エラー、バグ、質問 - ページ 2220

 
1861 - Alpariでデモを開くことができません。ブローカーを選んでもうまくいかない。
 
fxsaber:

私見ですが、取引サーバーに注文があるにもかかわらず、端末で同期OrderSendした後、その気配がない場合のバグだと思います。

このようなファントム・オーダーが、システム上には存在するがターミナルには存在しない場合、どの程度続くのかを確認することにした。

// Советник отслеживает длительность ситуаций, когда ордер отсутствует среди текущих и исторических

#define  TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define  TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

bool OrderIsExist( const ulong &OrderTicket )
{
  return(OrderTicket ? OrderSelect(OrderTicket) || HistoryOrderSelect(OrderTicket) : true);
}

void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest&, const MqlTradeResult& )
{
  static bool PrevIsExist = true;
  static ulong StartTime = 0;
  static ulong MaxInterval = 0;
  
  const ulong NowTime = GetMicrosecondCount();
  const bool IsExist = OrderIsExist(Trans.order);
    
  if (!IsExist)
  {
    Print(TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
  
    if (PrevIsExist) 
      StartTime = NowTime;
  }
  else if (!PrevIsExist)
  {
    const ulong Interval = NowTime - StartTime;
    
    Print(TOSTRING(Interval) + TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
    
    if (Interval > MaxInterval)
    {
      MaxInterval = Interval;
      
      Comment(TOSTRING(MaxInterval) + TOSTRING(Trans.order)); // mcs.
    }
  }
          
  PrevIsExist = IsExist;
}


その結果

2018.06.21 00:10:31.047 Trans.type = TRADE_TRANSACTION_ORDER_DELETE (2)
2018.06.21 00:10:31.047 Trans.order = 2210967406
2018.06.21 00:10:31.047 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 HistoryOrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 
2018.06.21 00:10:31.080 Interval = 32643
2018.06.21 00:10:31.080 Trans.type = TRADE_TRANSACTION_HISTORY_ADD (3)
2018.06.21 00:10:31.080 Trans.order = 2210967406
2018.06.21 00:10:31.080 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.080 HistoryOrderSelect(Trans.order) = true


注文はシステムには存在するが、Terminal には 32 ミリ秒存在しない!もし、この間に売買ロジックが実行されたらどうなるか、想像してみてください.


興味深いことに、ファントム注文はTRADE_TRANSACTION_ORDER_DELETEと TRADE_TRANSACTION_DEAL_ADD(かなり稀)の取引タイプにのみ 存在することが多い。


非常に悪いプラットフォームのニュアンス。


ZZY 5での貿易取引のスピードは、残念ながら疑問が残りますね。

Сравнение MQL5 и QLUA - почему торговые операции в MQL5 до 28 раз быстрее?
Сравнение MQL5 и QLUA - почему торговые операции в MQL5 до 28 раз быстрее?
  • 2016.09.13
  • MetaQuotes Software Corp.
  • www.mql5.com
Многие трейдеры зачастую не задумываются над тем, как быстро доходит их заявка до биржи, как долго она там исполняется и когда торговый терминал трейдера узнает о результате. В результате они не знают, что легко могут улучшить качество исполнения своих сделок за счет более быстрой реакции и скорости проведения транзакций. 12 сентября 2016 года...
 
fxsaber:

そこで、システムには注文があるが端末にはない、そんな幻の注文の状態がどのくらい続くのか調べてみることにした。


その結果


32ミリ秒の間、注文はあるが、ターミナルにない!もし、この間に売買ロジックが実行されたらどうなるか、想像してみてください。

ああ、これは良くない。 見ての通り、これらの取引結果は異なるパケットで送信されている。 それらは1つにまとめられるべきである。

 
Alexey Navoykov:

ご覧のように、これらの取引結果は1つのパッケージで送られるはずなのに、別々のパッケージで送られています。

OrderSend の直後に注文が幻になることがあり、OnTradeTransaction を 持つ並列 Expert Advisor がこの状態を常にキャッチできないことが判明したのです。つまり、OnTradeTransaction自体の動作が遅くなることがある。


一般的に、MT5ではアーキテクチャ上、様々な場所にラグがあり、それはほとんど解消されません。これらは、ダニの到着の遅れと、現在の貿易取引の遅れである。実行速度を重視するのであれば、そのプラットフォームがどのような機能を備えているかを明確にする必要があります。例えば、ティックがきちんと遅れて入ってきて、次にトランザクション...となると、自分が取引所のすぐそばに座っていても、MT5や他のプラットフォームの誰かに追い越されてしまうことがあります。

 
貿易取引は 優先的にパケット化され、他の取引に優先して行われます。これにより、レイテンシーを大幅に低減することができます。
 
Renat Fatkhullin:
貿易取引は優先的にパケットに入り、他を追い越します。これにより、レイテンシーを大幅に低減することができます。

スクリプトではOrderSendの後にファントム・オーダーの状況を検出しますが、並列EAのOnTradeTransactionでは 検出されないのはなぜですか(常にではありませんが、そのようなことがあります)。

 
Renat Fatkhullin:
貿易取引は、他の取引に優先してパケットでやってくる。これにより、レイテンシーを大幅に低減することができます。

問題は、TRADE_TRANSACTION_ORDER_DELETEとTRADE_TRANSACTION_HISTORY_ADDの トランザクションは異なるパケットで来るので、どちらの優先度が高いかは関係なく、ネットワークの遅延が 発生することです。つまり、削除された注文を履歴リストに入れることは、取引所とは何の関係もないので、本質的には1つのアトミック操作なのです。

つまり、この2つのトランザクションが1つのパッケージにまとまるか、2つ目のトランザクションが到着するまで1つ目のトランザクションが端末で実行されないかの2つの選択肢があるのです。

 
Alexey Navoykov:

つまり、これらのトランザクションが1つのパッケージにまとまるか、2つ目のトランザクションが到着するまで最初のトランザクションが端末で実行されないかの2つのオプションがあります。

TRADE_TRANSACTION_DEAL_ADDがTRADE_TRANSACTION_ORDER_DELETEトランザクションより前に来る場合があります。この場合、TRADE_TRANSACTION_ORDER_DELETE前でも注文はファントムのままです。

 

リモートエージェントが最適化を停止した

2018.06.22 14:05:24.901 SVA_03  pass 19 tested with error "task rejected by tester agent" in 0:00:00.000
2018.06.22 14:05:27.387 SVA_03  pass 19 tested with error "task rejected by tester agent" in 0:00:00.000

新しいコンパイラのせいだと思うのですが、どのようにアップデートすれば動くようになるのでしょうか?

また、オプティマイザーの一部だけが、このエラーのために、28個中13個をパスしています。
 

Alglibパッケージのコードに目を通す。こういう構文がいっぱいあって、コードを読み にくくしているんです。

         for(i_=0;i_<=nvars-1;i_++)
            tmp[i_]=xy[i][i_];
         for(i_=0;i_<=nvars-1;i_++)
            tmp[i_]=tmp[i_]-ct[xyc[i]][i_];
         //--- calculation
         v=0.0;
         for(i_=0;i_<=nvars-1;i_++)
            v+=tmp[i_]*tmp[i_];

もっとシンプルにこうじゃないですか?

v=0.0;
for(i_=0;i_<=nvars-1;i_++){
   tmp=xy[i][i_]-ct[xyc[i]][i_];
   v+=tmp*tmp;
}

実行速度がさらに速くなりそうですね。

なぜ、あんなに複雑なコードにしたのでしょうか?それとも、他の言語から何の調整もなく移植されただけですか?しかし、やはり原文ではなぜそんなこじつけをしたのだろうか?