お世話になっております。
プログラミングに関してはど素人です。
以下手順のサインツールを作成中ですが、サインが一つも出ませんでした。。。
どのように直せばいいかをお教えいただきたくお願いいたします。。。
≪手順≫
1 ボリンジャーバンドにタッチしたときに、注意のサイン(アラート含む)を出し、準備中であることを示すフラグを立てる。
2 準備中であることを示すフラグが立っている場合、次にボリンジャーバンドにタッチしたとしても、注意のサイン(アラート含む)を出さない。
3 1の後、以下の条件を満たしたときに本サイン(アラート含む)を出し、同時に準備中であることを示すフラグを消す。
≪条件≫
上サインの条件
1 1本前足のRVIメイン線が、2本前足のRVIメイン線より小さい
2 現在足のRVIメイン線が、1本前足のRVIメイン線より大きい
下サインの条件
1 1本前足のRVIメイン線が、2本前足のRVIメイン線より大きい
2 現在足のRVIメイン線が、1本前足のRVIメイン線より小さい
なにとぞ、よろしくお願いいたします。
ソースコードは以下の通りです。
//| temp.mq4 | //| Copyright 2020, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #property indicator_chart_window #property indicator_buffers 4 #property indicator_color1 Orange #property indicator_color2 DodgerBlue #property indicator_color3 Gray #property indicator_color4 Gray #property indicator_width1 1 #property indicator_width2 1 #property indicator_width3 1 #property indicator_width4 1 //本サイン double up[]; double down[]; //注意のサイン double preup[]; double predown[]; extern int Bands_Period = 20; extern int Bands_deviation = 2; extern int RVI_Period = 10; extern int ArrowOffset = 5; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping IndicatorBuffers(4); SetIndexBuffer(0, up); SetIndexBuffer(1, down); SetIndexBuffer(2, preup); SetIndexBuffer(3, predown); SetIndexStyle(0, DRAW_ARROW); SetIndexStyle(1, DRAW_ARROW); SetIndexStyle(2, DRAW_ARROW); SetIndexStyle(3, DRAW_ARROW); SetIndexArrow(0, 228); SetIndexArrow(1, 230); SetIndexArrow(2, 217); SetIndexArrow(3, 218); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ bool AlertFlag1 = false; bool AlertFlag2 = false; //↓準備中であることを示すフラグ bool BandsLFlag = false; bool BandsUFlag = false; 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; int limit; if (prev_calculated == 0) { limit = rates_total - 1; } else { limit = rates_total - prev_calculated; } for (i=limit; i>=0; i--) { double Bands_U1 = iBands(NULL, 0, Bands_Period, Bands_deviation, 0, PRICE_CLOSE, MODE_UPPER, i); double Bands_L1 = iBands(NULL, 0, Bands_Period, Bands_deviation, 0, PRICE_CLOSE, MODE_LOWER, i); double RVI1 = iRVI(NULL, 0, RVI_Period, MODE_MAIN, i); double RVI2 = iRVI(NULL, 0, RVI_Period, MODE_MAIN, i+1); double RVI3 = iRVI(NULL, 0, RVI_Period, MODE_MAIN, i+2); string msg1 = Symbol(); string msg2 = "M"+IntegerToString(Period()); string msg3 = "High sign"; string msg4 = "Low sign"; string msg5 = "Bands touch"; if (i + Bands_Period <= Bars) { preup[i] = EMPTY_VALUE; predown[i] = EMPTY_VALUE; //準備中のフラグが「false」であり if(BandsLFlag == false || BandsUFlag == false) { //ボリンジャーバンド(Lower)に安値がタッチしたら if(Bands_L1 > Low[i]) { //注意のサインを出し、準備中のフラグに「true」をセットする。 preup[i] = Low[i] - ArrowOffset; BandsLFlag = true; if(i==0) { if(AlertFlag1 == false) { Alert(msg1,",",msg2,":",msg5); AlertFlag1 = true; } } } //ボリンジャーバンド(Upper)に高値がタッチしたら if(Bands_U1 < High[i]) { //注意のサインを出し、準備中のフラグに「true」をセットする。 predown[i] = High[i] + ArrowOffset; BandsUFlag = true; if(i==0) { if(AlertFlag1 == false) { Alert(msg1,",",msg2,":",msg5); AlertFlag1 = true; } } } } else { AlertFlag1 = false; } //準備中のフラグが「true」であったなら if(BandsLFlag == true || BandsUFlag == true) { //RVIの以下条件を満たしたときに if(RVI3 > RVI2 && RVI1 >= RVI2) { //上方向の本サインを出し、準備中のフラグに「false」をセットする。 up[i] = Low[i] - ArrowOffset; BandsLFlag = false; if(i==0) { if(AlertFlag2 == false) { Alert(msg1,",",msg2,":",msg3); AlertFlag2 = true; } } } //または、RVIの以下条件を満たしたときに else if(RVI3 < RVI2 && RVI1 <= RVI2) { //上方向の本サインを出し、準備中のフラグに「false」をセットする。 down[i] = High[i] - ArrowOffset; bandsUFlag = false; if(i==0) { if(AlertFlag2 == false) { Alert(msg1,",",msg2,":",msg4); AlertFlag2 = true; } } } else { AlertFlag2 = false; } } else { BandsLFlag = false; BandsUFlag = false; } } } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ コード
以上、よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。