// this is from the Trader base class// manage a new tick and predetermines whether a new bar hast startedvirtualvoid 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 performedvoid 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 ordersdouble v0 = inSameBar ? sBuf[0] : sBuf[1]; // determine the actual 'previous' bardouble v1 = inSameBar ? sBuf[1] : sBuf[2]; // determine the actual 'current' barif (_volume > 0) {
if (crossesZeroDownwards(v0, v1)) { // cross down?
setReqVolume(0); // close this order
tradeCloses = true;
}
} elseif (_volume < 0) {
if (crossesZeroUpwards(v0, v1)) { // cross up?
setReqVolume(0); // close this order
tradeCloses = true;
}
}
...
当时我想发表这篇文章,但在头版上看起来很可怕。
嗨,伙计们,女士们。
前段时间我也遇到过这个问题,我们在这里讨论过:https://www.mql5.com/en/forum/1642
我的EA只有开盘价策略,我想坚持这样做以节省回溯测试的时间(显然)。
我设计的解决方案如下。
我将把我的EA中重要的代码部分剪切并粘贴在下面。我希望这能对你有所帮助!
干杯!
我自己也遇到了这个问题。你已经猜到了,试图从JForex移植到MQL5!我开始希望我没有打扰,虽然我想最后期限的延长是有帮助的:)
看起来MetaQuotes仍然没有解决这个问题。
MT5外汇似乎并不支持DOM。
isNewBar也不能帮助我。
这似乎是一个荒谬的状态。
有谁知道MT5内部关于这个问题是否有什么变化?
有谁知道有什么办法可以解决多货币策略的问题,而这个策略是希望被输入点位的?
你的挫折感。
吉姆
我自己也遇到了这个问题。你已经猜到了,试图从JForex移植到MQL5!我开始希望我没有打扰,虽然我想最后期限的延长是有帮助的:)
看起来MetaQuotes仍然没有解决这个问题。
MT5外汇似乎并不支持DOM。
isNewBar也不能帮助我。
这似乎是一个荒谬的状态。
有谁知道MT5内部关于这个问题是否有什么变化?
有谁知道有什么办法可以解决多货币策略的问题,而这个策略是希望被输入点位的?
你的挫折感。
吉姆
嗨,enivid。
试着用OnTimer()代替OnTick(),使用1秒计时器。
谢谢你的建议。你的解决方案比我尝试过的任何其他方案都要好得多,当然也符合我们的要求。
然而,针对不同货币对进行的多货币回测 仍会产生轻微的不同结果。
这并没有激发出巨大的信心
我现在要去烧更多的午夜油!
干杯。
吉姆
尝试使用OnTimer()与1秒计时器,而不是OnTick()。
TradingGurus:
然而,针对不同货币对进行多货币回测仍然会产生轻微的不同结果。
吉姆,我在我的竞赛组合EA中使用1秒的OnTimer解决方案。如果你的策略依赖于每一个刻度,那么是的,在单一货币 上使用OnTimer与OnTick时,你会得到不同的结果,因为每秒钟有可能出现不止一个刻度。我发现,当 "缺失 "的刻度线创造了一个新的柱状高点或低点时,通常会产生最大的差异。你可以检查前一个条形高/低点和当前条形高/低点的任何变化,并在它们发生时将其作为 "缺失的刻度 "插入,当然,除非当前的刻度创造了新的条形高/低。
还要记住,MetaTrader策略测试器只模拟tick数据。根据您的策略对刻度线运动的敏感程度,这种模拟可能对回测与正向测试产生重大影响。
- 帕特里克
如果您的策略依赖于每一个刻度,那么是的,在单一货币上使用OnTimer与OnTick时,您会得到不同的结果,因为每秒钟有可能出现不止一个刻度。
- 帕特里克
我不是这个意思。我们的(仍然只是潜在的!)竞赛EA交易所有12个货币对。仅仅使用OnTimer(),如果我在策略测试器中 选择英镑/美元而不是欧元/美元,我就会得到不同的回测结果。
我非常熟悉MT4在使用模拟点阵进行回测时的局限性。不幸的是,看起来MT5也没有好到哪里去。
吉姆
由于历史原因,我们非常想让这一切与蜱虫一起进行,但我们已经放弃了。但我们已经放弃了,因为我们无法让事情保持一致。
我们已经咬紧牙关,在OnTimer()和isNewBar()的帮助下,现在正在使用1分钟的条形。
事情终于开始有了些眉目,而且离冠军赛的截止日期还有4个小时呢 :)
吉姆终于在截止日期前的5分钟内提交了我们的EA。
只做了一次回测,没有优化。
以前从来没有这样做过,谁能告诉我它是否还有机会获得批准?
如果是的话,我们是否可以在下周对输入设置进行调整,或者不允许?
吉姆
终于在截止日期前的5分钟内提交了我们的EA。
只做了一次回测,没有优化。
以前从来没有这样做过,谁能告诉我它是否还有机会获得批准?
如果是的话,我们是否可以在下周对输入设置进行调整,或者不允许?
吉姆
祝你好运!吉姆
如果你的EA在2010.01.01至2010.08.01期间回测正确,没有任何错误(交易错误 等),并且有利润,那么你将有可能获得批准,只要你的个人信息也正确。然而,从这一点上,你将不能改变任何东西,包括设置(输入参数)。
我希望能看到你的机器人投入使用
- 帕特里克