CopyTicks」のテスト - ページ 12

 
Dmitriy Skub:

1年後、中間結果をまとめます。

- CopyTicks 機能が正しく動作する(説明の通り)。

- この機能で取得した先物市場のカレントティックデータは、取引所データと一致します。

- 先物市場のティックデータの履歴は、最も流動性の高い商品の場合、2016.07.28(当然、最新サーバーバージョンの開始日)から正しく表示されます。

上記はすべて、MT5 ターミナルバージョン1395と Open-Brokerの デリバティブ市場のリアル口座に適用されます。原則として、この話題は終了しています。

トレードの方向性も確認されましたか?
 

CopyBufferについて質問させていただきました。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

mql5では、別のウィンドウでチャートを描画したり、別のウィンドウでインジケータバッファにアクセスするインジケータを書くことができますか?

fxsaber さん 2016.09.09 10:20

こんな疑問があります。CopyBufferを使用する場合、変更された値の数(入力パラメータ数が0 でない)だけバッファを追加するのが(パフォーマンスの観点から)妥当でしょうか、それとも常にバッファを完全にコピーするのでしょうか?

が、CopyTicksについてほぼ同じ質問です。

CopyTicksを使用する場合、すでに収集されたティックに新しい値を追加したり、ティックが必要な場所から常にフルリクエストを行い、以前に収集した値を保存しないことは、(パフォーマンスの観点から)妥当でしょうか。

 
動的配列に 刻みを加える場合、ArrayResizeのreserve_sizeはどの程度が良いでしょうか?
 
fxsaber:
動的配列に 刻みを加える場合、ArrayResizeのreserve_sizeはどの程度が良いでしょうか?
動的配列はINT_MAXに制限されているので、このサイズをすぐに設定するのがよい。
 
prostotrader:
動的配列はINT_MAXに制限されているので、すぐにこのサイズに設定するのがよいでしょう。
鳥の記憶力については残念です。
 
prostotrader:
動的配列はINT_MAXに制限されているので、すぐにこのサイズに設定するのがよいでしょう。
ミカラス、お前か?:-)
 
Dennis Kirichenko:
ミカラス、お前か?:-)
Примечание

Функция может быть применена только к динамическим массивам. При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, 
назначенных в качестве индикаторных буферов функцией SetIndexBuffer(). Для индикаторных буферов все операции по изменению размера производит 
исполняющая подсистема терминала.

Общее число элементов в массиве не может превышать 2147483647.
 
prostotrader:
あなたの筆跡から、あなたがそうであることがわかります ;-)
 

スクリプトは、同じミリ秒の間に最適なギャングが変化したときにテロップを出力する

#property script_show_inputs

sinput int Count = 10000; // Количество тиков на проверку

#define  TOSTRING(A) " " + #A + " = " + (string)Tick.A

string TickToString( const MqlTick &Tick )
{
  static int i = 0;
  
  i++;
  
  return("Tick" + (string)i + ":" + TOSTRING(time) + "." + (string)(Tick.time_msc %1000) +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume));
}

void OnStart()
{
  MqlTick Ticks[];
  
  const int Amount = CopyTicks(_Symbol, Ticks, COPY_TICKS_INFO, 0, Count);
  
  for (int i = 1; i < Amount; i++)
    if (Ticks[i].time_msc == Ticks[i - 1].time_msc) // ищем соседние тики с одним временем (с точностью до мс)
//      if ((Ticks[i].bid > Ticks[i - 1].bid) ||(Ticks[i].ask < Ticks[i - 1].ask)) // ищем выставление лимитной заявки внутрь спреда
        Print(TickToString(Ticks[i - 1]) + "\n" + TickToString(Ticks[i]) + "\n");
}

その結果の一部をご紹介します。

2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick14: time = 2016.09.13 10:12:55.819 bid = 98220.0 ask = 98240.0 last = 98240.0 volume = 2
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick13: time = 2016.09.13 10:12:55.819 bid = 98230.0 ask = 98240.0 last = 98240.0 volume = 2

ここで、同じミリ秒の間に誰かがBuyLimit=98230を引き出すことに成功しました。マーカーで叩かれたのではなく、正確に引き抜いたのです。

チェックの結果、このような1ミリ秒以内の動作はすべてカップからのベストリミットの引き出し(実行ではない)であることがわかりました。

その結果のもう一つの部分。

2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick4: time = 2016.09.13 10:00:00.235 bid = 98490.0 ask = 99040.0 last = 98500.0 volume = 8
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick3: time = 2016.09.13 10:00:00.235 bid = 98490.0 ask = 98600.0 last = 98500.0 volume = 8
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick2: time = 2016.09.13 10:00:00.235 bid = 98490.0 ask = 98600.0 last = 98500.0 volume = 8
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick1: time = 2016.09.13 10:00:00.235 bid = 98500.0 ask = 98600.0 last = 98500.0 volume = 8

ここでは、セッションの開始時に、誰かがSellLimitとBuyLimitの両方を1ミリ秒で削除することに成功したのです。つまり、1ミリ秒間に2つのアクションを起こすのです。

どうしてでしょう?結局のところ、HFTでさえ1ミリ秒以内に指値注文を外すことはできないのです。

あるいは、OrderSendAsyncを通じて 2つの指値注文(BuyLimit1_price < BuyLimit2_price)がスプレッド内に送信された場合、取引所は(1msの精度で)同時に買値の改善で2連続ティックを生成するのでしょうか。

 
fxsaber:


どうしてでしょう?結局のところ、HFTでさえ1ms以下の時間で指値注文を削除することはできないのです。


どこでそのような知識を得たのですか?

プラザIIの他に、FAST/FIXプロトコルもある

1msの間に何百もの演算があるのです。