質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

Q&A

0回答

891閲覧

MQL4でアラートとエントリー矢印の出る条件を変更したい

wataro-web

総合スコア4

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

0グッド

0クリップ

投稿2019/11/07 16:31

前提・実現したいこと

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文の分岐の順番等をためしたのですが、コンパイルが通っても思っていた実装ができませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問