
学习如何基于 Ichimoku 设计交易系统
概述
欢迎阅读本系列的一篇新文章,在本文中,您可以学到如何利用最常见的技术指标设计交易系统。 在本文中,我们将详细学习一种新的技术工具,及如何基于该指标的主要概念或思路,配以简单策略创建简单的交易系统。
我们会通过以下主题涵盖该指标:
贯穿 Ichimoku 定义的整个主题,我们将学到什么是 Ichimoku,指标的结构是什么,我们如何计算它,以及它衡量什么。 由此,我们将详细学习该指标,了解其背后的主要概念,以便能够有效地运用它。 Ichimoku 策略则是我们要学习贯彻的主题,配合指标背后的基本概念的简单策略。 然后,我们将为每个提到的策略设计一个分步的策略蓝图,来帮助我们为它们创建一款交易系统,我们将通过 Ichimoku 策略蓝图的主题了解这一点。 除此之外,我们将学习本文中最有趣的部分,其核心是如何利用 MQL5 创建一个交易系统,并在 MetaTrader 5 交易平台中执行每个提到的策略,如同我们在 Ichimoku 交易系统主题里学到的这些。
我们将采用 MetaQuotes 语言(MQL5),这是 MetaTrader 5 中的内置编辑器。 如果您想知道如何下载 MetaTrader 5,并使用 MetaEditor,请您阅读上一篇文章中的在 MetaEditor 里编写 MQL5 代码主题。
我建议您测试所有的内容,并练习您所读的内容,因为如此非常有助于加深您的理解,或为您打开视野,接受新的想法。
免责声明:本文的所有内容仅用于教学目的,并非出于任何其它目的。 故此,您根据本文内容采取的任何行动应自行负责,因为本文内容不保证任何结果。
现在,我们观阅这篇新文章及其主题,开启学习之旅。
Ichimoku 定义
在这一部分中,我们辨别 Ichimoku 指标是什么、它衡量什么、它的结构、以及我们如何计算它,进而来详细了解它。 因此,我们可以深入理解我们需要的有关指标的所有信息,从而在以后能有效运用。
Ichimoku 指标是由 Goichi Hosoda 开发的。 它是日本学校里的工具之一,能用来获得更多关于金融产品的认知,因为我们可以识别趋势方向、支撑和阻力、动量、及交易信号。 如果您想了解更多有关如何识别趋势的信息,可以阅读上一篇文章中的趋势定义。
它有五个图板:
- Tenkan-Sen (转换线)
- Kijun-Sen (基准线)
- Senkou Span A (前导跨距 A)
- Senkou Span B (前导跨距 B)
- Chikou Span (滞后跨距)
现在,我们需要学习如何手工计算 Ichimoku 指标,从而了解该指标背后的概念、及如何有效运用该指标。 如此,我们将通过计算 Ichimoku 中的每个元素来学习这一点。
Tenkan-Sen (转换线)= (9 周期高点 + 9 周期低点)/2
Kijun-Sen (基准线)= (26 周期高点 + 26 周期低点)/2
Senkou Span A (前导跨距 A) = (Tenkan-Sen + Kijun-Sen)/2 但它是在未来的 26 个周期后才被绘制
Senkou Span B (前导跨距 B)= (52 周期高点 + 52 周期低点)/2 但它也是在未来的 26 个周期后才被绘制
Chikou Span (滞后跨距)= 今日收盘,但它绘制的是过去 26 周期的数值
如今,我们不需要手工计算,但我们现在是在学习指标背后的概念。 我们有包含该指标的交易平台,我们只需在图表上从可用指标中选择 Ichimoku,无需任何计算。 在此,我们需要将 Ichimoku 指标插入 MetaTrader5 中的图表,我们从菜单的插入选项卡 --> 指标 --> Ichimoku Kinko Hyo
顺便说一下,Ichimoku 也称作 Ichimogu Kinko-Hyo。
之后,我们将发现指标的窗口如下所示:
上一张图片设置指标的所需参数:
1- 设置 Tenkan sen 的周期
2- 设置 Kijun sen 的周期
3- 设置 Senkou 跨距 B 的周期
我们还可以从“颜色”选项卡中设置所需的指标样式和外观:
1- 选择 Tenkan sen 的颜色
1A- 选择 Tenkan sen 线的样式
1B- 选择 Tenkan sen 线的宽度
2- 选择 Kijun sen 的颜色:
2A- 选择 Kijun 线的样式
2B- 选择 Kijun 线的宽度
3- 选择 Chikou 跨距的颜色
3A- 选择 Chikou 跨距的样式
3B- 选择 Chikou 跨距的宽度
4- 选择云上移时的颜色(Up Kumo)
4A- 选择云上移时的样式(Up Kumo)
4B- 选择云上移时的宽度(Up Kumo)
5- 选择云下移时的颜色(Down Kumo)
5A- 选择云下移时的样式(Down Kumo)
5B- 选择云下移时的宽度(Down Kumo)
我们的首选项设置完毕后,我们可以在图表上找到与以下相同的指标。
正如我们从上图中图表上的指标所看到的,蓝色和红色的线是 Tenkan Sen 和 Kijun Sen,绿色的线是 Chikou Span,这是根据时间帧绘制的过去 26 小时的收盘价,此外还有云(Senkou Span A 和 Senkou Span B),将在未来 26 小时绘制,它是红色的,这意味着它正在向下移动。
Ichimoku 策略
在本主题中,我们将学习如何基于 Ichimoku 指标的基本概念,配合简单策略,加以运用。 我们将见识一种利用 Ichimoku 趋势识别器识别趋势的策略。 我们将要学习的策略,可依据 Ichimoku 强度策略告知我们趋势的强度,然后我们还要学习基于两种不同交叉方法的策略,在出现看涨或看跌信号时可提醒我们,如同我们通过 Ichimoku price-Ki 信号策略和 Ichimoku ten-Ki 信号策略看到的那样。
在开始涉及策略之前,我需要在此确认,您必须在运用任何策略之前先行测试,即使它曾经过测试,也要如此,因为没有任何策略能够适合所有人。 我们当中的每个人都有自己特点的交易个性,或个人交易风格。 故此,适合我的,并不意味着适合您。
除此之外,即使您发现该策略的思路或概念适合您,您依然会发现必须优化之后才能对您有用。 因此,在测试和发现它对您有用之前,不要在您的实盘帐户上运行任何策略,这一点至关重要。
- 策略一:Ichimoku 趋势识别器:
根据这一策略,我们需要一个触发器,可以用来通知我们趋势类型,譬如是上升趋势或下降趋势。 我们将检查三个值,这些值是收盘价、Senkou Span A 和 Senkou Span B。如果收盘价大于 Senkou Span B,与此同时收盘价也大于 Senkou Span A,这会触发已知趋势上升。 反之亦然,如果收盘价低于 Senkou Span B,与此同时收盘价低于 Senkou Span A,这将触发下跌趋势。
收盘价 > Senkou Span B 且收盘价 > Senkou Span A --> 上升趋势
收盘价 < Senkou Span B 且收盘价 < Senkou Span A --> 下跌趋势
- 策略二:Ichimoku 趋势强度:
基于这一策略,我们需要一个触发器,可以告知我们当前趋势是否强劲。 为此,我们将检查三个值,这些值是当前 Senkou Span A、前期 Senkou Span A 和 Senkou Span A。如果当期 Senkou Span A 大于前期 Senkou Span A,同时当期 Senkou Span A 大于 Senkou Span B,则这是趋势上升且强劲的触发因素。 反之亦然,如果当期 Senkou Span A 低于前期 Senkou Span A ,同时,当期 Senkou Span A 低于 Senkou Span AB,则这将是趋势下降且强劲的信号。
当期 Senkou Span A > 前期 Senkoo Span A 且当期 Senkuo Span A > Senkou spanb --> 上升趋势强劲
当期 Senkou Span A < 前期 Senkou Span A 且当期 Senkou Span A < Senkou Span B --> 下跌趋势强劲
- 策略三: Ichimoku 价格-Ki 信号:
Accordi根据这一策略,在上升趋势期间,我们需要一个能够提醒我们看涨信号的触发器,而在下降趋势期间,则需要一个能够提醒我们看跌信号的触发器。 我们将根据该策略检查两个值,收盘价和 Kijun-Sen。 如果收盘价大于 Kijun sen 值,则触发看涨信号。 反之亦然,如果收盘价低于 Kijun sen 值,这是一个看跌信号。
在上涨趋势中,收盘价 > kijum-sen --> 看涨信号
在下跌趋势中,收盘价 < kijum-sen --> 看跌信号
- 策略四: Ichimoku ten-ki 信号:
根据这一策略,在上升趋势期间,我们需要另一个触发器或方法来提醒我们何时有看涨信号;或者在下降趋势中,我们需要看跌信号。 我们将根据该策略检查两个值,Tenkan-sen 和 Kijum-sen。 如果 Tenkan sen 值大于 Kijun sen,则是看涨信号。 反之亦然,如果收 Tenkan-sen 低于 Kijun sen 值,这是一个看跌信号。
Tenkan-sen > Kijun-sen --> 看涨信号
Tenkan-sen < Kijun-sen --> 看跌信号
Ichimoku 策略蓝图
在这一部分中,我们将为每个策略创建一个蓝图,我认为这一步是我们创建交易系统任务中最重要的步骤,因为它能帮助我们设计一个分步蓝图,从而令我们准确地理解我们想要做什么。
- 策略一:Ichimoku 趋势识别器:
基于这一策略,我们需要创建一个能够持续检查收盘价、Senkou Span A 和 Senkou Span B 数值的交易系统。 我们需要交易系统在这些值之间进行比较,以便决定哪个值更大或更小,以此决定是否存在上升趋势或下降趋势,并在图表上显示收盘价和 Ichimoku 指标线的数值。 如果收盘价大于 span B ,且收盘价大于 span A,则趋势向上。 如果收盘价低于 span B ,且收盘价大于 span A,则趋势向下。
- 策略二:Ichimoku 趋势强度:
基于这一策略,我们需要创建一个交易系统来提醒我们当前趋势的强度。 因此,我们需要交易系统连续检查当期 Senkou span A、前期 Senkou span A 和 Senkou span B 的值。 我们需要交易系统在这些值之间进行比较,以便决定哪个值更大或更小,从而在此基础上返回当前趋势的强度。 如果当期 span A 大于前期 span A,且当期 span A 小于 span B,则趋势向上且强劲,并在图表注释上显示 Ichimoku 指标线的值。
- 策略三: Ichimoku 价格-Ki 信号:
根据这一策略,我们需要创建一个交易系统,以便在图表注释里显示一行带有看涨或看跌信号,以及收盘价和 Kijun-sen 指标线值。 因此,我们需要交易系统不断检查收盘价和 Kijun-sen 线的值,并进行比较,以此决定哪一个更大或更小。 如果收盘价大于 Kijun sen,则在图表注释里显示看涨信号、收盘价和 KijunSen 值。 如果收盘价低于 Kijun sen,则在图表注释里显示看跌信号、收盘价和 Kijun sen 值。
- 策略四: Ichimoku ten-ki 信号:
根据这一策略,我们需要创建一个交易系统,根据 Tenkan sen 和 Kijun 值之间的比较,在图表注释里显示看涨或看跌信号,以便决定哪个更大或更小。 因此,我们需要交易系统连续检查这两个值,即 Tenkan Sen 值 Kijun Sen 值,以便返回看涨信号,如果 Tenkan Sen 值大于 Kijun Sen 值,则返回看跌信号;如果 TenkanSen 值低于 KijunSen 值时,返回看跌信号。
Ichimoku 交易系统
在这一部分中,我们将学习如何根据上述策略设计一宽基于 Ichimoku 指标的交易系统。 因此,除了 Tenken-sen 和 Kijun-sen 策略之外,我们将学习如何设计基于 Ichimoku 趋势识别策略、趋势强度策略、价格和 KijunSen 策略的交易系统。
现在,我们将设计一个简单 Ichimoku 系统,把所有 Ichimoku 值显示在图表上的注释里,作为上述策略的基础。
我们把 #include 命令指到文件名 Indicators/Trend.mqh,然后用 CiIchimoku 类来调用 Ichimoku 指标的数据。
#include <Indicators/Trend.mqh>
CiIchimoku*Ichimoku;
通过 void OnInit(),我们调用指标,然后创建 Tenkan sen、Kijun sen、Senkou span A、Senkoo span B 和 Chikou span 的双精度型变量值。
Ichimoku.Refresh(-1); double TenkanVal= Ichimoku.TenkanSen(0); double KijunVal= Ichimoku.KijunSen(0); double SpanAVal= Ichimoku.SenkouSpanA(-26); double SpanBVal= Ichimoku.SenkouSpanB(-26); double ChikouVal= Ichimoku.ChinkouSpan(26);
在图表注释里显示这些值,且每个值均在单独的行中。
Comment("Tenkan Sen Value is: ",TenkanVal,"\n", "Kijun Sen Value is: ",KijunVal,"\n", "Senkou Span A Value is: ", SpanAVal,"\n", "Senkou Span B Value is: ",SpanBVal,"\n", "Chikou Span Value is: ",ChikouVal);
因此,完整代码如下所示:
//+------------------------------------------------------------------+ //| Simple Ichimoku 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" #include <Indicators/Trend.mqh> CiIchimoku*Ichimoku; //+------------------------------------------------------------------+ void OnInit() { Ichimoku = new CiIchimoku(); Ichimoku.Create(_Symbol,PERIOD_CURRENT,9,26,52); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick() { Ichimoku.Refresh(-1); double TenkanVal= Ichimoku.TenkanSen(0); double KijunVal= Ichimoku.KijunSen(0); double SpanAVal= Ichimoku.SenkouSpanA(-26); double SpanBVal= Ichimoku.SenkouSpanB(-26); double ChikouVal= Ichimoku.ChinkouSpan(26); Comment("Tenkan Sen Value is: ",TenkanVal,"\n", "Kijun Sen Value is: ",KijunVal,"\n", "Senkou Span A Value is: ", SpanAVal,"\n", "Senkou Span B Value is: ",SpanBVal,"\n", "Chikou Span Value is: ",ChikouVal); } //+------------------------------------------------------------------+
编译完这段代码后,我们将在导航窗口中找到它。
若要执行它,我们双击它,或将其拖放到图表上,即会出现 Ichimoku 系统的窗口。
按“确定”后,它将加载到图表。
以下是该系统生成的信号示例。
正如我们从前面的图片中看到的,我们发现图表上有一条注释,其值如下:
- Tenkan Sen 值
- Kijun Sen 值
- Senkou Span A 值
- Senkou Span B 值
- Chikou Span 值
- 策略一:Ichimoku 趋势识别器:
现在,我们需要设计一款交易系统,为我给出一个注释,含有该策略的当前趋势定义,下面是编写好的该策略的完整代码。
//+------------------------------------------------------------------+ //| Ichimoku trend identifier.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" #include <Indicators/Trend.mqh> CiIchimoku*Ichimoku; //+------------------------------------------------------------------+ void OnInit() { Ichimoku = new CiIchimoku(); Ichimoku.Create(_Symbol,PERIOD_CURRENT,9,26,52); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick() { MqlRates PArray[]; int Data=CopyRates(_Symbol,_Period,0,1,PArray); Ichimoku.Refresh(-1); double TenkanVal= Ichimoku.TenkanSen(0); double KijunVal= Ichimoku.KijunSen(0); double SpanAVal= Ichimoku.SenkouSpanA(-26); double SpanBVal= Ichimoku.SenkouSpanB(-26); double ChikouVal= Ichimoku.ChinkouSpan(26); if(PArray[0].close>SpanBVal&&PArray[0].close>SpanAVal) { Comment("The trend is up","\n", "Close Value is: ",PArray[0].close,"\n", "Tenkan Sen Value is: ",TenkanVal,"\n", "Kijun Sen Value is: ",KijunVal,"\n", "Senkou Span A Value is: ", SpanAVal,"\n", "Senkou Span B Value is: ",SpanBVal,"\n", "Chikou Span Value is: ",ChikouVal); } if(PArray[0].close<SpanBVal&&PArray[0].close<SpanAVal) { Comment("The trend is down","\n", "Close Value is: ",PArray[0].close,"\n", "Tenkan Sen Value is: ",TenkanVal,"\n", "Kijun Sen Value is: ",KijunVal,"\n", "Senkou Span A Value is: ", SpanAVal,"\n", "Senkou Span B Value is: ",SpanBVal,"\n", "Chikou Span Value is: ",ChikouVal); } } //+------------------------------------------------------------------+
此代码中的差异与下同:
创建 MqlRates 类型的价格数组,存储价格信息。
MqlRates PArray[];
在为数据创建整数型变量后,调用 CopyRates 函数填充价格数组。 CopyRates 函数获取 MqlRates 的历史数据。
int Data=CopyRates(_Symbol,_Period,0,1,PArray);
Ichimoku 趋势识别器策略的条件基于趋势类型,
在上升趋势的情况下:
if(PArray[0].close>SpanBVal&&PArray[0].close>SpanAVal) { Comment("The trend is up","\n", "Close Value is: ",PArray[0].close,"\n", "Tenkan Sen Value is: ",TenkanVal,"\n", "Kijun Sen Value is: ",KijunVal,"\n", "Senkou Span A Value is: ", SpanAVal,"\n", "Senkou Span B Value is: ",SpanBVal,"\n", "Chikou Span Value is: ",ChikouVal); }
在下跌趋势的情况下:
if(PArray[0].close<SpanBVal&&PArray[0].close<SpanAVal) { Comment("The trend is down","\n", "Close Value is: ",PArray[0].close,"\n", "Tenkan Sen Value is: ",TenkanVal,"\n", "Kijun Sen Value is: ",KijunVal,"\n", "Senkou Span A Value is: ", SpanAVal,"\n", "Senkou Span B Value is: ",SpanBVal,"\n", "Chikou Span Value is: ",ChikouVal); }
编译完这段代码后,我们可以在“智能系统”文件夹的“导航器”窗口中找到它,下面图片显示了它。
双击或将其拖放到图表上,Ichimoku 趋势标识器窗口将显示如下:
按下“确定”后,它将加载到图表上。
以下是根据策略条件生成上升趋势和下降趋势信号的示例。
上行趋势信号
正如我们在上一张图片中看到的,图表上有以下注释:
- 趋势上升
- 收盘价值
- Tenkan Sen 值
- Kijun Sen 值
- Senkou Span A 值
- Senkou Span B 值
- Chikou Span 值
该策略提供了含有不同价格和 Ichimoku 元素值的上升趋势类型。
下行趋势信号:
正如我们在上一张图片中看到的,图表上有以下注释:
- 趋势下跌
- 收盘价值
- Tenkan Sen 值
- Kijun Sen 值
- Senkou Span A 值
- Senkou Span B 值
- Chikou Span 值
该策略提供了含有不同价格和 Ichimoku 元素值的上升趋势类型。
- 策略二:Ichimoku 趋势强度:
根据这一策略,我们需要创建一个交易系统,在图表上的注释里显示趋势强度,如果趋势强劲,则显示为上升趋势或下降趋势。 以下代码是以 MQL5 编写的此交易系统,它可以做到这一点:
//+------------------------------------------------------------------+ //| Ichimoku trend strength.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" #include <Indicators/Trend.mqh> CiIchimoku*Ichimoku; //+------------------------------------------------------------------+ void OnInit() { Ichimoku = new CiIchimoku(); Ichimoku.Create(_Symbol,PERIOD_CURRENT,9,26,52); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick() { Ichimoku.Refresh(-1); double TenkanVal= Ichimoku.TenkanSen(0); double KijunVal= Ichimoku.KijunSen(0); double SpanAVal= Ichimoku.SenkouSpanA(-26); double SpanAPrevVal= Ichimoku.SenkouSpanA(-25); double SpanBVal= Ichimoku.SenkouSpanB(-26); double ChikouVal= Ichimoku.ChinkouSpan(26); if(SpanAVal>SpanAPrevVal&&SpanAVal>SpanBVal) { Comment("The trend is up and strong","\n", "Tenkan Sen Value is: ",TenkanVal,"\n", "Kijun Sen Value is: ",KijunVal,"\n", "Senkou Span A Prev. Value is: ", SpanAPrevVal,"\n", "Senkou Span A Value is: ", SpanAVal,"\n", "Senkou Span B Value is: ",SpanBVal,"\n", "Chikou Span Value is: ",ChikouVal); } if(SpanAVal<SpanAPrevVal&&SpanAVal<SpanBVal) { Comment("The trend is down and strong","\n", "Tenkan Sen Value is: ",TenkanVal,"\n", "Kijun Sen Value is: ",KijunVal,"\n", "Senkou Span A Prev. Value is: ", SpanAPrevVal,"\n", "Senkou Span A Value is: ", SpanAVal,"\n", "Senkou Span B Value is: ",SpanBVal,"\n", "Chikou Span Value is: ",ChikouVal); } } //+------------------------------------------------------------------+
该代码中的差异是策略的条件,
如果是强劲的上升趋势:
if(SpanAVal>SpanAPrevVal&&SpanAVal>SpanBVal) { Comment("The trend is up and strong","\n", "Tenkan Sen Value is: ",TenkanVal,"\n", "Kijun Sen Value is: ",KijunVal,"\n", "Senkou Span A Prev. Value is: ", SpanAPrevVal,"\n", "Senkou Span A Value is: ", SpanAVal,"\n", "Senkou Span B Value is: ",SpanBVal,"\n", "Chikou Span Value is: ",ChikouVal); }
如果是强劲的下跌趋势:
if(SpanAVal<SpanAPrevVal&&SpanAVal<SpanBVal) { Comment("The trend is down and strong","\n", "Tenkan Sen Value is: ",TenkanVal,"\n", "Kijun Sen Value is: ",KijunVal,"\n", "Senkou Span A Prev. Value is: ", SpanAPrevVal,"\n", "Senkou Span A Value is: ", SpanAVal,"\n", "Senkou Span B Value is: ",SpanBVal,"\n", "Chikou Span Value is: ",ChikouVal); }
编译完这段代码后,我们将在导航窗口中找到它。
双击执行它,我们将发现智能系统的窗口与以下窗口相同:
按“确定”后,智能系统将加载到图表:
以下是在强势上升趋势下测试产生的信号示例:
正如我们在上图中看到的,我们可以在图表上找到具有以下值的注释:
- 趋势上升且强劲
- Tenkan Sen 值
- Kijun Sen 值
- Senkou Span A 前期值
- Senkou Span A 值
- Senkou Span B 值
- Chikou Span 值
此处,我们可以发现注释告诉我们上升趋势很强。 以下是在强下降趋势下测试产生的信号示例:
正如我们在上图中看到的,我们可以在图表上找到具有以下值的注释:
- 趋势下跌且强劲
- Tenkan Sen 值
- Kijun Sen 值
- Senkou Span A 前期值
- Senkou Span A 值
- Senkou Span B 值
- Chikou Span 值
相反,我们可以发现,注释告诉我们,下降趋势很强。
- 策略三: Ichimoku 价格-Ki 信号:
根据这一策略,我们需要创建一款交易系统,根据价格和 Kijun sen 之间的交叉,在图表上生成带有看涨或看跌信号的注释,以下是完整的代码。
//+------------------------------------------------------------------+ //| Ichimoku Price-Ki signal.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" #include <Indicators/Trend.mqh> CiIchimoku*Ichimoku; //+------------------------------------------------------------------+ void OnInit() { Ichimoku = new CiIchimoku(); Ichimoku.Create(_Symbol,PERIOD_CURRENT,9,26,52); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick() { MqlRates PArray[]; int Data=CopyRates(_Symbol,_Period,0,1,PArray); Ichimoku.Refresh(-1); double TenkanVal= Ichimoku.TenkanSen(0); double KijunVal= Ichimoku.KijunSen(0); double SpanAVal= Ichimoku.SenkouSpanA(-26); double SpanBVal= Ichimoku.SenkouSpanB(-26); double ChikouVal= Ichimoku.ChinkouSpan(26); if(PArray[0].close>KijunVal) { Comment("Bullish signal","\n", "Close Value is: ",PArray[0].close,"\n", "Kijun Sen Value is: ",KijunVal,"\n"); } if(PArray[0].close<KijunVal) { Comment("Bearish signal","\n", "Close Value is: ",PArray[0].close,"\n", "Kijun Sen Value is: ",KijunVal,"\n"); } } //+------------------------------------------------------------------+
此代码中的区别:
创建并填充价格数组。
MqlRates PArray[]; int Data=CopyRates(_Symbol,_Period,0,1,PArray);
在看涨信号的情况下,Ichimoku Price Ki 策略的条件,
if(PArray[0].close>KijunVal) { Comment("Bullish signal","\n", "Close Value is: ",PArray[0].close,"\n", "Kijun Sen Value is: ",KijunVal,"\n"); }
在看跌信号的情况下,Ichimoku Price Ki 策略的条件,
if(PArray[0].close<KijunVal) { Comment("Bearish signal","\n", "Close Value is: ",PArray[0].close,"\n", "Kijun Sen Value is: ",KijunVal,"\n"); }
编译完这段代码后,我们可以在导航窗口中找到它。
拖放到图表上可以执行智能系统,将出现智能系统窗口。
按下“确定”后,它将加载到图表上。
以下是测试产生的看涨信号示例。
正如我们在前面的示例中看到的,图表上有一条注释:
- 看涨信号
- 收盘价值
- Kijun-sen 值
这一看涨信号是基于价格和 Kijun-sen 之间的交叉产生的。 以下是测试生成的看跌信号的示例。
正如我们在前面的示例中看到的,图表上有一条注释:
- 看跌信号
- 收盘价值
- Kijun-sen 值
该看跌信号是基于价格和 Kijun-sen 之间的交叉产生的。
- 策略四: Ichimoku ten-ki 策略:
根据这一策略,我们需要创建一个交易系统,根据 Tenkan sen 和 Kijun sen 之间的交叉,在图表上生成带有看涨或看跌信号的注释,以下是完整的代码。
//+------------------------------------------------------------------+ //| Ichimoku ten-Ki signal.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" #include <Indicators/Trend.mqh> CiIchimoku*Ichimoku; //+------------------------------------------------------------------+ void OnInit() { Ichimoku = new CiIchimoku(); Ichimoku.Create(_Symbol,PERIOD_CURRENT,9,26,52); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick() { Ichimoku.Refresh(-1); double TenkanVal= Ichimoku.TenkanSen(0); double KijunVal= Ichimoku.KijunSen(0); double SpanAVal= Ichimoku.SenkouSpanA(-26); double SpanBVal= Ichimoku.SenkouSpanB(-26); double ChikouVal= Ichimoku.ChinkouSpan(26); if(TenkanVal>KijunVal) { Comment("Bullish signal","\n", "Tenkan Sen Value is: ",TenkanVal,"\n", "Kijun Sen Value is: ",KijunVal,"\n"); } if(TenkanVal<KijunVal) { Comment("Bearish signal","\n", "Tenkan Sen Value is: ",TenkanVal,"\n", "Kijun Sen Value is: ",KijunVal,"\n"); } } //+------------------------------------------------------------------+
此代码中的区别是 Ichimoku ten-Ki 策略的条件,
若是看涨信号情况:
if(TenkanVal>KijunVal) { Comment("Bullish signal","\n", "Tenkan Sen Value is: ",TenkanVal,"\n", "Kijun Sen Value is: ",KijunVal,"\n"); }
若是看跌信号情况:
if(TenkanVal<KijunVal) { Comment("Bearish signal","\n", "Tenkan Sen Value is: ",TenkanVal,"\n", "Kijun Sen Value is: ",KijunVal,"\n"); }
编译此代码后,我们将在导航器中找到智能系统。
双击,其窗口将如下出现:
按“确定”后,智能系统将加载到图表:
以下是基于该策略测试产生的看涨信号的示例:
正如我们在前面的示例中看到的,图表上有一条注释:
- 看涨信号
- Tenkan-sen 值
- Kijun-sen 值
该看涨信号基于 tenkan-sen 和 Kijun-sen 之间的交叉产生。 以下是根据该策略测试生成的熊市信号的示例:
正如我们在前面的示例中看到的,图表上有一条注释:
- 看跌信号
- Tenkan-sen 值
- Kijun-sen 值
该看跌信号基于 tenkan-sen 和 Kijun-sen 之间的交叉产生。
结束语
Ichimoku 指标可以作为一个完整的系统,令您在图表上以多个角度识别,正如我们在本文中所了解的,因为您据其识别趋势、趋势强度,并获得交易看涨或看跌信号。 因此,它在交易中非常有用,它可以通过一个指标从多个角度识别,从而制定更好的决策,并提高我们的结果。
我认为我们学完了很多关于这个指标的主题,尽可能多地涵盖它,但可以肯定的是,您可能会发现自己需要参阅这个指标的更多地信息,这是正常的,因为我们仅提供了关于它的基本知识,我鼓励您这样做。
在这篇文章中,我们涵盖了许多关于 Ichimoku 的主题,我们学习了它是什么,它测量什么,它的构造,以及如何依据 Ichimoku 定义来计算它。 我们学习如何基于其基本概念在简单策略里运用它,故我们学习了以下策略:
- Ichimoku 趋势识别器: 告诉我们趋势类型,是上升趋势还是下降趋势。
- Ichimoku 趋势强度: 当趋势强劲时通知我们。
- Ichimoku price-ki 信号: 当有看涨或看跌信号时通知我们。
- Ichimoku ten-ki 信号: 基于另一种方法通知我们何时有看涨或看跌信号。
我们还创建了一个分步蓝图,来帮助我们根据上述策略创建交易系统。 我们利用 MQL5 为每个提到的策略创建了一个交易系统,可在 MetaTrader 5 里运行。 我希望您自己应用本文中所学到的知识,因为实践在任何教育过程中都是非常重要的因素。 我再次确认,在将其用于您的实盘账户之前,必须测试任何策略,因为没有适合每个人的策略。
算法交易是一个令人难以置信的工具,可以帮助我们更好地进行交易,因为它可以帮助我们避免人类情绪干扰,而这可能对我们的交易有害,因为您必须知道情绪在我们的交易中起着重要作用,这将是造成损失的原因。 因此,当我们发现一个工具,其可根据我们的获胜策略自动执行交易,这将是一笔真正的财富。 除此之外,在我们的交易系统为我们工作的同时,我们还能抽出时间做其它有用的事情。
在本文章的结尾,我希望您能发现它对您提高交易水平有很大帮助。 如果您想参阅更多类似的文章,可以阅读我在本系列中的其它文章,了解如何运用最流行的技术指标设计交易系统。
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/11081
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
This article was written by a user of the site and reflects their personal views. MetaQuotes Ltd is not responsible for the accuracy of the information presented, nor for any consequences resulting from the use of the solutions, strategies or recommendations described.




