long LastTime = 0; // time_msc-время последнего тика (самого свежего), полученного из истории int Count = 0; // Количество тиков в последенем запросе, у которых time_msc == LastTime
// Возвращает свежие тики, пришедшие после предыдущего вызова int GetFreshTicks( MqlTick &Ticks[], constuint flags = COPY_TICKS_INFO, constuint count = 2000 ) { int Res = 0;
if ((NewAmount > 0) && (Count < NewAmount)) { Res = ArrayCopy(Ticks, NewTicks, 0, Count);
// Взяли крайнее время из текущей истории LastTime = NewTicks[NewAmount - 1].time_msc; Count = 1;
// Находим (Count) в текущей истории количество тиков со временем LastTime for (int i = NewAmount - 2; i >= 0; i--) { if (NewTicks[i].time_msc < LastTime) break;
没有,很遗憾。雷纳特认为,玻璃是永久性地流向整个市场观察。但对于大多数情况来说,这不是一个权宜之计(浪费)的解决方案。
这是唯一可能的选择。流动的利害关系是一种原生的、不可分割的流弊。
平台中的所有东西都是相互关联的,需要全球数据同步。而蜱虫流在其中起到了至关重要的作用。
这是唯一可能的选择。流动率是一种原生的、不可分割的蜱虫流。
平台中的所有东西都是相互关联的,需要全球数据同步。而蜱虫流在其中起着关键作用。
那么,如果没有EA订阅BookEvent呢?
你是否建议削减MarketWatch以提高性能?
但最重要的是,上面的采样率计算是不相关的。它们做得如此笨拙(除了CopyTicks的时间外,测量任何东西),甚至让人感到惊讶。
那么,如果没有EA订阅BookEvent呢?
你是否建议削减Marketwatch以提高性能?
如果你想的话,就把它切掉。
这就是你测试CopyTicks的方法。
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick()
{
ulong from =(TimeTradeServer()-1200)*1000;
ulong ticks =GetMicrosecondCount();
int records=CopyTicks(_Symbol,ExtArr,COPY_TICKS_INFO,from,2048);
ticks=GetMicrosecondCount()-ticks;
Print("Time: ",ticks," msc for ",records," records");
}
下面是以微秒为单位的输出:在过去20分钟里,2048个INFO点的每个样本有95微秒的输出
我已经在这个问题上吃了我的猫眼了。我已经用CopyTicks做了很多测试。这一次我决定,只要运行指标就够了。
你的变体。
2016.10.18 14:29:11.966 Test14 (GBPUSD,M1) Time: 20263 msc for 2048 records
2016.10.18 14:29:10.841 Test14 (GBPUSD,M1) Time: 13190 msc for 2048 records
2016.10.18 14:29:07.788 Test14 (GBPUSD,M1) Time: 13344 msc for 2048 records
2016.10.18 14:29:07.738 Test14 (GBPUSD,M1) Time: 12751 msc for 2048 records
这是关于进入最后4096个报价的紧密缓存。
任何进入它的东西都需要微秒,而任何更长的东西都需要访问历史(包括磁盘)。
因此,我的例子是在美元兑瑞郎(USDCHF)上获取20分钟的刻度,这很少更新,是在缓存中,但在英镑兑美元上,已经超过了最后的4096个刻度,不得不转到远处的数据库。
如果我设置ulong从=(TimeTradeServer()-600)*1000,那么它也会适合GBPUSD。
这是关于进入最后4096个报价的紧密缓存。
任何进入它的东西都需要微秒的时间,而更多的东西需要访问历史(包括磁盘)。
在你的演示中,情况确实如此。在BCS上,它没有。
2016.10.18 15:12:32.949 Test14 (Si-12.16,M1) Time: 29089 msc for 1503 records
2016.10.18 15:12:32.822 Test14 (Si-12.16,M1) Time: 33207 msc for 1501 records
2016.10.18 15:12:32.639 Test14 (Si-12.16,M1) Time: 21389 msc for 1500 records
2016.10.18 15:12:31.959 Test14 (Si-12.16,M1) Time: 21926 msc for 1500 records
而在Alpari,这一点也不好。
2016.10.18 15:14:47.159 Test14 (GBPUSD,M1) Time: 31086 msc for 1836 records
2016.10.18 15:14:46.999 Test14 (GBPUSD,M1) Time: 30698 msc for 1836 records
2016.10.18 15:14:46.779 Test14 (GBPUSD,M1) Time: 46306 msc for 1836 records
2016.10.18 15:14:46.612 Test14 (GBPUSD,M1) Time: 30440 msc for 1836 records
2016.10.18 15:14:46.532 Test14 (GBPUSD,M1) Time: 36227 msc for 1836 records
因此,我在很少更新的USDCHF上获取20分钟的ticks的例子适合于缓存,但是对于GBPUSD来说,它已经超过了最后的4096个ticks,迫使我去到一个遥远的数据库。
上面评论了关于copytix的不便之处。提出的指标由于被迫多次调用copyix而变得缓慢。而所有的滞后都是因为它。原因就在这里
关于交易、自动交易系统和测试交易策略的论坛
测试 "CopyTicks"。
fxsaber, 2016.10.11 19:23
获得从_时间到_时间的刻度的最佳(最快)算法是什么?已经提出了一个解决方案
关于交易、自动交易系统和交易策略测试的论坛
测试 "CopyTicks"。
fxsaber, 2016.10.12 08:44
当非零时,CopyTicks内部正在寻找(可能是二进制搜索)一个开始的地方--内部基础中的一个索引。
请添加一个函数,按时间返回数据库中的索引。那么这个任务将有可能得到最佳解决
现在,为了下载不同日期之间的刻度线,我们必须从开始日期开始,对未知数量的刻度线提出请求。然后每次检查,是否已经到达结束日期。并考虑到一个事实,即每个请求copytix是非常昂贵的,而你得到这样的刹车。
而在Alpari上,它一点也不好。
阿尔帕里似乎已被修复。BCS没有。
如果能有一个先前要求的复制数据的缓存,那就更好了。那么,如果复制是分几步进行的(从[i]到from[i+1]),那么在第一次请求后进行大量的缓存是合乎逻辑的。
总而言之,目前还不清楚该功能在内部是如何安排的。但很难用它来工作--100%。
int Count = 0; // Количество тиков в последенем запросе, у которых time_msc == LastTime
// Возвращает свежие тики, пришедшие после предыдущего вызова
int GetFreshTicks( MqlTick &Ticks[], const uint flags = COPY_TICKS_INFO, const uint count = 2000 )
{
int Res = 0;
MqlTick NewTicks[];
const int NewAmount = CopyTicks(Symbol(), NewTicks, flags, LastTime, count);
if ((NewAmount > 0) && (Count < NewAmount))
{
Res = ArrayCopy(Ticks, NewTicks, 0, Count);
// Взяли крайнее время из текущей истории
LastTime = NewTicks[NewAmount - 1].time_msc;
Count = 1;
// Находим (Count) в текущей истории количество тиков со временем LastTime
for (int i = NewAmount - 2; i >= 0; i--)
{
if (NewTicks[i].time_msc < LastTime)
break;
Count++;
}
}
return(Res);
}
#define TOSTRING(A) " " + #A + " = " + (string)(A)
void OnTick( void )
{
// возьмем тики с начала утренней сессии
LastTime = (TimeCurrent() - (TimeCurrent() % (24 * 3600))) * 1000;
MqlTick Ticks[];
int i = 0;
int Sum = 0;
const ulong StartTime =GetMicrosecondCount();
// Взяли свеженькие тики
int Amount = GetFreshTicks(Ticks);
while (Amount > 0)
{
Sum += Amount;
i++;
Print(TOSTRING(i) + TOSTRING(Amount) + TOSTRING(Sum) + TOSTRING(GetMicrosecondCount() - StartTime));
// Взяли свеженькие тики
Amount = GetFreshTicks(Ticks);
}
}
2016.10.18 16:06:18.744 Test15 (GBPUSD,M1) i = 39 Amount = 1999 Sum = 77961 GetMicrosecondCount()-StartTime = 584314
2016.10.18 16:06:18.729 Test15 (GBPUSD,M1) i = 38 Amount = 1999 Sum = 75962 GetMicrosecondCount()-StartTime = 568509
2016.10.18 16:06:18.714 Test15 (GBPUSD,M1) i = 37 Amount = 1999 Sum = 73963 GetMicrosecondCount()-StartTime = 552582
2016.10.18 16:06:18.696 Test15 (GBPUSD,M1) i = 36 Amount = 1999 Sum = 71964 GetMicrosecondCount()-StartTime = 536790
2016.10.18 16:06:18.681 Test15 (GBPUSD,M1) i = 35 Amount = 1999 Sum = 69965 GetMicrosecondCount()-StartTime = 520432
2016.10.18 16:06:18.666 Test15 (GBPUSD,M1) i = 34 Amount = 1999 Sum = 67966 GetMicrosecondCount()-StartTime = 504725
2016.10.18 16:06:18.649 Test15 (GBPUSD,M1) i = 33 Amount = 1999 Sum = 65967 GetMicrosecondCount()-StartTime = 488911
2016.10.18 16:06:18.634 Test15 (GBPUSD,M1) i = 32 Amount = 1999 Sum = 63968 GetMicrosecondCount()-StartTime = 473372
2016.10.18 16:06:18.619 Test15 (GBPUSD,M1) i = 31 Amount = 1999 Sum = 61969 GetMicrosecondCount()-StartTime = 458022
2016.10.18 16:06:18.604 Test15 (GBPUSD,M1) i = 30 Amount = 1999 Sum = 59970 GetMicrosecondCount()-StartTime = 442557
2016.10.18 16:06:18.589 Test15 (GBPUSD,M1) i = 29 Amount = 1999 Sum = 57971 GetMicrosecondCount()-StartTime = 427044
2016.10.18 16:06:18.571 Test15 (GBPUSD,M1) i = 28 Amount = 1999 Sum = 55972 GetMicrosecondCount()-StartTime = 411524
2016.10.18 16:06:18.556 Test15 (GBPUSD,M1) i = 27 Amount = 1999 Sum = 53973 GetMicrosecondCount()-StartTime = 396539
2016.10.18 16:06:18.541 Test15 (GBPUSD,M1) i = 26 Amount = 1999 Sum = 51974 GetMicrosecondCount()-StartTime = 381185
2016.10.18 16:06:18.526 Test15 (GBPUSD,M1) i = 25 Amount = 1999 Sum = 49975 GetMicrosecondCount()-StartTime = 366146
2016.10.18 16:06:18.511 Test15 (GBPUSD,M1) i = 24 Amount = 1999 Sum = 47976 GetMicrosecondCount()-StartTime = 351066
2016.10.18 16:06:18.496 Test15 (GBPUSD,M1) i = 23 Amount = 1999 Sum = 45977 GetMicrosecondCount()-StartTime = 336183
2016.10.18 16:06:18.481 Test15 (GBPUSD,M1) i = 22 Amount = 1999 Sum = 43978 GetMicrosecondCount()-StartTime = 321109
2016.10.18 16:06:18.466 Test15 (GBPUSD,M1) i = 21 Amount = 1999 Sum = 41979 GetMicrosecondCount()-StartTime = 306119
2016.10.18 16:06:18.449 Test15 (GBPUSD,M1) i = 20 Amount = 1999 Sum = 39980 GetMicrosecondCount()-StartTime = 288558
2016.10.18 16:06:18.434 Test15 (GBPUSD,M1) i = 19 Amount = 1999 Sum = 37981 GetMicrosecondCount()-StartTime = 273758
2016.10.18 16:06:18.419 Test15 (GBPUSD,M1) i = 18 Amount = 1999 Sum = 35982 GetMicrosecondCount()-StartTime = 259255
2016.10.18 16:06:18.406 Test15 (GBPUSD,M1) i = 17 Amount = 1999 Sum = 33983 GetMicrosecondCount()-StartTime = 244750
2016.10.18 16:06:18.391 Test15 (GBPUSD,M1) i = 16 Amount = 1999 Sum = 31984 GetMicrosecondCount()-StartTime = 230100
2016.10.18 16:06:18.371 Test15 (GBPUSD,M1) i = 15 Amount = 1999 Sum = 29985 GetMicrosecondCount()-StartTime = 216143
2016.10.18 16:06:18.361 Test15 (GBPUSD,M1) i = 14 Amount = 1999 Sum = 27986 GetMicrosecondCount()-StartTime = 201830
2016.10.18 16:06:18.346 Test15 (GBPUSD,M1) i = 13 Amount = 1999 Sum = 25987 GetMicrosecondCount()-StartTime = 186887
2016.10.18 16:06:18.331 Test15 (GBPUSD,M1) i = 12 Amount = 1999 Sum = 23988 GetMicrosecondCount()-StartTime = 172667
2016.10.18 16:06:18.311 Test15 (GBPUSD,M1) i = 11 Amount = 1999 Sum = 21989 GetMicrosecondCount()-StartTime = 158356
2016.10.18 16:06:18.299 Test15 (GBPUSD,M1) i = 10 Amount = 1999 Sum = 19990 GetMicrosecondCount()-StartTime = 143450
2016.10.18 16:06:18.289 Test15 (GBPUSD,M1) i = 9 Amount = 1999 Sum = 17991 GetMicrosecondCount()-StartTime = 128520
2016.10.18 16:06:18.269 Test15 (GBPUSD,M1) i = 8 Amount = 1999 Sum = 15992 GetMicrosecondCount()-StartTime = 114209
2016.10.18 16:06:18.256 Test15 (GBPUSD,M1) i = 7 Amount = 1999 Sum = 13993 GetMicrosecondCount()-StartTime = 100016
2016.10.18 16:06:18.246 Test15 (GBPUSD,M1) i = 6 Amount = 1999 Sum = 11994 GetMicrosecondCount()-StartTime = 85745
2016.10.18 16:06:18.231 Test15 (GBPUSD,M1) i = 5 Amount = 1999 Sum = 9995 GetMicrosecondCount()-StartTime = 71438
2016.10.18 16:06:18.219 Test15 (GBPUSD,M1) i = 4 Amount = 1999 Sum = 7996 GetMicrosecondCount()-StartTime = 57293
2016.10.18 16:06:18.204 Test15 (GBPUSD,M1) i = 3 Amount = 1999 Sum = 5997 GetMicrosecondCount()-StartTime = 43192
2016.10.18 16:06:18.181 Test15 (GBPUSD,M1) i = 2 Amount = 1999 Sum = 3998 GetMicrosecondCount()-StartTime = 28943
2016.10.18 16:06:18.171 Test15 (GBPUSD,M1) i = 1 Amount = 1999 Sum = 1999 GetMicrosecondCount()-StartTime = 15160
在半秒内完成8万次点击是很慢的!说是有必要要求一次不要2000支,但更多,当然是可以的。那么什么请求值是最佳的?
最理想的做法是把你需要的东西下载到自己深处一次,然后只在微秒内从附近的缓存中下载新的东西。
如果每次你做深层查询时都与跌到盘面上,那当然是你自己的错。