文章 "学习如何基于 Ichimoku 设计交易系统"

 

新文章 学习如何基于 Ichimoku 设计交易系统已发布:

这是我们系列中有关如何基于最热门指标设计交易系统的一篇新文章,这回我们将详细讨论 Ichimoku 指标,以及如何依据该指标设计交易系统。

基于这一策略,我们需要创建一个能够持续检查收盘价、Senkou Span A 和 Senkou Span B 数值的交易系统。 我们需要交易系统在这些值之间进行比较,以便决定哪个值更大或更小,以此决定是否存在上升趋势或下降趋势,并在图表上显示收盘价和 Ichimoku 指标线的数值。 如果收盘价大于 span B ,且收盘价大于 span A,则趋势向上。 如果收盘价低于 span B ,且收盘价大于 span A,则趋势向下。

Ichimoku 趋势识别器蓝图

作者:Mohamed Abdelmaaboud

[删除]  
介绍得很好,我很喜欢
 
ApostleT #:
介绍得很好,我很喜欢
感谢您的评论
 
非常好,非常有用的一课。
谢谢
 
我认为最好将上述策略合二为一,这样 交易信号会更强。
 

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


我发现在 DeInit() 中删除对象可以解决这个问题

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   delete Ichimoku;
  }
 
大家好,请帮助我解决 mql5 的问题:
附加的文件:
trendtang.mq5  3 kb
 

我的 心:

绘制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);

}