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

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

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

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

Q&A

1回答

2977閲覧

初心者でMQL4でインジケーター制作中でエラーを直したいです。

Tanaka6666

総合スコア0

MQL4

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

0グッド

0クリップ

投稿2020/08/10 10:45

前提・実現したいこと

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/ツールのバージョンなど)

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

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

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

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

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

guest

回答1

0

中括弧の対応があっていないというエラーメッセージです。
コメントアウトされている閉じ括弧を戻せばコンパイルはできると思います。
あと、if文の判定で代入している箇所があります。

MQL

1int OnCalculate(const int rates_total, 2 const int prev_calculated, 3 const datetime &time[], 4 const double &open[], 5 const double &high[], 6 const double &low[], 7 const double &close[], 8 const long &tick_volume[], 9 const long &volume[], 10 const int &spread[]) 11{ 12//--- 13 int limit = Bars - IndicatorCounted() - 1; 14 limit = MathMin(limit, Maxbars); 15 16 if(limit == Bars - 1) { //チャート勝率二倍エラー対策 17 totalcnt = 0; 18 wincnt = 0; 19 losecnt = 0; 20 totalcnt = 0; 21 } 22 23 for(int i = limit; i >= 0; i--) { 24 double Rsi = iCustom(NULL, 0, "RSI-Bollinger", RSIPeriod, BandPeriod, BandDeviation, 0, i); 25 double RsiBoliUp = iCustom(NULL, 0, "RSI-Bolniger", RSIPeriod, RSIPeriod, BandPeriod, BandDeviation, 1, i); 26 double RsiBoliDn = iCustom(NULL, 0, "RSI-Bolniger", RSIPeriod, RSIPeriod, BandPeriod, BandDeviation, 2, i); 27 28 double Rsi1 = iCustom(NULL, 0, "RSI-Bollinger", RSIPeriod, BandDeviation, 0, i + 1); 29 double RsiBoliUp1 = iCustom(NULL, 0, "RSI-Bolniger", RSIPeriod, BandPeriod, BandDeviation, 1, i + 1); 30 double RsiBoliDn1 = iCustom(NULL, 0, "RSI-Bolniger", RSIPeriod, BandPeriod, BandDeviation, 2, i + 1); 31 32 if(i == 0) { 33 Buffer_0[i] = EMPTY_VALUE; 34 Buffer_1[i] = EMPTY_VALUE; 35 36 if(Rsi1 > RsiBoliDn1 && Rsi <= RsiBoliDn && a >= Space) { //上から下抜け 37 Buffer_0[i] = iLow(NULL, 0, i) - 5 * Pips * Point; 38 if(i == 0 && RealBars < Bars) { 39 Alert(Symbol() + "M" + Period() + "High Sign"); //アラート関数 40 RealBars = Bars; 41 } 42 } 43 44 if(Rsi1 < RsiBoliUp1 && Rsi >= RsiBoliUp && b >= Space) { //下から上抜け 45 Buffer_1[i] = iHigh(NULL, 0, i) + 10 * Pips * Point; //サイン表示 46 if(i == 0 && RealBars < Bars) { 47 Alert(Symbol() + "M" + Period() + "M" + Period() + "Low Sign"); 48 RealBars = Bars; 49 } 50 } 51 }//for 52 53 if(i == 0) { 54 Buffer_0[i] = EMPTY_VALUE; 55 Buffer_1[i] = EMPTY_VALUE; 56 57 if(Rsi1 > RsiBoliDn1 && Rsi <= RsiBoliDn && a >= Space) { //上から下抜け 58 Buffer_0[i] = iLow(NULL, 0, i) - 5 * Pips * Point; 59 if(i == 0 && RealBars < Bars) { 60 Alert(Symbol() + "M" + Period() + "High Sign"); //アラート関数 61 RealBars = Bars; 62 } 63 } 64 65 if(Rsi1 > RsiBoliUp1 && Rsi <= RsiBoliUp && b >= Space) { //下から上抜け 66 Buffer_1[i] = iHigh(NULL, 0, i) + 10 * Pips * Point; //サイン表示 67 if(i == 0 && RealBars < Bars) { 68 Alert(Symbol() + "M" + Period() + "M" + Period() + "Low Sign"); 69 RealBars = Bars; 70 } 71 } 72 } 73 74 if(i > 1 || (i == 1 && NowBars < Bars)) { 75 76 NowBars = Bars; 77 a++; 78 b++;//aとbのそれぞれを足確定ごとに+1していき、エントリーから次のエントリーまでの間隔調整 79 80 if(Rsi1 > RsiBoliDn1 && Rsi <= RsiBoliDn && a >= Space) { //上から下抜け 81 Buffer_0[i] = iLow(NULL, 0, i) - 5 * Pips * Point; 82 83 upentryflag = true;//エントリー時にフラグを通して判定コード通るようにする 84 eprice = iClose(NULL, 0, i); //エントリー時に価格を判定用に保存 85 a = 0; 86 p++; 87 } 88 89 if(Rsi1 < RsiBoliUp1 && Rsi >= RsiBoliUp && b >= Space) { //下から上抜け 90 Buffer_1[i] = iHigh(NULL, 0, i) + 10 * Pips * Point; //サイン表示 91 92 dnentryflag = true; 93 eprice = iClose(NULL, 0, i); 94 b = 0; 95 q++; 96 } 97 } 98 99//勝敗判定---------------------------------------------------------------------------------- 100 if(upentryflag = true) { 101 if(p <= 1) { 102 Judg = 0; //最初の一回目の判定だけバグ調整でここ通る 103 104 } 105 else { 106 107 if(minute == Judg + 1) { 108 if(eprice < iClose(NULL, 0, i)) { 109 Buffer_2[i] = iLow(NULL, 0, i) - 5 * Point; 110 upentryflag = false; 111 wincnt++; 112 } 113 else { 114 Buffer_3[i] = iLow(NULL, 0, i) - 5 * Point; 115 upentryflag = false; 116 losecnt++; 117 } 118 minute = 0; 119 } 120 minute++; 121 } 122//} 123 124 if(dnentryflag = true) { 125 if(q <= 1) { 126 Judg = 0; //最初の一回目の判定だけバグ調整でここ通る 127 128 } 129 else { 130 131 if(minute2 == Judg + 1) { 132 if(eprice > iClose(NULL, 0, i)) { 133 Buffer_2[i] = iHigh(NULL, 0, i) + 5 * Point; 134 dnentryflag = false; 135 wincnt++; 136 } 137 else { 138 Buffer_3[i] = iHigh(NULL, 0, i) + 5 * Point; 139 dnentryflag = false; 140 losecnt++; 141 } 142 minute2 = 0; 143 } 144 minute2++; 145 } 146 } 147 148 ObjectCreate("counttotal", OBJ_LABEL, 0, 0, 0); 149 ObjectSet("counttotal", OBJPROP_CORNER, 0); 150 ObjectSet("counttotal", OBJPROP_XDISTANCE, 5); 151 ObjectSet("counttotal", OBJPROP_YDISTANCE, 15); 152 totalcnt = wincnt + losecnt; 153 if(wincnt > 0) { 154 percent = MathRound((wincnt / totalcnt) * 100); 155 } 156 else { 157 percent = 0; 158 } 159 160 ObjectSetText("counttotal", "Win: " + wincnt + "回" + "Lose: " + losecnt + "回" + "勝率:" + percent + "%", LabelSize, "MS ゴッシック", White); 161 162 } //for 163 } 164 165//--- return value of prev_calculated for next call 166 return(rates_total); 167} 168 169//+------------------------------------------------------------------+ 170int deinit() 171{ 172 for(int i = ObjectsTotal() - 1; 0 <= i; i--) { 173 string ObjName = ObjectName(i); 174 if(StringFind(ObjName, "counttotal") >= 0) 175 ObjectDelete(ObjName); 176 } 177 178 Comment(""); 179 180 return (0); 181} 182

投稿2020/08/11 11:37

mah

総合スコア591

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問