实时的提基 - 页 7

 
prostotrader:

你必须张贴你的代码来证明或反驳一些东西!

你自己去证明相邻的OnTick事件之间有记录,然后进入CopyTicks-历史,并可以通过OnBookEvent实时捕获。

不幸的是,上面的日志并没有显示这一点。

 
fxsaber:

你正在证明相邻的OnTick事件之间存在记录,然后进入CopyTicks历史,并可以通过OnBookEvent实时捕捉。

不幸的是,上面的日志并没有显示这一点。

我通过发布工作代码证明了这一点,并解释了为什么它工作得更快,而且是实时的。

我是基于MQL5功能的 帮助和个人经验。

想自己检查一下吗?或者用一个工作代码来证明相反的情况。

 
prostotrader:

我通过发布工作代码和解释为什么它工作得更快、更实时来证明这一点。

不幸的是,当缺少OnTick CopyTicks-history条目形式的主要证明环节时,不能被接受。

 
fxsaber:

不幸的是,当缺少OnTick CopyTicks-history记录形式的证明的主要环节时,它不能被接受。

那么问题出在哪里?

自己去看看吧。

 
prostotrader:

那么它是什么呢?

自己去看看吧。

只是指出你的证明不能仅凭逻辑上的理由而被接受,而不是与任何其他观点相矛盾。

 
fxsaber:

只是指出你的证明不能仅仅因为逻辑原因而被接受,而不是因为与任何其他观点相矛盾。

好的,我明白了,但我还是建议阅读OnBookEvent()的帮助。

我不打算证明什么,我只是在主题中写 了一些工作 代码,并解释(应论坛用户的要求)。

为什么这个方法比OnTick()好,如果有人不相信 我,让他自己检查一下吧

或者贴出一个能反驳我的解释的工作代码。

由以下人员添加

论坛上有成千上万的 外汇交易者,他们从未使用过OnBookEvent()。

并且有一个tumblr。

我应该为每一个会在这个线程中发帖的人做些什么呢?

 
prostotrader:

第一次OnTick()的时间2020.01.30 19:31:11.112

秒的时间 OnTick()2020.01.30 19:31:11.802

也就是说,690毫秒已经过去了,同时,在这690毫秒的OnTick()之间的

OnBookEvent()被触发了15次

你认为这些点击声与蜱虫没有 关系吗?

除非你在堆栈中调用一个不影响边缘带(买入/卖出)或翻转器的变化,那么是的,这些触发器与跳动没有关系。


prostotrader:

还有一个基本点,很多人都忘记了。

这是EA通过分析输入数据做出决定的速度。

使用OnBookEvent()而不是OnTick(),我的EA会 你的

你错了,我已经告诉你一千次了。

你可以在一个终端上的两个图表上运行这个EA:一个是 "使用OnBookEvent "模式,第二个是 "使用OnTick "模式(这是输入参数)。事件处理程序内部的代码是相同的(你可以把它放在一个单独的函数中,并从那里调用它,但这不是重点)。

//---
enum ENUM_BOOK_OR_TICK
{
        USE_BOOK,       // Use OnBookEvent
        USE_TICK        // Use OnTick
};

input ENUM_BOOK_OR_TICK Mode = USE_BOOK;

//---
bool is_book;
long last_tick_time = 0;
MqlTick cur_ticks[], last_tick;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
        if ( Mode == USE_BOOK )
        {
                is_book = MarketBookAdd(Symbol());
                if ( !is_book ) Alert( "MarketBookAdd failed with error #", GetLastError(), "!" );
        }

        last_tick_time = 0;

        return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
        if(is_book == true) MarketBookRelease(Symbol());
}

