同志諸君記事を読みました!私はそこに書かれているようにすべてをやった。しかし、マスター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自体をコンパイルすると、以下のエラーが発生します。
1 error(s), 0 warning(s) 2 1
私の場合、少なくとも77行目では次のようになっている。
signal.Limit(Inp_Signal_Sample_Limit);
Limitの後にMAを挿入
Expert Advisorのテキストのエラーは消えます。
もし間違っていたら、申し訳ありません。私はプロではありません。
そしてもう一つ、何をやってもこのエラーが出る:
'--' - 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 が動作し、最適化する準備が整いました。

- www.mql5.com
そう、それに従って、説明文もLimitではなく、LimitMAであるべきだ
はい、LimitMAです。
一般的に、今後のために・・・。クラス記述子を作成するときは、コピーペーストをもっと積極的に使いましょう。コンパイラは(記述子を構成する)コメントをチェックしないので、記述子のメソッド名とパラメータ名の一致は重要です。これはExpert Advisorをコンパイルするときにだけ「出てくる」もので、ネガティブな感情を引き起こす。しかし、ご覧の通り、致命的な問題ではありません。
そしてもう一つ、何をやってもこのエラーが出る:
'--' - l値が必要 1234.mq5 31 57

- www.mql5.com
こんにちは!
- 添付ファイルに誤植があります!CheckOpenLong関数の説明で、変数slとtpを計算する行で、符号を逆にすべきです。
- 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の場合は、値の代わりにゼロが出力されます!何が間違っているのでしょうか?私は何を間違えているのでしょうか?
ありがとうございました!
こんにちは!
- 添付ファイルに誤植があります!CheckOpenLong関数の説明の中で、変数slとtpを計算する行で、符号を逆にすべきです。
- CheckOpenLong関数を次のように変更しました:つまり、前回と前々回のバーのクローズ、オープン、MAの値だけを出力するようにしました。もしEveryTickの値がfalseであれば、すべてその通りに動作しますが、もしtrueであれば、値の代わりにゼロが出力されます!何が間違っているのか教えてください。私は何を間違えているのでしょうか?
ありがとうございました!
1について、エラーを発見してくれてありがとう。修正します。
2について、MQL5との小さな不整合がありました。次回のビルドで表示されるはずです。

- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
新しい記事 MQL5ウィザード:トレーディングシグナル用モジュール作成方法 はパブリッシュされました:
この記事は、価格のクロスオーバーと移動平均に関するシグナルの実行とともに、トレーディングシグナルクラスの記述方法、 MQL5ウィザードのトレーディングストラテジー生成プログラムへの挿入方法、MQL5ウィザードにおいて生成されるクラスの記述フォーマットやストラクチャーについて紹介します。
作者: MetaQuotes Software Corp.