做震荡行情的朋友应该都清楚,普通随机指标只有简单的超买超卖线条,根本没法结合价格盘面判断进场点位,逆势做单、盲目进场是常态。
今天这款工具和普通指标完全不一样,是专门为手动交易者打造的半自动辅助指标,源码我已经放下面,全程无未来函数、信号零漂移,所有数据实时计算,绝对不存在事后改信号的情况,大家可以放心使用。

这款工具只适合震荡盘整行情,主打M15、M30、H1短线高抛低吸、反转交易,是震荡市的交易神器;
切记!单边暴涨暴跌、大数据非农、利率决议期间不要使用,趋势行情下任何逆势反转指标,都会出现无效杂信号,大家一定要按需使用。
我已经帮大家调试好最优默认参数,直接导入MT4就能直接用。如果大家啊需要别的参数,也可以和侠哥交流。

好了源码我已经放下面了,需要的自取。
extern int BarsToCheck = 3456;extern ENUM_TIMEFRAMES TimeFrame = PERIOD_CURRENT;extern int Kperiod = 13, //5,Slowing = 3;extern ENUM_STO_PRICE StochPrice = STO_LOWHIGH; //STO_CLOSECLOSE;extern int OverBought = 80, //70,OverSold = 20; //30;extern color Rectangle1 = C'150,60,60'; //0x4040a0;extern color Rectangle2 = C'60,60,150'; //0x804040;extern bool PlusATR = false,ShowLines = false,RayRight = false;extern int HowH1forRay = 96;extern ENUM_LINE_STYLE RayStyle = STYLE_DOT;extern int AlertBar = 1;extern bool AlertsMessage = true, //false,AlertsSound = true, //false,AlertsEmail = false,AlertsMobile = false;extern string SoundFile = "alert2.wav"; //"news.wav"; //"news.wav", //"stops.wav" //"expert.wav"//****************************************************************************//*** Custom indicator buffers ***//****************************************************************************double STOCH[]; int TFK, SGB; string BH2xID, sTFR, cTFR; datetime TimeBar=0;//****************************************************************************//*** Custom indicator initialization function ***//****************************************************************************int init(){TimeFrame = fmax(TimeFrame,_Period); TFK = TimeFrame/_Period; sTFR = StringSubstr(EnumToString(TimeFrame),7); cTFR = StringSubstr(EnumToString(ENUM_TIMEFRAMES(_Period)),7); //IndikName = WindowExpertName();//---Kperiod = MathMax(Kperiod,1);Slowing = MathMax(Slowing,1); SGB = AlertBar*TFK;//---IndicatorBuffers(1); IndicatorDigits(0); //(Digits-Digits%2);//-----SetIndexBuffer(0,STOCH); SetIndexStyle(0,DRAW_NONE);//-----BH2xID = "BH'STO'TT["+(string)BarsToCheck+":"+(string)Kperiod+">"+(string)Slowing+">"+StringSubstr(EnumToString(StochPrice),4)+"±"+(string)OverBought+"±"+(string)OverSold+"]";//-----return(0);}//****************************************************************************//*** Custom indicator deinitialization function ***//****************************************************************************int deinit() { delete_objects_containing(BH2xID); return(0); }//-----//-----void delete_objects_containing(string bhname){for (int i=ObjectsTotal()-1; i>=0; i--){ if (StringFind(ObjectName(i),bhname)>= 0)ObjectDelete(ObjectName(i)); }}//****************************************************************************//*** Custom indicator iteration function ***//****************************************************************************int start(){int counted_bars=IndicatorCounted(); if (BarsToCheck<(Kperiod+Slowing)) BarsToCheck = Bars-3-(Kperiod+Slowing);delete_objects_containing(BH2xID);int hh, ll, sh, sl, eh=0, el=0; /*double p;*/ int lastHH=0, lastLL=0;double RangeATR = PlusATR ? iATR(NULL,TimeFrame,Kperiod,iBarShift(NULL,TimeFrame,Time[0])) /*/Kperiod*/ : 0; //10*Point; //оригинал....//****************************************************************************while ( (eh >= 0 && eh < BarsToCheck) || (el >= 0 && el < BarsToCheck) ) //for (e=0; e>=0 && e<BarsToCheck; e++) //{find_last_stoch_high(eh+1, hh, sh, eh); //p = High[h]; //оригинал....find_last_stoch_low (el+1, ll, sl, el); //p = Low[h]; //оригинал....//-----if (eh > 0){ObjectCreate(BH2xID+"H"+sh, OBJ_RECTANGLE, 0, Time[sh-1], High[hh]+RangeATR, Time[eh+1], Low[sh]-RangeATR);ObjectSet(BH2xID+"H"+sh, OBJPROP_HIDDEN,false);ObjectSet(BH2xID+"H"+sh, OBJPROP_COLOR, Rectangle1);}//---if (el > 0){ObjectCreate(BH2xID+"L"+sl, OBJ_RECTANGLE, 0, Time[sl-1], Low[ll] - RangeATR, Time[el+1], High[sl]+RangeATR);ObjectSet(BH2xID+"L"+sl, OBJPROP_HIDDEN,false);ObjectSet(BH2xID+"L"+sl, OBJPROP_COLOR, Rectangle2);}//-----if (lastHH>0 && ShowLines && iBarShift(NULL,PERIOD_H1,Time[hh])<=HowH1forRay) // && High[last_h] < p ){ //ObjectCreate(BH2xID+"D"+sh, OBJ_TREND, 0, Time[h], p, Time[last_h], High[last_h]); //оригинал....ObjectCreate(BH2xID+"D"+sh, OBJ_TREND, 0, Time[hh], High[hh], Time[lastHH-1], Low[lastHH-1]);ObjectSet(BH2xID+"D"+sh, OBJPROP_RAY, RayRight);ObjectSet(BH2xID+"D"+sh, OBJPROP_HIDDEN,false);ObjectSet(BH2xID+"D"+sh, OBJPROP_COLOR, Rectangle1 -15); //RedObjectSet(BH2xID+"D"+sh, OBJPROP_STYLE, RayStyle);} else ObjectDelete(BH2xID+"D"+sh);//-----if (lastLL>0 && ShowLines && iBarShift(NULL,PERIOD_H1,Time[ll])<=HowH1forRay) // && Low[last_h] > p ){ //ObjectCreate(BH2xID+"U"+sl, OBJ_TREND, 0, Time[h], p, Time[last_h], Low[last_h]); //оригинал....ObjectCreate(BH2xID+"U"+sl, OBJ_TREND, 0, Time[ll], Low[ll], Time[lastLL-1], High[lastLL-1]);ObjectSet(BH2xID+"U"+sl, OBJPROP_RAY,RayRight);ObjectSet(BH2xID+"U"+sl, OBJPROP_HIDDEN,false);ObjectSet(BH2xID+"U"+sl, OBJPROP_COLOR, Rectangle2 -15); //LimeObjectSet(BH2xID+"U"+sl, OBJPROP_STYLE, RayStyle);} else ObjectDelete(BH2xID+"U"+sl);//-----lastHH = hh;lastLL = ll;}//****************************************************************************for (int e=BarsToCheck; e>=0; e--) { STOCH[e]=0; STOCH[e] = iStochastic(NULL,TimeFrame,Kperiod,1,Slowing,0,StochPrice,MODE_MAIN,iBarShift(NULL,TimeFrame,Time[e])); }//****************************************************************************//*** BH Stoch Alerts TT [x3] ***//****************************************************************************if (AlertsMessage || AlertsEmail || AlertsMobile || AlertsSound){string messageDN = "BH Stoch TT << "+_Symbol+", "+cTFR+" << Signal DN << SELL"; //HA CLH 3C TTstring messageUP = "BH Stoch TT >> "+_Symbol+", "+cTFR+" >> Signal UP >> BUY"; //HA CLH 3C TT//-----if (TimeBar!=iTime(NULL,TimeFrame,0) && STOCH[SGB] < OverBought && STOCH[1+SGB] >= OverBought){if (AlertsMessage) Alert(messageDN);if (AlertsEmail) SendMail(Symbol(),messageDN);if (AlertsMobile) SendNotification(messageDN);if (AlertsSound) PlaySound(SoundFile); //"stops.wav" //"news.wav"TimeBar=iTime(NULL,TimeFrame,0); //return(0);}//-----else if (TimeBar!=iTime(NULL,TimeFrame,0) && STOCH[SGB] > OverSold && STOCH[1+SGB] <= OverSold){if (AlertsMessage) Alert(messageUP);if (AlertsEmail) SendMail(Symbol(),messageUP);if (AlertsMobile) SendNotification(messageUP);if (AlertsSound) PlaySound(SoundFile); //"stops.wav" //"news.wav"TimeBar=iTime(NULL,TimeFrame,0); //return(0);}}//------return(0);}//****************************************************************************//*** BH Stoch Alerts TT [x3] ***//****************************************************************************void find_last_stoch_high(int x, int& p, int& s, int& e){s = -1;e = -1;p = x;//-----for (int i=x; i<x+BarsToCheck; i++){if (iStochastic(NULL,TimeFrame,Kperiod,1,Slowing,0,StochPrice,MODE_MAIN,iBarShift(NULL,TimeFrame,Time[i])) > OverBought){p = i;s = i;break;}}//-----if (s>0)for (i=s+1; i<s+BarsToCheck; i++){if (iStochastic(NULL,TimeFrame,Kperiod,1,Slowing,0,StochPrice,MODE_MAIN,iBarShift(NULL,TimeFrame,Time[i])) < OverBought){e = i-1;break;}else { if (iHigh(NULL,TimeFrame,iBarShift(NULL,TimeFrame,Time[i])) > High[p]) p = i; }}}//****************************************************************************//*** BH Stoch Alerts TT [x3] ***//****************************************************************************void find_last_stoch_low(int x, int& p, int& s, int& e){s = -1;e = -1;p = x;//-----for (int i=x; i<x+BarsToCheck; i++){if (iStochastic(NULL,TimeFrame,Kperiod,1,Slowing,0,StochPrice,MODE_MAIN,iBarShift(NULL,TimeFrame,Time[i])) < OverSold){p = i;s = i;break;}}//-----if (s>0)for (i=s+1; i<s+BarsToCheck; i++) //iRSI(NULL,0,RSIPeriod,RSIPrice,i){if (iStochastic(NULL,TimeFrame,Kperiod,1,Slowing,0,StochPrice,MODE_MAIN,iBarShift(NULL,TimeFrame,Time[i])) > OverSold){e = i-1;break;}else { if (iLow(NULL,TimeFrame,iBarShift(NULL,TimeFrame,Time[i])) < Low[p]) p = i; }}} 由于时间有限加上对源码的追溯做不到最终解释权,所以我们提供的源码EA仅仅只能用来做模拟测试使用,严格禁止商业使用和跑实盘!
夜雨聆风