記事"MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第4部): 取引イベント"についてのディスカッション - ページ 3

 

内容的にはとても興味深い講義のようだ。ぜひ全シリーズを追っていきたい。

残念ながら、わざと小さなミスをすることもあるかもしれない。内容はとても複雑なので、おそらくあなたはボールを離さない方がいい。

内容は非常に複雑で、おそらくあなたはボールを維持する必要があります。

CMarketCollection::Refresh

「これは ORDER_STATUS_MARKET で以前にもありました。単純なものから複雑なものへの切り替えは非常に印象的です。

リフレッシュの時点で、私はそれ以上進むことができなかった。だから、ダウンロードを利用してよかった。

mfG

マーク・トルミット

 

奇妙なことに、私はあなたの方法で最も単純なロジックを実現することができません...

最後の取引の終了時刻を取得する 必要があります。ライブラリにはMT4のような抽象的な注文を扱うメカニズムがあるようですが、それを扱うメソッドは見当たりません。

Dealsをリクエストしていますが、ORDER_PROP_TIME_CLOSEはサポートされていません:

bool last_trade_time_filter=true;
   CArrayObj *all_trades=engine.GetListDeals();
   if(all_trades!=NULL && all_trades.Total()>0)
     {
      CArrayObj *sym_all_trades=CSelect::ByOrderProperty(all_trades,ORDER_PROP_SYMBOL,Symbol(),EQUAL);
      if(sym_all_trades!=NULL && sym_all_trades.Total()>0)
        {
         CArrayObj *sym_all_trades_recent=CSelect::ByOrderProperty(sym_all_trades,ORDER_PROP_TIME_CLOSE,iTime(NULL,PERIOD_CURRENT,1),EQUAL_OR_MORE);
         if(sym_all_trades_recent.Total()>0)
           {
            // ここにはない
            last_trade_time_filter=false;
           }
            
        }
     }
 
leonerd 時刻を取得する 必要があります。ライブラリにはMT4のような抽象注文を扱うメカニズムがあるようですが、それを扱うメソッドは見当たりません。

Dealsを要求しますが、ORDER_PROP_TIME_CLOSEはサポートされていません:

OK, 取引の終了時刻を要求するのは何となく間違っています。しかし、それはGetListHistoryOrders()でも動作しません。

 
leonerd 時刻を取得する 必要があります。ライブラリにはMT4のような抽象的な注文を扱うメカニズムがあるようですが、それを扱うメソッドは見当たりません。

Dealsを要求しますが、ORDER_PROP_TIME_CLOSEはサポートされていません:

テストExpert Advisorのボタン押下ハンドラでは、ORDER_PROP_TIME_CLOSEはサポートされていません。

//+------------------------------------------------------------------+
//| ボタン押下処理|
//+------------------------------------------------------------------+
void PressButtonEvents(const string button_name)

(これはイベント処理とデータ取得の一例です)。

