記事"MQL5ウィザード:トレーディングシグナル用モジュール作成方法"についてのディスカッション

 

新しい記事 MQL5ウィザード:トレーディングシグナル用モジュール作成方法 はパブリッシュされました:

この記事は、価格のクロスオーバーと移動平均に関するシグナルの実行とともに、トレーディングシグナルクラスの記述方法、 MQL5ウィザードのトレーディングストラテジー生成プログラムへの挿入方法、MQL5ウィザードにおいて生成されるクラスの記述フォーマットやストラクチャーについて紹介します。

図1. CExpertベースクラスのストラクチャー

作者: MetaQuotes Software Corp.

 
同志諸君記事を読みました!私はそこに書かれているようにすべてをやった。しかし、マスターMKL 5は私のシグナル付きファイルを見ることができなかった。記事の推奨に従って作成したファイルを添付します。私が何を間違えたのか、あるいは逆に、記事の著者が何か重要なことを追加していないのか、そのためにどうにもまとまりません。要するに、どのような形であれ、私を助けてください。
ファイル:
 
Tincup:
同志諸君記事を読みました!私はそこに書かれているようにすべてをやった。しかし、マスターMKL 5は私のシグナル付きファイルを見ることができなかった。記事の推奨に従って作成したファイルを添付します。私が何を間違えたのか、あるいは逆に、記事の著者が何か重要なことを追加していないのか、そのためにどうにもまとまりません。要するに、できる限りの方法で私を助けてください。


クラス記述子は 原文の重要な部分です。

あなたの記述子には2つの明らかな誤りがあります。そのうちの1つは、存在しないENUMが指定されているため、シグナルを検出できません。もう1つはコンパイル時に問題を引き起こします(パラメータ名が正しくない)。

もう1つ微妙な点がある。各ディスクリプタ行で、キーワードの前にはスペースを1つだけ入れるべきである。(将来的にはこの制限はなくなると思いますが、今のところはこのようになっています)。

// wizard description start
//+---------------------------------------------------------------------------+
//| Description of the class                                                |
//| Title=Сигнал пересечению ценой скользящей средней                     |
//| Type=Signal                                                             |
//| Name=Sample                                                             |
//| Class=CSampleSignal                                                     |
//| Page=                                                                   |
//| Parameter=PeriodMA,int,12                                                |
//| Parameter=ShiftMA,int,0                                                  | было SniftMA
//| Parameter=MethodMA,ENUM_MA_METHOD,MODE_EMA                               |
//| Parameter=AppliedMA,ENUM_APPLIED_PRICE,PRICE_CLOSE                      | было ENUM_MA_APLLIED_PRICE
//| Parameter=Limit,double,0.0                                               |
//| Parameter=StopLoss,double,50.0                                           |
//| Parameter=TakeProfit,double,50.0                                         |
//| Parameter=Expiration,int,10                                              |
//+---------------------------------------------------------------------------+
// wizard description end


さらに本文について。

コンストラクタを持たないのは良くない。メンバ・データはデフォルト値で初期化すべきです。結局のところ、一般的なケースでは、パラメータを設定するメソッドは呼び出されないかもしれない。

そして最後に、メソッドの記述が間違っている。

   void     LimitMA (int value)                    {m_limit=value;}
   void     StopLoss (int value)                   {m_stop_loss=value;}
   void     TakeProfit (int value)                 {m_take_profit=value;}

は必須です。

   void     LimitMA (double value)                    {m_limit=value;}
   void     StopLoss (double value)                   {m_stop_loss=value;}
   void     TakeProfit (double value)                 {m_take_profit=value;}

 

お返事ありがとうございます。すべて修正したらうまくいきました。

しかし、Expert Advisor自体をコンパイルするときに、コンパイラが見つけても自分では見つけられないようなエラーが出ました。ところで、あなたが私に答えているとき、あなた自身は気づかないうちに修正していたはずですが、記事の原文にはあります。

記事の中で

  void               Limit(double value)                 { m_limit=value;                  }

私の依頼に対して

  void               LimitМА(double value)                 { m_limit=value;}

シグナルファイルにMAがない場合、Expert Advisorの生成に成功した後、Expert Advisor自体をコンパイルすると、以下のエラーが発生します。

'Limit' - memberfunction is not defined 123456.mq5 77 11
1 error(s), 0 warning(s) 2 1

私の場合、少なくとも77行目では次のようになっている。

signal.Limit(Inp_Signal_Sample_Limit);

Limitの後にMAを挿入

Expert Advisorのテキストのエラーは消えます。

もし間違っていたら、申し訳ありません。私はプロではありません。

 
従って、その記述はLimitではなく、LimitMAであるべきだ。
 

そしてもう一つ、何をやってもこのエラーが出る:

'--' - l値が必要 1234.mq5 31 57

