Информация о счете - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
// Попытка поймать тик, который не попал в историю тиков.// Сравнение двух тиков.bool IsEqual( constMqlTick &Tick1, constMqlTick &Tick2 )
{
return((Tick1.time_msc == Tick2.time_msc) &&
!NormalizeDouble(Tick1.bid - Tick2.bid, _Digits) &&
!NormalizeDouble(Tick1.ask - Tick2.ask, _Digits));
}
// Проверяет наличие тика в истории.bool IsHistory( constMqlTick &Tick )
{
bool Res = false;
MqlTick Ticks[];
constint 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);
}
voidOnTick()
{
staticMqlTick Ticks[];
MqlTick Tick;
if (SymbolInfoTick(_Symbol, Tick)) // Взяли текущий тик.
{
constint 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); // Удалили тики, что проверили.
}
}
}
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がゼロになると、端末だけでなく、サーバーにも一定の遅延ティックが入力されるようになります。特に、注文受付。
予期せぬことに、Market Watch:SymbolInfoTickで来て いるにもかかわらず、履歴からティックが消えているのに出くわしました。
同じティックをMQLでプリントアウトすると、興味深いフラグが表示されます。
このフラグは、Market Watchの欠落したティックの直前のヒストリーのティックで形成されたものである。もしかしたら、これで問題の所在がわかるかもしれません。
ZS 残念ながら、このようなことは組織的に起こっています。ダニ履歴には、端末に来たすべてのダニが含まれているわけではありません。
予期せぬことに、Market Watch: SymbolInfoTickで来ているにもかかわらず、履歴からティックが消えているのに出くわしました。
同じティックをMQLでプリントアウトすると、興味深いフラグが表示されます。
このフラグは、Market Watchの欠落したティックの直前のヒストリーのティックで形成されたものである。もしかしたら、これで問題の所在がわかるかもしれません。
ZS 残念ながら、このようなことは組織的に起こっています。ダニ履歴には、端末に来たすべてのダニが含まれているわけではありません。
例えば、EAが実際の口座で 丸一日取引して、利益を出したとしましょう。
翌日、前日のテスターを実行すると、損失が発生します。
ブローカーが間違ったティックを出しているのか、それとも他の何かなのか、理由がわかりません...。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
MT5とスピードの関係
fxsaber, 2021.01.04 20:51
思いがけず、Market Watch: SymbolInfoTick に来ているにもかかわらず、履歴にティックがないことにぶつかりました。
並列で起動したターミナルでtkcを生成せず、Serverからアップロードしています。
スクリーンショットでは、この左側の端末 - tickが存在しています。しかし、もう一方のターミナル(右側)には--。
Terminal 自体が、受信したすべてのティックをティック履歴に入れないことが判明しました。履歴を漏れなく残したい場合は、tkc-fileを追加して、Serverから引っ張ってくる必要があります。
不快なバグ
このようなEAでは、履歴に残っていないティックをキャッチすることはできません。戦闘の方はそうでしたね。どうやら、これらのティックではOnTickが開始されないようです。
見逃したティック自体は、数十ミリ秒の間、実際に存在する可能性がある。
上のほうにソースコードの投稿がありました。今は空っぽです。その理由は?
Terminalでtkcを生成せず、Serverからアップロードする並列Terminalを実行しました。
この端末の左のスクリーンショットでは、ティックが表示されています。しかし、もう一方の端末(右側)では、そうではありません
このスクリプトを両方のTerminalで実行しました。
要求された間隔により、tkcは変更される場合があります(サーバーと同期)。そのため、リクエスト前に消えていたティックが存在し始めることもあります。
それでも、異なるキャラクターでいくつか検出することは可能でした。端末によってティックが大きく異なるため、フラグフィルターを適用する必要がありました。
その違いは、こんな感じです。
EURJPY。
米ドルCHF
一般的に、リアルタイムで取引する場合、TerminalではTickの履歴が存在せず、ServerではTickの履歴が存在しうるものがあります。
このバグは直さなければならない。