ライブラリ: MT4Orders - ページ 46

 
traveller00:

そしてこの場合、リミッターを通す方法はない。それとも何か方法があるのでしょうか?

私は 現在の価格でテイクアウトを設定してポジションをクローズ します。しかし、テイクアウトは必ずしもリミットの形で行われるとは限りません(ブローカーのソフトウェアによる)。そのため、この方法が常に適しているとは限りません。

リミッターを使って正確に行う必要がある場合。リミッターを設定し、ヘッジの場合はOrderCloseByで反対側のポジションをクローズする。

 

テイクを選択するのは、ヘッジの場合、2回に分けてリミットとクローズ・バイを送る代わりに、1回のテイク・リクエストをサーバーに送るためなのですね?ネッティングの場合は違いはありません。

ところで、私の記憶では、証券取引所では、現在 価格に直接テイクやストップ・ロスを入れることはできませんでした。

 
traveller00:

テイクは、ヘッジのために、2つの別々のリミットとクローズ・バイの代わりに、1つのテイク・リクエストをサーバーに送ることができるように選択されているのですね?ネッティングの場合は、何の違いもありません。

CloseByの操作はトレードではないので、大きな違いはありません。

 
MT5で部分約定を見つけるのはとても簡単です。
// true - 部分実行の結果としてのトランザクション。
bool IsPartial( const ulong TicketDeal )
{
  const ulong TicketOrder = HistoryDealGetInteger(TicketDeal, DEAL_ORDER);
  
  return((HistoryDealGetInteger(TicketDeal, DEAL_TYPE) <= DEAL_TYPE_SELL) &&
         (!TicketOrder ||
          (HistoryDealGetDouble(TicketDeal, DEAL_VOLUME) != HistoryOrderGetDouble(TicketOrder, ORDER_VOLUME_INITIAL))));
}


この機能を例に、MT5スタイルとMT4スタイルを併用することの特殊性を紹介します。

// 部分的に実行されたトランザクションをすべて出力する。

#include <MT4Orders.mqh>

input datetime inFrom = D'2020.01.01';

void OnStart()
{
  if (HistorySelect(inFrom, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong TicketDeal = HistoryDealGetTicket(i);
      
      if (IsPartial(TicketDeal))
      {
        Print(TicketDeal);
        
        if (OrderSelect(TicketDeal, SELECT_BY_TICKET) && // OrderSelect by ticket の後、履歴テーブルを変更します、
            HistorySelect(inFrom, INT_MAX))              // そのため、必要であれば返さなければならない。
          OrderPrint();        
      }
    }
  }
}

HistorySelect+MT4Ordersを 使用する場合は、この点を考慮してください。

 

ポジション順の選択が 発生する場所はいくつかある。コメントで

// 検索中に注文数が変更される可能性があります。

というコメントで、注文数が変更される可能性があることがチェックされています。しかし、厳密には、注文数は変わっていないが、注文そのものが変わっている、例えば、クローズが1件、新規オープンが1件というような状況もあり得ます。そうすると、途中のナンバリングが変わることがある。そのような事態は、使用期間中一度もなかったのですが?チェックが厳密でないのはバグなのでしょうか、それともコードを複雑にしすぎないように、ありそうもない状況を意図的に無視しているのでしょうか。それとも、私が何かを見落としていて、ここにバグはないのでしょうか?

 
traveller00:

ポジション順の選択が 発生する場所はいくつかある。解説付き

では、注文数が変化する可能性があることがチェックされています。しかし、厳密には、注文数は変わっていないが、クローズが1件、新規オープンが1件というように、注文自体が変わっている場合があります。そうすると、途中のナンバリングが変わることがある。そのような状況は、ずっと使っている間、一度もなかったのですか?より厳密なチェックがないのはバグなのでしょうか、それともコードを複雑にしすぎないように、ありそうもない状況を意図的に無視しているのでしょうか。それとも、私が何かを見落としていて、ここにバグはないのでしょうか?

覚えていない。私が知っているのは、あらゆる状況をチェックするために多くのストレステストを行ったことだけだ。

 

