記事"MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第29部): 未決取引リクエスト - 特定の条件下での注文とポジションの削除と変更"についてのディスカッション - ページ 2

 
Artyom Trishkin:
はい、そうなります。なぜなら、アカウント・データの保存方法が変更されたからです。これは記事の最後に警告として書かれています: ----- ご参考までに: アカウントオブジェクトの構造を変更したため(アカウントの文字列プロパティを格納する uchar 配列のサイズを変更し、整数プロパティを 1 つ追加)、アカウントオブジェクトの以前に保存したファイルはすべて正しくロードされなくなりました。アカウントから別のアカウントに切り替えるとき、新しいサイズのオブジェクト構造で再作成されます。 -----



私はあなたのコードが完全にロードされることを確認するために、共通フォルダ内のすべての口座BINファイルを削除しました。

その後、いくつかの取引を手動で開き、スクリプトでできるだけ早く閉じました。またこのエラーが出た:

CEventsCollection::CreateNewEvent、768行目:このイベントはすでにリストにあります。

これらのイベントがMT4で異なるポジションをクローズしたものであることはわかっていますが、`engine`のコードはそれを理解できません。エンジンは短時間に複数の取引クローズ/イベントを理解できますか?


以下はすべてのログメッセージです:

2020.08.21 21:23:50.604 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:ポジションクローズ

2020.08.21 21:23:50.600 mhdbzr-34 AUDCAD,H1: - ポジションクローズ: 2020.08.21 19:51:47.000 -

AUDCAD クローズ買い #573142748 @ 価格 0.94405、利益 -0.22 USD

2020.08.21 21:23:50.368 スクリプトCloseTradesFast4Test AUDCAD,H1:remove

2020.08.21 21:23:50.364 CloseTradesFast4Test AUDCAD,H1: uninit reason 0

2020.08.21 21:23:50.364 CloseTradesFast4Test AUDCAD,H1: close #573142747 buy 0.01 AUDCAD at 0.94404 at price 0.94375

2020.08.21 21:23:50.148 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:ポジションクローズ

2020.08.21 21:23:50.146 mhdbzr-34 AUDCAD,H1: - ポジションクローズ:2020.08.21 19:51:47.000 - 。

AUDCAD クローズ買い #573142748 @ 価格 0.94405、利益 -0.22 USD

2020.08.21 21:23:49.942 CloseTradesFast4Test AUDCAD,H1: 終了 #573142748 買 0.01 AUDCAD at 0.94405 at 価格 0.94376

2020.08.21 21:23:49.725 mhdbzr-34 AUDCAD,H1: CEventsCollection::CreateNewEvent, Line 768:このイベントはすでにリストにあります。

2020.08.21 21:23:49.520 CloseTradesFast4Test AUDCAD,H1: close #573142752 buy 0.01 AUDCAD at 0.94406 at price 0.94376

2020.08.21 21:23:49.257 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:ポジションクローズ

2020.08.21 21:23:49.255 mhdbzr-34 AUDCAD,H1: - ポジションクローズ:2020.08.21 19:51:52.000 - .

AUDCAD クローズ売り #573142755 @ 価格 0.94366、利益 -0.37 USD

2020.08.21 21:23:49.086 CloseTradesFast4Test AUDCAD,H1: Close #573142755 売り 0.01 AUDCAD at 0.94366 at price 0.94414

2020.08.21 21:23:48.815 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:ポジションクローズ

2020.08.21 21:23:48.812 mhdbzr-34 AUDCAD,H1: - ポジションクローズ:2020.08.21 19:51:53.000 - 。

AUDCAD クローズ売り #573142757 @ 価格 0.94366、利益 -0.37 USD

2020.08.21 21:23:48.661 CloseTradesFast4Test AUDCAD,H1: Close #573142756 売り 0.01 AUDCAD at 0.94366 at price 0.94415

2020.08.21 21:23:48.352 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:ポジションクローズ

2020.08.21 21:23:48.350 mhdbzr-34 AUDCAD,H1: - ポジションクローズ: 2020.08.21 19:51:53.000 -

AUDCAD クローズ売り #573142757 @ 価格 0.94366、利益 -0.37 USD