这篇文章写得很好,只有一个小问题,那就是我在使用示例代码时出现了内存泄漏。

我发现在 DeInit() 中删除对象可以解决这个问题
我的 心:
绘制spanB石灰绿色时,接近>过去的云和接近>过去的天干森,接近>过去的木槿森和接近>现在的云,spanA>spanB:
#include <Indicators/Trend.mqh> (包括<指标/趋势.mqh>)
CiIchimoku*Ichimoku;
//--- 指标设置
#property indicator_chart_window
#property indicator_buffers 9
#property indicator_plots 1
#property indicator_type1 DRAW_LINE
#property indicator_color1 LimeGreen
#property indicator_width1 2
double sp1tl[];
double sp2tl[];
double trendtang[];
double tenqk[];
double kijqk[];
double sp1ht[];
double sp2ht[];
double sp1qk[];
double sp2qk[];
void OnInit()
{
Ichimoku = new CiIchimoku();
Ichimoku.Create(_Symbol,PERIOD_CURRENT,9,26,52);
SetIndexBuffer(0,trendtang,INDICATOR_DATA);
SetIndexBuffer(1,sp1tl,INDICATOR_DATA);
SetIndexBuffer(2,sp2tl,INDICATOR_DATA);
SetIndexBuffer(3,tenqk,INDICATOR_DATA);
SetIndexBuffer(4,kijqk,INDICATOR_DATA);
SetIndexBuffer(5,sp1ht,INDICATOR_DATA);
SetIndexBuffer(6,sp2ht,INDICATOR_DATA);
SetIndexBuffer(7,sp1qk,INDICATOR_DATA);
SetIndexBuffer(8,sp2qk,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//--- 设置要绘制的第一个条形图的指数
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,51);
//---绘制时线条移动
PlotIndexSetInteger(0,PLOT_SHIFT,25);
}
int OnCalculate(const int rates_total、
const int prev_calculated、
const datetime &time[]、
const double &open[]、
const double &high[]、
const double &low[]、
const double &close[]、
const long &tick_volume[]、
const long &volume[]、
const int &spread[])
{
int start;
//---
if(prev_calculated==0)
start=0;
否则
start=prev_calculated-1;
//--- 主循环
for(int i=start; i<rates_total && !IsStopped(); i++)
{
MqlRates PArray[];
int Data=CopyRates(_Symbol,_Period,0,1,PArray);
Ichimoku.Refresh(-1);
double spanAtl= Ichimoku.SenkouSpanA(0);
double spanBtl= Ichimoku.SenkouSpanB(0);
double spanAht= Ichimoku.SenkouSpanA(-25);
double spanBht= Ichimoku.SenkouSpanB(-25);
double spanAqk= Ichimoku.SenkouSpanA(-51);
double spanBqk= Ichimoku.SenkouSpanB(-51);
double tenkanqk= Ichimoku.TenkanSen(-25);
double kijunqk= Ichimoku.KijunSen(-25);
sp1tl[i]=spanAtl;
sp2tl[i]=spanBtl;
tenqk[i]=tenkanqk;
kijqk[i]=kijunqk;
sp1ht[i]=spanAht;
sp2ht[i]=spanBht;
sp1qk[i]=spanAqk;
sp2qk[i]=spanBqk;
如果
sp1tl[i]>=sp2tl[i]
&& close[i]>tenqk[i]
&& close[i]>kijqk[i]
&& close[i]>sp1ht[i]
&& close[i]>sp2ht[i]
&& close[i]>sp1qk[i]
&& close[i]>sp2qk[i]
)
{
trendtang[i]=sp2tl[i];
}
否则
{
trendtang[i]=EMPTY_VALUE;
}
}
//---
return(rates_total);
}