MT5とスピードの関係 - ページ 80

 
fxsaber:

ZS 何カ月も続いているハングアップを解消するのはいいことだと思います。このスクリプトは、RAMが無限のマシンで実行してください。例えば、6月1日からのティックを1文字ずつだけアップロードすることができないのです。CopyTicksをハングアップさせるだけで、リソースの消費はゼロです。

b2699 - 修正済み、ありがとうございます。

 
ブレーキを示すコードの貯金箱へ。今回はテスター
 

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

SL/TP注文の受付

fxsaber, 2020.12.11 09:17

// Измеряет размер лага между приходом тика на MT5-сервер и MT5-Терминал.
// Запускать на той же машине, на которой установлен MT5-сервер.

100本のダニを処理した。サーバーと端末の間の到着遅れは、1〜8ミリ秒の範囲で変化する。平均は4ミリ秒強です。これはちょうど、このブランチの始まりであるTP注文のトリガーラグと同じです。


ラグ自体はMT5サーバーの中にある。Server->Terminalのチャンネルは関係ありません。


このラグをなくすよう、開発者に強く要望します。これで、Pingがゼロになると、端末だけでなく、サーバーにも一定の遅延ティックが入力されるようになります。特に、注文受付。

 
取引の遅延を減らすために、バトルターミナルをRAM-driveに移すことをお勧めします。
 

予期せぬことに、Market Watch:SymbolInfoTickで来て いるにもかかわらず、履歴からティックが消えているのに出くわしました。



同じティックをMQLでプリントアウトすると、興味深いフラグが表示されます。

                         [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
        [0] 2021.01.04 20:52:55 103.16300 103.16500 0.0000        0 1609793575267       4       0.00000
        [1] 2021.01.04 20:52:55 103.16300 103.16400 0.0000        0 1609793575788       4       0.00000
        [2] 2021.01.04 20:52:59 103.16400 103.16400 0.0000        0 1609793579367     130       0.00000
        [3] 2021.01.04 20:53:01 103.16400 103.16400 0.0000        0 1609793581817       2       0.00000
        [4] 2021.01.04 20:53:01 103.16300 103.16400 0.0000        0 1609793581969       2       0.00000

このフラグは、Market Watchの欠落したティックの直前のヒストリーのティックで形成されたものである。もしかしたら、これで問題の所在がわかるかもしれません。


ZS 残念ながら、このようなことは組織的に起こっています。ダニ履歴には、端末に来たすべてのダニが含まれているわけではありません。

 
fxsaber:

予期せぬことに、Market Watch: SymbolInfoTickで来ているにもかかわらず、履歴からティックが消えているのに出くわしました。



同じティックをMQLでプリントアウトすると、興味深いフラグが表示されます。

このフラグは、Market Watchの欠落したティックの直前のヒストリーのティックで形成されたものである。もしかしたら、これで問題の所在がわかるかもしれません。


ZS 残念ながら、このようなことは組織的に起こっています。ダニ履歴には、端末に来たすべてのダニが含まれているわけではありません。

例えば、EAが実際の口座で 丸一日取引して、利益を出したとしましょう。

翌日、前日のテスターを実行すると、損失が発生します。

ブローカーが間違ったティックを出しているのか、それとも他の何かなのか、理由がわかりません...。

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
Информация о счете - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

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

MT5とスピードの関係

fxsaber, 2021.01.04 20:51

思いがけず、Market Watch: SymbolInfoTick に来ているにもかかわらず、履歴にティックがないことにぶつかりました。


並列で起動したターミナルでtkcを生成せず、Serverからアップロードしています。

スクリーンショットでは、この左側の端末 - tickが存在しています。しかし、もう一方のターミナル(右側)には--。


Terminal 自体が、受信したすべてのティックをティック履歴に入れないことが判明しました。履歴を漏れなく残したい場合は、tkc-fileを追加して、Serverから引っ張ってくる必要があります。

不快なバグ

 
// Попытка поймать тик, который не попал в историю тиков.

// Сравнение двух тиков.
bool IsEqual( const MqlTick &Tick1, const MqlTick &Tick2 )
{
  return((Tick1.time_msc == Tick2.time_msc) &&
         !NormalizeDouble(Tick1.bid - Tick2.bid, _Digits) &&
         !NormalizeDouble(Tick1.ask - Tick2.ask, _Digits));
}

// Проверяет наличие тика в истории.
bool IsHistory( const MqlTick &Tick )
{
  bool Res = false;
  
  MqlTick Ticks[];
  
  const int Size = CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, Tick.time_msc, Tick.time_msc + 1);
  
  for (int i = 0; !Res && (i < Size); i++)
    Res = IsEqual(Tick, Ticks[i]);
    
  return(Res);
}

