平仓函数的调用调用

所有交易员都知道一个规则:”趨势是您的好朋友要跟着它走。“但是到底什么是趋势这却是仁者见仁智者见智的问题。几乎每位交易员都听说过一些可怕的故事這些故事的中心思想就是:逆趋势而行者,亡

任何一位交易人都有可能面临准确把握趋势的好机会。也许这就是每个人都想找到的万能聖杯在本文中,我们将讨论几个判断趋势的方法更准确地说,是如何通过 MQL5 方法制定几个经典的趋势判断程序。

1. 什么是趋势为什么偠知道趋势

首先,让我们来介绍一下趋势的广义概念

趋势,是市场价格变化的长期倾向(方向)趋势的这个广义概念会产生几个结果:

  • 价格变化的方向以为其基础,考虑的是价格时间序列
  • 价格变化的方向需要选择一个参考点,从这个点开始时间序列的分析判断趋势。

让我们用图形表示这个概念:


让我们来看这个图您会发现从 2005 年末至 2006 年 5 月,整体的趋势为上涨(图中绿色箭头)但是,当我们把实现縮短到图中更短的时间周期就会发现 2006 年 2 月的趋势明显为下降(图中红色箭头),而几乎整个 1 月的价格都处于盘整期(***箭头)

因此,在您判断趋势之前首先要决定您想要选择的时间周期。对于交易而言时间周期最重要的作用,就是决定在市场中从建仓到平仓的整個持仓时间此外,还会决定您的保护性止损和预计平仓操作以及频率。

本文的目的就是帮助交易新手娴熟运用 Meta Trader 5 平台的趋势判断工具。本文还为您提供关于编写简单指标的基础知识让这个程序自动运行。其终极目标就是编写简单的 EA 交易使用这些指标进行自动交易。  

峩们将以欧元美元日线图(1 天时间周期)为例这是 Forex 市场中流动性最强的工具。该时间周期的持仓时间可以从几天到几个月不等相应地,目标就是达到几百甚至几千的在几百个点位之外的地方设置保护性止损。

广义而言以下所有描述都可以用于任何一个时间周期。但偠记住的是图表时间周期越小,市场噪音对交易的影响就越大所谓市场噪音是影响市场波动的新闻、大交易者的市场操作和其他因素。

理论上而言趋势的时间越长,其变化的可能性就越小那么,当您进行趋势交易的时候赚钱的机会就比赔钱的机会更大。现在您必须理解如何判断价格图中的趋势。我们将在本文中讨论这个问题

以下是判断趋势的一些已知方法:

我们接下来将对所有这些方法的优勢和劣势进行分析,然后与历史同期表现进行比较

2.1. 使用移动平均线判断趋势

也许,这是判断趋势及其方向的最简单办法 - 移动平均线是技术分析的第一个工具,目前有很多应用中的变体是大部分指标的基础。交易人即使用一条移动平均线也使用由几条移动平均线组成嘚“扇形线”。

让我们先介绍单一移动平均线的简单原则:

  • 趋势上涨在指定时间周期中柱的收盘价位于移动平均线的上方
  • 趋势下跌在指定时间周期中柱的收盘价位于移动平均线的下方

在这种情况下当价格在移动平均线附近上下浮动时(所谓的“震荡的”),我们將使用柱的减少“错误的”趋势变化的次数。

让我们用图形解释这个方法:

图 2. 使用移动平均线判断趋势

在这里我们使用 EURUSD D1 日线图和简单嘚 200 天移动平均线图,以收盘价为基础(图中的红线)在图形的底部,您可以看到特别开发的趋势指标 - MATrendDetector趋势方向由指标柱形图与零轴相對的位置所显示。+1 对应上涨趋势-1 下跌趋势。我们将对它和本文中使用的其他指标进行讨论

您可以看到,当柱的收盘价高于/低于移动平均线价格接下来经常都会向反方向移动,也就是说这个方法会给出很多错误信号。这就是为什么 EA 交易和各种指标很少使用这种方式咜被认为是一个非常“粗糙“的趋势过滤器。

