前提・実現したいこと
youtubeのRSIBolingerBandのサインツール動画内容の模写しました。
エラー発生してコンパイルできないです。
発生している問題・エラーメッセージ
'}' - unexpected end of program RSIBolinger.mq4 288
'{' - unbalanced parentheses RSIBolinger.mq4 84
OnCalculate function not found in custom indicator 1
エラーメッセージ
### 該当のソースコード 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[]) { ←84行目 //--- int limit = Bars - IndicatorCounted() - 1; limit = MathMin(limit, Maxbars); if(limit == Bars - 1) //チャート勝率二倍エラー対策 { totalcnt = 0; wincnt = 0; losecnt = 0; totalcnt = 0; } for(int i = limit; i >= 0; i--) { double Rsi = iCustom(NULL, 0, "RSI-Bollinger", RSIPeriod, BandPeriod, BandDeviation, 0, i); double RsiBoliUp = iCustom(NULL, 0, "RSI-Bolniger", RSIPeriod, RSIPeriod, BandPeriod, BandDeviation, 1, i); double RsiBoliDn = iCustom(NULL, 0, "RSI-Bolniger", RSIPeriod, RSIPeriod, BandPeriod, BandDeviation, 2, i); double Rsi1 = iCustom(NULL, 0, "RSI-Bollinger", RSIPeriod, BandDeviation, 0, i + 1); double RsiBoliUp1 = iCustom(NULL, 0, "RSI-Bolniger", RSIPeriod, BandPeriod, BandDeviation, 1, i + 1); double RsiBoliDn1 = iCustom(NULL, 0, "RSI-Bolniger", RSIPeriod, BandPeriod, BandDeviation, 2, i + 1); if(i == 0) { Buffer_0[i] = EMPTY_VALUE; Buffer_1[i] = EMPTY_VALUE; if(Rsi1 > RsiBoliDn1 && Rsi <= RsiBoliDn && a >= Space) //上から下抜け { Buffer_0[i] = iLow(NULL, 0, i) - 5 * Pips * Point; if(i == 0 && RealBars < Bars) { Alert(Symbol() + "M" + Period() + "High Sign"); //アラート関数 RealBars = Bars; } } if(Rsi1 < RsiBoliUp1 && Rsi >= RsiBoliUp && b >= Space) //下から上抜け { Buffer_1[i] = iHigh(NULL, 0, i) + 10 * Pips * Point; //サイン表示 if(i == 0 && RealBars < Bars) { Alert(Symbol() + "M" + Period() + "M" + Period() + "Low Sign"); RealBars = Bars; } } // }//for if(i == 0) { Buffer_0[i] = EMPTY_VALUE; Buffer_1[i] = EMPTY_VALUE; if(Rsi1 > RsiBoliDn1 && Rsi <= RsiBoliDn && a >= Space) //上から下抜け { Buffer_0[i] = iLow(NULL, 0, i) - 5 * Pips * Point; if(i == 0 && RealBars < Bars) { Alert(Symbol() + "M" + Period() + "High Sign"); //アラート関数 RealBars = Bars; } } if(Rsi1 > RsiBoliUp1 && Rsi <= RsiBoliUp && b >= Space) //下から上抜け { Buffer_1[i] = iHigh(NULL, 0, i) + 10 * Pips * Point; //サイン表示 if(i == 0 && RealBars < Bars) { Alert(Symbol() + "M" + Period() + "M" + Period() + "Low Sign"); RealBars = Bars; } } } if(i > 1 || (i == 1 && NowBars < Bars)) { NowBars = Bars; a++; b++;//aとbのそれぞれを足確定ごとに+1していき、エントリーから次のエントリーまでの間隔調整 if(Rsi1 > RsiBoliDn1 && Rsi <= RsiBoliDn && a >= Space) //上から下抜け { Buffer_0[i] = iLow(NULL, 0, i) - 5 * Pips * Point; upentryflag = true;//エントリー時にフラグを通して判定コード通るようにする eprice = iClose(NULL, 0, i); //エントリー時に価格を判定用に保存 a = 0; p++; } if(Rsi1 < RsiBoliUp1 && Rsi >= RsiBoliUp && b >= Space) //下から上抜け { Buffer_1[i] = iHigh(NULL, 0, i) + 10 * Pips * Point; //サイン表示 dnentryflag = true; eprice = iClose(NULL, 0, i); b = 0; q++; } //} //勝敗判定---------------------------------------------------------------------------------- if(upentryflag = true) { if(p <= 1) { Judg = 0; //最初の一回目の判定だけバグ調整でここ通る } else { if(minute == Judg + 1) { if(eprice < iClose(NULL, 0, i)) { Buffer_2[i] = iLow(NULL, 0, i) - 5 * Point; upentryflag = false; wincnt++; } else { Buffer_3[i] = iLow(NULL, 0, i) - 5 * Point; upentryflag = false; losecnt++; } minute = 0; } minute++; } //} if(dnentryflag = true) { if(q <= 1) { Judg = 0; //最初の一回目の判定だけバグ調整でここ通る } else { if(minute2 == Judg + 1) { if(eprice > iClose(NULL, 0, i)) { Buffer_2[i] = iHigh(NULL, 0, i) + 5 * Point; dnentryflag = false; wincnt++; } else { Buffer_3[i] = iHigh(NULL, 0, i) + 5 * Point; dnentryflag = false; losecnt++; } minute2 = 0; } minute2++; } //} ObjectCreate("counttotal", OBJ_LABEL, 0, 0, 0); ObjectSet("counttotal", OBJPROP_CORNER, 0); ObjectSet("counttotal", OBJPROP_XDISTANCE, 5); ObjectSet("counttotal", OBJPROP_YDISTANCE, 15); totalcnt = wincnt + losecnt; if(wincnt > 0) { percent = MathRound((wincnt / totalcnt) * 100); } else { percent = 0; } ObjectSetText("counttotal", "Win: " + wincnt + "回" + "Lose: " + losecnt + "回" + "勝率:" + percent + "%", LabelSize, "MS ゴッシック", White) } //for } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ int deinit() { for(int i = ObjectsTotal() - 1; 0 <= i; i--) { string ObjName = ObjectName(i); if(StringFind(ObjName, "counttotal") >= 0) ObjectDelete(ObjName); } Comment(""); return (0); } ←287行目 ### 試したこと ### 補足情報(FW/ツールのバージョンなど)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。