Отличная статья - только одна небольшая проблема заключается в том, что я получил утечку памяти в коде примера.
Я обнаружил, что удаление объекта в DeInit() устраняет эту проблему
//+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { delete Ichimoku; }
мой ум :
Нарисовать spanB limegreen, когда близко > прошлые облака и близко > прошлые tenkansen, близко > прошлые kijunsen и близко > Настоящие облака, spanA > spanB :
#include <Indicators/Trend.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;
else
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;
if(
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];
}
else
{
trendtang[i]=EMPTY_VALUE;
}
}
//---
return(rates_total);
}

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Разработка торговой системы на основе индикатора Ишимоку:
Эта статья продолжает серию, в которой мы учимся строить торговые системы на основе самых популярных индикаторов. На этот раз мы поговорим об индикаторе Ишимоку и создадим торговую систему по его показателям.
Согласно описанию этой стратегии нам нужно создать торговую систему, которая будет постоянно проверять цены закрытия, значения Senkou Span A и Senkou span. Затем система должна сравнивать эти значения и определять, какое из них больше, а какое меньше. На основе этого она должна решить, на рынке восходящий тренд или нисходящий. Соответствующее значение нужно вывести в виде комментария на график. Дополнительно на график нужно вывести значения цены закрытия и линий Ишимоку. Если цена закрытия одновременно больше, чем Span B и больше, чем Span A, то тренд восходящий. Если цена закрытия одновременно ниже, чем Span B и ниже, чем Span A, то тренд нисходящий.
Автор: Mohamed Abdelmaaboud