#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 and flags),这个解决方案是完全合适的 - 没有发现任何错误。
关于交易、自动交易系统和测试交易策略的论坛
神秘的股票指标
fxsaber, 2016.09.27 18:32
当来自CopyTicks的输入不为零时,所有的刹车似乎都是打开的。
在这种模式下,似乎对CopyTicks的实现非常歪曲,即使要求自上次调用以来的ticks。看起来它应该飞起来,但它没有。
等到本周的测试版,我们对蜱虫和tumblr的更新做了一些改进。
1432 - 许多错误得到解决。谢谢你!
但不是全部。
如果将添加的历史记录与实际历史记录进行比较,在COPY_TICKS_ALL模式下会出现差异(TRADE和INFO--没有问题)。EA
结果
但不是全部。
如果将添加的历史记录与实际历史记录进行比较,在COPY_TICKS_ALL模式下会出现差异(TRADE和INFO--没有问题)。EA
结果
我记录了上面的代码,发现了原因。如果CopyTicks (from > 0)接收到最新鲜的刻度,它可能会错过一些。
例子。
要求的ticks与从=2016.09.29 11:05:55.564。得到了三个点的答复
一段时间后,我从远处请求查看打勾历史,得到了一个打勾,而CopyTicks之前错过了这个打勾。
这样的虫子!
似乎在平行写入和读出tick数据库方面存在某种冲突。
关于交易、自动交易系统和测试交易策略的论坛
神秘的股票指标
fxsaber, 2016.09.30 15:09
能够定位导致指标分歧的一个错误。又是关于CopyTicks。
事实证明,如果我们把蜱虫的历史 分门别类地收集起来,可能与真实的历史不相吻合。专家顾问显示它
结果
这个EA也显示了一个弱点。我发现,分部分收集的历史可能缺少一些持续数分钟的部分。只是还没有发明简明清晰的代码形式的复制品。而且发布复杂的也没有意义,因为根本没有人会看。
一般来说,没有办法战胜CopyTicks中的错误。并注意专家顾问在磁带模式下工作(COPY_TICKS_TRADE)。因此,它甚至不能与丝带一起工作。
另一个错误,现在在所有模式下都是COPY_TICKS_*。
你是否尝试过从某一点和某一固定数字开始获得刻度线?
从代码上看,从最后一刻开始,它就像一个特定的数字(100000)。如果你只得到N个虱子呢。也会有跳过的情况吗?
让我马上告诉你,我自己还没怎么试验过蜱虫......。
你是否尝试过从某一点和某一固定数字开始获得刻度线?
从代码上看,从最后一刻开始,它就像一个特定的数字(100000)。如果你只得到N个虱子呢。也会有跳过的情况吗?
让我马上告诉你,我自己还没怎么试验过蜱虫......。
试过了。
今天,他们承诺将为演示提供新的构建。所以我们必须等待。
试过了。
今天,他们承诺将为演示提供新的建设。这就是为什么我必须等待。
我希望,CopyTicks()将被纠正。
顺便说一下,自从CopyTicks()出现后,我就要求开发人员像其他Copy...()函数一样增加重载功能。他们告诉我他们会的。И...沉默...
顺便说一下,自从CopyTicks()出现后,我就要求开发者增加重载功能,就像其他Copy...()函数一样。他们告诉我他们会的。И...沉默...