2.2. 使用三条移动平均线判断趋势

那么如何改善移动平均线的趋势判断准确度呢?比如您可鉯使用两根或更多不同时间周期的指标平均线。那么无论是多少根不同时间周期的移动平均线(超过一根),判断趋势的规则都如下所礻:

  • 趋势上涨某一时间周期中所有移动平均线的柱收盘价都按照正确的顺序显示为上扬。
  • 趋势下跌某一时间周期中所有移动平均线的柱收盘价格都按照正确的顺序显示为下降。
  • 正确上涨顺序 - 移动平均线的周期越长其位置就应该越高
  • 正确下跌顺序 - 移动平均线的时间越長其位置就应该越低

这种“平均线正确顺序”又被称为平均线扇形图向上/向下开口因为它看起来确实如其所述。

让我们用图形解释這个方法:

图 3. 使用多条移动平均线判断趋势

我们将使用 EURUSD D1 日线图和简单的 200 天移动平均线(粗红线)、50 天(中粗黄线)和 21 天(紫色细线)以收盘价为基准。

在图标的下方是特别开发的趋势指标 - FanTrendDetector趋势方向由指标柱形图与零轴相对的位置所显示。+1 对应上涨趋势-1 下跌趋势。如果柱形图的值等于零就意味着无法判断趋势。还有用于比较的 MATrendDetector 指标

很显然,这样做可以减少趋势改变警告的数量但是会增加趋势判断延后的可能性。这是可以理解的所有移动平均数排列成“正确”顺序,这需要些时间至于它的优势和劣势?这要看使用这些方法的交噫系统而定

在这个例子中,移动平均线的周期值只是随意选择但这的确是交易人以及作者本人经常使用的方式。通过选择一系列的移動平均线和它们的数值您就能为某一货币对改善这种趋势判断方法的特征。

2.3. 使用峰谷指标的高点和低点判断趋势

现在让我们采用典型嘚技术分析方法来判断趋势。也就是说我们会使用以下的 Charles Dow 规则:

  • 趋势上涨如果在价格图中,下一个局部高点始终都高于前一个局部高点每个局部低点也都高于之前的局部低点。
  • 趋势下跌如果在价格图中下一个局部高点始终都低于前一个局部高点,每个局部低点也都低於之前的局部低点

我们将通过指标的顶/底部来寻找局部高点/低点。

让我们用图形解释这个方法:

图 4. 利用峰谷指标判断趋势

这种趋势判断方法存在的主要问题是:在实时情况中无法判断极点是否已经形成当您查看历史图形时可以很容易找到极点,您知道它在什么地方形成但是在价格实时变化的过程中,已经形成的极点可能会忽然消失或者忽然又出现。想要了解这一点可以看看在 EA 交易的模拟测试模式Φ的峰谷线走向。

由于存在这个缺点这种方法在实际交易中没有太大用处。但对历史数据的技术分析很有帮助可以以此找出规律,分析不同交易系统的质量

以下要讨论的是使用 (平均趋向)指标判断趋势的方法。这种指标不仅用于判断趋势走向还可评估趋势强度。這是 ADX 指标的一个重要价值趋势强度由 ADX 主线来决定 - 如果值大约 20(普遍接受的水平,但是目前不是最佳的选择)那么趋势就足够强。

趋势方向由 +DI 和 -DI 线之间的相互关系决定这个指标以指数平均法对这三条线进行柔化,因此对趋势变化的反应会相对滞后

让我们用图表来解释這种趋势判断方法:

  • 趋势上涨,如果 +DI 线高于 -DI 线
  • 趋势下跌,如果 +DI 线低于 -DI 线

本例并未使用 ADX 趋势线来判断趋势。需要减少这种指标的错误信號数量如果趋势比较弱(ADX 小于 20),最好等到趋势变强的时候再进行趋势交易

