#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280long LastTime = 0; // time_msc-время последнего тика (самого свежего), полученного из историиint Count = 0; // Количество тиков в последенем запросе, у которых time_msc == LastTime// Возвращает следующие тики (после предыдущего вызова)int GetFreshTicks( MqlTick &Ticks[], constuint flags = COPY_TICKS_TRADE, constuint count = 100000 )
{
int Res = 0;
MqlTick NewTicks[];
constint NewAmount = CopyTicks(Symbol(), NewTicks, flags, LastTime, count);
if ((NewAmount > 0) && (Count < NewAmount))
{
Res = ArrayCopy(Ticks, NewTicks, 0, Count);
// Взяли крайнее время из текущей истории
LastTime = Ticks[Res - 1].time_msc;
Count = 1;
// Находим (Count) в текущей истории количество тиков со временем LastTimefor (int i = Res - 2; i >= 0; i--)
{
if (Ticks[i].time_msc < LastTime)
break;
Count++;
}
}
return(ArrayResize(Ticks, Res));
}
// Сравнение двух массивовtemplate <typename T>
bool ArrayEqual( const T &Array1[], const T &Array2[] )
{
constint Amount = MathMin(ArraySize(Array1), ArraySize(Array2));
bool Res = (Amount > 0);
if (Res)
for (int i = 0; i < Amount; i++)
if (_R(Array1[i]) != Array2[i]) // https://www.mql5.com/ru/code/16280
{
Res = false;
ExpertRemove();
break;
}
return(Res);
}
voidOnTick()
{
// возьмем тики с начала утренней сессии
Count = 0;
LastTime = (TimeCurrent() - (TimeCurrent() % (24 * 3600))) * 1000;
MqlTick Ticks[]; // История, собранная по частямMqlTick NewTicks[]; // массив для следующей части тиков// Собираем историю по частям while (GetFreshTicks(NewTicks, COPY_TICKS_TRADE, 100000) > 0)
ArrayCopy(Ticks, NewTicks, ArraySize(Ticks));
if (ArraySize(Ticks) > 0)
{
// Взяли ВСЮ историю тиковPrint(CopyTicks(_Symbol, NewTicks, COPY_TICKS_TRADE, Ticks[0].time_msc, 10000000)); // 10000000 - большое число, чтобы все выкачать.// Проверка на совпадение собранной по частям истории с самой историейPrint(ArrayEqual(NewTicks, Ticks) ? "Equal" : "Not Equal");
}
}
結果
2016.09.3016:02:54.661 Test (Si-12.16,M1) Not Equal
2016.09.3016:02:54.661 Test (Si-12.16,M1) ExpertRemove() function called2016.09.3016:02:54.621 Test (Si-12.16,M1) 3337402016.09.3016:02:54.121 Test (Si-12.16,M1) Equal
2016.09.3016:02:54.071 Test (Si-12.16,M1) 3337362016.09.3016:02:53.791 Test (Si-12.16,M1) Equal
2016.09.3016:02:53.741 Test (Si-12.16,M1) 333723
リボン(COPY_TICKS_TRADE - time_msc、last、volume、flags)だけが必要な場合、このソリューションは完全に適しており、バグは検出されません。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
謎の株価指標
fxsaber さん 2016.09.27 18:32
CopyTicksからの入力が0でないとき、すべてのブレーキがかかっているようです。
このモードでは、最後の呼び出しからのティックが要求されても、CopyTicksの実装が非常に曲者であるように思えます。飛ぶように見えるが、飛ばない。
今週のベータ版では、ティックとタンブラーのアップデートに多くの改良を加えましたので、お待ちください。
1432 - 多くのバグを解決しました。ありがとうございました。
しかし、すべてではありません。
追加した履歴を実際の履歴と比較すると、COPY_TICKS_ALLモードでは不一致があります(TRADEとINFOは問題ありません)。電子ブック
結果
しかし、すべてではありません。
追加した履歴を実際の履歴と比較すると、COPY_TICKS_ALLモードでは不一致があります(TRADEとINFOは問題ありません)。電子ブック
結果
上記のコードをログに記録し、理由が判明しました。CopyTicks (from > 0) が最も新しいものまでのティックを受け取る場合、いくつかのティックを見逃す可能性があります。
例
from = 2016.09.29 11:05:55.564で要求されたティックです。返信で3ティック獲得
しばらくして、遠くからティック履歴を 要求したところ、以前はCopyTicksが見逃していたティックが表示されました。
こんな虫がいたのか!?
tickデータベースへの書き込みと読み込みが並行して行われるため、何らかのコンフリクトが発生しているようです。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
謎の株価指標
fxsaber さん 2016.09.30 15:09
インジケーターの発散を引き起こすバグの1つを特定することができた。またCopyTicksの話です。
ダニの歴史を 部分的に集めても、本当の歴史と一致しない場合があることがわかった。Expert Advisorに表示されます。
結果
このEAでも、弱いバグが見られます。部分的に集められた歴史は、数分間続く部分が欠落している可能性があることがわかりました。ただ、コードという形で簡潔かつ明確に再現することは発明されていない。また、複雑なものを掲載しても、誰も見ないので意味がありません。
一般的に、CopyTicksのバグを打ち消す方法はありません。また、Expert Advisorはリボンモード(COPY_TICKS_TRADE)で動作することに留意してください。そのため、リボンとの連携もできません。
もう一つのバグ、すべてのモードで COPY_TICKS_* になりました。
ある時点から始まるティックと、ある一定数などからのティックの両方を取得してみましたか?
コードを見る限りでは、最後の瞬間からある数字(100000)のようです。そして、ちょうどNダニが出た場合はどうするか。スキップもあるのでしょうか?
さっそくですが、私自身はまだあまりダニの実験をしていないのですが...。
ある時点から始まるティックと、ある一定数などからのティックの両方を取得してみましたか?
コードを見る限りでは、最後の瞬間からある数字(100000)のようです。そして、ちょうどNダニが出た場合はどうするか。スキップもあるのでしょうか?
さっそくですが、私自身はまだあまりダニの実験をしていないのですが...。
試してみました。
今日、彼らはデモのための新しいビルドを約束しています。だから、待つしかないのです。
試してみました。
今日、彼らはデモのために新しいビルドを約束します。だから、待たされるんです。
CopyTicks()が修正されることを期待します。
ところで、CopyTicks()が登場して以来、私は開発者に、他のCopy...()関数と同様にオーバーロード機能を追加してほしいとお願いしてきました。そうすると言われたんです。И...黙
ところで、CopyTicks()が登場して以来、私は開発者に、他のCopy...()関数と同様にオーバーロード機能を追加してほしいとお願いしてきました。そうすると言われたんです。И...黙