記事"MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第10部): MQL4との互換性 - ポジションオープンイベントと指値注文発動イベント"についてのディスカッション - ページ 2

 
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

つまり、ライブラリのイベントモデル全体が仮想環境でも動作します。

 
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に変換したいというあなたの気持ちは理解できない。

 
Artyom Trishkin:

以上のことから、繰り返しになりますが、2つのスタイルに分かれることはありません。したがって、すでに変換されたものを2度MQL4に変換したいというあなたの気持ちは理解できない。

誤解があるのは用語の違いだけです。あなたのMT4用ライブラリはラッパーであり、MQL4で書かれています。これがMT4スタイルだ。これが私が必要とした部分だ。実際、私はそれを行った。

 
fxsaber:

誤解があるのは用語の違いだけです。あなたのMT4ライブラリはMQL4で書かれたラッパーです。これはMT4スタイルだ。これが私が必要としていた部分だ。実際、私はそれを実行した。

良い
 

こんにちは、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
 

そして一番不可解なのは、今ボタン・プローブをチャートに 置いたのだが......。何のメッセージも入ってこない。テスターに戻せば、すべてうまくいく。


ps; わかりました。OnChartEventをカスタム・イベントで有効にする必要がある。

 
Alexey Viktorov:
そして一番不可解なのは、今ボタン・プローブをチャートに 置いたのだが......。何のメッセージも入ってこない。テスターに戻したところ、すべて動作しました。
EAからタイマーへの参照をすべて削除してください - ライブラリが独自にタイマーを作成し、その中で動作します。全てはシンプルさと利便性のために行われています。
 
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);
     } 
  }
 
Alexey Viktorov:

タイマーを削除し、OnChartEventをこのフォームに挿入した。ボタン・コントロールはおそらく必要ないだろうし、カスタム・ イベントはライブラリーの荒野のどこかに作成されていると思う。しかし、結果は得られなかった。

後で例を作ろうと思う。
 

アルテム、ハイライトされているコード部分がどのような役割を果たしているのか教えてください。

#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("");
}/*******************************************************************/

タイマーが有効になっていないのに、どうしてこのコードが実行されるのですか?

しかし、このコードセクションを削除すると、イベントメッセージが表示されなくなります。しかし、このコードですべてが機能します。

そして、私はチケット、価格、そしておそらくポジションとオーダーの 他のプロパティを イベントメッセージと一緒に取得したいのです。