記事"MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第10部): MQL4との互換性 - ポジションオープンイベントと指値注文発動イベント"についてのディスカッション - ページ 2 123456 新しいコメント fxsaber 2019.05.24 01:48 #11 fxsaber:ZY 私もバーチャルであなたのライブラリを実行できるようにしたい。そのためには、ライブラリのMT4スタイルの部分にアクセスする必要があります。私はそれを実行することができました #define TESTER_CUSTOM // ユーザーテスターでのエキスパートアドバイザーの実行 #include <fxsaber\Tester\Tester.mqh> //https://www.mql5.com/ja/code/24848 #include <IgorM\TradePanel_C#\TradePanel_C#.mqh> //https://www.mql5.com/ja/code/24829 #include "TestDoEasyPart10.mq5" //https://www.mql5.com/ja/articles/6767 つまり、ライブラリのイベントモデル全体が仮想環境でも動作します。 Artyom Trishkin 2019.05.24 03:14 #12 fxsaber:MT4-style-logicを介してMT5で動作する、あなたのライブラリの変種を送りました。ポイントは、クロスプラットフォームのライブラリは、MQL5スタイルよりもMQL4スタイルの部分で動作する確率が非常に高いという ことです。したがって、クロスプラットフォームライブラリを使用する場合、私はMT5でそのMQL4スタイルのロジックを使用することを好みます。MT5の方が信頼性が高いからです。MT5では、MQL5スタイルのロジックはバグを検出するのに時間がかかりますが、MQL4スタイルのロジックはバグがあっても最小限のもので、致命的なものではないと思います。このライブラリでは、ロジックをMQL5とMQL4に分けることはありません。実際の状態や取引環境の状態の実際の変化で動作します。純粋にMQL5-OnTradeXXX関数は使用されていません。すべてが取引環境の状態から取得されています。つまり、イベントベースのモデル ではないのです。ロジックは同じですが、環境と連携するために必要な関数が異なるため、実装が若干異なります。 あなたのライブラリでは、すべてがMQL5スタイルをMQL4スタイルに移植することに従属しますが、ここでは(このライブラリでは)むしろ逆で、MQL5スタイルが(より柔軟なものとして)MQL4に移植されています。例えば、MQL4と同様のPositionIDがあり、作業中に(履歴を計算するときではなく)どの注文からポジションが生成されたかを知ることができます。残念ながら、MQL4にはそのようなデータはありません。まあ、あるいはあまり深く考えていなかったのかもしれないが......。 以上のことから、2つのスタイルに分かれることはなく、どちらのプラットフォームでも同じです。したがって、すでに変換されたものを2度MQL4に変換したいというあなたの気持ちは理解できない。 fxsaber 2019.05.24 03:25 #13 Artyom Trishkin:以上のことから、繰り返しになりますが、2つのスタイルに分かれることはありません。したがって、すでに変換されたものを2度MQL4に変換したいというあなたの気持ちは理解できない。誤解があるのは用語の違いだけです。あなたのMT4用ライブラリはラッパーであり、MQL4で書かれています。これがMT4スタイルだ。これが私が必要とした部分だ。実際、私はそれを行った。 Artyom Trishkin 2019.05.24 04:16 #14 fxsaber:誤解があるのは用語の違いだけです。あなたのMT4ライブラリはMQL4で書かれたラッパーです。これはMT4スタイルだ。これが私が必要としていた部分だ。実際、私はそれを実行した。 良い Alexey Viktorov 2019.05.27 08:03 #15 こんにちは、Artem。このライブラリをMQL4で使おうとしているのですが、うまくいきません。昨日、テスターで私のEAに接続し、ポジションのオープンとクローズに関するメッセージを受け取りました。しかし今日、テスターで使っていたものを新しいEAに移したのですが、ポジションを開く ボタンがなく、ポジションを 開いたり閉じたりするメッセージを受け取ろうとしているのですが、受け取れません。私の計画では、ポジション、価格、時間のチケットを取得する必要があります。テスターでもこれを得ることができませんでした。 #property strict #include <DoEasy\Engine.mqh> CEngine engine; /*******************Expert initialization function*******************/ int OnInit() { EventSetMillisecondTimer(100); return(INIT_SUCCEEDED); }/*******************************************************************/ /************************Expert tick function************************/ void OnTick() { //--- 最後の取引イベントの初期化 static ENUM_TRADE_EVENT last_event=WRONG_VALUE; //--- テスターで作業する場合 if(MQLInfoInteger(MQL_TESTER)) { engine.OnTimer(); //PressButtonsControl(); } //--- 最後の取引イベントが変更された場合 if(engine.LastTradeEvent()!=last_event) { last_event=engine.LastTradeEvent(); Comment("last_event: ",EnumToString(last_event)); Print(__FUNCTION__, " last_event: ",EnumToString(last_event)); engine.ResetLastTradeEvent(); //Print("last_event: ",EnumToString(last_event)); } }/*******************************************************************/ /***************************Timer function***************************/ void OnTimer() { //--- 最後の取引イベントの初期化 static ENUM_TRADE_EVENT last_event=WRONG_VALUE; //--- テスターで作業する場合 if(MQLInfoInteger(MQL_TESTER)) { engine.OnTimer(); //PressButtonsControl(); } //--- 最後の取引イベントが変更された場合 if(engine.LastTradeEvent()!=last_event) { last_event=engine.LastTradeEvent(); Comment("last_event: ",EnumToString(last_event)); Print(__FUNCTION__, " last_event: ",EnumToString(last_event)); engine.ResetLastTradeEvent(); //Print("last_event: ",EnumToString(last_event)); } }/*******************************************************************/ void OnDeinit(const int reason) { EventKillTimer(); Comment(""); }/*******************************************************************/ ファイル: 00.mq4 5 kb Alexey Viktorov 2019.05.27 08:19 #16 そして一番不可解なのは、今ボタン・プローブをチャートに 置いたのだが......。何のメッセージも入ってこない。テスターに戻せば、すべてうまくいく。 ps; わかりました。OnChartEventをカスタム・イベントで有効にする必要がある。 Artyom Trishkin 2019.05.27 08:25 #17 Alexey Viktorov: そして一番不可解なのは、今ボタン・プローブをチャートに 置いたのだが......。何のメッセージも入ってこない。テスターに戻したところ、すべて動作しました。 EAからタイマーへの参照をすべて削除してください - ライブラリが独自にタイマーを作成し、その中で動作します。全てはシンプルさと利便性のために行われています。 Alexey Viktorov 2019.05.27 09:00 #18 Artyom Trishkin: EAからタイマーへの参照をすべて削除する - ライブラリはそのために独自のタイマーを作成し、その中で動作する。全ては単純化と利便性のために行われている。タイマーを削除し、このフォームにOnChartEventを挿入した。ボタン・コントロールはおそらく必要なく、ユーザー・ イベントはライブラリの荒野のどこかで作成されていると思う。しかし、結果は出なかった。 void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //if(MQLInfoInteger(MQL_TESTER)) // を返す; //if(id==CHARTEVENT_OBJECT_CLICK && StringFind(sparam, "BUTT_")>0) // { // PressButtonEvents(sparam); // } if(id>=CHARTEVENT_CUSTOM) { ushort event=ushort(id-CHARTEVENT_CUSTOM); Print(DFUN,"id=",id,", event=",EnumToString((ENUM_TRADE_EVENT)event),", lparam=",lparam,", dparam=",DoubleToString(dparam,Digits()),", sparam=",sparam); } } Artyom Trishkin 2019.05.27 09:09 #19 Alexey Viktorov:タイマーを削除し、OnChartEventをこのフォームに挿入した。ボタン・コントロールはおそらく必要ないだろうし、カスタム・ イベントはライブラリーの荒野のどこかに作成されていると思う。しかし、結果は得られなかった。 後で例を作ろうと思う。 Alexey Viktorov 2019.05.27 13:43 #20 アルテム、ハイライトされているコード部分がどのような役割を果たしているのか教えてください。 #property strict #include <DoEasy\Engine.mqh> CEngine engine; /*******************Expert initialization function*******************/ int OnInit() { //EventSetMillisecondTimer(100); return(INIT_SUCCEEDED); }/*******************************************************************/ /************************Expert tick function************************/ void OnTick() { //--- 最後の取引イベントの初期化 static ENUM_TRADE_EVENT last_event=WRONG_VALUE; //--- テスターで作業する場合 if(MQLInfoInteger(MQL_TESTER)) { engine.OnTimer(); } //--- 最後の取引イベントが変更された場合 if(engine.LastTradeEvent()!=last_event) { last_event=engine.LastTradeEvent(); Comment("last_event: ",EnumToString(last_event)); Print(__FUNCTION__, " last_event: ",EnumToString(last_event)); //engine.ResetLastTradeEvent(); //Print("last_event: ",EnumToString(last_event)); } }/*******************************************************************/ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { if(id>=CHARTEVENT_CUSTOM) { ushort event=ushort(id-CHARTEVENT_CUSTOM); Print(DFUN,"id=",id,", event=",EnumToString((ENUM_TRADE_EVENT)event),", lparam=",lparam,", dparam=",DoubleToString(dparam,Digits()),", sparam=",sparam); } } /***************************Timer function***************************/ void OnTimer() { //--- 最後の取引イベントの初期化 static ENUM_TRADE_EVENT last_event=WRONG_VALUE; //--- テスターで作業する場合 if(!MQLInfoInteger(MQL_TESTER)) { engine.OnTimer(); } }/*******************************************************************/ void OnDeinit(const int reason) { //EventKillTimer(); Comment(""); }/*******************************************************************/ タイマーが有効になっていないのに、どうしてこのコードが実行されるのですか? しかし、このコードセクションを削除すると、イベントメッセージが表示されなくなります。しかし、このコードですべてが機能します。 そして、私はチケット、価格、そしておそらくポジションとオーダーの 他のプロパティを イベントメッセージと一緒に取得したいのです。 123456 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
ZY 私もバーチャルであなたのライブラリを実行できるようにしたい。そのためには、ライブラリのMT4スタイルの部分にアクセスする必要があります。
私はそれを実行することができました
つまり、ライブラリのイベントモデル全体が仮想環境でも動作します。
MT4-style-logicを介してMT5で動作する、あなたのライブラリの変種を送りました。
ポイントは、クロスプラットフォームのライブラリは、MQL5スタイルよりもMQL4スタイルの部分で動作する確率が非常に高いという ことです。したがって、クロスプラットフォームライブラリを使用する場合、私はMT5でそのMQL4スタイルのロジックを使用することを好みます。MT5の方が信頼性が高いからです。
MT5では、MQL5スタイルのロジックはバグを検出するのに時間がかかりますが、MQL4スタイルのロジックはバグがあっても最小限のもので、致命的なものではないと思います。
このライブラリでは、ロジックをMQL5とMQL4に分けることはありません。実際の状態や取引環境の状態の実際の変化で動作します。純粋にMQL5-OnTradeXXX関数は使用されていません。すべてが取引環境の状態から取得されています。つまり、イベントベースのモデル ではないのです。ロジックは同じですが、環境と連携するために必要な関数が異なるため、実装が若干異なります。
あなたのライブラリでは、すべてがMQL5スタイルをMQL4スタイルに移植することに従属しますが、ここでは(このライブラリでは)むしろ逆で、MQL5スタイルが(より柔軟なものとして)MQL4に移植されています。例えば、MQL4と同様のPositionIDがあり、作業中に(履歴を計算するときではなく)どの注文からポジションが生成されたかを知ることができます。残念ながら、MQL4にはそのようなデータはありません。まあ、あるいはあまり深く考えていなかったのかもしれないが......。
以上のことから、2つのスタイルに分かれることはなく、どちらのプラットフォームでも同じです。したがって、すでに変換されたものを2度MQL4に変換したいというあなたの気持ちは理解できない。
以上のことから、繰り返しになりますが、2つのスタイルに分かれることはありません。したがって、すでに変換されたものを2度MQL4に変換したいというあなたの気持ちは理解できない。
誤解があるのは用語の違いだけです。あなたのMT4用ライブラリはラッパーであり、MQL4で書かれています。これがMT4スタイルだ。これが私が必要とした部分だ。実際、私はそれを行った。
誤解があるのは用語の違いだけです。あなたのMT4ライブラリはMQL4で書かれたラッパーです。これはMT4スタイルだ。これが私が必要としていた部分だ。実際、私はそれを実行した。
こんにちは、Artem。このライブラリをMQL4で使おうとしているのですが、うまくいきません。
昨日、テスターで私のEAに接続し、ポジションのオープンとクローズに関するメッセージを受け取りました。しかし今日、テスターで使っていたものを新しいEAに移したのですが、ポジションを開く ボタンがなく、ポジションを 開いたり閉じたりするメッセージを受け取ろうとしているのですが、受け取れません。私の計画では、ポジション、価格、時間のチケットを取得する必要があります。テスターでもこれを得ることができませんでした。
そして一番不可解なのは、今ボタン・プローブをチャートに 置いたのだが......。何のメッセージも入ってこない。テスターに戻せば、すべてうまくいく。
ps; わかりました。OnChartEventをカスタム・イベントで有効にする必要がある。
そして一番不可解なのは、今ボタン・プローブをチャートに 置いたのだが......。何のメッセージも入ってこない。テスターに戻したところ、すべて動作しました。
EAからタイマーへの参照をすべて削除する - ライブラリはそのために独自のタイマーを作成し、その中で動作する。全ては単純化と利便性のために行われている。
タイマーを削除し、このフォームにOnChartEventを挿入した。ボタン・コントロールはおそらく必要なく、ユーザー・ イベントはライブラリの荒野のどこかで作成されていると思う。しかし、結果は出なかった。
タイマーを削除し、OnChartEventをこのフォームに挿入した。ボタン・コントロールはおそらく必要ないだろうし、カスタム・ イベントはライブラリーの荒野のどこかに作成されていると思う。しかし、結果は得られなかった。
アルテム、ハイライトされているコード部分がどのような役割を果たしているのか教えてください。
タイマーが有効になっていないのに、どうしてこのコードが実行されるのですか?
しかし、このコードセクションを削除すると、イベントメッセージが表示されなくなります。しかし、このコードですべてが機能します。
そして、私はチケット、価格、そしておそらくポジションとオーダーの 他のプロパティを イベントメッセージと一緒に取得したいのです。