Код зигзага
//+------------------------------------------------------------------+ //| FastZZ.mq5 | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, Yurich" #property link "https://login.mql5.com/ru/users/Yurich" #property version "1.00" //+------------------------------------------------------------------+ #property indicator_chart_window #property indicator_buffers 2 #property indicator_plots 1 #property indicator_label1 "ZZ" #property indicator_type1 DRAW_ZIGZAG #property indicator_color1 clrRed #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //+------------------------------------------------------------------+ input int Depth=2000; // Minimum points in a ray //+------------------------------------------------------------------+ double zzH[],zzL[]; double depth;//, deviation; int last,direction; //+------------------------------------------------------------------+ void OnInit() { SetIndexBuffer(0,zzH,INDICATOR_DATA); SetIndexBuffer(1,zzL,INDICATOR_DATA); IndicatorSetInteger(INDICATOR_DIGITS,Digits()); PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0); depth=Depth*_Point; //deviation=10*_Point; direction=1; last=0; } //+------------------------------------------------------------------+ int OnCalculate(const int total, const int calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick[], const long &real[], const int &spread[]) { if(calculated==0) last=0; for(int i=calculated>0?calculated-1:0; i<total-1; i++) { bool set=false; zzL[i]=0; zzH[i]=0; //--- if(direction>0) { if(high[i]>zzH[last])//-deviation) { zzH[last]=0; zzH[i]=high[i]; if(low[i]<high[last]-depth) { if(open[i]<close[i]) zzH[last]=high[last]; else direction=-1; zzL[i]=low[i]; } last=i; set=true; } if(low[i]<zzH[last]-depth && (!set || open[i]>close[i])) { zzL[i]=low[i]; if(high[i]>zzL[i]+depth && open[i]<close[i]) zzH[i]=high[i]; else direction=-1; last=i; } } else { if(low[i]<zzL[last])//+deviation) { zzL[last]=0; zzL[i]=low[i]; if(high[i]>low[last]+depth) { if(open[i]>close[i]) zzL[last]=low[last]; else direction=1; zzH[i]=high[i]; } last=i; set=true; } if(high[i]>zzL[last]+depth && (!set || open[i]<close[i])) { zzH[i]=high[i]; if(low[i]<zzH[i]-depth && open[i]>close[i]) zzL[i]=low[i]; else direction=1; last=i; } } } //---- zzH[total-1]=0; zzL[total-1]=0; return(total); } //+------------------------------------------------------------------+
Буферы индикатора содержат только значения хай и лоу, промежуточные данные я заполняю в цикле, преобразуя их в 1 - растущий на текущем баре, -1 падающий. Вроде бы правильно, но если есть ошибки - прошу поправить меня
void FillZZarray() { ArrayResize(zz,vector); int lastcountbar = 0; for(int i=0;i<vector;i++) // Заполняем массив выходов { if(zzH[i]>0) { zz[i]=1; lastcountbar = 1; if(i!=0) for(int q=i-1;q>=0;q--) { if(zz[q]==0)zz[q]=lastcountbar; } } if(zzL[i]>0) { zz[i]=-1; lastcountbar = -1; if(i!=0) for(int q=i-1;q>=0;q--) { if(zz[q]==0)zz[q]=lastcountbar; } } if(zzH[i]==0 && zzL[i]==0) zz[i] = lastcountbar; } }
Клёво! Только когда будешь ставить на реал меняй местами сигналы на бай и селл.
Зачем? )
Примета такая. После тестирования.
Мне нужен вектор входных данных для обучения, а тут сигналы прерываются - то бай то селл, то пропуски.. и чем их заполнять непонятно, не нулями же.. Зигзаг, по моему, не менее идеальные входы дает, но могу ошибаться.. слабо шарю еще в нейросетях..
Мне нужен вектор входных данных для обучения, а тут сигналы прерываются - то бай то селл, то пропуски.. и чем их заполнять непонятно, не нулями же.. Зигзаг, по моему, не менее идеальные входы дает, но могу ошибаться.. слабо шарю еще в нейросетях..
В индикаторе два вида сигналов, дискретный и аналоговый на выбор. Пропуски заполнять нулями.
Картинка в первом посте на обучающей выборке? Если это вне выборки то интересно посмотреть на обучающей выборке, при таком количестве нейронов сеть наизусть должна запомнить все входные данные.
В индикаторе два вида сигналов, дискретный и аналоговый на выбор. Пропуски заполнять нулями.
Картинка в первом посте на обучающей выборке? Если это вне выборки то интересно посмотреть на обучающей выборке, при таком количестве нейронов сеть наизусть должна запомнить все входные данные.
Обучающая выборка - это последние 1000 баров, вернее, первые, если смотреть с 0-го как в тайм серии, все что до этого - аут оф сэмпл.
Попробую завтра его прикрутить, посмотрим что выдает.. Пока что прикрутил второй зигзаг, более крупный, смотрю как на 2-х выходах работает. Ничего выдающегося до сих пор не выдала, в среднем в ноль работает :)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Мало информации есть на форуме о уже готовых решениях, и эффективности нейросети для торговли на рынке. Предлагаю обсуждать и делиться опытом здесь. Если уже есть ветка с обсуждением, просьба линкнуть.
Использую классы отсюда, обычный многослойный персептрон. Надеюсь, классы считают все правильно, рассчитываю на опытность автора. Начал экспереметировать, интересно :)
На данный момент у меня на входе 11 индюков, на выходе зигзаг, смещенный на 1 бар в будущее.
Вот такие результаты сейчас выдает сетка за 8 мес. Обучаю на 1000 барах, 10000 эпох, 70 нейронов в скрытом слое. Сигналы реверсные и чисто по нейросети, без дополнительных фильтров. 15 мин тф.