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

 

もう一つの質問 - フラグがないのは正常ですか? ビルド1585

アルパリ


ファクスオープン



FxOpenアルパリエムキュー
COPY_TICKS_INFO
ビッドおよび/またはアスク
930168391679292
COPY_TICKS_TRADE
Last and Volume
2710610102924
COPY_TICKS_ALL
すべてのティック
364077426568182216

if everywhereCOPY_TICKS_ALL =COPY_TICKS_INFO +COPY_TICKS_TRADE

では、アルパリではどうなのでしょうか?

 
kaus_bonus:

アルパリ

ファクスオープン

ヒレはないんです。
 
fxsaber:
国旗がないのです。


というのはわかりますが、では、何を追加してCOPY_TICKS_ALLを 取得するのでしょうか?

COPY_TICKS_TRADE=0 であるため。

で、フラグがないストーリーのティックは、未知のCOPY_TICKS_TRADE?

 
kaus_bonus:


というのはわかりますが、では、何を追加してCOPY_TICKS_ALLを 取得するのでしょうか?

COPY_TICKS_TRADE=0 であるため。

で、フラグが欠けた履歴のティックは不明COPY_TICKS_TRADE ?

証券会社の手が曲がっているのだと思います。
 

HistoryDealGet*関数とHistoryOrderGet*関数は、パフォーマンスの面で非常に奇妙な書き方をしています。

HistorySelectを作ると、例えば10万件の個別レコードに対して。HistoryDealGet 機能は、第一引数として履歴テーブルのレコード数ではなく、チケット を要求する。そして、この表はチケット別ではなく、時間別にソートされています。したがって、HistoryDealGet 関数が実行されるたびに最初に行うことは、テーブルを検索して一致するチケットを探すことです。


なぜ、こんなにも資源の無駄遣いをするのか!一番最初のチケットと一番新しいチケットでは、実行速度が異なることが判明しました。そして、最後の取引のすべての特徴を得るために、HistoryDealGet-functionsは毎回テーブル全体を実行する。


なぜ、普通にしないのか?

long HistoryDealGetInteger( const int index, const ENUM_ORDER_PROPERTY_INTEGER  property_id ); // номер сделки, а не тикет


また、現在のポジションの手数料を取得するために、毎回HistorySelectでスローヒストリーを取得する必要があり、HistorySelectByPositionを使用 しない場合は、HFTロボットをどのようにテストできますか? 保留注文の滑りは、パフォーマンスのゴミと化します!

 

テスターのACCOUNT_PROFITは無意味なことを表示しています。

今度はExpert Advisorを実行して、ポジションを即座にオープン、クローズします。

#include <MT4Orders.mqh>

#define  PRINT(A) Print(#A + " = " + (string)(A));

void OnTick()
{  
  static bool FirstRun = true;

  if (FirstRun && OrderSelect(OrderSend(_Symbol, OP_BUY, 1, 0, 0, 0, 0), SELECT_BY_TICKET))
  {
    PRINT(AccountInfoDouble(ACCOUNT_PROFIT))
    
    if (OrderClose(OrderTicket(), OrderLots(), 0, 0) && OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
      OrderPrint();
    
    FirstRun = false;          
  }
}

その結果

2017.04.19 23:24:50.317 RTS-6.17,M1 (MetaQuotes-Demo): generating based on real ticks
2017.04.19 23:24:50.317 RTS-6.17,M1: testing of Experts\fxsaber\Test2.ex5 from 2017.04.06 00:00 to 2017.04.08 00:00 started
2017.04.19 23:24:50.419 RTS-6.17 : real ticks begin from 2017.04.06 00:00:00
2017.04.19 23:24:50.419 2017.04.06 09:45:01   deal #2  buy 1.00 RTS-6.17 at 114250 done (based on order #2)
2017.04.19 23:24:50.419 2017.04.06 09:45:01   deal performed [#2  buy 1.00 RTS-6.17 at 114250]
2017.04.19 23:24:50.419 2017.04.06 09:45:01   order performed buy 1.00 at 114250 [#2  buy 1.00 RTS-6.17 at 114250]
2017.04.19 23:24:50.421 2017.04.06 09:45:01   AccountInfoDouble(ACCOUNT_PROFIT) = 0.0
2017.04.19 23:24:50.421 2017.04.06 09:45:01   exchange sell 1.00 RTS-6.17 at 114200, close #2 (114200 / 114250)
2017.04.19 23:24:50.421 2017.04.06 09:45:01   deal #3  sell 1.00 RTS-6.17 at 114200 done (based on order #3)
2017.04.19 23:24:50.421 2017.04.06 09:45:01   deal performed [#3  sell 1.00 RTS-6.17 at 114200]
2017.04.19 23:24:50.421 2017.04.06 09:45:01   order performed sell 1.00 at 114200 [#3  sell 1.00 RTS-6.17 at 114200]
2017.04.19 23:24:50.421 2017.04.06 09:45:01   #3 2017.04.06 09:45:01 buy 1.00 RTS-6.17 114250 0 0 2017.04.06 09:45:01 114200 0.00 0.00 -56.44 0
2017.04.19 23:24:50.629 RTS-6.17,M1: 582089 ticks, 1573 bars generated. Environment synchronized in 0:00:00.063. Test passed in 0:00:00.421 (including ticks preprocessing 0:00:00.078).

ACCOUNT_PROFITが0と表示されているが、実際は-56.44である。 その結果、エクイティやドローダウンなどが正しく推定されない。

PositionGetDouble(POSITION_PROFIT) - 同じことです。

 
fxsaber:

また、現在のポジションの手数料サイズを知るために、毎回HistorySelectByPositionではなく HistorySelectで履歴を取得する必要がある場合、HFTロボットはどのようにテストできますか? 保留注文のスリッページを見るには、パフォーマンスのゴミと化します。

HistorySelectは、要求された時間間隔のバイナリ検索によって動作するのか、しないのか?つまり、O(N)またはO(log(N))ですか?
 
fxsaber:
HistorySelectは、要求された時間間隔のバイナリ検索によって動作するのか、しないのか?つまり、O(N)またはO(log(N))ですか?
いいえ、この場合、バイナリサーチは適用されません。
 
Slawa:
いいえ、この場合、バイナリサーチは適用されません。
そのため、内部的には両方のストーリー(OrdersとDeal)が時間によってソートされています。HistorySelectの話であって、HistorySelectByPositionの 話ではないので、全く最適化されていない。
 
fxsaber:
そのため、内部的には両方のストーリー(OrdersとDeal)が時間によってソートされています。

すみません、ちょっと興奮しちゃいました。

はい、時間順に並んでいます。最初のレコードはバイナリサーチで検索される。