Еще раз спасибо.
//+------------------------------------------------------------------+ //| Stochastic_fan_color | //| Copyright © 2012 Fox.RM | //| fox.rm@mail.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2012 Fox.RM" #property link "fox.rm@mail.ru" //---- #property indicator_separate_window #property indicator_buffers 7 //---- fan style #property indicator_color1 Red #property indicator_color2 Black #property indicator_color3 Blue #property indicator_color4 Red #property indicator_color5 Blue #property indicator_color6 SlateBlue #property indicator_color7 Tomato #property indicator_style1 0 #property indicator_style2 0 #property indicator_style3 0 #property indicator_width4 2 #property indicator_width5 2 #property indicator_width6 2 #property indicator_width7 2 #property indicator_level1 88.2 #property indicator_level2 11.8 #property indicator_levelcolor DarkGray //---- basic fan indicator parameters extern bool Show_STOCH_1=true; extern int K_period1=21; extern int S_period1=1; extern bool Show_STOCH_2=true; extern int K_period2=55; extern int S_period2=1; extern bool Show_STOCH_3=true; extern int K_period3=144; extern int S_period3=1; extern bool Show_STOCH_4=true; extern int K_period4=377; extern int S_period4=1; //---- indicator buffers double MainBuffer1[]; double MainBuffer2[]; double MainBuffer3[]; double MainBufferR[]; double MainBufferB[]; double MainBufferS[]; double MainBufferT[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- stochastic line 1 (fast) if(Show_STOCH_1 ==true){Show_STOCH_1=DRAW_LINE; } else {Show_STOCH_1=DRAW_NONE; } SetIndexBuffer(0,MainBuffer1); SetIndexStyle(0,Show_STOCH_1,0); SetIndexLabel(0,"fast WPR ( "+K_period1+" )"); //---- stochastic line 2 (basic) if(Show_STOCH_2 ==true){Show_STOCH_2=DRAW_LINE; } else {Show_STOCH_2=DRAW_NONE; } SetIndexBuffer(1,MainBuffer2); SetIndexStyle(1,Show_STOCH_2); SetIndexLabel(1,"basic WPR ( "+K_period2+" )"); //---- stochastic line 3 (flat) if(Show_STOCH_3 ==true){Show_STOCH_3=DRAW_LINE; } else {Show_STOCH_3=DRAW_NONE; } SetIndexBuffer(2,MainBuffer3); SetIndexStyle(2,Show_STOCH_3,0); SetIndexLabel(2,"slow WPR ( "+K_period3+" )"); //---- stochastic line 4 (control) SetIndexBuffer(3,MainBufferR); SetIndexStyle(3,Show_STOCH_4,0,2); SetIndexLabel(3,"control WPR ( "+K_period4+" )"); SetIndexBuffer(4,MainBufferB); SetIndexBuffer(5,MainBufferS); SetIndexBuffer(6,MainBufferT); //---- name for DataWindow and indicator subwindow label IndicatorShortName("Stochastic_fan_color"); } //---- return(0); //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- ObjectsDeleteAll(0,OBJ_LABEL); //---- return(0); } //+------------------------------------------------------------------+ //| Stochastic_fan | //+------------------------------------------------------------------+ int start() { double MA1[]; double MA2[]; double MA3[]; double VolumesBuf[]; int i,limit,counted_bars=IndicatorCounted(); //---- Plot defined timeframe on to current timeframe limit=Bars-counted_bars; //---stroim stohastik for(i=0;i<limit;i++) { //---расчет скользящих от Volume и заполнение массивов VolumesBuf[i]=Volume[i]; MA1[i]=iMAOnArray(VolumesBuf,0,8,0,0,i); MA2[i]=iMAOnArray(VolumesBuf,0,21,0,0,i); MA3[i]=iMAOnArray(VolumesBuf,0,233,0,0,i); //---расчет стохастиков и заполнение массивов MainBuffer1[i]=iStochastic(NULL,0,K_period1,1,S_period1,0,0,MODE_MAIN,0); MainBuffer2[i]=iStochastic(NULL,0,K_period2,1,S_period2,0,0,MODE_MAIN,0); MainBuffer3[i]=iStochastic(NULL,0,K_period3,1,S_period3,0,0,MODE_MAIN,0); MainBufferR[i]=iStochastic(NULL,0,K_period4,1,S_period4,0,0,MODE_MAIN,0); MainBufferB[i]=iStochastic(NULL,0,K_period4,1,S_period4,0,0,MODE_MAIN,0); MainBufferS[i]=iStochastic(NULL,0,K_period4,1,S_period4,0,0,MODE_MAIN,0); MainBufferT[i]=iStochastic(NULL,0,K_period4,1,S_period4,0,0,MODE_MAIN,0); //---условия для раскрашивания контрольной линии стохастика if(MA1[i]>MA3[i]&&MA1[i]>MA2[i]){MainBufferB[i]=EMPTY;MainBufferS[i]=EMPTY;MainBufferT[i]=EMPTY;} if(MA1[i]>MA3[i]&&MA1[i]<MA2[i]){MainBufferB[i]=EMPTY;MainBufferS[i]=EMPTY;MainBufferR[i]=EMPTY;} if(MA1[i]<MA3[i]&&MA1[i]>MA2[i]){MainBufferB[i]=EMPTY;MainBufferT[i]=EMPTY;MainBufferR[i]=EMPTY;} if(MA1[i]<MA3[i]&&MA1[i]<MA2[i]){MainBufferR[i]=EMPTY;MainBufferT[i]=EMPTY;MainBufferS[i]=EMPTY;} /* при выставлении этих параметров на раскрашивание контрольной линии начинает рисовать каля-маля. есть подозрения, что проблема в МА1, МА2, МА3. if(MainBuffer1[i]>MainBuffer2[i]){MainBufferB[i]=EMPTY_VALUE;MainBufferS[i]=EMPTY_VALUE;MainBufferT[i]=EMPTY_VALUE;} if(MainBuffer2[i]>MainBuffer3[i]){MainBufferB[i]=EMPTY_VALUE;MainBufferS[i]=EMPTY_VALUE;MainBufferR[i]=EMPTY_VALUE;} if(MainBuffer1[i]<MainBuffer3[i]){MainBufferB[i]=EMPTY_VALUE;MainBufferT[i]=EMPTY_VALUE;MainBufferR[i]=EMPTY_VALUE;}else{ if(MainBuffer2[i]<MainBuffer3[i]){MainBufferR[i]=EMPTY_VALUE;MainBufferT[i]=EMPTY_VALUE;MainBufferS[i]=EMPTY_VALUE;} } */ } //---- return(0); } //+------------------------------------------------------------------+
Есть некоторые нюансы с отрисовкой линий разными цветами. Поэтому прежде чем начинать, задайте себе следующие вопросы (и постарайтесь сами найти ответы:)
- Если точка индикатора 1 нарисована красным цветом, а точка 2 - синим, то каким цветом MT соединит эти точки на графике?
- Если точки 1 и 3 нарисованы красным цветом, а между ними "синяя" точка 2, то что нарисует на графике MT?
- Если в точке 1 заканчивается линия буфера 1, а в следующей за ней точке 2 начинается линия буфера 2, то будут ли эти линии соединены друг с другом на графике?
Вас не смущает, что значения объема - это целые числа, 1,2,3 и т.д., и даже если вы поделили их на nPeriods (которое у вас по умолчанию равно 5), это будет на порядок больше значений AOBuffer (0.0003 и т.п.) Естественно, последний вы увидите только в в форме прямой линии вдоль нуля. Отмасштабируйте переменные, короче говоря.
пОнято!
Есть некоторые нюансы с отрисовкой линий разными цветами. Поэтому прежде чем начинать, задайте себе следующие вопросы (и постарайтесь сами найти ответы:)
- Если точка индикатора 1 нарисована красным цветом, а точка 2 - синим, то каким цветом MT соединит эти точки на графике?
- Если точки 1 и 3 нарисованы красным цветом, а между ними "синяя" точка 2, то что нарисует на графике MT?
- Если в точке 1 заканчивается линия буфера 1, а в следующей за ней точке 2 начинается линия буфера 2, то будут ли эти линии соединены друг с другом на графике?
Как в фильме штрафной удар, вопрос понятен - отвечаю) Логика ясна, я и сам над этим думаю попутно, но на текущий момент меня больше заботит почему при этих условиях
if(MA1[i]>MA3[i]&&MA1[i]>MA2[i]){MainBufferB[i]=EMPTY;MainBufferS[i]=EMPTY;MainBufferT[i]=EMPTY;}
if(MA1[i]>MA3[i]&&MA1[i]<MA2[i]){MainBufferB[i]=EMPTY;MainBufferS[i]=EMPTY;MainBufferR[i]=EMPTY;}
if(MA1[i]<MA3[i]&&MA1[i]>MA2[i]){MainBufferB[i]=EMPTY;MainBufferT[i]=EMPTY;MainBufferR[i]=EMPTY;}
if(MA1[i]<MA3[i]&&MA1[i]<MA2[i]){MainBufferR[i]=EMPTY;MainBufferT[i]=EMPTY;MainBufferS[i]=EMPTY;}
линия не раскрашивается ВООБЩЕ, а при этих
if(MainBuffer1[i]>MainBuffer2[i]){MainBufferB[i]=EMPTY_VALUE;MainBufferS[i]=EMPTY_VALUE;MainBufferT[i]=EMPTY_VALUE;}
if(MainBuffer2[i]>MainBuffer3[i]){MainBufferB[i]=EMPTY_VALUE;MainBufferS[i]=EMPTY_VALUE;MainBufferR[i]=EMPTY_VALUE;}
if(MainBuffer1[i]<MainBuffer3[i]){MainBufferB[i]=EMPTY_VALUE;MainBufferT[i]=EMPTY_VALUE;MainBufferR[i]=EMPTY_VALUE;}else{
if(MainBuffer2[i]<MainBuffer3[i]){MainBufferR[i]=EMPTY_VALUE;MainBufferT[i]=EMPTY_VALUE;MainBufferS[i]=EMPTY_VALUE;}
начинает красится?
Как в фильме штрафной удар, вопрос понятен - отвечаю) Логика ясна, я и сам над этим думаю попутно, но на текущий момент меня больше заботит почему при этих условиях
линия не раскрашивается ВООБЩЕ, а при этих
начинает красится?
EMPTY - это константа, которая используется для обозначения слова "пусто" при передаче параметров в функции. А EMPTY_VALUE - константа, служащая для сообщения отрисовщику графика, то ничего рисовать не надо.
Там везде должно стоять значение (и оно использовалось при отладке во всех вариантах) EMPTY_VALUE. Вообще идея взята отсюда https://www.mql5.com/ru/articles/1569.
Может проблема в организации массивов МА1-МА3 и их заполнении? Спасибо alsu.
Может проблема в организации массивов МА1-МА3 и их заполнении?
Я ж не зря свои вопросы писал. При смене цвета вы не только должны скрыть те линии, которые не надо рисовать, но и открыть взад предыдущее и текущее значения той, которую надо рисовать. Иначе не получится линии (линия ведь состоит минимум из 2 точек).
Такой совет - для отладки сменить тип отрисовки на гистограмму DRAW_HISTOGRAM (она-то не зависит от сказанного выше), тогда, по крайней мере, будет видно, правильно ли заполняются буфера. После этого уже можно прорисовывать линиями.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день! Снова переименовал ветку, дабы стало понятно отчего так много вопросов. Решил всерьез изучить MQL.
Так как уровень мастерства оставляет желать лучшего, то большая просьба не закидывать камнями и расстреливать холостыми)
Буду рад любой помощи и любым советам, кроме конечно "изучай литературу", т.к. все доступные мне источники начиная от книги С.Ковалева и заканчивая
различными статьями с форумов уже под рукой и штудируются. Изучаю по принципу сам ставлю себе задачу, сам решаю. Не хватает понимания, задаю вопрос на форуме.
Рассчитываю на поддержку более опытных коллег. Спасибо.
ВОПРОС СНЯТ.