
学习如何设计基于 CCI 的交易系统
概述
来自我们的系列文献的新篇章,我们将学习如何基于最常用的技术指标,并配合简单的策略,来设计交易系统。 这次我们将讨论商品通道指数(CCI)指标。 像往常一样,我将尝试解释这个主题的基本原理,从而帮助您理解其思路和用法。 终极目标,这种方式可能会给您一些见解和新想法,并可在交易中运用它们。
在本文中,我们将基于 CCI 设计一款交易系统。 涵盖的主题:
我们将从商品通道指数(CCI)的详细信息开始,它衡量什么,我们如何计算它。 当理解了我们所做工作的基本原理和根源时,我们就能够更有效地运用这些工具,并发现更多关于它的思路和见解。 这就是我们将在 “CCI 定义” 主题中讨论的内容。 之后,我们将制定一个在不同行情趋势或条件下可与 CCI 一起配合运用用的简单策略 — 这是我们将在 “CCI 策略” 章节学习的内容。 然后,我们将学习如何根据这一策略设计交易系统,规划我们需要设计什么,以及我们希望计算机做什么 — “CCI交易系统蓝图” 章节。 然后,我们将学习如何设计我们规化好的交易系统蓝图 — “CCI 交易系统” 章节。
在本文中,我们将利用 MetaTrader 5 交易平台,和 MetaQuotes 语言编辑器。 您可以从以下链接下载 MetaTrader 5:https://www.metatrader5.com/zh/download
一旦下载并安装 MetaTrader 5 之后,您将看到如下图所示的终端:
然后,您可以在交易终端打开的同时,按 F4 或在终端中选择工具菜单,随后单击 MetaQuotes 语言编辑器,即可打开 MetaQuotes 语言编辑器:
或按下 MetaTrader 5 工具栏中的 IDE 按钮:
在此,我需要提到编程在交易中的好处,因为它可以帮助我们严守纪律。 纪律是我们交易成功的一个重要因素,因为情绪可能会对交易有害:应该根据盈利交易计划制定正确的决策,但大多数交易者出于恐惧、贪婪或其它情绪,而无法采取正确的行动或决策。
我们可以依据我们的条件,通过程序来执行我们的交易计划,故此,我们提供了编程功能。 该程序将根据我们的规则完成我们需要做的事情,如此即可不涉及可能影响我们交易的情绪,这意味着该程序能帮助我们遵守纪律。 这就是 MQL5 派上用场的地方,因为它能帮助我们依据交易条件和计划编制程序,然后在终端中以自动执行的方式进行交易。 根据我们的交易计划,这些程序的逻辑可以从简单到非常复杂。
免责声明:本文的所有内容仅用于教学目的,不针对其它目的。 因此,您将对基于本文内容所采取的任何行动负责,因为本文内容并不保证任何结果。
现在,我们准备好开始我们的文章,来为我们的学习旅程搭建一个新的平台。 那么,我们这样做吧...
CCI 定义
在本章节中,我们将更详尽地学习商品通道指数(CCI)指标:它衡量什么、如何计算、以及如何运用它。
唐纳德·兰伯特(Donald Lambert)创建的商品通道指数(CCI)指标是一款动量指标,衡量当前价格相对于给定时间区段的平均价格。 兰伯特创建这一指标时,最初的目标是衡量大宗商品的周期性波动,但它也可以衡量其它金融产品。 CCI 可用于发现趋势强度和逆转,根据其作为动量指标的性质,这是正常结果。
根据 CCI 的计算及其衡量方法,当 CCI 较高时,这意味着价格远远高于其平均水平;反之亦然,当 CCI 较低时,这意味着价格远远低于其平均水平。
CCI 的计算步骤如下:
- 获取典型价格 (TP):
TP = (最高价 + 最低价 + 收盘价)/3
- 获取 TP 的简单移动平均值:
TP 的 SMA = TP 合计/n
- 获取平均偏差:
平均偏差: = Abs(TP-SMA) 合计/n
- 获取 CCI:
CCI = (TP-TP 均值)/(0.015*平均偏差)
现在,我们举一个例子来应用此计算:
假设我们有金融产品的 14 天数据:
天数 | 最高价 | 最低价 | 收盘价 |
---|---|---|---|
1 | 100 | 90 | 110 |
2 | 130 | 100 | 120 |
3 | 140 | 110 | 130 |
4 | 130 | 100 | 120 |
5 | 120 | 95 | 110 |
6 | 140 | 120 | 130 |
7 | 160 | 130 | 150 |
8 | 170 | 150 | 160 |
9 | 155 | 130 | 140 |
10 | 140 | 120 | 130 |
11 | 160 | 140 | 150 |
12 | 180 | 160 | 170 |
13 | 190 | 170 | 190 |
14 | 200 | 180 | 210 |
此处就是我们如何利用这些数据来计算 CCI:
- 首先,我们计算典型价格(TP):
TP = (最高价 + 最低价 + 收盘价)/3
因此,计算典型价格之后,将如下所示:
- 然后,我们依据计算出的 TP,再计算其简单移动平均值(SMA):
TP 的 SMA = TP 合计/n
结果如下:
- 然后,我们计算 TP 和其 SMA 之间的绝对值差,即计算平均偏差:
Abs (TP-SMA)
就是这个:
- 现在,我们需要计算平均偏差:
平均偏差: = Abs(TP-SMA) 合计/n
- 现在,是计算 CCI 的时候了:
CCI = (TP-TP 均值)/(0.015*平均偏差)
CCI = (196.67-141.19)/(0.015*22.86)
CCI = 55.48/0.3429
CCI = 161.80
如今,我们不再需要手动计算指标,因为 MetaTrader 5 提供了内置的现成指标。 您可以立即从平台中选择 CCI 指标使用它,如下图所示:
选择 CCI 后,将出现以下窗口:
指标的上一个窗口显示其参数:
- 1: 确定指标的周期。
- 2: 为指标设置计算用的价格类型,这里我们选择典型价格。
- 3: 设置指标样式:CCI 颜色、CCI 线型、和 CCI 线宽。
指定所有参数后,按确定,指标就会在图表上显示:
CCI 是一个在 100 和 -100 之间摇摆的振荡器
CCI 策略
在这一部分中,我们将讨论两种可采用 CCI 的简单策略。 可根据行情趋势或方向(上升趋势、下降趋势和横向)选用其中一种策略。 另一个是 CCI 的值与 0 和 100 或 -100 级别的简单交叉。 在我们讨论这些策略之前,我需要提到,有许多策略可以与 CCI 配合使用。 您最好先在一个演示账户上自行测试每一种策略,看看在您的交易中它是否管用,然后再把它用于一个实盘账户。
因此,策略如下。
第一种策略:根据行情趋势使用 CCI
- 上行趋势期间:
上行趋势是指在行情方向上,连创更高的低点和更高的高点,这意味着随着价格上涨,买家可以控制价格。 在这种行情条件下,我们可用 CCI 作为信号提供者,在 CCI 指示线突破高位 100 时生成买入信号。 如此,CCI > 100。 然后我们可以用另一种有效的工具,例如价格行动来获利。
CCI > 100 = 做多
获利了结信号可以依据另一个更有用的工具,例如价格突破之前低点的动作
- 下行趋势期间:
下行趋势是与上行趋势相反的趋势:价格连创更低的高点和更低的低点,这意味着卖方掌控行情,价格下跌。 在这样的行情中,CCI 也可以用来产生信号:当 CCI 线突破低位 -100 时,就会出现做空信号。 价格动作可以用来获利了结。
CCI < -100 = 做空
可以依据另一个更有用的工具作为获取获利回吐信号,例如突破先前高点的价格动作
- 横盘期间:
在横盘走势期间,我们可以发现买家和卖家之间存在一种平衡,因此从视觉上观察,没有人在行情中占优势。 它是除了上行和下行趋势之外的任意状况。
在横盘期间,我们也可以利用 CCI 生成信号。 当 CCI 指示线突破低位 -100 时,这是做多信号;当 CCI 指示线突破高位 100 时,此刻获利了结。 或者,当 CCI 指示线突破高位 100 时,这是做空信号,而当 CCI 指示线突破低位 -100 时,此刻获利了结。
CCI < -100 = 做多
CCI > 100 = 获利了结
CCI > 100 = 做空
CCI < -100 = 获利了结
在本文中,我们可以按照不同的方式运用 CCI,即我们可以根据零轴交叉入场,并根据持仓类型(做多或做空),以及与 100 和 -100 的交叉来获利了结。
- 对于做多信号:
观察 CCI 值相对于零轴。 当 CCI 值突破零轴向上时,这是做多信号;当 CCI 值突破高位 100 时,我们可以获利了结。
CCI > 0 = 做多
CCI > 100 = 获利了结
- 对于做空信号:
观察 CCI 值相对于零轴。 当 CCI 值突破零轴向下时,这是做空信号;当 CCI 值突破低位 -100 时,我们可以获利了结。
CCI < 0 = 做空
CCI < -100 = 获利了结
CCI 交易系统蓝图
现在,我们进入本文最有趣的部分,因为我们需要对上述策略进行编程,从而在人工观察 CCI 时自动发送信号。
如此,我们现在需要对上述策略进行编码,并根据我们的具体需求通知计算机下一步该怎么做。 我们将按部就班地为此设计蓝图。
- 上行趋势期间:
我们需要程序在每一次即时报价时来检查 CCI 值,并根据 CCI 值采取相应动作。
如果 CCI 高于 100,则做多,如果不是的话,则什么也不做。
- 下行趋势期间:
在每一次即时报价时来检查 CCI 值,并采取相应动作。
如果 CCI 值低于 -100,给出做空信号;如果不是的话,则什么也不做。
- 横盘期间:
在横盘期间,我们需要程序检查 CCI 值,并根其采取相应动作。
如果 CCI 值低于 -100,给出做多信号,获利了结。 如果 CCI 不低于 -100,检查 CCI 是否高于 -100,且低于 100,此时什么也不做 (保持);如果 CCI 高于 100,给出做空信号,然后检查如果 CCI 低于 -100,获利了结;如果 CCI 值低于 100 且高于 -100,此时什么也不做 (保持)。
- 对于做多信号:
在每次即时报时检查 CCI 值和零轴。 当 CCI值大于零,在图表上生成一个做多信号,而当 CCI 值高于 100 时在图表上出示一个获利了结信号。
- 对于做空信号:
CCI 交易系统
现在,我们需要编写上述策略,作为计算机执行所需操作的代码。
首先,我们需要编写一个简单的程序,在图表上显示 CCI 的值。 编程包括以下步骤:
- 创建价格数组。
- 从当前数据整理价格数组。
- 定义 CCI 属性。
- 整理结果。
- 获取当前数据的值。
- 绘制 CCI 值并在图表上显示这些值。
以下是如何针对前面的步骤进行编码,从而创建一个程序,令计算机自动在图表上显示 CCI 的值:
//+------------------------------------------------------------------+ //| Simple CCI System.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { //Creating an array of prices double ArrayOfPrices[]; //Sorting price array from current data ArraySetAsSeries(ArrayOfPrices,true); //CCI properties Definition int CCIDef = iCCI(_Symbol,_Period,14,PRICE_CLOSE); //Storing results CopyBuffer(CCIDef,0,0,3,ArrayOfPrices); //Getting value of current data double CCIValue = (ArrayOfPrices[0]); //Charting CCI values Comment ("CCI Value = ",CCIValue); } //+------------------------------------------------------------------+
之后,我们可以在导航器中找到该程序(Simple CCI System),选择它,并在交易平台中执行:
可通过双击或拖放该程序(Simple CCI System)至图表打开。 之后,将打开以下窗口:
启用“允许算法交易”选项,并按确定后,Simple CCI System 程序(EA)将加载到图表上,并在图表上显示 CCI 值:
现在,我们来学习如何针对上述两种策略进行编码:
- 第一种策略:根据行情趋势运用 CCI:
- 上行趋势期间:
CCI > 100 = 做多
我们将执行以下步骤:
- 为价格创建数组。
- 从当前数据整理价格数组。
- 定义 CCI 属性.
- 整理结果。
- 获取当前数据的值。
- 设置上行趋势期间 CCI 信号条件。
以下是如何针对这些步骤进行编码:
//+------------------------------------------------------------------+ //| Uptrend CCI Strategy.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { //Creating an array of prices double ArrayOfPrices[]; //Sorting price array from current data ArraySetAsSeries(ArrayOfPrices,true); //CCI properties Definition int CCIDef = iCCI(_Symbol,_Period,14,PRICE_CLOSE); //Storing results CopyBuffer(CCIDef,0,0,3,ArrayOfPrices); //Getting value of current data double CCIValue = (ArrayOfPrices[0]); //CCI signals for uptrend if(CCIValue> 100) Comment ("UPTREND CCI - BUY SIGNAL "); } //+------------------------------------------------------------------+
此后,我们可以在导航器中找到该程序 Uptrend CCI Strategy:
再次双击或拖放到 图表上,即可打开该程序 CCI Uptrend Strategy。 将打开以下窗口:
启用“允许算法交易”,并按确定之后,程序(EA)— Uptrend CCI Strategy — 将附着到图表上:
Uptrend CCI Strategy 的信号将根据此策略显示:
- 下行趋势期间:
CCI < -100 = 做空
我们将针对以下步骤进行编码:
- 为价格创建数组。
- 从当前数据整理价格数组。
- 定义 CCI 属性.
- 整理结果。
- 获取当前数据的值。
- 设置下形趋势期间 CCI 信号条件。
以下是可在交易平台上启动并自动执行我们需求的程序代码:
//+------------------------------------------------------------------+ //| Downtrend CCI Strategy.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { //Creating an array of prices double ArrayOfPrices[]; //Sorting price array from current data ArraySetAsSeries(ArrayOfPrices,true); //CCI properties Definition int CCIDef = iCCI(_Symbol,_Period,14,PRICE_CLOSE); //Storing results CopyBuffer(CCIDef,0,0,3,ArrayOfPrices); //Getting value of current data double CCIValue = (ArrayOfPrices[0]); //CCI signals if(CCIValue< -100) Comment ("DOWNTREND CCI - SHORT SIGNAL "); } //+------------------------------------------------------------------+
在导航器中找到该程序 Downtrend CCI Strategy:
双击或拖放到图表上,从而打开此程序 Downtrend CCI Strategy 。 将打开以下窗口:
启用“允许算法交易”,并按确定之后,程序(EA)— Downtrend CCI Strategy — 将附着到图表上:
Downtrend CCI Strategy 程序的信号将根据该策略出现,如下图所示:
- 横盘期间:
- 对于做多信号:
CCI < -100 = 做多
CCI > 100 = 获利了结
步骤:
- 为价格创建数组。
- 从当前数据整理价格数组。
- 定义 CCI 属性。
- 整理结果。
- 获取当前数据的值。
- 设置横盘期间 CCI 信号条件。
编写以下步骤的代码,来创建一个可以执行我们所需操作的程序:
//+------------------------------------------------------------------+ //| Sideways CCI Strategy - Buy.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { //Creating an array of prices double ArrayOfPrices[]; //Sorting price array from current data ArraySetAsSeries(ArrayOfPrices,true); //CCI properties Definition int CCIDef = iCCI(_Symbol,_Period,14,PRICE_CLOSE); //Storing results CopyBuffer(CCIDef,0,0,3,ArrayOfPrices); //Getting value of current data double CCIValue = (ArrayOfPrices[0]); //CCI signals if(CCIValue< -100) Comment ("SIDEWAYS CCI - BUY SIGNAL "); if(CCIValue> 100) Comment ("SIDEWAYS CCI - TAKE PROFIT"); } //+------------------------------------------------------------------+
在导航器中查找此程序 Sideways CCI Strategy - Buy:
双击或将其放到图表上打开它。 将打开以下窗口:
启用“允许算法交易”,并按确定之后,程序(EA)— Sideways CCI Strategy - Buy — 将附着到图表上:
然后,我们可以根据此策略查找出现的信号 Sideways CCI Strategy - Buy:
获利了结信号 CCI > 100 = 获利了结。 示例:
- 对于做空信号:
CCI > 100 = 做空
CCI < -100 = 获利了结
我们将通过以下步骤对其编码:
- 为价格创建数组。
- 从当前数据整理价格数组。
- 定义 CCI 属性。
- 整理结果。
- 获取当前数据的值。
- 设置横盘期间 CCI 做空信号条件。
下面是如何编写这些步骤来创建程序 Sideways CCI Strategy - Short:
//+------------------------------------------------------------------+ //| Sideways CCI Strategy - Short.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { //Creating an array of prices double ArrayOfPrices[]; //Sorting price array from current data ArraySetAsSeries(ArrayOfPrices,true); //CCI properties Definition int CCIDef = iCCI(_Symbol,_Period,14,PRICE_CLOSE); //Storing results CopyBuffer(CCIDef,0,0,3,ArrayOfPrices); //Getting value of current data double CCIValue = (ArrayOfPrices[0]); //CCI signals if(CCIValue> 100) Comment ("SIDEWAYS CCI - SHORT SIGNAL "); if(CCIValue< -100) Comment ("SIDEWAYS CCI - TAKE PROFIT"); } //+------------------------------------------------------------------+
此后我们的程序 Sideways CCI Strategy - Short 即可在导航器里找到:
启用“允许算法交易”,并按确定之后,程序(EA)— Sideways CCI Strategy - Short — 将附着到图表上,并与如下内容相同:
信号将根据此策略 Sideways CCI Strategy - Short 显示:
当 CCI < -100 = 获利了结:
- 第二种策略:零轴交叉信号:
- 对于做多信号:
CCI > 0 = 做多
CCI > 100 = 获利了结
我们将通过以下步骤对其编码:
- 为价格创建数组。
- 从当前数据整理价格数组。
- 定义 CCI 属性。
- 整理结果。
- 获取当前数据的值。
- 设置 CCI 值和零轴交叉时的条件。
按步骤创建程序 Zero crossover CCI Strategy - Buy:
//+------------------------------------------------------------------+ //| Zero crossover CCI Strategy - Buy.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { //Creating an array of prices double ArrayOfPrices[]; //Sorting price array from current data ArraySetAsSeries(ArrayOfPrices,true); //CCI properties Definition int CCIDef = iCCI(_Symbol,_Period,14,PRICE_CLOSE); //Storing results CopyBuffer(CCIDef,0,0,3,ArrayOfPrices); //Getting value of current data double CCIValue = (ArrayOfPrices[0]); //CCI signals if(CCIValue > 0) Comment ("Zero crossover CCI - BUY SIGNAL "); if(CCIValue > 100) Comment ("Zero crossover CCI - TAKE PROFIT"); } //+------------------------------------------------------------------+
在导航器里查找该程序 Zero crossover CCI Strategy - Buy :
启用“允许算法交易”,并按确定之后,程序(EA)— Zero crossover CCI Strategy - Buy — 将附着到图表上:
信号将根据此策略 Zero crossover CCI Strategy - Buy 显示:
当 CCI > 100 = 获利了结,下图就是其示例:
- 对于做空信号:
CCI < 0 = 做多
CCI < -100 = 获利了结
我们将通过以下步骤对其编码:
- 为价格创建数组。
- 从当前数据整理价格数组。
- 定义 CCI 属性。
- 整理结果。
- 获取当前数据的值。
- 设置 CCI 值和零轴交叉时的条件。
按步骤编码来创建该程序 Zero crossover CCI Strategy - Short:
//+------------------------------------------------------------------+ //| Zero crossover CCI Strategy - Short.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { //Creating an array of prices double ArrayOfPrices[]; //Sorting price array from current data ArraySetAsSeries(ArrayOfPrices,true); //CCI properties Definition int CCIDef = iCCI(_Symbol,_Period,14,PRICE_CLOSE); //Storing results CopyBuffer(CCIDef,0,0,3,ArrayOfPrices); //Getting value of current data double CCIValue = (ArrayOfPrices[0]); //CCI signals if(CCIValue < 0) Comment ("Zero crossover CCI - SHORT SIGNAL "); if(CCIValue < -100) Comment ("Zero crossover CCI - TAKE PROFIT"); } //+------------------------------------------------------------------+
之后在导航器里即可找到该程序 Zero crossover CCI Strategy - Short :
启用“允许算法交易”,并按确定之后,程序(EA)— Zero crossover CCI Strategy - Short — 将附着到图表上:
信号将根据此策略 Zero crossover CCI Strategy - Short 显示:
当 CCI < -100 = 获利了结,下图就是其示例:
结束语
商品通道指数指标 CCI — 是另一款有益于我们交易的工具,在测试 CCI 的每一项策略后,可以获得更好的结果,在测试盈利的情况下还可进一步对其优化。 您可以认为本文是针对一种新工具的介绍,如果它适合您的交易计划和风格,则您就可在交易中运用它。
正如我们在本文中所知,什么是 CCI 指标,它意味着什么,它衡量什么,我们如何计算它,并看到了一个示例,以便加深我们对这一工具的认知识和了解,这就是我们得到更多见解和新思路的理由。
然后,我们还掌握了 CCI 在不同行情条件下(上行、下行和横盘)、以及与零轴交叉时可供运用的简单策略,正如我所提及的,CCI 可以配合许多策略,您可以了解其中哪些策略对您的交易更有用,但我相信,当您了解了一些基本知识后,您会更有效地运用它。
然后,我们知道了如何设计这一策略的蓝图,这有助于编写我们的程序,从而设计基于 CCI 的交易系统。 现在,我们知道了如何以 MQL5 针对该策略进行编码,以及如何将该交易系统连接到我们的 Meta Trader 5 交易平台,执行并自动生成信号,最后我们会看到如何在图表上生成信号。
我现在需要确认的是,您必须预先测试任何新策略,然后才能在实盘帐户上使用它。 我希望这篇文章能为您和您的交易提供有用的信息,或者为您的交易提供新的思路或见解。
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/10592