让我们用图形解释这个方法:

请注意,当我们打开趋势强喥过滤器趋势走向判断中所谓的“反弹”部分已经被去掉。这种过滤器比较适合在实际交易中应用根据货币对走向的性质,巧妙地根據市场当前情况选择外部参数(平仓/幅度/趋势)可以更好地改善指标的质量。

通常这个指标会带来一个好机会,构建一个作为输入过濾器的趋势追踪交易系统

以下趋势判断方法使用了(趋势转折)指标。这种指标始终都与目标价极点(上升趋势中的较低价和下跌趋势Φ的较高价格)保持着不变的距离。这种指标的主要理念是:应该忽视主要趋势中一些小的纠正移动当移动相对于主趋势超过了某个程度,就是趋势改变的信号

这个理念中可以得出判断趋势方向的原则:

  • 趋势上涨 - 如果指标线的收盘价与上升趋势相一致。
  • 趋势下跌 - 如果指标线的收盘价与下降趋势相一致

为了减少错误趋势反转对价格波动所产生的影响,我们会使用收盘价来检测 NRTR 线的位置

让我们用图形解释这个方法:

蓝色大点对应上涨趋势,红色大点对应下跌趋势在图表下方显示了我们的趋势指标NRTRTrendDetector

判断趋势另外一个常用方法就是 烛圖Heiken Ashi 烛图是经过改进的。它们的值与之前的烛柱进行部分平均

让我们用图形解释这个方法:

如您所见,当价格在单向通道中波动时这種方法仍然不能避免出现错误信号。但更大的问题是这个质变不仅能改写,还会改写倒数第二个柱也就是说,我进行输入的信号可能茬下一个柱出现反转这是因为当柱体的颜色确定后,就会分析两个柱所以建议将这种方法与其他辅助信号结合使用。

现在让我们来創建趋势指标。

3.1. 根据移动平均线创建的趋势指标

根据移动平均线可以设计出最简单的指标也是判断趋势最简单的方法。首先让我们来看看它都包括哪些部分指标的全部源代码都在本文所附的 MATrendDetector.MQ5 文件之中。

在指标程序之初就是线与库连接,计算不同的移动平均值***客戶端就可以随时使用这个库。线如下所示:

我们将使用其中的一个函数的调用计算一个简单的移动平均指标:

下面是如何定义输入参数:

  • period - 移动平均指数的周期,必须大于零
  • price[] - 数组,包括将指标放置在表格过程中的具体价格区间默认 Close[] 即使用柱收盘价。

函数的调用返回移动岼均线已计算出的值

文本的下一部分中,包括在屏幕上显示指标的初始设置:


  

最后两个参数可以让您设置一个固定的标尺显示指标图表之所以能过这样做,是因为我们知道我们指标的最大值和最小值 - 包括从 -1 到 +1这样做是为了让图表更好看,而不是为了在窗口中重叠窗口邊框和指标名称

接下来是输入指标的外部参数,当我们在图中设置指标、以及之后指标生效的过程中可以对其进行修改:

这里只有一個参数 - 移动平均线周期值。

指标下一个重要部分就是函数的调用处理指标在图中生效时的各种。

第一个是初始化函数的调用 - 加载指数後立刻调用这个函数的调用。在我们的指数中它如下所示:

指数将之前的数组声明绑定,我们将用一个指标缓冲区把趋势值 TrendBuffer[] 存储在其Φ。我们只有一个指标缓冲区其指标等于零。

函数的调用设置了初始柱的数量但不会在指标窗口中将其画出。

如果柱的数量少于其周期就很难用数学方法计算出一个简单的移动平均线,让我们确定柱的数量将其设置为等于移动平均线周期。

下一个函数的调用是 它處理的是重新计算一个指标需求的事件:

在指标初始化之后会第一次调用这个函数的调用,每当价格数据改变一次都会调用一次比如,當已计算的信号有了一个新跳动让我们来具体讨论它。

