回溯测试多货币EA - 页 3

 

当时我想发表这篇文章,但在头版上看起来很可怕。

投资组合EA的逻辑

 

嗨,伙计们,女士们。

前段时间我也遇到过这个问题,我们在这里讨论过:https://www.mql5.com/en/forum/1642

我的EA只有开盘价策略,我想坚持这样做以节省回溯测试的时间(显然)。

我设计的解决方案如下。

  1. 在你的EA的主要交易期间,使用最活跃的货币对作为 "驱动"(产生ticks的图表)。
  2. 在每个onTick()中检查你的驱动器是否进入了一个新的柱状体
    1. 如果没有新条形图,再等一等
    2. 如果有一个新的条形图,将OnTick()信息分发给你的各个交易员(每个交易员负责一个货币对)。
  3. 在交易员中检查该交易员的货币对的最后时间是否等于驱动器中的 "新条形时间"。
    1. 如果是,你可以继续正常操作
    2. 如果不是,你必须把当前条形图的收盘价当作你要找的开盘价,如果你要找以前条形图的信息,要考虑到这种 "偏一 "的情况。

我将把我的EA中重要的代码部分剪切并粘贴在下面。我希望这能对你有所帮助!

干杯!


// this is from the Trader base class

    // manage a new tick and predetermines whether a new bar hast started
    virtual void onTick() {
        MqlRates rates[1];
    
        // check the rates of the tick stream we're attached to (_Symbol!!!)
        if (CopyRates(_Symbol, _period, 0, 1, rates) != 1) {
            Print("CopyRates of ", _Symbol, " failed");
            return;
        }

        if (_newBar = (rates[0].time != _currBarTime)) {
            _prevBarTime = _currBarTime;  // remember the previous bar time
            _currBarTime = rates[0].time;  // remember the current bar time
        }

    }


// this is the actual trader for a specific currency pair

    // checks whether a new trade (closing or opening) is to be performed
    void checkForTrade(void) {    
    
        MqlRates rates[3];

        if (CopyRates(_symbol, _period, 0, 3, rates) != 3) {
            Print("CopyRates of ", _symbol, " failed");
            return;
        }

        bool inSameBar = (rates[2].time == _currBarTime);  // _currBarTime determined in OnTick()!


        double sBuf[3];  // signal buffer! 2: current bar, 1: previous bar, 0: current - 2 

        if (CopyBuffer(_ind, SIGNAL3, 0, 3, sBuf) != 3) {
            Print("copy signal from indicator failed, no data");
            return;
        }    
        
        
        // first close exiting orders
        double v0 = inSameBar ? sBuf[0] : sBuf[1];  // determine the actual 'previous' bar
        double v1 = inSameBar ? sBuf[1] : sBuf[2];  // determine the actual 'current' bar
        
        if (_volume > 0) {
            if (crossesZeroDownwards(v0, v1)) {  // cross down?
                setReqVolume(0);  // close this order
                tradeCloses = true;
            }    
        } else if (_volume < 0) {
            if (crossesZeroUpwards(v0, v1)) {  // cross up?
                setReqVolume(0);  // close this order
                tradeCloses = true;
            }    
        }

        ...
Tick generation - Open bar only
  • www.mql5.com
The whole list printed shows also many discrepancies in times.
 

我自己也遇到了这个问题。你已经猜到了,试图从JForex移植到MQL5!我开始希望我没有打扰,虽然我想最后期限的延长是有帮助的:)

看起来MetaQuotes仍然没有解决这个问题。

MT5外汇似乎并不支持DOM。

isNewBar也不能帮助我。

这似乎是一个荒谬的状态。

有谁知道MT5内部关于这个问题是否有什么变化?

有谁知道有什么办法可以解决多货币策略的问题,而这个策略是希望被输入点位的?

你的挫折感。

吉姆

 
TradingGurus:

