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

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

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

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

1回答

6402閲覧

MQL4言語ですが、このコードでコンパイルするとエラーが発生してしまいます。

onikosantaro

総合スコア1

MQL4

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2020/10/16 07:15

編集2020/10/16 07:42

前提・実現したいこと

このコードをコンパイルすると、エラーが発生しますがどう見てもおかしいところが見たりません。どうか助けてください。

ここに質問の内容を詳しく書いてください。
(例)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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。
すみません。矢印ではありませんでした。正しくはエントリーサイン発生時に垂直線のオブジェクト
を引いて表現しています。

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

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

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

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

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

y_waiwai

2020/10/16 07:17

このままではコードが読めないので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
onikosantaro

2020/10/16 07:29

失礼しました。コードの表記を改善しました。
guest

回答1

0

ベストアンサー

29行目input int count_period = 30の末尾にセミコロンがありません。
115行目bool = false;に変数名がありません。
130行目のif文に{がありません。なので、その後の行がずれています。

もしMetaEditorを使用している場合はCtrl+,かツールバーの櫛のボタンでソースを整形できます。

投稿2020/10/16 09:32

mah

総合スコア591

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

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

onikosantaro

2020/10/17 13:11

非常に助かりました。 本当にありがとうございます。エラーがすべてなくなりました。本当にすごいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問