ORDER_TIME_SETUP(_MSC) を変更します。つまり、例えばBuyLimitがいつ発注されたかを履歴から判断することは不可能になります。


その結果、ネッティングでよく見られるように、ヘッジ ポジションの始値が端数となる可能性があります。

このような状況では、MT4Orders を通じて、そのような MT4 ポジションの OrderOpenPrice/OrderOpenTime は、最初の MT5 取引の対応する値に等しくなります。

つまり、ポジションを建てるための端数価格は、残念ながらありません。これはまれな状況ですが、よくあることです。

 

取引、自動取引システム、取引戦略のテストに関するフォーラム

ライブラリ: MT4Orders

fxsaber, 2020.03.18 03:47

タイ・リジェクト

このような状況はよく起こります:

  1. 価格がオープンポジションのテイクアウトに達した。
  2. MT5 が成行注文を生成しました。対応する指値注文が流動性プロバイダーに送信されました。
  3. 指値注文が再登録されます。その後、テイクに対応する MT5 注文が削除されます。
  4. ポイント 1 に切り替えます。
履歴でプロバイダーの拒否を確認できるので、良い実装だ。また、テイクアウトをリミッターとして内部的に強制的に実現している。

MT4Ordersは、テイク注文が部分的に約定し、その後キャンセルされた 場合と同様に、このようなteejk再ジャックの状況では、これらのMT5注文を表示しません。その通りです!

 

最新リリースMT5 2361 MT4Orders、リアル、ヘッジを使用。複数のEA、異なるマジック。Expert Advisorの1つの状況。

チケット216684で買い注文を出した。しばらくしてポジションをクローズ する時間になり、それをクローズするために売り指値が発注され、逆のポジションをオープンするために別の売り指値が発注された。すべての注文は同じロットサイズである。216978指値がトリガーされると、216684と216978はCloseByで決済され、216975だけが残った。

ジャーナルのログの一部

2020.04.15 07:33:24.203 : deal #107485  sell 0.15 XXXXXX at 1.05555 done (based on order #216978)
2020.04.15 07:33:24.203 : close position #216684  buy 0.15 XXXXXX by position #216978  sell 0.15 XXXXXX
2020.04.15 07:33:24.305 : accepted close position #216684  buy 0.15 XXXXXX by position #216978
2020.04.15 07:33:24.307 : deal #107487  sell 0.15 XXXXXX at 1.05555 done (based on order #216986)
2020.04.15 07:33:24.307 : close position #216684  buy 0.15 XXXXXX by position #216978  done in 103.841 ms
2020.04.15 07:33:24.309 : deal #107489  sell 0.15 XXXXXX at 1.05563 done (based on order #216975)

Expert Advisorのログの一部

2020.04.15 07:33:24.180 OrdersTotal 216978 216975 216684
2020.04.15 07:33:24.305 OrdersTotal

つまり、3つの注文があったことがわかる。しかし、そのうちの2つの注文を決済し、3つ目の注文のマーケットに移動する過程で、注文のリストが空になっています。この状況は、ポジションの二重オープンにつながる可能性があります。

私は以下のコードで注文を取得している。

  int PrevTotal;
  ulong OrderTickets[];
  do
  {
    PrevTotal=OrdersTotal();
    for(int i=PrevTotal-1;i>=0;--i)
    {
      int Total=OrdersTotal();
      if(Total!=PrevTotal)
      {
        PrevTotal=Total;
        i=PrevTotal;
        ArrayFree(OrderTickets);
        continue;
      }
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES) || OrderMagicNumber()!=inTradeMagic)
        continue;

      ArrayResize(OrderTickets,ArraySize(OrderTickets)+1);
      OrderTickets[ArraySize(OrderTickets)-1]=OrderTicket();
    }
  }while(PrevTotal!=OrdersTotal());

そこで、列挙中に番号が変わった場合に備えて、チェックを挿入した。しかし、それが欠けているようです。これはバグなのでしょうか、機能なのでしょうか、それとも未完成の領域に入ってしまったのでしょうか?

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...