使用iClose/iOpen时间序列访问等工作时的MQL5错误。 - 页 10

 
fxsaber:

胡说八道。

+1
 
fxsaber:

胡说八道。

只要 "突然"(c),就不存在系统性能有限的问题(不管是哪种)。

 

这些天我一直在仔细研究OnCalculate和Tick数据处理。前面写到,所有的事情都是为了避免 "冻结 "不正确的指标,但是如果我们真的想处理自上一次调用OnCalculate以来的整个tick数据流,那么在快速的价格运动(和回滚)中,我们应该得到一个相当 "深 "的数组,对tick数组的深度是否有任何限制?

我不希望听到这样的回答,比如 "OnCalculate将收到一个累积的tick(s)...,以优化..."。

谁已经在分析蜱虫数据,是否有理由这样担心?

 
Farkhat Guzairov:

这些天我一直在研究OnCalculate和tick数据处理。前面写到,所有的事情都是为了避免 "冻结 "不正确的指标,但是如果我们真的想处理自上一次调用OnCalculate以来的整个tick数据流,那么在快速的价格运动(和回滚)中,我们应该得到一个相当 "深 "的数组,对tick数组的深度是否有任何限制?

我不希望听到这样的回答,比如 "OnCalculate将收到一个累积的tick(s)...,以优化..."。

谁已经在分析蜱虫数据,是否有任何原因导致这种担心?

2008-2009年,雷纳特曾经写道:"蜱虫是没有幸福的,他举了一个专家的例子。反正虱子是跳过的。如果你需要,在每次通话时都能得到https://www.mql5.com/ru/docs/series/copyticks,但你还是会错过你想进入的50/50的顶部或底部。

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
  • www.mql5.com
[in]  Количество запрашиваемых тиков. Если параметры from и count не указаны, то в массив ticks_array[] будут записаны все доступные последние тики, но не более 2000. Первый вызов CopyTicks() инициирует синхронизацию базы тиков, хранящихся на жёстком диске по данному символу. Если тиков в локальной базе не хватает, то недостающие тики...
 

为了宣传,我就在这里突然出现。我一直想弄清楚为什么这个东西停止工作,已经有一个月了。

long lastbardaytime=0;

int OnInit(){ 
}

bool isNewBar(string symbol_,ENUM_TIMEFRAMES period_){
    long curbar = SeriesInfoInteger(symbol_,period_,SERIES_LASTBAR_DATE)%86400;
    if(lastbardaytime == 0){
        lastbardaytime = curbar;
    }
    if(lastbardaytime != curbar){
        lastbardaytime = curbar;
        return(true);
    }
    return(false);
}


void OnTick(){
    if(isNewBar(MIX-12.18,PERIOD_M1)){ 
        Print("New bar");
///....
    }
} 


等待开幕式上的新版本。

 

恢复与优化和加载历史数据有关的问题。

1.iClose/iOpen函数的正确工作问题,以及在这种情况下的iTime,是存在的,我认为期望一切都会完美是没有意义的。也许应该简单地将它们从MQL5中删除,以避免再犯同样的错误?(我有一个问题,但我没有时间去描述它,因为我已经找到了一个解决方案,另一个 "转折")

也许有一个解决方案,但我希望它能被记录下来,而不是另一个MQL5社区的扭曲。我们谈论的是如何处理异步请求,例如,这些请求反过来会同步本地数据库。

在指标中,CopyTicks()函数立即返回结果。 当从一个指标中调用时,CopyTick()将立即返回每个符号的可用点数,如果没有足够的数据,也将开始同步刻度数据库。一个符号上的所有指标都在一个共同的线程中工作,所以指标无权等待同步的完成。一旦同步完成,随后对CopyTicks()的调用将返回所有要求的刻度。指标中的OnCalculate() 函数在每个tick传入后被调用。


关键短语是"完成同步后,下一次调用CopyTicks()将返回所有请求的刻度。",先生们,你们怎么知道同步完成的时间呢?它被写成在同步 结束之前,CopyTicks()返回例如-1,但事实并非如此结果在几次重新加载指标后,DB同步了,我们真的得到了整个数据集,但如果我不重新加载指标,我就得不到这个数据集,因为我不知道完成这个该死的同步的结果。

