記事"MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第8部): 注文およびポジション変更イベント"についてのディスカッション - ページ 2

 



メソッド"void CEventsCollection::CreateNewEvent(COrderControl* order)"は、注文変更のタイプに応じて取引イベントを 作成するために使用されています。

//--- イベントの作成
   if(event!=NULL)
     {
      event.SetProperty(EVENT_PROP_TIME_EVENT,order.Time());                        // イベント開催時間
      event.SetProperty(EVENT_PROP_REASON_EVENT,EVENT_REASON_STOPLIMIT_TRIGGERED);  // イベントの原因(ENUM_EVENT_REASON列挙より)

もし私が正しいのであれば、訂正してください。そうでなければ、私が何を理解していなかったのか説明してください。


特に主な作業がプログラミングと関係ない場合、私の労力を何度も簡素化してくれたライブラリに感謝します。

 
BmC:



メソッド"void CEventsCollection::CreateNewEvent(COrderControl* order)"は、注文変更のタイプに応じて取引イベントを作成するために使用されます。

もし私が正しいのであれば、訂正してください。そうでなければ、私が何を理解していなかったのか説明してください。


特に主な作業がプログラミングと関係ない場合、私の労力を何度も簡素化してくれたライブラリに感謝します。

Shift+Ctrl+Fで検索しても、すべてのライブラリファイルにそのようなコードは見つかりませんでした。

event.SetProperty(EVENT_PROP_REASON_EVENT,EVENT_REASON_STOPLIMIT_TRIGGERED);

どこにあるのでしょうか?

 
以下は、この記事の一番最後にある説明とコードの行です:
//+------------------------------------------------------------------+
//|| 注文の変更タイプに応じて取引イベントを作成する。
//+------------------------------------------------------------------+
void CEventsCollection::CreateNewEvent(COrderControl* order)
  {
   if(!::SymbolInfoTick(order.Symbol(),this.m_tick))
     {
      Print(DFUN,TextByLanguage("イベントシンボルによる現在価格の取得に失敗しました","Failed to get current prices by event symbol "),order.Symbol());
      return;
     }
   CEvent* event=NULL;
//--- 逆指値注文がトリガーされる
   if(order.GetChangeType()==CHANGE_TYPE_ORDER_TYPE)
     {
      this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_PLASED;
      event=new CEventOrderPlased(this.m_trade_event_code,order.Ticket());
     }
//--- 修正
   else
     {
      //--- 保留注文価格を修正
      if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE;
      //--- 保留注文の価格とストップロスを変更。
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL;
      //--- 保留注文の価格とTakeProfitを変更する。
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_TP;
      //--- 保留注文の価格、StopLoss、TakeProfitを変更。
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
      //--- 保留注文のStopLossを変更した。
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL;
      //--- 保留注文のTakeProfitを変更した。
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_TP;
      //--- 保留注文のStopLossとTakeProfitを変更した。
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;

      //--- ストップロス・ポジションの変更
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL;
      //--- テイクプロフィットの位置を変更
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_TP;
      //--- ポジションのストップロスとテイクプロフィットを変更する。
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
      
      //--- 修正イベントを作成する
      event=new CEventModify(this.m_trade_event_code,order.Ticket());
     }
//--- イベントの作成
   if(event!=NULL)
     {
      event.SetProperty(EVENT_PROP_TIME_EVENT,order.Time());                        // イベント開催時間
      event.SetProperty(EVENT_PROP_REASON_EVENT,EVENT_REASON_STOPLIMIT_TRIGGERED);  // イベントの原因(ENUM_EVENT_REASON列挙より)
      event.SetProperty(EVENT_PROP_TYPE_DEAL_EVENT,PositionTypeByOrderType((ENUM_ORDER_TYPE)order.TypeOrderPrev())); // オーダータイプ、そのトリガーによって発生したイベント
      event.SetProperty(EVENT_PROP_TICKET_DEAL_EVENT,order.Ticket());               // イベントをトリガーした注文のチケット
      event.SetProperty(EVENT_PROP_TYPE_ORDER_EVENT,order.TypeOrder());             // イベント・オーダー・タイプ
      event.SetProperty(EVENT_PROP_TICKET_ORDER_EVENT,order.Ticket());              // イベントオーダーチケット
      event.SetProperty(EVENT_PROP_TYPE_ORDER_POSITION,order.TypeOrder());          // 最初のポジションオーダーのタイプ
      event.SetProperty(EVENT_PROP_TICKET_ORDER_POSITION,order.Ticket());           // 最初のポジション順のチケット
      event.SetProperty(EVENT_PROP_POSITION_ID,order.PositionID());                 // ポジション識別子
      event.SetProperty(EVENT_PROP_POSITION_BY_ID,0);                               // カウンター位置の識別子
      event.SetProperty(EVENT_PROP_MAGIC_BY_ID,0);                                  // カウンター位置のマジックナンバー
         
      event.SetProperty(EVENT_PROP_TYPE_ORD_POS_BEFORE,order.TypeOrderPrev());      // 方向転換前のポジションオーダーの種類
      event.SetProperty(EVENT_PROP_TICKET_ORD_POS_BEFORE,order.Ticket());           // 方向転換前のポジション・オーダー・チケット
      event.SetProperty(EVENT_PROP_TYPE_ORD_POS_CURRENT,order.TypeOrder());         // 現在位置のオーダータイプ
      event.SetProperty(EVENT_PROP_TICKET_ORD_POS_CURRENT,order.Ticket());          // 現在位置のオーダーチケット
      
      event.SetProperty(EVENT_PROP_PRICE_OPEN_BEFORE,order.PricePrev());            // 修正前の注文設定価格
      event.SetProperty(EVENT_PROP_PRICE_SL_BEFORE,order.StopLossPrev());           // 修正前の損切り価格
      event.SetProperty(EVENT_PROP_PRICE_TP_BEFORE,order.TakeProfitPrev());         // 修正前のテイクプロフィット価格
      event.SetProperty(EVENT_PROP_PRICE_EVENT_ASK,this.m_tick.ask);                // イベント開催時のアスク価格
      event.SetProperty(EVENT_PROP_PRICE_EVENT_BID,this.m_tick.bid);                // イベント開催時の入札価格
         
      event.SetProperty(EVENT_PROP_MAGIC_ORDER,order.Magic());                      // マジックオーダー番号
      event.SetProperty(EVENT_PROP_TIME_ORDER_POSITION,order.TimePrev());           // 最初のポジションオーダーの時間
      event.SetProperty(EVENT_PROP_PRICE_EVENT,order.PricePrev());                  // イベントが発生した価格
      event.SetProperty(EVENT_PROP_PRICE_OPEN,order.Price());                       // 注文設定価格
      event.SetProperty(EVENT_PROP_PRICE_CLOSE,order.Price());                      // 注文の終値
      event.SetProperty(EVENT_PROP_PRICE_SL,order.StopLoss());                      // 損切り注文価格
      event.SetProperty(EVENT_PROP_PRICE_TP,order.TakeProfit());                    // テイクプロフィット注文の価格
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_INITIAL,order.Volume());            // 要求注文量
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_EXECUTED,0);                        // 実行された注文量
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_CURRENT,order.Volume());            // 残りの(未約定の)注文数量
      event.SetProperty(EVENT_PROP_VOLUME_POSITION_EXECUTED,0);                     // 実行位置ボリューム
      event.SetProperty(EVENT_PROP_PROFIT,0);                                       // 利益
      event.SetProperty(EVENT_PROP_SYMBOL,order.Symbol());                          // 注文記号
      event.SetProperty(EVENT_PROP_SYMBOL_BY_ID,order.Symbol());                    // カウンターの位置記号
      //--- 制御プログラムのスケジュール識別子を設定し、イベントコードを解読し、イベントタイプを設定する。
      event.SetChartID(this.m_chart_id);
      event.SetTypeEvent();
      //--- イベント・オブジェクトがリストにない場合は、追加する。
      if(!this.IsPresentEventInList(event))
        {
         this.m_list_trade_events.InsertSort(event);
         //--- イベントメッセージを送信し、最後の取引イベントの値を設定する。
         event.SendEvent();
         this.m_trade_event=event.TradeEvent();
        }
      //--- このイベントが既にリストにある場合、新しいイベント・オブジェクトを削除し、デバッグ・メッセージを表示する。
      else
        {
         ::Print(DFUN_ERR_LINE,TextByLanguage("そのようなイベントはすでにリストにある","This event is already in the list."));
         delete event;
        }
     }
  }