void OnTick()
{
  static MqlTick Ticks[];
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick)) // Взяли текущий тик.
  {
    const int Size = ArrayResize(Ticks, ArraySize(Ticks) + 1);
    
    Ticks[Size - 1] = Tick; // Дописали его в массив
    
    MqlTick HistoryTick[1];
    
    if (CopyTicks(_Symbol, HistoryTick, COPY_TICKS_ALL, 0, 1) > 0) // Взяли последний исторический тик
    {
      int i = 0;
      
      while ((i < Size) && (Ticks[i].time_msc < HistoryTick[0].time_msc)) // Если исторический тик пришел позже проверяемого
      {
        if (!IsHistory(Ticks[i]))                                    // Если в истории тиков нет проверяемого тика,
        {
          Alert("!IsHistory(Ticks[i]) == true");
          ArrayPrint(Ticks, _Digits, NULL, i, 1, ARRAYPRINT_HEADER); // выводим его.
        }
          
        i++;
      }
      
      ArrayRemove(Ticks, 0, i); // Удалили тики, что проверили.
    }
  }  
}

このようなEAでは、履歴に残っていないティックをキャッチすることはできません。戦闘の方はそうでしたね。どうやら、これらのティックではOnTickが開始されないようです。

見逃したティック自体は、数十ミリ秒の間、実際に存在する可能性がある。

 
fxsaber:
上のほうにソースコードの投稿がありました。今は空っぽです。その理由は?
サイトが更新されたときの投稿なのでしょう(英語部分にそのような投稿が2つあります)。
 
fxsaber:

Terminalでtkcを生成せず、Serverからアップロードする並列Terminalを実行しました。

この端末の左のスクリーンショットでは、ティックが表示されています。しかし、もう一方の端末(右側)では、そうではありません

このスクリプトを両方のTerminalで実行しました。

// Сохранение тиковой истории в текстовый файл.

string GetTickFlag( uint tickflag )
{
  string flag = " " + (string)tickflag;

#define  TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : ""; \
                        tickflag -= tickflag & TICK_FLAG_##A;
 TICKFLAG_MACRO(BID)
TICKFLAG_MACRO(ASK)
TICKFLAG_MACRO(LAST)
TICKFLAG_MACRO(VOLUME)
TICKFLAG_MACRO(BUY)
TICKFLAG_MACRO(SELL)
#undef  TICKFLAG_MACRO

  if (tickflag)
    flag += " FLAG_UNKNOWN (" + (string)tickflag + ")";

  return(flag);
}

#define  TOSTRING(A) " " + #A + " = " + (string)Tick.A
string TickToString( const MqlTick &Tick, const int FilterFlags = 0xFF )
{
  return(TOSTRING(time) + "." + ::IntegerToString(Tick.time_msc % 1000, 3, '0') +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags & FilterFlags));
}
#undef  TOSTRING


void OnStart()
{  
  MqlTick Ticks[];
  const int Size = CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, D'2021.01.05 01:00' * 1000, D'2021.01.05 10:50' * 1000);
  
  string From = (string)Ticks[0].time;
  string To = (string)Ticks[Size - 1].time;
  
  StringReplace(From, ":", ".");
  StringReplace(To, ":", ".");
  
  const int handle = FileOpen(_Symbol + "_" + From + "-" + To + ".txt", FILE_WRITE | FILE_ANSI | FILE_TXT);

  if (handle != INVALID_HANDLE)
  {        
    for (int i = 0; i < Size; i++)
      FileWrite(handle, TickToString(Ticks[i], 0x7F)); // Фильтр флагов, иначе очень много различий.

    FileClose(handle);
  }
  
  Alert("Done.");
}


要求された間隔により、tkcは変更される場合があります(サーバーと同期)。そのため、リクエスト前に消えていたティックが存在し始めることもあります。

それでも、異なるキャラクターでいくつか検出することは可能でした。端末によってティックが大きく異なるため、フラグフィルターを適用する必要がありました。

その違いは、こんな感じです。


EURJPY。


米ドルCHF


一般的に、リアルタイムで取引する場合、TerminalではTickの履歴が存在せず、ServerではTickの履歴が存在しうるものがあります。

このバグは直さなければならない。