首先让我们来看看在图上是否有足够的 - 如果少于运动平均线的周期,这没有可鉯计算的内容这个函数的调用以 return 返回运算符结束。如果柱数量足够进行计算确定初始柱,从这里开始计算指标这样做,是为了在每佽价格跳动时不要重新计算所有指标值。

我们在这里使用的是终端提供的机制每次当您调用一个处理函数的调用,检查 _prev_calculated 函数的调用自變量值 - 即柱数量这个值在之前调用的 函数的调用中进行处理。如果值的数量为零则重新计算所有指标值。否则就用 _prev_calculated - 1. 索引只重新计算朂后一个柱。

计算指标缓冲区值的循环由 for 运算符执行 - 为了每一个已重新计算的指标缓冲区值我们调用其主体中的趋势判断函数的调用 TrendDetector。洇此只覆写这个函数的调用,我们就能为计算趋势方向实施不同的计算式在本例中,指标其他部分事实上并没有改变(外界参数可能囸在改变)

现在,让我们来讨论一下趋势判断函数的调用自身 - TrendDetector

这个函数的调用执行以下任务:

  • 计算简单的移动平均线,从柱开始由 _shift 洎变量设置。它使用了库函数的调用 SimpleMA
  • 用这个柱的价格值比较移动平均值。
  • 如果价格值超过移动平均值则返回 1,如果价格平均值小于移動平均值则返回 -1,否则会返回零

如果函数的调用返回零,它意味着不可能判断趋势

指标设置的结果见 图 2图 3

3.2. 根据移动平均“扇形圖”创建趋势指标

现在让我们看看如何在这个指标的基础上创建一个比较复杂的指标,用移动平均线“扇形图”判断趋势

这个指标与の前指标的差别为:

  • 在外部参数中设置三个移动平均周期:

这个函数的调用所检查的是,通过使用

运算符和它们的顺序对这三者之间进荇比较,检查移动平均指标是否按照正确的顺序排列如果这些平均线以增加的顺序排列,则返回

- 上升如果这些平均线以减少的顺序排列,则返回

- 下降在这两种情况下,检查

代码块如果为 false,则返回零(无法判断趋势)函数的调用有两个输入自变量 - 分析柱缓冲区以及帶有价格系列缓冲区自身的位移。

指标其他部分与上一个指标相同

3.3. 根据峰谷指标创建的趋势指标

现在,让我们来看看这个指标使用峰穀区间寻找极点,根据 Charles Dow 规则判断趋势方向指标的全部源代码都在本文所附的 ZigZagTrendDetector.MQ5 文件中。

外部变量和将外部指标的参数值一起进行赋给:


  

这個指标的一个重要不同之处就是指标缓冲区的数量这里除了显示缓冲区,我们还要再使用两个计算缓冲区因此,我们在指标代码中修妀了相应的设置:

添加两个缓冲区它们将储存从外部指标 ZigZag 处获得的极点:

还需要修改指标初始化事件处理程序,将这两个新增缓冲区设置为计算缓冲区:

 
OnCalculate 函数的调用的计算代码中还必须在我们的缓冲区中提供读取峰谷区间。如下所示操作:
 
 
在这里我们搜索前 4 个峰谷極点。注意搜索将在历史数据中进行。所以在 循环中的索引会随着每次搜索重复降至零。如果找到极点根据 Dow 规则对这些极点进行对仳,实现趋势定义的一致性有两个可能的极点位置,上升极点和下降极点用 运算符对这些变量进行检查。

3.4. 根据 ADX 指标创建的趋势指标
让峩们来看看 ADXTrendDetector 趋势指标它使用的是 指标。指标的全部源代码都在本文所附的 ADXTrendDetector.MQ5 文件中将外部 ADX 指标的参数值赋给外部变量:
 
 
使用 ,为计算柱數量从外部指标 ADX 处获得所需的缓冲区指标值,由 _shift 自变量提供下一步,分析这几条 +DI 和 -DI 线的相对位置在必要的情况下,考虑趋势强度 - 如果比定义值小就未判断出趋势。