この行に下線を引いてください!
 
Artyom Trishkin:

Shift+Ctrl+Fで検索しても、すべてのライブラリファイルにそのようなコードは見つかりませんでした。

どこにあるのでしょうか?

もしかしたら、ライブラリの説明の次の章ですでに修正されているかもしれませんね?私にとって、あなたのライブラリーは私の戦略にとても適していますし、ライブラリーの他に正しいプログラミングのための方法論も作られているので、とてもよく理解しています。
 
BmC:
以下は、この記事の一番最後にある説明とコードの行である:この行に下線を引いてください!

現在のところ、ライブラリの現行バージョンでは、このメソッドはこのようになっている:

//+------------------------------------------------------------------+
//|| 注文変更タイプに応じて取引イベントを作成する。
//+------------------------------------------------------------------+
void CEventsCollection::CreateNewEvent(COrderControl* order)
  {
   ENUM_EVENT_REASON reason=WRONG_VALUE;
   if(!::SymbolInfoTick(order.Symbol(),this.m_tick))
     {
      ::Print(DFUN,CMessage::Text(MSG_LIB_SYS_NOT_GET_CURR_PRICES),order.Symbol());
      return;
     }
   CEvent* event=NULL;
//--- 逆指値注文がトリガーされる
   if(order.GetChangeType()==CHANGE_TYPE_ORDER_TYPE)
     {
      reason=EVENT_REASON_STOPLIMIT_TRIGGERED;
      this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_PLASED;
      event=new CEventOrderPlased(this.m_trade_event_code,order.Ticket());
     }
//--- 修正
   else
     {
      //--- 保留注文価格を修正
      if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE;
      //--- 保留注文の価格とストップロスを変更。
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL;
      //--- 保留注文の価格とTakeProfitを変更する。
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_TP;
      //--- 保留注文の価格、StopLoss、TakeProfitを変更。
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
      //--- 保留注文のStopLossを変更した。
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL;
      //--- 保留注文のTakeProfitを変更した。
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_TP;
      //--- 保留注文のStopLossとTakeProfitを変更した。
      else if(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;

      //--- ストップロス・ポジションの変更
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL;
      //--- テイクプロフィットの位置を変更
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_TP;
      //--- ポジションのストップロスとテイクプロフィットを変更する。
      else if(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS_TAKE_PROFIT)
         this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
      
      //--- 修正イベントを作成する
      reason=EVENT_REASON_MODIFY;
      event=new CEventModify(this.m_trade_event_code,order.Ticket());
     }
//--- イベントの作成
   if(event!=NULL)
     {
      event.SetProperty(EVENT_PROP_TIME_EVENT,order.Time());                        // イベント開催時間
      event.SetProperty(EVENT_PROP_REASON_EVENT,reason);                            // イベントの原因(ENUM_EVENT_REASON列挙より)
      event.SetProperty(EVENT_PROP_TYPE_DEAL_EVENT,PositionTypeByOrderType((ENUM_ORDER_TYPE)order.TypeOrderPrev())); // オーダータイプ、そのトリガーによって発生したイベント
      event.SetProperty(EVENT_PROP_TICKET_DEAL_EVENT,order.Ticket());               // イベントをトリガーした注文のチケット
      event.SetProperty(EVENT_PROP_TYPE_ORDER_EVENT,order.TypeOrder());             // イベント・オーダー・タイプ
      event.SetProperty(EVENT_PROP_TICKET_ORDER_EVENT,order.Ticket());              // イベントオーダーチケット
      event.SetProperty(EVENT_PROP_TYPE_ORDER_POSITION,order.TypeOrder());          // 最初のポジションオーダーのタイプ
      event.SetProperty(EVENT_PROP_TICKET_ORDER_POSITION,order.Ticket());           // 最初のポジション順のチケット
      event.SetProperty(EVENT_PROP_POSITION_ID,order.PositionID());                 // ポジション識別子
      event.SetProperty(EVENT_PROP_POSITION_BY_ID,0);                               // カウンター位置の識別子
      event.SetProperty(EVENT_PROP_MAGIC_BY_ID,0);                                  // カウンター位置のマジックナンバー
         
      event.SetProperty(EVENT_PROP_TYPE_ORD_POS_BEFORE,order.TypeOrderPrev());      // 方向転換前のポジションオーダーの種類
      event.SetProperty(EVENT_PROP_TICKET_ORD_POS_BEFORE,order.Ticket());           // 方向転換前のポジション・オーダー・チケット
      event.SetProperty(EVENT_PROP_TYPE_ORD_POS_CURRENT,order.TypeOrder());         // 現在位置のオーダータイプ
      event.SetProperty(EVENT_PROP_TICKET_ORD_POS_CURRENT,order.Ticket());          // 現在位置のオーダーチケット
      
      event.SetProperty(EVENT_PROP_PRICE_OPEN_BEFORE,order.PricePrev());            // 修正前の注文設定価格
      event.SetProperty(EVENT_PROP_PRICE_SL_BEFORE,order.StopLossPrev());           // 修正前の損切り価格
      event.SetProperty(EVENT_PROP_PRICE_TP_BEFORE,order.TakeProfitPrev());         // 修正前のテイクプロフィット価格
      event.SetProperty(EVENT_PROP_PRICE_EVENT_ASK,this.m_tick.ask);                // イベント開催時のアスク価格
      event.SetProperty(EVENT_PROP_PRICE_EVENT_BID,this.m_tick.bid);                // イベント開催時の入札価格
         
      event.SetProperty(EVENT_PROP_MAGIC_ORDER,order.Magic());                      // マジックオーダー番号
      event.SetProperty(EVENT_PROP_TIME_ORDER_POSITION,order.TimePrev());           // 最初のポジションオーダーの時間
      event.SetProperty(EVENT_PROP_PRICE_EVENT,order.PricePrev());                  // イベントが発生した価格
      event.SetProperty(EVENT_PROP_PRICE_OPEN,order.Price());                       // 注文設定価格
      event.SetProperty(EVENT_PROP_PRICE_CLOSE,order.Price());                      // 注文の終値
      event.SetProperty(EVENT_PROP_PRICE_SL,order.StopLoss());                      // 損切り注文価格
      event.SetProperty(EVENT_PROP_PRICE_TP,order.TakeProfit());                    // テイクプロフィット注文の価格
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_INITIAL,order.Volume());            // 要求注文量
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_EXECUTED,0);                        // 実行された注文量
      event.SetProperty(EVENT_PROP_VOLUME_ORDER_CURRENT,order.Volume());            // 残りの(未約定の)注文数量
      event.SetProperty(EVENT_PROP_VOLUME_POSITION_EXECUTED,0);                     // 実行位置ボリューム
      event.SetProperty(EVENT_PROP_PROFIT,0);                                       // 利益
      event.SetProperty(EVENT_PROP_SYMBOL,order.Symbol());                          // 注文記号
      event.SetProperty(EVENT_PROP_SYMBOL_BY_ID,order.Symbol());                    // カウンターの位置記号
      //--- イベントコードを解読し、イベントタイプを設定する。
      event.SetTypeEvent();
      //--- イベント・オブジェクトがリストにない場合は、追加する。
      if(!this.IsPresentEventInList(event))
        {
         this.m_list_trade_events.InsertSort(event);
         //--- イベントメッセージを送信し、最後の取引イベントの値を設定する。
         this.m_trade_event=event.TradeEvent();
         this.m_is_event=true;
         event.SendEvent();
         CBaseObjExt::EventAdd(this.m_trade_event,order.Ticket(),order.Price(),order.Symbol());
        }
      //--- このイベントが既にリストにある場合、新しいイベント・オブジェクトを削除し、デバッグ・メッセージを表示する。
      else
        {
         ::Print(DFUN_ERR_LINE,CMessage::Text(MSG_LIB_SYS_EVENT_ALREADY_IN_LIST));
         delete event;
        }
     }
  }