我自己也遇到了这个问题。你已经猜到了,试图从JForex移植到MQL5!我开始希望我没有打扰,虽然我想最后期限的延长是有帮助的:)

看起来MetaQuotes仍然没有解决这个问题。

MT5外汇似乎并不支持DOM。

isNewBar也不能帮助我。

这似乎是一个荒谬的状态。

有谁知道MT5内部关于这个问题是否有什么变化?

有谁知道有什么办法可以解决多货币策略的问题,而这个策略是希望被输入点位的?

你的挫折感。

吉姆


试着用OnTimer()代替OnTick(),使用1秒的计时器。
 

嗨,enivid。

enivid:
试着用OnTimer()代替OnTick(),使用1秒计时器。

谢谢你的建议。你的解决方案比我尝试过的任何其他方案都要好得多,当然也符合我们的要求。

然而,针对不同货币对进行的多货币回测 仍会产生轻微的不同结果。

这并没有激发出巨大的信心

我现在要去烧更多的午夜油!

干杯。

吉姆

 
enivid:
尝试使用OnTimer()与1秒计时器,而不是OnTick()。

TradingGurus:

然而,针对不同货币对进行多货币回测仍然会产生轻微的不同结果。

吉姆,我在我的竞赛组合EA中使用1秒的OnTimer解决方案。如果你的策略依赖于每一个刻度,那么是的,在单一货币 上使用OnTimer与OnTick时,你会得到不同的结果,因为每秒钟有可能出现不止一个刻度。我发现,当 "缺失 "的刻度线创造了一个新的柱状高点或低点时,通常会产生最大的差异。你可以检查前一个条形高/低点和当前条形高/低点的任何变化,并在它们发生时将其作为 "缺失的刻度 "插入,当然,除非当前的刻度创造了新的条形高/低。

还要记住,MetaTrader策略测试器只模拟tick数据。根据您的策略对刻度线运动的敏感程度,这种模拟可能对回测与正向测试产生重大影响。

- 帕特里克

 
你好,帕特里克。
Pix:

如果您的策略依赖于每一个刻度,那么是的,在单一货币上使用OnTimer与OnTick时,您会得到不同的结果,因为每秒钟有可能出现不止一个刻度。

- 帕特里克


我不是这个意思。我们的(仍然只是潜在的!)竞赛EA交易所有12个货币对。仅仅使用OnTimer(),如果我在策略测试器中 选择英镑/美元而不是欧元/美元,我就会得到不同的回测结果。

我非常熟悉MT4在使用模拟点阵进行回测时的局限性。不幸的是,看起来MT5也没有好到哪里去。

吉姆

 

由于历史原因,我们非常想让这一切与蜱虫一起进行,但我们已经放弃了。但我们已经放弃了,因为我们无法让事情保持一致。

我们已经咬紧牙关,在OnTimer()和isNewBar()的帮助下,现在正在使用1分钟的条形。

事情终于开始有了些眉目,而且离冠军赛的截止日期还有4个小时呢 :)

吉姆
 

终于在截止日期前的5分钟内提交了我们的EA。

只做了一次回测,没有优化。

以前从来没有这样做过,谁能告诉我它是否还有机会获得批准?

如果是的话,我们是否可以在下周对输入设置进行调整,或者不允许?

吉姆

 
TradingGurus:

终于在截止日期前的5分钟内提交了我们的EA。

只做了一次回测,没有优化。

以前从来没有这样做过,谁能告诉我它是否还有机会获得批准?

如果是的话,我们是否可以在下周对输入设置进行调整,或者不允许?

吉姆

祝你好运!吉姆

如果你的EA在2010.01.01至2010.08.01期间回测正确,没有任何错误(交易错误 等),并且有利润,那么你将有可能获得批准,只要你的个人信息也正确。然而,从这一点上,你将不能改变任何东西,包括设置(输入参数)。

我希望能看到你的机器人投入使用

- 帕特里克