一个突出的例子是上一次的敲击,欧元兑美元出现了急剧的波动,虽然指标一直都在,而且这段时间也算是正常呈现,但在我重新加载后(改变了输入参数),指标开始不正确地反映信息,分别开始搜索指标中的错误(重新编译和重新加载几次),但没有任何帮助,然后那个 "奇迹 "发生了。"当你从一个指标中调用CopyTick()时,它将立即返回该符号可用的点数,同时开始同步 点数库",也许你应该创建(或拥有)能够告诉我们此刻本地数据库的同步还没有完成的函数,这个函数将减轻我们的任务,使我们能够为市场编写一个更高质量的产品。

P.S.:SymbolInfoTick 函数不幸地没有这个功能

 

不幸的是,这个例子并不总是有效。

//--- запросим тиковую историю с момента 1970.01.01 00:00.001 (параметр from=1 ms) 
      int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_ALL,1,getticks); 
      if(received!=-1) 
        { 
         //--- выведем информацию о количестве тиков и затраченном времени времени 
         PrintFormat("%s: received %d ticks in %d ms",_Symbol,received,GetTickCount()-start); 
         //--- если тиковая история синхронизирована, то код ошибки равен нулю 
         if(GetLastError()==0) 
           { 
            success=true; 
            break; 
           } 
         else 
            PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d", 
            _Symbol,received,GetTickCount()-start,_LastError); 
        } 

确切地说,10次中有1-2次有效。

但在上述情况下,它甚至一次都没有起作用。

 

还是一个问题,数据库是实时更新的吗?

正如我在上面写的,在有问题的整个时期,指标是工作的,即CopyTicks()函数 被定期 调用 ,但事实证明,它对本地数据库....,没有任何影响这很奇怪....

 
Unicornis:

2008-2009年,雷纳特曾经写道:"虱子是没有幸福的,举了一个专家的例子。蜱虫被跳过了,因为它是。如果需要,在每次通话时都能得到https://www.mql5.com/ru/docs/series/copyticks,但你还是会错过你想进入的50/50的顶部/底部。

谁不需要,谁需要:)要有实际的数据,特别是虱子。
 
Farkhat Guzairov:

恢复与优化和加载历史数据有关的问题。

1.iClose/iOpen函数的正确操作问题,以及在这种情况下的iTime,可能存在,没有理由期望一切都会完美。也许可以简单地将它们从MQL5中删除,以避免重蹈覆辙?(我有一个问题,但我没有时间去描述它,因为我已经找到了一个解决方案,另一个 "转折")

也许有一个解决方案,但我希望它能被记录下来,而不是另一个MQL5社区的扭曲。我们谈论的是如何处理异步请求,例如,这些请求反过来会同步本地数据库。

在指标中,CopyTicks()函数立即返回结果。 当从一个指标中调用时,CopyTick()将立即返回每个符号的可用点数,如果没有足够的数据,也将开始同步刻度数据库。一个符号上的所有指标都在一个共同的线程中工作,所以指标无权等待同步的完成。一旦同步完成,随后对CopyTicks()的调用将返回所有请求的刻度。指标中的OnCalculate() 函数在每次收到tick后被调用。


关键短语是"完成同步后,下一次调用CopyTicks()将返回所有请求的刻度。",先生们,你们怎么知道同步完成的时间呢?它被写成在同步 结束之前,CopyTicks()返回例如-1,但事实并非如此结果在几次重新加载指标后,DB同步了,我们真的得到了整个数据集,但如果我不重新加载指标,我就得不到这个数据集,因为我不知道完成这个该死的同步的结果。

一个突出的例子是上一次的敲击,欧元兑美元出现了急剧的波动,虽然指标一直都在,而且这段时间也算是正常呈现,但在我重新加载后(改变了输入参数),指标开始不正确地反映信息,分别开始搜索指标中的错误(重新编译和重新加载几次),但没有任何帮助,然后那个 "奇迹 "发生了。"当你从指标中调用CopyTick()时,它将立即返回该符号可用的ticks,同时开始同步ticks基础",也许你应该创建(或拥有)能够告诉我们此刻本地数据库的同步还没有完成的函数,这个函数将减轻我们的任务,使我们能够为市场编写更好的最终产品。

P.S.:SymbolInfoTick 函数不幸地没有这个功能

在这种情况下,SERIES_SYNCHRONIZED会返回什么?