'--' - l-value required 1234.mq5 31 59
'--' - l-value required 1234.mq5 31 61
'--' - l-value required 1234.mq5 31 63
'--' - l-value required 1234.mq5 31 65
'--' - l-value required 1234.mq5 31 67
'--' - l-value required 1234.mq5 31 69
'--' - l-value required 1234.mq5 31 71
'--' - l-value required 1234.mq5 31 73
'--' - l-value required 1234.mq5 31 75
'--' - l-value required 1234.mq5 31 77
'--' - l-value required 1234.mq5 31 79
'--' - l-value required 1234.mq5 31 81
'--' - l-value required 1234.mq5 31 83
'--' - l-value required 1234.mq5 31 85
'--' - l-value required 1234.mq5 31 87
'--' - l-value required 1234.mq5 31 89
'--' - l-value required 1234.mq5 31 91
'--' - l-value required 1234.mq5 31 93
'--' - l-value required 1234.mq5 31 95
'--' - l-value required 1234.mq5 31 97
'--' - l-value required 1234.mq5 31 99
'--' - l-value required 1234.mq5 31 101
'--' - l-value required 1234.mq5 31 103
'--' - l-value required 1234.mq5 31 105
'--' - l-value required 1234.mq5 31 107
'--' - l-value required 1234.mq5 31 109
'--' - l-value required 1234.mq5 31 111
'--' - l-value required 1234.mq5 31 113
'--' - l-value required 1234.mq5 31 115
'-' - オペランドが必要 1234.mq5 31 117
'Inp_Signal_Sample_Expiration' - 宣言されていない識別子 1234.mq5 77 22
32 エラー(複数可)、0 警告(複数可) 33 1

EAの31行目まで進むと、以下のようになる。

input double Inp_Signal_Sample_StopLoss =50.0;
input double Inp_Signal_Sample_TakeProfit=50.0;
input int Inp_Signal_Sample_Expiration=10-------------------------------------------------------------;
//---
input double Inp_Money_FixLot_Percent =10.0;

input double Inp_Money_FixLot_Lots =0.1;

10からの点線の テールを取り除くと、すべてのエラーが消えます。

Expert Advisor が動作し、最適化する準備が整いました。

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования - Документация по MQL5
 
Tincup:
そう、それに従って、説明文もLimitではなく、LimitMAであるべきだ

はい、LimitMAです。

一般的に、今後のために・・・。クラス記述子を作成するときは、コピーペーストをもっと積極的に使いましょう。コンパイラは(記述子を構成する)コメントをチェックしないので、記述子のメソッド名とパラメータ名の一致は重要です。これはExpert Advisorをコンパイルするときにだけ「出てくる」もので、ネガティブな感情を引き起こす。しかし、ご覧の通り、致命的な問題ではありません。

 
Tincup:

そしてもう一つ、何をやってもこのエラーが出る:

'--' - l値が必要 1234.mq5 31 57

このエラーは、クラス・ディスクリプタ文字列の長さが 原因で発生する。連休が明けたら、解決する予定です。
Документация по MQL5: Основы языка / Типы данных / Тип string
Документация по MQL5: Основы языка / Типы данных / Тип string
  • www.mql5.com
Основы языка / Типы данных / Тип string - Документация по MQL5
 
よく書けているし、確かに目からウロコだ。
 

こんにちは!

  1. 添付ファイルに誤植があります!CheckOpenLong関数の説明で、変数slとtpを計算する行で、符号を逆にすべきです。
  2. CheckOpenLong関数を次のように変更しました:
    bool CSampleSignal::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
      {
    
       Print("Close(0)=",DoubleToString(Close(0),5)," Close(1)=",DoubleToString(Close(1),5));
       Print("Open(0)=",DoubleToString(Open(0),5)," Open(1)=",DoubleToString(Open(1),5));
       Print("MA(0)=",DoubleToString(MA(0),5)," MA(1)=",DoubleToString(MA(1),5));
    
       return(false);
       
      }
    つまり、単純に前回と前々回のバーのクローズ、オープン、MA の値を出力します。EveryTickの値がfalseの場合は、すべてがその通りに動作しますが、trueの場合は、値の代わりにゼロが出力されます!何が間違っているのでしょうか?私は何を間違えているのでしょうか?

ありがとうございました!

 
lVlaxim:

こんにちは!

  1. 添付ファイルに誤植があります!CheckOpenLong関数の説明の中で、変数slとtpを計算する行で、符号を逆にすべきです。
  2. CheckOpenLong関数を次のように変更しました:つまり、前回と前々回のバーのクローズ、オープン、MAの値だけを出力するようにしました。もしEveryTickの値がfalseであれば、すべてその通りに動作しますが、もしtrueであれば、値の代わりにゼロが出力されます!何が間違っているのか教えてください。私は何を間違えているのでしょうか?

ありがとうございました!

1について、エラーを発見してくれてありがとう。修正します。

2について、MQL5との小さな不整合がありました。次回のビルドで表示されるはずです。