前提・実現したいこと
このコードをコンパイルすると、エラーが発生しますがどう見てもおかしいところが見たりません。どうか助けてください。
ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。
インジケータを作成しています。MACDとRSIを使ったサインツールです。サインの発生タイミングをサブウィンドウにて上下の矢印で表現しています。
発生している問題・エラーメッセージ
エラーメッセージ
'}' - unexpected end of program JunkInd.mq4 167 1
'{' - unbalanced parentheses JunkInd.mq4 90 37
'JudgeEntry' - function not defined JunkInd.mq4 87 5
該当のソースコード
言語名はMQL4言語です。 ソースコード
//| TestIndicator.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_separate_window #property indicator_buffers 3 #property indicator_color1 clrBlue #property indicator_color2 clrWhite #property indicator_color3 clrRed #property indicator_width1 2 #property indicator_width2 2 #property indicator_width3 2 #define IND_MIN_INDEX 2 #define OBJ_HEAD ( __FILE__ + "_" ) double _IndBuffer1[]; double _IndBuffer2[]; double _IndBuffer3[]; input int count_period = 30//RSI持続期間 //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0, _IndBuffer1); SetIndexBuffer(1, _IndBuffer2); SetIndexBuffer(2, _IndBuffer3); //--- 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[]) { //--- TaskPeriod(prev_calculated); //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ void OnDeinit( const int reason ){ ObjectsDeleteAll(0, OBJ_HEAD); } //+------------------------------------------------------------------+ void TaskPeriod(int a) { static datetime s_lasttime; // 最後に記録した時間軸時間 // staticはこの関数が終了してもデータは保持される datetime temptime = iTime( Symbol(), Period() ,0 ); // 現在の時間軸の時間取得 if ( temptime == s_lasttime ) { // 時間に変化が無い場合 return; // 処理終了 } s_lasttime = temptime; // 最後に記録した時間軸時間を保存 // ----- 処理はこれ以降に追加 ----------- JudgeEntry(a); // エントリーオーダー判定 } void JudgeEntry(int prev_calculated){ int end_index = Bars - prev_calculated; if( end_index <= IND_MIN_INDEX ){ end_index = IND_MIN_INDEX; } if(Bars <= IND_MIN_INDEX){ return ; } for(int icount = 0 ; icount < end_index ; icount++){ double get_rsi = iRSI(Symbol(), Period(), 14, PRICE_CLOSE, icount); double get_macd = iMACD(Symbol(), Period(), 8, 17, 9, PRICE_CLOSE, MODE_MAIN, icount); double get_fast_macd = iMACD(Symbol(), Period(), 8, 17, 9, PRICE_CLOSE, MODE_MAIN, icount + 1); double get_slow_macd = iMACD(Symbol(), Period(), 8, 17, 9, PRICE_CLOSE, MODE_MAIN, icount + 2); double get_signal = iMACD(Symbol(), Period(), 8, 17, 9, PRICE_CLOSE, MODE_SIGNAL, icount); double get_fast_signal = iMACD(Symbol(), Period(), 8, 17, 9, PRICE_CLOSE, MODE_SIGNAL, icount + 1); double get_slow_signal = iMACD(Symbol(), Period(), 8, 17, 9, PRICE_CLOSE, MODE_MAIN, icount + 2); _IndBuffer1[icount] = get_rsi; _IndBuffer2[icount] = get_macd; _IndBuffer3[icount] = get_signal; bool = false; int flag = 0; if( flag > count_period ){ flag = 0; } else if( flag <= count_period ){ flag += 1; } if( get_rsi < 30 || get_rsi > 70 ){ flag = 1; } if( 0 < flag && flag <= count_period && get_slow_macd < get_slow_signal && get_fast_signal < get_fast_macd ) ret = true; } else if( 0 < flag && flag < count_period && get_slow_macd > get_slow_signal && get_fast_signal > get_fast_macd ){ ret = true; } if( ret == true ){ DispObjVLine(icount); } } void DispObjVLine( int in_index ) { string obj_name; // オブジェクト名 obj_name = StringFormat( "%sNYCloseLine%s" , OBJ_HEAD, TimeToStr( Time[in_index] ) ); if ( ObjectFind( obj_name ) >= 0 ) { // オブジェクト名重複チェック // 重複している場合 ObjectDelete( obj_name ); // 指定したオブジェクトを削除する } ObjectCreate( // オブジェクト生成 obj_name, // オブジェクト名 OBJ_VLINE, // オブジェクトタイプ 0, // ウインドウインデックス Time[in_index], // 1番目の時間のアンカーポイント 0 // 1番目の価格のアンカーポイント ); } コード
試したこと
ここに問題に対して試したことを記載してください。
中かっこの対応を見ましたが。過不足は見当たりません。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
すみません。矢印ではありませんでした。正しくはエントリーサイン発生時に垂直線のオブジェクト
を引いて表現しています。
回答1件
あなたの回答
tips
プレビュー