English
中文
日本語
ID
Vietnam
한국어
Filipino
 
   学院导航

MQL4 如何避免在每个报价单上运行

MQL4 How to Avoid Running on Each Tick

大多数专家顾问实时运行,在每个报价单上都有其优点和缺点。 从好的方面来说,运行每个报价点可以让 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,因为它不再是新柱。