欢迎来到我们的 MetaTrader4 智能交易系统课程的第三部分!如果您还没有这样做,请查看前两期。

[包含文件=”wp-content/post-includes/expertadvisorvault.php”]

在这一部分,我想讨论止损。在上一篇文章中,我们已经了解了如何使用简单的基于点的止损创建订单。这次我想看的是如何实现动态的 追踪止损。我们仍在开发我们的 Forex Wall-E 专家顾问,所以让我们从中断的地方继续!

MT4 EA 课程:追踪止损

追踪止损

 

首先,让我们谈谈追踪止损是什么以及为什么要使用它们。追踪止损是一个止损水平,它将“追踪”特定距离的当前价格。通常,追踪止损只会朝着您的交易方向移动。这意味着,随着价格向您的方向移动,止损将随之移动。然后,如果价格突然对您不利,追踪止损将保持在同一水平。因此,追踪止损也可以作为获利了结的水平。

 

MT4 EA 课程:追踪止损

 

让我们举个例子:假设您在 1.30000 创建一个 EURCAD 买单,初始止损为 1.20800(即 20 点),追踪止损为 30 点。如果您的交易想法是正确的并且价格上涨至 1.30500,则追踪止损将随之移动,保持低于当前价格 30 点的距离,即 1.30200。每次价格上涨时,我们的止损将跟随当前价格 30 点的固定距离。每次价格再次下跌时,我们的止损将保持在同一水平,从而保护我们的利润。

[包含文件=”wp-content/post-includes/expertadvisorvault.php”]

追踪止损的优势

设置追踪止损的主要优点是它可以保护未实现的利润。如果价格向您移动,则设置追踪止损可防止在价格反转并对您不利的情况下放弃过多的利润。

追踪止损可以让您 快速获利并减少损失

追踪止损的另一个优点是易于交易管理。虽然您以前可能需要偶尔移动止损,但追踪止损为您提供了一种自动处理该问题的方法。无需对您的交易进行微观管理。由于追踪止损,您的订单将自行执行。知道您不需检查您的交易止损也可以让您更加安心。

 

[包含文件=”wp-content/post-includes/test.php”]

最后,这是处理风险管理的一种非常系统的方法。您的止损将始终是您头寸的 x%。或固定点数。它为您提供了一个与您的风险和资金管理状况相一致的框架,因此您不必事后猜测停止放置。

 

追踪止损的类型

 

MT4 EA 课程:追踪止损如果您认为只有一种基于点的止损,请再想一想!虽然固定点数的追踪止损可能是最常见的,但追踪止损的方法有很多种。

 

Van K. Tharp 的优秀著作《 Trade Your Way To Financial Freedom》中也描述了其中的许多内容,如果您正在寻找一本可以帮助您设计自己的交易系统的好书,我真的可以推荐这本书。

以下是一些常见的追踪止损类型:

  • 基于点的动态(跟踪 x 当前价格后面的点数)
  • 基于点的固定(每次价格向您的方向上涨 x 点时,移动止损)
  • 波动率追踪止损(例如使用 ATR)
  • 移动平均追踪止损

 

还有其他追踪止损的方法(例如,使用基于百分比的系统或使用之前的支撑和阻力位),但我更喜欢写一篇单独的文章来介绍追踪止损。现在,我想在我们的专家顾问的背景下专注于追踪止损。因此,我们将从使用基于点的动态追踪止损开始,因为这是最容易实现的一种。

我们的 EA 交易中的追踪止损

还记得我们的外汇 Wall-E 专家顾问吗?让我们继续看前几行:

3
4
5
if (OrdersTotal() > 0) {
    return;
}

 

这基本上意味着如果我们已经有订单打开,则返回并退出该函数。我们这样做是为了防止同时打开多个订单。虽然这根本不是一项要求,但它使我们的外汇专家顾问更易于管理。

如果我们想追踪我们的止损,我们实际上必须对我们的未结订单做一些事情。这意味着我们需要像这样更改上面的代码:

 

3
4
5
6
if (OrdersTotal() > 0) {
    TrailStops();
    return;
}

 

它的作用是在(且仅当)我们有未结订单时执行名为TrailStops的函数。我们之前在课程的第二部分学习过函数。那时,我们定义了一个名为 OnTick 的函数,每次发生变动(或价格的最小变化)时都会调用该函数。

但是,您可能会问:这个 TrailStops 函数有什么作用?这就是我们现在要定义的!这个函数还没有被创建,实际上由我们来做。如果你现在点击编译按钮,你会看到它会导致以下错误:

编译错误

定义 TrailStops 函数