//+------------------------------------------------------------------+

ということは、これはバグでとっくの昔に修正されているか、議論されているバージョンのライブラリでは致命的でないか、どちらかだ。正確には覚えていないのですが......。

 
Artyom Trishkin:

現在のところ、ライブラリーの現行バージョンでは、このメソッドは次のようになっている:

つまり、これはバグでとっくの昔に修正されているか、あるいは、議論されているバージョンのライブラリでは致命的ではない、ということだ。正確には覚えていないのですが...。

これはとても重要なことで、作者からすればさらに重要なことです。もしあなたが元のアイデアを捨てていないのであれば。私のような初心者プログラマーの 仕事を助けるために。初心者(学生)で、プログラミング言語やプログラミング全般を勉強しているところだと、自分の作品(ライブラリ)を勉強するときに疑問や質問がたくさん出てきます。今回の場合も、それが間違いなのか、あなたの意図なのか、最後までわかりませんでした。あなたのコードを何度も見直しました。そして、私にとっては非常に重要なことです。「作者の意味を理解していなかったか、作者の大きなプロジェクトにおける単なるタイプミスであるかのどちらかです」
そして、どうして批判的ではないと言えるのでしょうか?これはあなたの間違いであり、あなたと私は読者を混乱させているだけだ。私と同じように、あなたの図書館で勉強したり学んだりしている人たち。

 
BmC:

これはとても重要なことで、著者からすればさらに重要なことだ。もしあなたがオリジナルのアイデアをあきらめていないのなら。私のようなプログラミング初心者の 仕事を助けるために。初心者(学生)で、プログラミング言語やプログラミング全般を勉強しているところだと、自分の作品(ライブラリ)を勉強するときに疑問や質問がたくさん出てきます。今回の場合も、それが間違いなのか、あなたの意図なのか、最後までわかりませんでした。あなたのコードを何度も見直しました。そして、私にとっては非常に重要なことです。「作者の意味を理解していなかったか、作者の大きなプロジェクトにおける単なるタイプミスであるかのどちらかです」
そして、どうして批判的ではないと言えるのでしょうか?これはあなたの間違いであり、あなたと私は読者を混乱させているだけだ。私と同じように、あなたの図書館で勉強したり学んだりしている人たち。

:)

修正箇所を色で強調 したコードをお見せしました。この記事に添付されているライブラリーのバージョンに入れてね。

もちろん、それが私のミスなのか、それともこのバージョンでは致命的でないためにデバッグ中に私の目を素通りしてしまったのかは覚えていない。何しろ、もう40数回目の記事だし、この記事もずいぶん前のことだ。おそらくバグで、その後の記事で修正 されたのだろう。ライブラリ内の多くのものは、すでにその場で作成されている。もちろん、ライブラリーのテストバージョンは複数あった。しかし、その作成に関する記述が始まって以来、多くのことが修正され、追加されてきた。そのため、この連載はライブラリの作成についての説明という位置づけになっている。こうすることで、私は読者をライブラリーの作成過程に巻き込もうとしている。試行錯誤を重ね、その修正方法を説明することで、全過程を可視化し、いわば「創作の苦悩のすべて」を明らかにするのだ) :):)