//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
{
        if ( Mode != USE_BOOK || symbol != _Symbol ) return;

        if ( last_tick_time <= 0 )
        {
                if ( CopyTicks( _Symbol, cur_ticks, COPY_TICKS_ALL, 0, 1 ) > 0 )
                {
                        last_tick_time = cur_ticks[0].time_msc;
                        last_tick = cur_ticks[0];
                }
        }
        if ( last_tick_time > 0 )
        {
                int new_ticks = CopyTicks( _Symbol, cur_ticks, COPY_TICKS_ALL, last_tick_time, 0 );
                for ( int i = 0; i < new_ticks; i ++ )
                {
                        PrintTick( "OnBook", cur_ticks[i] );
                }
                if ( new_ticks > 0 )
                {
                        last_tick_time = cur_ticks[new_ticks-1].time_msc;
                        last_tick = cur_ticks[new_ticks-1];
                }
        }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
{
        if ( Mode != USE_TICK ) return;

        if ( last_tick_time <= 0 )
        {
                if ( CopyTicks( _Symbol, cur_ticks, COPY_TICKS_ALL, 0, 1 ) > 0 )
                {
                        last_tick_time = cur_ticks[0].time_msc;
                        last_tick = cur_ticks[0];
                }
        }
        if ( last_tick_time > 0 )
        {
                int new_ticks = CopyTicks( _Symbol, cur_ticks, COPY_TICKS_ALL, last_tick_time, 0 );
                for ( int i = 0; i < new_ticks; i ++ )
                {
                        PrintTick( "OnTick", cur_ticks[i] );
                }
                if ( new_ticks > 0 )
                {
                        last_tick_time = cur_ticks[new_ticks-1].time_msc;
                        last_tick = cur_ticks[new_ticks-1];
                }
        }
}

void PrintTick( string func_name, MqlTick &tick )
{
        if ( tick.time_msc == last_tick.time_msc &&
                        tick.bid == last_tick.bid &&
                        tick.ask == last_tick.ask &&
                        tick.last == last_tick.last ) return;
        Print( GetTickCount64(), ": tick received from ", func_name, ": ",
                        tick.time, "   ", tick.time_msc, "  ",
                        DoubleToString( tick.bid, _Digits ), " / ",
                        DoubleToString( tick.ask, _Digits ), " / ",
                        DoubleToString( tick.last, _Digits ) );
};

然后查看EA的日志,分析收到tick的时间。


如果你发现一些有趣的事情(例如,从OnTick获得一个tick(GetTickCount64)的时间比从OnBook获得同样的时间(对于同一个tick)要长),请在这里发表。

 
Andrey Khatimlianskii:

如果你不调用杯中的变化,不影响边缘带(买入/卖出)或翻牌,那么是的,这些触发器与跳动没有关系。


你错了,我已经告诉你一千次了。

在一个终端上的两个图表上运行该EA:一个是 "使用OnBookEvent "模式,另一个是 "使用OnTick "模式(这是输入参数)。事件处理程序内部的代码是相同的(你可以把它放在一个单独的函数中,并从那里调用它,但这不是重点)。

然后查看EA的日志,分析收到tick的时间。


如果你发现一些有趣的事情(例如,从OnTick获得一个tick(GetTickCount64)的时间比从OnBook获得的类似时间(对于相同的tick)要长),请在这里发表。

这就像我说的那样!

在日志的第一行(联合工作)是对我的解释的直接确认

OnTick()触发较晚,因此接收到的是过时的数据


附加的文件:
20200131.log  220 kb
 
prostotrader:

这就像我说的那样!

在日志的第一行(合作工作),直接确认了我的解释

OnTick()的触发时间较晚,所以它得到的是过期的数据

在这篇日志前显示一些信息。

是在发射后(最开始的条目)吗?你是按照什么顺序运行这些EA的?

ps:见附件中的日志,现在就去看一下。

 
Andrey Khatimlianskii:

在这篇日志前显示一些信息。

是在推出之后(最开始的条目)吗?你是按照什么顺序运行这些EA的?

首先是本册,然后是本体,上面附有日志