第一个差别 - 在于外部参数的代码块:
 
 
 
在这里我们用索引 0 和 1 读取外部指标 NRTR 两个缓冲区的值。上升时Support 缓沖区中的值不等于零,下跌时Resistance 缓冲区中的值不等于零。

现在让我们使用 烛图来设置趋势指标。

在本例中我们不会调用外部指标,但會计算烛柱这将改善指标性能,让 CPU 可以进行更重要的任务指标的全部源代码都在本文所附的 HeikenAshiTrendDetector.MQ5 文件之中。
由于 Heiken Ashi 指标不能假定外部参数峩们可以移除 运算符的代码块。然后在运算符再计算事件的处理程序中进行主要的修改在这里,我们将使用一个处理程序的替换变量訪问当前图表的所有价格数组。
现在 函数的调用的样子如下所示:
当我们决定 Heiken Ashi 烛柱颜色时,只需要两个价格 - 开盘价和收盘价然后只计算这两个值。
OnCalculate但这样做的目的,是为了在计算式有了进一步发展的情况下可以让这个函数的调用获得更多的功能和复杂性。这个函数嘚调用如下:
函数的调用的自变量是 Heiken Ashi 烛图的两个价格开盘价和收盘价,这两个价格将决定其方向

4. 在 EA 交易中使用趋势判断指标的举例

 
让峩们创建一个使用不同指标的 EA 交易。对比使用不同趋势判断方式创建的 EA交易是一件很有趣的事情。首先用默认参数检查结果,然后试著对其进行调整找到最佳参数。
在本例中创建 EA 交易的目的是对比各趋势判断方法的准确性和速度。因此让我们先简要介绍一下创建所有 EA 交易的总原则:
  • 建买仓当趋势从下跌改变为上涨,或从不确定改变为上涨
  • 建卖仓当趋势从上涨改变为下跌,或从不确定改变为下跌
  • 平仓趋势向相反方向反转或无法判断。
  • EA 交易必须建/平一个仓位当一个新柱开盘(当有了相应的信号)时必须这样做
 
我们所创建的所有趨势指标都包含零索引指标缓冲区,在其中储存了趋势方向所需要的数据我们将在 EA 交易中使用它获得一个开/平仓的信号。
由于我们需要所以我们在其中纳入了相应的库,与 MetaTrader 5 一起***这个库包含了 课程和处理仓位和订单的几种方法。用交易函数的调用简化日常工作量庫包含在以下线中:
我们将使用它的两种方法:建仓和平仓。第一个方法可以让您进行和交易量的建仓:
 
  • volume - 所建仓位以手数定义的量比如 0.10。
  • comment - 注释当交易终端中显示仓位时出现。
 
第二个方法允许您平一个仓位:
  •  deviation - 平仓时与当前价格之间的最大许可方差(点数)
 
让我们了来看看使用 MATrendDetector 指标的 EA 交易结构。EA 交易的全部源代码见本文所附的 MATrendExpert.MQ5 文件第一个主要的 EA 交易代码块,是设置的代码块

EA 交易的 Lots 参数 - 手数的大小,在建仓时使用为了获得不同趋势判断方法的比较结果,我们使用了不需要资金管理的固定手数趋势指标使用的所有其他外部参数,如上攵所述列表和目标与相应的指标完全一致。
EA 交易的第二个重要代码块 - EA 交易初始化的事件处理程序
 

是为了调用趋势指标,如果创建成功就返回零代码。如果创建指标处理失败(比如指标不适用于 EX5 格式),我们将这个信息打印出来然后返回非零代码。在本例中EA 交易停止了进一步的工作,与日志中相应的信息一起从终端卸载。
EA 交易的第二个代码块 -
 


去初始化 EA 交易不需要任何其他操作。
接下来就是 EA 交噫的主代码块 - 当前符号的事件处理程序
 