我们得到一个“函数未定义”错误,这是有道理的,因为我们还没有定义它。为了使我们的智能交易系统正常工作,我们将在其他所有代码下方添加以下代码块:

 

51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//+------------------------------------------------------------------+
//| Trailing stop function                                           |
//+------------------------------------------------------------------+
void TrailStops()
{
    int trailingStop = 300;
    for (int i = 0; i < OrdersTotal(); i++) {
        if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
            continue;
        }
 
        if (OrderSymbol() != Symbol()) {
            continue;
        }
 
        if(OrderType() == OP_BUY) {
            if (Bid - OrderOpenPrice() > trailingStop * Point && OrderStopLoss() < Bid - trailingStop * Point) {
                if (!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - trailingStop * Point, OrderTakeProfit(), 0, Green)) {
                    Print("OrderModify error ",GetLastError());
                }
                return;
            }
        }
    }
}

 

让我们更详细地看一下这段代码。首先,我们创建函数定义并定义追踪止损距离(本例中为 30 点):

54
55
56
void TrailStops()
{
    int trailingStop = 300;

 

然后,我们创建一个 for 循环,遍历我们拥有的每个未结订单。对于我们找到的每个订单,我们使用 OrderSelect 函数选择它。然后,我们检查订单的交易品种是否真的是我们想要的交易品种。可能有我们不想影响的其他符号的订单。

58
59
60
61
62
63
64
65
for (int i = 0; i < OrdersTotal(); i++) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
        continue;
    }
    if (OrderSymbol() != Symbol()) {
        continue;
    }

 

注意:有更好的方法来确保我们不会影响不是由我们的专家顾问创建的订单。因为我们目前专注于追踪止损,所以我在代码中省略了这些。但是,我将在课程的未来部分展示如何做到这一点。

如果一切顺利,这意味着我们有一个订单,我们可以调整止损以跟踪它。这正是以下代码块中发生的情况:

 

67
68
69
70
71
72
73
74
if(OrderType() == OP_BUY) {
    if (Bid - OrderOpenPrice() > trailingStop * Point && OrderStopLoss() < Bid - trailingStop * Point) {
        if (!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - trailingStop * Point, OrderTakeProfit(), 0, Green)) {
            Print("OrderModify error ",GetLastError());
        }
        return;
    }
}

 

这是我们的新代码中最复杂的部分,所以让我们分解一下。首先,我们检查订单类型是否实际上是买入订单。这样做的原因是,根据是买入还是卖出,我们需要改变一些逻辑(例如,使用买入价而不是卖出价)。目前,我们的专家顾问只创建买单,所以我们只需要检查这些。

接下来,我们在 if 语句中进行一些非常基本的检查。第一个检查如果我们从当前买入价中减去订单开仓价,结果是否大于我们预定义的追踪止损距离。实施此检查意味着价格首先必须至少在我们设置为追踪止损的距离(30 点)内向我们有利的方向移动。只有当这种情况发生时,我们的追踪止损才会生效。这种检查不是必需的,但这样做可以让您的交易有最初的喘息空间来采取行动。

 

第二次检查查看当前的止损水平。只有当该水平小于当前买入价减去我们的追踪止损距离时,我们才会移动我们的追踪止损。这基本上意味着如果价格回撤到我们的开盘价,我们不会移动止损。

 

结果

当我们运行更新后的智能交易系统时,我们会得到以下结果:

带有追踪止损的 EA 图表

带有追踪止损的 EA 结果

 

还是不太有说服力!但我确实注意到我们的利润系数从 1.16 上升到 1.19,我们的绝对和相对回撤数字下降了。这是一个很好的结果,也是意料之中的,因为我们的追踪止损将确保不会丢失任何未实现的收益,从而降低风险。

请记住,我们的目标是向您展示如何实施追踪止损,而不是如何创建有利可图的智能交易系统(至少现在还没有!)。当您尝试此操作时,请使用我们迄今为止定义的各种参数,例如 EMA 周期、追踪止损距离、初始止损和止盈水平等。更改这些变量中的每一个很可能会在策略测试器中为您提供不同的结果,我们有责任找到最有效的变量组合。

 

结论

 

在本文中,您了解了追踪止损是什么、为什么要使用它们以及可以使用哪些类型的追踪止损。然后,我们修改了我们的智能交易系统以实现一个示例追踪止损,并查看了执行此操作所需的代码。

下一次,我们将着眼于让我们的专家顾问更加强大,并找出提高盈利能力的方法,同时仍然保持我们的回撤和整体风险较低。敬请关注!

如果您对EA系统有任何疑问希望得到解答,请在评论中给我留言!

发表回复

后才能评论