そこにはポジションをクローズするコードブロックがあります。そこでどのように実装されているかを見ることができます。例えば、現在のシンボルによる買いを最大利益で決済するコード・ブロックがあります:

      //--- BUTT_CLOSE_BUY ボタンが押された場合: 最大利益で買いを決済する。
      else if(button==EnumToString(BUTT_CLOSE_BUY))
        {
         //--- すべてのオープンポジションのリストを取得する
         CArrayObj* list=engine.GetListMarketPosition();
         //--- リストから買いポジションのみを選択し、現在のシンボルのみで選択する。
         list=CSelect::ByOrderProperty(list,ORDER_PROP_SYMBOL,Symbol(),EQUAL);
         list=CSelect::ByOrderProperty(list,ORDER_PROP_TYPE,POSITION_TYPE_BUY,EQUAL);
         //--- 手数料とスワップを考慮した利益でリストを並べ替える
         list.Sort(SORT_BY_ORDER_PROFIT_FULL);
         //--- 最も利益の高い買いポジションのインデックスを取得する。
         int index=CSelect::FindOrderMax(list,ORDER_PROP_PROFIT_FULL);
         if(index>WRONG_VALUE)
           {
            //--- 買いポジションオブジェクトを取得し、チケットポジションをクローズする。
            COrder* position=list.At(index);
            if(position!=NULL)
              {
               //--- 保留中のリクエストを作成するためのボタンが押されていない場合、ポジションを閉じます。
               if(!pressed_pending_close_buy)
                  engine.ClosePosition((ulong)position.Ticket());
               //--- そうでなければ、チケットのポジションをクローズするために、保留中のリクエストを作成する。
               //--- アクティブなボタンに応じた条件を設定する
               else
                 {
                  int id=engine.ClosePositionPending(position.Ticket());
                  if(id>0)
                    {
                     //--- 保留中のリクエストの価格とアクティベーション時間を設定し、アクティベーションパラメータを設定する。
                     double bid=SymbolInfoDouble(NULL,SYMBOL_BID);
                     double price_activation=NormalizeDouble(bid+distance_pending_request*g_point,g_digits);
                     ulong  time_activation=TimeCurrent()+bars_delay_pending_request*PeriodSeconds();
                     SetPReqCriterion((uchar)id,price_activation,time_activation,BUTT_CLOSE_BUY,EQUAL_OR_MORE,bid,TimeCurrent());
                    }
                 }
              }
           }
        }

クローズド・ポジションについては、ずいぶん前にやったことがあるので、今となっては一目で必要なものを得る方法をお伝えすることはできません。今、とても忙しいので、また後で書きます。

 
Artyom Trishkin #:

テスト用Expert Advisorのボタン押下ハンドラで

(を実行します(これはイベントを処理してデータを取得する方法の一例です)。

そこにはポジションのクローズを担当するコードブロックがあります。そこでどのように実装されているかを見ることができます。たとえば、現在のシンボルの買いを最大の利益で決済するコード・ブロックがあります:

クローズド・ポジションについて - ずいぶん前にやったことがあるのですが、今となっては、一目で必要なものを得る方法をお伝えすることができません。今、とても忙しいので、後で見てから書きます。

ありがとう、しかし、イベントをキャッチする必要はありません。

 
ORDER_STATUS_MARKET_ORDERでエラー:宣言されていない識別子。MQL 5の最近のバージョンで変更されたようで、COrder::OrderMagicNumberとCMarketOrderコンストラクタの両方で表示されます!
 
theonementor # :
ORDER_STATUS_MARKET_ORDERでエラー:宣言されていない識別子。MQL 5の最近のバージョンで変更されたようで、COrder::OrderMagicNumberとCMarketOrderコンストラクタの両方で表示されます!

記事に添付されているMQL5.zipアーカイブファイルをダウンロードしました。各ファイルは個別に、またすべて一緒に(Engine.mqhまたはTestDoEasyPart04.mq5をコンパイルする場合)エラーなしでコンパイルされます。

コンパイルエラーが発生するのは、具体的に何をしているからですか?

 
Artyom Trishkin #:

記事に添付されているMQL5.zipアーカイブファイルをダウンロードしました。各ファイルは個別に、また(Engine.mqhまたはTestDoEasyPart04.mq5をコンパイルする際に)すべて一緒に、エラーなしでコンパイルされます。

コンパイル・エラーが発生するのは、具体的に何をしているからですか?

チュートリアルのコードをエディタにコピー・ペーストしたのですが、なぜか欠落していました。
 
theonementor # :
チュートリアルのコードをエディタにコピー・ペーストしたのですが、なぜか抜けていました。

記事のコードと添付ファイルのコードは必ずしも一致しません。記述中に見落としがあるかもしれませんし、記事を書いた後に何かが追加されることもあります。この記事は "読んでコピーして使う "スタイルのステップバイステップのガイドではなく、トレーニング資料の形での詳細な説明に過ぎません。そして、小さな間違いや脱落はあなたに考えさせるものであり、それは良いことである)