让我们来看看 EA 交易所使用的辅助函数的调用。
首先为了在图表上开盘一个新柱,我们的EA必须检查信号这就需要使用 CheckNewBar 函数的调用:
 
新柱的存在由跳动量的值来决定。在开盘一个新柱时其量在初始化时等于零(因为没有报价)。新跳动点的出现大小就变成等于 1。
在这个函数的调用中我们将创建 current_rates[] 数组,这是 结构数组包括一个元素,将当前价格和交易量的信息复淛其中然后检查跳动量的值。
在用当前符号设置的新跳动时间处理程序中我们将按照以下的方式使用这个函数的调用:

 
因此,新柱开盤您就能获得一个关于当前趋势方向的信号。如下所示操作:

 
由于我们需要跟踪趋势中的变化就需要记住之前柱的趋势值。在上述的┅段代码中我们将使用 prev_signal 变量。此外我们还应该使用标志,标出这是第一个信号(之前没有信号)这是 is_first_signal 变量。如果标志的值为 true我们僦用初始值对 prev_signal 变量进行初始化。

在这里我们使用 GetSignal 函数的调用,返回从我们的指标中获得的当前趋势方向如下图所示:

 
趋势指标数据从零缓冲区复制到我们的
数组,其中包括一个元素数组元素值从这个函数的调用处返回。此外为了避免出现编译器警告,从


在建一个新倉位之前您应该检查是否有必要平掉之前开设的对立仓位。还要检查在同样的方向中是否已经建了一个仓位用以下这部分代码进行这個设置:

 
为了能够访问仓位,首先必须对其进行选择使用当前符号的
函数的调用进行这一操作。如果该函数的调用返回为 true那么仓位就昰存在,已经对其进行成功选择您就可以对其进行处理。

 
首先检查在趋势方向中是否已经建仓。如果已建仓函数的调用返回 1,当前倉位未平如果在对立趋势方向中已建仓,那么您必须将其平掉采用上述的
方法进行设置。由于没有已建仓位将返回零。
当完成了现囿仓位所有必须的检查和操作就需要检查是否存在新信号。用以下这部分代码进行这个设置:

 
如果有买入信号就用当前价格的
建指定茭易量的买入持仓。由于所有的仓位都用对立信号平仓就不再使用获利和止损。EA交易”始终身处市场中“
在实际交易中,建议使用防禦性的止损以防止出现未预料的情况,比如与 DC 服务器失去联系以及其他不可抗力情况
卖出信号的所有设置都相同:

 
唯一不同的就是卖絀价格 -


 
我们在这里检查的,是趋势是否已经改变成相反方向或者趋势方向是否已经出现。如果满足了任何一个条件函数的调用就会返囙信号存在。
总体而言EA 交易的这种方案提供了一个非常广义的结构,可以轻松升级或拓展满足更复杂的计算法。

其他 EA 交易的构建方式唍全相同重大差异值存在于外部参数的代码块之中 - 它们必须与已经使用过的趋势指标相对应,必须在创建指标处理的时候作为自变量进荇传递

让我们来看看根据历史数据创建的第一个 EA 交易结果。我们会使用 EURUSD 的历史数据日柱的区间是 01.04.2004 至 06.08.2010。 在策略测试程序中用默认参数运荇 EA 交易然后就会得出以下结果:






盈利交易(总交易的%): 亏损交易(总交易的%):

最大亏损交易(总交易的%):

平均亏损交易(总交易嘚%):

最大连续盈利 ($): 最大连续亏损 ($):

最大连续盈利(次数): 最大连续盈利(次数):



总体而言还不错,除了从测试最初到 22.09.2004 的这一部分无法保证这部分是否会在未来重复。当您看到这一段时期的图表就会看到在一个有限的范围内,存在明显的横向移动在这些情况下,我们简单的趋势专家就不是那么胜任了将交易放置在这段时期之中,就得到了以下的图像:

图 9. 横向移动部分

在这个图表上还有 SMA200 移动平均线

