記事"MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第24部): 基本取引クラス - 無効なパラメータの自動修正"についてのディスカッション - ページ 3

 
hsyhsy863 :
こんにちは、私が言った問題は見つかりましたか?
私は元ファイルとは考えていません。
 

Artyomさん、こんにちは。このコードを詳しく調べているうちに、テスターで実行中のトレードイベントを正しく処理するために、EventsHandling()OnDoEasyEvent() に実装されている「shift」値の特殊性に気づきました。記事の中でご指摘されているように、ライブで稼動している場合、取引イベントは エンジンによってトリガーされるとOnChartEvent() から1つずつ配信されるのに対し、テストモードでは グループ化され、リストとして配信されると理解しています。

私の質問は、イベント・ハンドラーにとって有用な情報を含むことができる'lparam'を犠牲にするよりも、イベント・ハンドラーに専用の関数パラメータを実装する方が良いのではないかということです。その方がコードがシンプルになり、読みやすくなると思うのですが、そう思いますか?

追記:とにかく、このライブラリは本当に強力だが、複雑で、頭を使いこなすのが難しいライブラリだと感じている。DoEasyの機能セットを完成させたら、この点に対処してほしいです。

void EventsHandling(void)
  {
//--- 取引イベントが存在する場合
   if(engine.IsTradeEvent())
     {
      //--- 同時に発生した取引イベントの数
      int total = engine.GetTradeEventsTotal();
      for (int i = 0; i < total; i++)
        {
         //--- 同時に発生したイベントのリストから、インデックスによって次のイベントを取得する。
         CEventBaseObj *event = engine.GetTradeEventByIndex(i);
         if(event == NULL)
            continue;
         int   shift  = i;
         long   lparam = event.LParam();
         double dparam = event.DParam();
         string sparam = event.SParam();
         OnDoEasyEvent(CHARTEVENT_CUSTOM+event.ID(), lparam, dparam, sparam, shift);
        }
     }
   //...
   //...
  }

void OnDoEasyEvent(const int id, const long &lparam, const double &dparam, const string &sparam, int shift=0)
  {
   //...
   //...
//--- 取引イベントの処理
   if(idx > TRADE_EVENT_NO_EVENT && idx < TRADE_EVENTS_NEXT_CODE)
     {
      //--- 取引イベントのリストを取得する
      CArrayObj *list = engine.GetListAllOrdersEvents();
      if(list == NULL) return;

      //--- get the event index shift relative to the end of the list
      //--- in the tester, the shift is passed by the lparam parameter to the event handler
      //--- outside the tester, events are sent one by one and handled in OnChartEvent()
      int shift=(testing ? (int)lparam : 0);
      
      CEvent *event=list.At(list.Total()-1-shift);
      if(event==NULL) return;
   //...
   //...
  }


 
Dima Diall :

Artyomさん、こんにちは。このコードを詳しく調べているうちに、EventsHandling()OnDoEasyEvent() に実装されている、テスターで実行中のトレードイベントを正しく処理するための'shift'値の特殊性に気づきました。記事の中でご指摘されているように、ライブで稼動している場合、取引イベントは エンジンによってトリガーされるようにOnChartEvent() から1つずつ配信されるのに対し、テストモードでは グループ化され、リストとして配信される...と理解しています。

私の質問は、イベント・ハンドラーにとって有用な情報を含むことができる'lparam' を犠牲にするよりも、イベント・ハンドラーに専用の関数パラメータを実装する方が良いのではないかということです。また、その方がコードがシンプルになり、読みやすくなると思います。

追記:とにかく、このライブラリは本当に強力ですが、複雑で頭を使いこなすのが難しいものだと感じています。DoEasyの機能セットを完成させたら、この点に対処してほしいです。


いいえ、何もやり直すつもりはありませんし、おそらくやり直すこともないでしょう。必要なデータはすべてイベントオブジェクトに配信済みで、残りのデータはイベントが登録されたオブジェクトから取得済みです。

 
Artyom Trishkin:

いや、ここでは何もやり直すつもりはなかったし、おそらくやり直すこともないだろう。必要なデータはすべてイベント・オブジェクトに配信済みで、残りのデータはイベントが登録されたオブジェクトから取得済みだ。

わかりました。必要なデータはすべてイベントオブジェクトの中にあるというのは同意する。

 
最後の取引イベントを取得した後、注文/ポジションチケットや その他のプロパティを引き出すコード例を教えてください。
 
leonerd:
最後の取引イベントを取得したときに、注文/ポジションチケットや その他のプロパティを引き出すことができるように、サンプルコードを提供していただけませんか?
1週間後までは無理です。