2020.08.21 21:23:48.237 CloseTradesFast4Test AUDCAD,H1: Close #573142757 売り 0.01 AUDCAD at 0.94366 at price 0.94415

2020.08.21 21:23:47.537 CloseTradesFast4Test AUDCAD,H1: initialized

2020.08.21 21:23:47.520 スクリプトCloseTradesFast4Test AUDCAD,H1: 正常にロードされました。

2020.08.21 21:23:31.762 自動売買が有効になりました。

 
Mohammad Bazrkar :

CAccount::Load`に関するエラーはなく、ロードされました(しかし、主な問題は間違ったイベントの無視であり、まだ残っています)。

その後、いくつかの取引を手動で開き、スクリプトでできるだけ早く閉じました。またこのエラーが出た:

CEventsCollection::CreateNewEvent、768行目:このイベントはすでにリストに入っています

これらのイベントがMT4で異なるポジションをクローズしたものであることは分かっていますが、`engine`コードはそれを理解できません。エンジンは短時間に複数の取引クローズ/イベントを理解できますか?

このエラーが発生するために行っていることを順を追って説明してください。

 
Artyom Trishkin:

このエラーが発生するために何をしているのか、順を追って説明してください。

イベントのみを取得するようにEAのコードを修正しました。(以前のメッセージに修正版を添付しました。ファイル名は `mhdbzr-34` です)

  1. EAを実行して監視を開始します。
  2. デモ口座で 同じロットでいくつかの売買を高速でオープンする。
  3. スクリプトを実行して、その取引をできるだけ早く決済する。(私のスクリプト名は`CloseTradesFast 4Test`です。)
  4. ログ・メッセージをチェックすると、私がここに書いた赤いエラー・メッセージが表示され、エンジンがいくつかのポジションの決済をミスしたことがわかる。
 
Mohammad Bazrkar :

あなたのEAコードをイベントのみを取得するように修正しました。(以前のメッセージに修正版を添付しました。名前は`mhdbzr-34`です)

  1. EAを実行して監視を開始する。
  2. デモ口座で 同じロットでいくつかの売買を素早く行う。
  3. スクリプトを実行して、その取引をできるだけ早く決済する。(私のスクリプト名は「CloseTradesFast4Test」です。)
  4. ログ・メッセージをチェックすると、おそらくここに書いた赤いエラー・メッセージで、エンジンがいくつかのポジションの決済をミスしているのがわかる。

ポジションをクローズするスクリプトを作成してください。

 
Artyom Trishkin:

スクリプトをクローズポジションに渡す。

これがそのコードです:

void OnStart()
{
   for(int i=OrdersTotal()-1; i>-1; i--)
   {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ continue; }
      if(OrderSymbol()!= _Symbol){ continue;}
      //--
      RefreshRates();
      int res = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
   }
}
 

今回はクローズしたポジションを認識せず、2つのケースで 前のポジションと一緒に見逃してしまった。

2020.08.27 20:30:18.880 Expert mhdbzr-34 AUDCAD,H1: 削除されました。

2020.08.27 20:30:18.869 mhdbzr-34 AUDCAD,H1: uninit reason 1

2020.08.27 20:28:35.617 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:ポジションクローズ

2020.08.27 20:28:35.617 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:ポジションクローズ

2020.08.27 20:28:35.617 mhdbzr-34 AUDCAD,H1: - ポジションクローズ: 2020.08.27 18:58:03.000 - AUDCAD 決済 買い#573721560 at price 0.95218, 利益 -2.29 USD

2020.08.27 20:28:35.614 mhdbzr-34 AUDCAD,H1: - ポジションクローズ: 2020.08.27 18:58:04.000 - AUDCAD クローズ買い#573721562 at price 0.95218, 利益 -2.29 USD

2020.08.27 20:28:35.582 スクリプトCloseTradesFast4Test AUDCAD,H1: remove

2020.08.27 20:28:35.577 CloseTradesFast4Test AUDCAD,H1: uninit reason 0

2020.08.27 20:28:35.577 CloseTradesFast4Test AUDCAD,H1: close#573721560 buy 0.10 AUDCAD at 0.95218 at price 0.95188

2020.08.27 20:28:35.177 CloseTradesFast4Test AUDCAD,H1: close#573721562 buy 0.10 AUDCAD at 0.95218 at price 0.95188

2020.08.27 20:28:35.161 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:ポジションクローズ

2020.08.27 20:28:35.158 mhdbzr-34 AUDCAD,H1: - ポジションクローズ: 2020.08.27 18:58:06.000 - AUDCADクローズ売り#573721573 at price 0.95190, 利益 -2.06 USD

2020.08.27 20:28:34.739 CloseTradesFast4Test AUDCAD,H1: Close#573721571 buy 0.10 AUDCAD at 0.95224 at price 0.95191

2020.08.27 20:28:34.695 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:ポジションクローズ

2020.08.27 20:28:34.691 mhdbzr-34 AUDCAD,H1: - ポジションクローズ: 2020.08.27 18:58:06.000 - AUDCADクローズ売り#573721573 at price 0.95190, Profit -2.06 USD

2020.08.27 20:28:34.306 CloseTradesFast4Test AUDCAD,H1: クローズ#573721573 売り0.95190で0.10 AUDCAD価格0.95217で

2020.08.27 20:28:34.180 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:ポジションクローズ

2020.08.27 20:28:34.177 mhdbzr-34 AUDCAD,H1: - ポジションクローズ: 2020.08.27 18:58:09.000 - AUDCADクローズ売り#573721582 at price 0.95190, 利益 -2.14 USD

2020.08.27 20:28:33.883 CloseTradesFast4Test AUDCAD,H1: 終了#573721577 売り 0.10 AUDCAD at 0.95190 at price 0.95217

2020.08.27 20:28:33.664 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:ポジションクローズ

2020.08.27 20:28:33.660 mhdbzr-34 AUDCAD,H1: - ポジションクローズ: 2020.08.27 18:58:09.000 - AUDCADクローズ売り#573721582 at price 0.95190, 利益 -2.14 USD

2020.08.27 20:28:33.440 CloseTradesFast4Test AUDCAD,H1: Close#573721582 売り 0.10 AUDCAD at 0.95190 at price 0.95218

2020.08.27 20:28:32.946 CloseTradesFast4Test AUDCAD,H1: initialized

2020.08.27 20:28:32.928 スクリプトCloseTradesFast4Test AUDCAD,H1: 正常にロードされました。

2020.08.27 20:28:09.413 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:ポジションがオープンしました。

2020.08.27 20:28:09.411 mhdbzr-34 AUDCAD,H1: - Position opened: 2020.08.27 18:58:09.000 - AUDCAD 0.10売り #573721582 [0.10 成行注文 売り #573721582] at price 0.95190

2020.08.27 20:28:07.664 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:ポジションオープン

2020.08.27 20:28:07.659 mhdbzr-34 AUDCAD,H1: - Position opened: 2020.08.27 18:58:07.000 - AUDCAD 0.10売り #573721577 [0.10 成行注文 売り #573721577] at price 0.95190

2020.08.27 20:28:06.755 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:ポジションオープン

2020.08.27 20:28:06.752 mhdbzr-34 AUDCAD,H1: - Position opened: 2020.08.27 18:58:06.000 - AUDCAD 0.10 Sell #573721573 [0.10 成行注文 Sell #573721573] at price 0.95190

2020.08.27 20:28:05.911 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:ポジションオープン

2020.08.27 20:28:05.909 mhdbzr-34 AUDCAD,H1: - Position opened: 2020.08.27 18:58:05.000 - AUDCAD 0.10 Buy #573721571 [0.10 成行注文 Buy #573721571] at price 0.95224

2020.08.27 20:28:04.587 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:ポジションオープン

2020.08.27 20:28:04.582 mhdbzr-34 AUDCAD,H1: - Position opened: 2020.08.27 18:58:04.000 - AUDCAD 0.10 Buy #573721562 [0.10 成行注文 Buy #573721562] at price 0.95218

2020.08.27 20:28:04.101 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:ポジションオープン

2020.08.27 20:28:04.099 mhdbzr-34 AUDCAD,H1: - Position opened: 2020.08.27 18:58:03.000 - AUDCAD 0.10 Buy #573721560 [0.10 成行注文 Buy #573721560] at price 0.95218

2020.08.27 20:27:59.245 mhdbzr-34 AUDCAD,H1: initialized

2020.08.27 20:27:59.244 mhdbzr-34 AUDCAD,H1: Account 13278180: mhdbzr test (Alpari) 5537.01 USD, 1:100, Hedge,デモ口座 MetaTrader 4

Expert TestDoEasyPart34\mhdbzr-34 AUDCAD,H1: loaded successfully

これらの取引は、テスター環境ではなく、デモ口座の ライブマーケットで手動でオープンしました。(スクリプトでクローズしました。)

(念のためスクリーンショットを掲載します。)

ファイル:
 
Mohammad Bazrkar :

今回はクローズド・ポジションを認識せず、2つのケースで 前のポジションをミスした。

これらの取引は、テスター環境ではなく、デモ口座の ライブマーケットで手動でオープンしました。(そして、前と同じようにスクリプトで決済しました。)

(念のためスクリーンショットを掲載します。)

問題の原因を探しています。速くはないでしょう。テストをありがとう。

 
Artyom Trishkin:

問題の原因を探している。早くはないだろう。テストをありがとう。

(以下は私の意見です)

これらのクローズしたポジションは同じ秒数で、そのうちの1つは前のティックタイムで処理されているため、新しいティックでは`new_history_orders=1`となりますが、`list`には 2つのポジションがあり、おそらくソートが間違っています。

            //--- クローズしたポジションのリストを取得(EventsCollection.mqh 205~230行目)
            CArrayObj* list=this.GetListHistoryPositions(list_history);
            if(list!=NULL)
              {
               //--- 新しいリストをポジションクローズ時間でソートする。
               list.Sort(SORT_BY_ORDER_TIME_CLOSE);
               //--- ループ内のリストの最後から、新しくクローズされたポジションの数に等しい数のポジションを取り出す(最後のNイベント)。
               int total=list.Total(), n=new_history_orders;
               for(int i=total-1; i>WRONG_VALUE && n>0; i--,n--)
                 {
                  //--- リストからポジションを受け取る。これがポジションの場合、新規注文データを検索し、取引イベントを設定する。
                  COrder* position=list.At(i);
                  if(position!=NULL && position.Status()==ORDER_STATUS_HISTORY_ORDER)
                    {
                     //--- 閉位置の制御オーダーがある場合
                     COrderControl* ctrl=this.GetOrderControlByTicket(list_control,position.Ticket());
                     if(ctrl!=NULL)
                       {
                        //--- (1)ポジションを建てるきっかけとなった注文の種類と(2)ポジションIDを設定し、ポジション決済イベントを作成する。
                        this.m_type_first=(ENUM_ORDER_TYPE)ctrl.TypeOrder();
                        this.m_position_id=position.Ticket();
                        this.CreateNewEvent(position,list_history,list_market,list_control);
                       }
                    }
                 }
              }

もし注文が既にリストに入っていてエラーメッセージを投げたら、ポジションオブジェクトを削除し、このforループでカウントを再開します。しかし、CreateNewEvent 関数 内で注文が削除された場合、次の有効なポジションをキャッチするために、nカウントすべきではないと思います。

また、間違ったソートされたオーダーをスキップするために、最近処理されたポジションを理解する必要があります。

 
Mohammad Bazrkar :

(以下は私の意見)

これらのクローズしたポジションは同じ秒数で、そのうちの1つは前のティックタイムで処理されているため、新しいティックでは `new_history_orders=1` となりますが、リスト` には2つのポジションがあり、おそらくソートが間違っています。

もしオーダーがすでにリストに入っていてエラーメッセージを投げている場合は、ポジションオブジェクトを削除して、このforループでカウントを再開しますが、CreateNewEvent 関数 内でオーダーが削除された場合は、次の有効なポジションをキャッチするために、nカウントしないようにすべきだと思います。

また、間違ったソートされたオーダーをスキップするために、最近処理されたポジションを理解する必要があります。

ありがとうございます。

 

何週間か前に初めてこの記事を読んだとき、未来のグラフィカル・シェルについて 言及していたのを覚えています これについてのあなたのビジョンと、これによって実際に何ができるようになるのかについて、もっと詳しく教えてもらえますか?