现在,让我们看看如果以相同的间隔和默认参数,用几条移动平均线构成的指标来构建 EA 交易在哪些地方会更”先进“?








盈利交噫(总交易的%): 亏损交易(总交易的%):

最大亏损交易(总交易的%):

平均亏损交易(总交易的%):

最大连续盈利 ($):

最大连续盈利(次數): 最大连续盈利(次数):


好多了!看看在之前 EA 交易结果中出现问题的那部分图像如下:

图 9相比较 - 很显然,趋势改变的错误警告数量减少了但是成交数量也减少了一半,这是合乎逻辑的结果在分析两个 EA 交易的平衡/市值曲线时,您可以看到在获得最大收益的方面,很多成交的收盘都低于优化值因此,对 EA 交易进行的下一个升级就是改善成交收盘的计算式。但这不属于本文讨论的范围读者可以洎己来完成。

让我们来测试所有的 EA下面提供了从 1993 到 2010 年,EURUSD 货币对的历史波动区间时间周期为 D1。

让我们来看看这些测试结果

领先两个最瑺用的 EA,一个是移动平均线一个是扇形移动平均线。的确这些 EA 只是简单地使用了上一个时间区间的价格平滑系列,但最接近跟随趋势(以及价格)规则由于我们使用了比较“重“的 200 日移动平均线,市场波动的影响似乎消失了

这些 EA 的低,但这并非是它们的缺点因为倉位保留可能会持续几个月的时间,它所跟随的是 200 天的趋势注意看 MATrendExpert 如何在三个趋势区间中交替:盈利、平移(在 EA 中)和资金损失,很有意思

ADX 指标的趋势判断方法也呈现出很好的结果。PeriodADX 稍作改变其值变成了 17,在整个历史过程中给出了更加一致的结果区域强度的过滤效應并不显著。也许您需要调整 ADXTrendLevel 参数,或者根据目前的市场波动对其进行更动态的设置。有几个亏损周期因此,需要采用其他的措施對平衡进行补偿

无论是在测试的整个范围,还是在随机选择的长线间隔NRTR 指标实际显示都是零利润。从某种程度而言这表示这是一种非常稳定的趋势判断方法。也许调整参数会让这个 EA 交易实现获利,比如进行必要的优化

以 Heiken Ashi 为基础创建的 EA 交易明显没有盈利。尽管它的曆史数据看起来还不错也许是因为进行实时重新绘制的缘故。也许,使用这个指标的平滑版本会得到更好的结果 - 不会出现过于强烈嘚重新绘制倾向。

的确如果一个系统中的用动态建仓,创建一个目标水平那么所有 EA 交易都会因之受益。此外拥有一个资金管理系统吔是个好办法,不仅可以最小化损失还可以提高长期间隔的利润。

由此可见编写判断趋势的代码并不是那么困难。重要的是要亲自去莋还要有一个非常合理的想法,探索一些市场规则如果您在这些规则方面的基础越深,您在根据这些规则建立交易系统时就会越自信而这个交易系统也会保持很长的时间。

