前提・実現したいこと
MQL4でアラートとエントリー矢印の出る条件を変更したいです。
ここに質問の内容を詳しく書いてください。
ボリンジャーバンドとCCIを使ってアラートとハイロー矢印がでるインジケータを作成したのですが、自分が思っていた仕様で作動せず有識者の意見を頂きたいと思っております。
発生している問題・エラーメッセージ
私が想定していた動きは
①ボリンジャーバンドが2σから3σより大きくなったときにLOWシグナルが出る
(この時に一本前のローソク足が2σを超えていないこと)
②CCIが100以下から150以上へ伸びた時にLOWシグナルが出る
③ボリンジャーバンドが-2σから-3σより小さくなったときにHIGHシグナルが出る
(この時に一本前のローソク足が-2σを超えていないこと)
④CCIが-100以下から-150以上へ伸びた時にHIGHシグナルが出る
以上の条件で作成したところ
自分が想定していたローソク足の一本後でハイローシグナルとアラートが出てしまいました。
以下にソースコードを添付しますので有識者の方にアドバイスを頂きたいです。
該当のソースコード
MQl4 ソースコード //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping IndicatorBuffers(2); SetIndexStyle(0, DRAW_ARROW); SetIndexArrow(0,236); SetIndexBuffer(0,ArrowUp); SetIndexStyle(1, DRAW_ARROW); SetIndexArrow(1,238); SetIndexBuffer(1,ArrowDown); SetIndexStyle(2, DRAW_ARROW); SetIndexArrow(2,161); SetIndexBuffer(2,maru); SetIndexStyle(3, DRAW_ARROW); SetIndexArrow(3,251); SetIndexBuffer(3,batu); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- int i; /////////////時間処理////////////// y = TimeYear(TimeCurrent()); mon = TimeMonth(TimeCurrent()); d = TimeDay(TimeCurrent()); h = TimeHour(TimeCurrent()); m = TimeMinute(TimeCurrent()); s = TimeSeconds(TimeCurrent()); stry=y*1000000; strmon=mon*100000; strd=d*10000; strh=h*100; strm=m*1; strhm=strh+strm+strd+strmon+stry; /////////////////////////////////// ObjectsDeleteAll(); ArrayInitialize(ArrowDown,EMPTY_VALUE); ArrayInitialize(ArrowUp,EMPTY_VALUE); ArrayResize(ArrowDown,R_TIME); ArrayResize(ArrowUp,R_TIME); ArrayInitialize(maru,EMPTY_VALUE); ArrayInitialize(batu,EMPTY_VALUE); ArrayResize(maru,R_TIME); ArrayResize(batu,R_TIME); atari=0; hazure=0; for(i=0;i<R_TIME;i++){ // ボリバン設定 double Upper_20=iBands(Symbol(),0,BORIKIKAN,SIGMA,0,PRICE_CLOSE,MODE_UPPER,i); double Lower_20=iBands(Symbol(),0,BORIKIKAN,SIGMA,0,PRICE_CLOSE,MODE_LOWER,i); double Upper_30=iBands(Symbol(),0,BORIKIKAN,SIGMA2,0,PRICE_CLOSE,MODE_UPPER,i); double midleBand=iBands(Symbol(),0,BORIKIKAN,SIGMA2,0,PRICE_CLOSE,MODE_MAIN,i); double Lower_30=iBands(Symbol(),0,BORIKIKAN,SIGMA2,0,PRICE_CLOSE,MODE_LOWER,i); // CCI設定 double CCICLOSEDATA=iCCI(Symbol(),0,CCIKIKAN,PRICE_CLOSE,i); double CCIBEFOREDATA=iCCI(Symbol(),0,CCIKIKAN,PRICE_CLOSE,i-1); // 始値がボリバンの2σより小さい時 if(Upper_20<iOpen(Symbol(),0,i)){ // 終値がボリバンの3σより大きかった時 if(Upper_30>iClose(Symbol(),0,i)){ // 一本前のCCIの値が100より小さい時 if(CCIBEFOREDATA<CCI_UPPER_100){ // CCIの値が120より大きい時 if(CCICLOSEDATA>CCI_UPPER_120){ if(i==0){ ArrowDown[0]=iHigh(Symbol(),0,0); if(ALERT_ON==1){ if(last1<strhm){ Alert(SELL_A+" SYMBOL:"+Symbol()+"TIME:"+Period()); last1=strhm+Period()-1; } } }else{ ArrowDown[i]=iHigh(Symbol(),0,i); if(i==1){ if(last2<strhm&&Period()==5||last2<strhm&&Period()==1){ Alert(GO_DOWN); last2=strhm+ALL_TIME; } } if(i>1){ if(iOpen(Symbol(),0,i-1)>=iClose(Symbol(),0,i-1)){//結果 atari=atari+1; maru[i-1]=iHigh(Symbol(),0,i-1); }else{ ArrowDown[i-1]=iHigh(Symbol(),0,i-1); if(i==2){ if(last3<strhm&&Period()==5||last3<strhm&&Period()==1){ GO_DOWN2=Symbol()+"_"+ENTRY_TIME+"SELL"+PLICE2+".UWS"; Alert(GO_DOWN2+"/Martin"); last3=strhm+ALL_TIME; } } if(i>2){ if(iOpen(Symbol(),0,i-2)>=iClose(Symbol(),0,i-2)){//結果 atari=atari+1; maru[i-2]=iHigh(Symbol(),0,i-2); }else{ hazure=hazure+1; batu[i-2]=iHigh(Symbol(),0,i-2); } } } } } } } } }else{ // 始値がボリバンの2σより大きい時 if(Upper_20<iOpen(Symbol(),0,i)){ // 終値がボリバンの3σより小さい時 if(Upper_30>iClose(Symbol(),0,i)){ // 一本前のCCIの値が-100より大きい時 if(CCIBEFOREDATA>CCI_LOWER_100){ // CCIの値が-120より小さい時 if(CCICLOSEDATA<CCI_LOWER_120){ if(i==0){ ArrowUp[i]=iLow(Symbol(),0,0); if(ALERT_ON==1){ if(last1<strhm){ Alert(BUY_A+" SYMBOL:"+Symbol()+"TIME:"+Period()); last1=strhm+Period()-1; } } }else{ ArrowUp[i]=iLow(Symbol(),0,i); if(i==1){ if(last2<strhm&&Period()==5||last2<strhm&&Period()==1){ Alert(GO_UP); last2=strhm+ALL_TIME; } } if(i>1){ if(iOpen(Symbol(),0,i-1)<=iClose(Symbol(),0,i-1)){//結果 atari=atari+1; maru[i-1]=iLow(Symbol(),0,i-1); }else{ ArrowUp[i-1]=iLow(Symbol(),0,i-1); if(i==2){ if(last3<strhm&&Period()==5||last3<strhm&&Period()==1){ GO_UP2=Symbol()+"_"+ENTRY_TIME+"BUY"+PLICE2+".UWS"; Alert(GO_UP2+"/Martin"); last3=strhm+ALL_TIME; } } if(i>2){ if(iOpen(Symbol(),0,i-2)<=iClose(Symbol(),0,i-2)){//結果 atari=atari+1; maru[i-2]=iLow(Symbol(),0,i-2); }else{ hazure=hazure+1; batu[i-2]=iHigh(Symbol(),0,i-2); } } } } } } } } } } if(atari>0){ goukei=atari+hazure; goukei=NormalizeDouble(atari/goukei*100,1); goukei=NormalizeDouble(goukei,0); goukei=MathFloor(goukei); }else{ goukei=0; } } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
試したこと
if文の分岐の順番等をためしたのですが、コンパイルが通っても思っていた実装ができませんでした。
あなたの回答
tips
プレビュー