というわけで、何が起こっているのか理解しにくくて申し訳ない......。
ただ、上で提案した変更を加えてください。あるいは、修正される記事まで残しておいてください。

 
最後のイベントのシンボル、チケット、タイプ(オープン、クローズ、モディファイ)を取得したいのですが、どうすればよいですか?
 
Andrii Miknevich:
最後のイベントのシンボル、チケット、タイプ(オープン、クローズ、変更)を取得したいのですが、どうすれば正しくできますか?

Artyomはとても忙しそうで、フォーラムには全く顔を出していないようですね。)一度彼のライブラリで実験したことがあるから、ヒントをあげられるかもしれない。今日、その実験を通して、そのような関数を見つけました。コメントには、その関数はすべてのオープンポジションの リストを取得すると書いてある。

void OrderActivated()
{
Print(__FUNCTION__, "***", ENUM_TRADE_EVENT(engine.LastTradeEvent()));
//---すべてのオープンポジションのリストを取得する
CArrayObj* list = engine.GetListMarketPosition();
if(list == NULL || list.Total() == 0)
return;
int index = CSelect::FindOrderMax(list, ORDER_PROP_TIME_OPEN);
COrder *pos = list.At(index);
if(pos == NULL)
return;

pos.Print();
}/*******************************************************************/

