大多数专家顾问实时运行,在每个报价单上都有其优点和缺点。 从好的方面来说,运行每个报价点可以让 EA 捕捉到最小的价格变动,这对于剥头皮系统来说非常有用。
然而,不利的一面是,在每次报价时实时执行交易会使许多系统容易受到错误信号的影响。
有时每个柱只检查一次交易条件会更好。 通过等待柱线收盘,我们可以确定条件已经发生并且信号有效。 在这篇 MQL4 如何避免在每个分时运行的文章中了解如何对您的 Expert Advisor 进行编程以使用收盘价并避免错误信号。
每个柱线交易一次也意味着策略测试器中的结果将更加准确和相关。 由于 MT4 策略测试器的固有局限性,使用“每个报价”作为测试模型将产生不可靠的回溯测试结果,因为报价通常是根据 M1 数据建模的。 实时交易中发生的交易不一定与策略测试器中进行的交易相对应。
但是通过将我们的交易放在收盘价上并使用“仅开盘价”作为测试模式,我们可以获得更准确地反映实时交易的测试结果。 每个柱线交易一次的缺点是交易可能会延迟执行,尤其是在柱线过程中价格波动很大的情况下。 它基本上是响应性和可靠性之间的权衡。
我知道有两种方法可以检查每个柱的交易条件:1)时间戳方法; 2) 容积法;
1. 时间戳法
下面是用于检查新柱开盘时间戳方法的代码。
外部布尔 EnterOpenBar = true;
int 当前时间;
内部初始化(){
当前时间=时间[0];
返回(0);
}
开始(){
如果 (EnterOpenBar) = true)
{
如果(当前时间!=时间[0]){
// 找到新柱的第一个订单号
// 买卖条件在这里
当前时间=时间[0];
返回(0);
}
}
在此方法中,我们首先声明一个名为 EnterOpenBar 的外部变量来打开和关闭该功能。
在 init() 函数中,我们将当前柱的时间戳分配给 CurrentTime。 这将延迟交易条件检查,直到下一个柱开盘。
接下来我们将 CurrentTime 变量的值与 Time[0] 进行比较,后者是当前柱的时间戳。 如果这两个值不匹配,则会检测到一个新柱,我们可以继续在新柱上建立交易。
2.体积法
下面是用于检查新柱开盘的交易量方法的代码。
外部布尔 EnterOpenBar = true;
内部开始()
布尔 OpenBar=真;
if(EnterOpenBar) if(iVolume(NULL,0,0)>1) OpenBar=false;
如果(OpenBar){
// 找到新柱的第一个订单号
// 买卖条件在这里
返回(0);
}
我更喜欢 volume 方法,因为它包含的代码片段要短得多。
与前面的方法一样,我们首先声明一个名为 EnterOpenBar 的外部变量来打开和关闭该功能。 我们不需要 init() 函数中的任何东西。
我们只需要放入一行代码来检查基于交易量的 openbar 条件。 此条件检查成交量是否为 1,在这种情况下 OpenBar=true,因为它已找到新柱的第一个订单号。 如果交易量大于 1 (>1) OpenBar = false,因为它不再是新柱。