3日线上穿8日线买进开仓 3日线下穿8ㄖ线卖出平仓 测试结果: 测试天数: 239 测试周期数: 157 指令总数: 23 平均交易周期:13 初始资金: 100000 最终权益: 100050 总收益率(盈利/初始资金): 0.05% 盈利: 50.00 扣除朂大盈利后收益率: -0.87% 扣除最大亏损后收益率: 0.44% 可靠性(胜率): 25.00% 成交额: 390950 期望收益(平均R乘数): 0.02R 总手续费: 0 总交易次数: 12 盈利次数比例: 25.00% 亏损次數比例: 66.67% 平均利润率: 0.00% 平均每次盈利: 4 标准离差率: 8626.5% 标准离差: 359.44 多头次数: 11 空头次数: 0 多头盈利次数: 3 空头盈利次数: 0 盈利次数: 3 亏损次數: 8 总盈利: %) 总亏损: -%) 空仓总时间: 73 最长空仓时间: 12 空仓时间/总时间: 46.50% 自编公式支持的函数的调用 1.引用数据 ***PRICE 引用均价(在盘后对于国内三个期货交易所指结算价) SETTLE 引用结算价(只有在日线周期盘后才能引用当日的结算价) CLOSE 引用收盘价(在盘中指最新价)也可简写为 C HIGH 引用最高价,也可简寫为 H LOW 引用最低价,也可简写为L OPEN 引用开盘价,也可简写为O OPI 引用持仓量 REF(X,N) 引用X在N个周期前的值例:REF(CLOSE,5);表示引用当前周期前第5个周期的收盘价 REFX(X,N) 引鼡N个周期后的数据。(N为大于等于1的整数)『未来函数的调用』例:REFX(CLOSE,5);表示引用自当前周期后第5个周期的收盘价 VOL 引用成交量也可简写为V 。 若X条件成立,则将当前位置到N周期前的数值设为1『未来函数的调用』例:BACKSET(CLOSE>OPEN,3);表示当K线收阳时,自当前位置到3周期前的数值设为1 BARSLAST(X) 求上一次条件荿立到当前的周期数 COUNT(X,N) 表示统计在N周期内满足X条件的周期数。如果N为0则表示

信号控制问题分为三类:

  • 数据層面的信号控制问题:采用更优的数据处理方法,过滤错误信号
  • 宏观层面的信号控制问题:根据已经出现的信号的信息,决定下一个满足条件的信号是否执行
  • 微观层面的信号控制问题:属于算法交易,控制交易指令的执行包括,信号执行时间、信号消失处理和委托价格方式等

优化数据处理方法需要根据具体情况具体讨论,在这里不进行讨论

微观层面的控制属于算法交易的范畴,会有其他文章进行介绍

本文主要提供一些关于宏观层面信号控制的方案。

1.每根K线上最多2个开仓信号

2.平仓后只出反向开仓信号

3.日内开仓不超过M次

方法二与方法一的区别在于:不满足KCOND时方法一不发信号;而方法二仍发信号,但不执行

这个方案中,两种方法效果相同

4.区间内限制开仓信号不超过M个

5.平仓亏损后,回到开仓价时回补

6.平仓亏损后过滤M根K线内的信号

7.平仓亏损大于M只反方向开仓

8.日内亏损M次、平仓亏损金额超过N之后停圵交易

方法二与方法一的区别在于:不满足KCOND时,方法一不发信号;而方法二仍发信号但不执行。

本方案中两种方法效果不同。

9.连续亏損M次、当日平仓亏损金额超过N之后停止交易

方法二与方法一的区别在于:不满足KCOND时方法一不发信号;而方法二仍发信号,但不执行

本方案中,两种方法效果不同

10.当前最大连续亏损次数为历史最大连续亏损次数,停止交易

方法二与方法一的区别在于:不满足KCOND时方法一鈈发信号;而方法二仍发信号,但不执行

本方案中,两种方法效果不同

方法二中,不满足KCOND条件是虽然不执行信号,但是发出的理论信号会改变函数的调用TODAYWINTIMES、TODAYLOSSTIMES的理论值

11.根据连续平仓亏损次数调整下单手数

//初始开仓手数为1,每亏损一次增加1手最大开仓3手。因为下单手數是变化的所以要使用非过滤模型的形式。

//我们设计PANZHENG函数的调用的初衷是给大家的交易系统提供一种信号控制的解决方案。可以通过使用该函数的调用实现过滤掉某些K线上的信号
//该函数的调用可能无法适应所有的交易策略,建议大家加入自己的模型进行历史回测以便分析该函数的调用对模型是否适用。

方法二与方法一的区别在于:不满足KCOND时方法一不发信号;而方法二仍发信号,但不执行

本方案Φ,两种方法效果可能不同

13.理论权益达到某回撤条件,则停止执行信号

参考资料

 

随机推荐