残念ながら、それが何のためにあるのか説明することはできない、私はすべてを忘れてしまった。

まあ...無理なら待ってくれ。アルテムが時間を見つけて返信してくれるだろう。

 

ティックが受信され、そのティックに未決注文が 設定され、同時に有効化(トリガー)された場合(買い逆指値でテストしました)、エンジンはすべてのイベントを登録しません...

TRADE_EVENT_PENDING_ORDER_PLASEDイベントは受信されますが、TRADE_EVENT_PENDING_ORDER_ACTIVATEDは受信されません。

私のコードは次のようなものです:

//+------------------------------------------------------------------+
//| 貿易イベントを処理する|
//+------------------------------------------------------------------+ 
void ProcessTradeEvents(void)
  {
   static ENUM_TRADE_EVENT last_event=WRONG_VALUE;
   static CEvent *last_processed=NULL;
   
   if(engine.LastTradeEvent()!=last_event)
     {      
      if(last_event==TRADE_EVENT_NO_EVENT)
         return;
      CArrayObj *list=engine.GetListAllOrdersEvents();
      if(list==NULL)
         return;
      list=CSelect::ByEventProperty(list,EVENT_PROP_SYMBOL,Symbol(),EQUAL);
      if(list==NULL || list.Total()<=0)
         return;      
      last_event=engine.LastTradeEvent();
      //--- 古いイベントのインデックスを取得する
      int index_of_old_event=0;
      if(last_processed==NULL)
         index_of_old_event=-1;
      else
        {
         for(int i=list.Total()-1;i>=0;i--)
           {
            CEvent *event=list.At(i);
            if(event==NULL)
               return;
            ENUM_TRADE_EVENT event_type=event.TypeEvent();
            if(last_processed!=NULL && event.IsEqual(last_processed))
              {
               index_of_old_event=i;
               break;
              }
           }
        }
      //--- すべての新しいイベントをチェックする
      for(int i=index_of_old_event+1;i<list.Total();i++)
        {
         CEvent *event=list.At(i);
         if(event==NULL)
            break;
         if(last_processed!=NULL && event.IsEqual(last_processed))
            break; 
         Print(__FUNCTION__+": event : ",event.TypeEventDescription());
         switch(event.TypeEvent())
           {
            case TRADE_EVENT_PENDING_ORDER_PLASED:
              {
               // いくつかのコード
              }
            break;
            case TRADE_EVENT_PENDING_ORDER_REMOVED:
              {
               // いくつかのコード
              }
            break;
            case TRADE_EVENT_PENDING_ORDER_ACTIVATED:
              {
               // いくつかのコード
              }
            break;

            case TRADE_EVENT_POSITION_CLOSED:
              {
               // いくつかのコード
              }
            break;
            case TRADE_EVENT_POSITION_CLOSED_BY_SL:
              {
               // いくつかのコード
              }
            break;
            case TRADE_EVENT_POSITION_CLOSED_BY_TP:
              {
                // いくつかのコード
              }
            break;
            case TRADE_EVENT_MODIFY_ORDER_PRICE:
              {
                // いくつかのコード
              }
            break;

            case TRADE_EVENT_MODIFY_POSITION_SL:
              {
                // いくつかのコード
              }
            break;
            case TRADE_EVENT_MODIFY_POSITION_TP:
              {
                // いくつかのコード
              }
            break;
           }
        }
      last_processed=list.At(list.Total()-1);
      Comment("\nLast trade event: ",last_processed.TypeEventDescription());
     }
  }

まず、古い(処理された)イベントのインデックスをループ内で見つけ、それを起点として、新しいイベントを最後までループします。つまり、1ティックで指値注文が設定され、striggerenが設定に関するイベントを1つ受信するような状況で...コメントをお願いします。

engine.OnTick(rates_data)に続くOnTick()の中でProcessTradeEvents()を呼んでいます。
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Свойства ордеров - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5