Нужна помощь. Изучаю MQL возникают вопросы.

 

Добрый день! Снова переименовал ветку, дабы стало понятно отчего так много вопросов. Решил всерьез изучить MQL.

Так как уровень мастерства оставляет желать лучшего, то большая просьба не закидывать камнями и расстреливать холостыми)

Буду рад любой помощи и любым советам, кроме конечно "изучай литературу", т.к. все доступные мне источники начиная от книги С.Ковалева и заканчивая

различными статьями с форумов уже под рукой и штудируются. Изучаю по принципу сам ставлю себе задачу, сам решаю. Не хватает понимания, задаю вопрос на форуме.

Рассчитываю на поддержку более опытных коллег. Спасибо.

Пишу индикатор, который отображал бы гистограмму Volumes относительно
0-го уровня в зависимости от положения линии индикатора Awesom. Volumes
отображается, но полностью перекрывает остальные линии индикатора.
Не могу понять в чем ошибка. Прикладываю скрин. Спасибо!

//+------------------------------------------------------------------+
//|                                            Awesom_fan_volumes    |
//|                                         Copyright © 2012 Fox.RM  |
//|                                               fox.rm@mail.ru     |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012 Fox.RM"
#property link      "fox.rm@mail.ru"

//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 4
#property  indicator_color1  Red
#property  indicator_color2  CornflowerBlue
#property  indicator_color3  Gray
#property  indicator_color4  Green
#property  indicator_width1  2
//#property indicator_style5 1
//---- basic fan indicator parameters

extern bool Show_AOLine_2=true;
extern int SlowEMA3=34;
extern int EMA=2;
//---- additional fan indicator parameters
extern bool Show_AOLine_5=true;
extern int FastEMA2=21;
extern int SlowEMA6=55;
extern bool Show_AOLine_6=true;
extern int V=34;
extern int nPeriod = 5;
//---- indicator buffers

double     AOBuffer3[];
double     EMABuffer2[];
double     VBuffer[];
double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   
//---- 3 indicator buffers mapping
   
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("Awesome_fan_Volumes");
   
   
//---- AO_fan line 2 (basic)
   if(Show_AOLine_2 ==true){Show_AOLine_2=DRAW_LINE; }
   else 
    {Show_AOLine_2=DRAW_NONE; }
   SetIndexBuffer(0,AOBuffer3);
   SetIndexStyle(0,Show_AOLine_2);
   SetIndexLabel(0,"basic line");   


//---- AO_fan line (slow trand)
 if(Show_AOLine_5 ==true){Show_AOLine_5=DRAW_LINE; }
   else 
    {Show_AOLine_5=DRAW_NONE; }
   SetIndexBuffer(1,EMABuffer2);
   SetIndexStyle(1,Show_AOLine_5);
   SetIndexLabel(1,"slow trand  ( "+FastEMA2+" )( "+SlowEMA6+" )");

//---- AO_fan V Line (balans)
 if(Show_AOLine_6 ==true){Show_AOLine_6=DRAW_LINE; }
   else 
    {Show_AOLine_6=DRAW_NONE; }
   SetIndexBuffer(2,VBuffer);
   SetIndexStyle(2,Show_AOLine_6);
   SetIndexLabel(2,"balans line (V)  ( "+V+" )");
   
   SetIndexBuffer(3,ExtMapBuffer1);
   SetIndexStyle(3,DRAW_HISTOGRAM);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current;
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

//---- AO_fan line 2 (basic) buffer
   for(int i=0; i<limit; i++)
   {
      AOBuffer3[i]=iMA(NULL,0,EMA,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,SlowEMA3,0,MODE_SMA,PRICE_MEDIAN,i);
       int nSum = Volume[i]/nPeriod; //-- коэффициент для уменьшения гистограммы Volumes
       if (AOBuffer3[i]<0)ExtMapBuffer1[i] = nSum;  //--здесь прописываю отображение гистограммы Volumes
       if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum; //--относительно основной линии Awesom (AO).

//---- AO_fan line (slow trand) buffer
   
      EMABuffer2[i]=iMA(NULL,0,FastEMA2,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA6,0,MODE_EMA,PRICE_CLOSE,i);

//---- AO_fan V Line (balans)

      VBuffer[i]=iMA(NULL,0,V,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,V,0,MODE_SMA,PRICE_MEDIAN,i);

 
//---- dispatch values between 2 buffers
   }
       
//---- done
   return(0);
  }
//+------------------------------------------------------------------+

ВОПРОС СНЯТ.


Файлы:
 
И сразу второй вопрос, че мелочиться-то))
Хочу раскрасить одну из линий стохастика в 4-е цвета.
Цвет зависит от положения мувингов рассчинных от Volumes,
но линия красится только в один цвет. Также прикладываю скрин.

Еще раз спасибо.

//+------------------------------------------------------------------+
//|                                           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);
  }
//+------------------------------------------------------------------+

Файлы:
 
Fox_RM:
Добрый день!
Пишу индикатор, который отображал бы гистограмму Volumes относительно
0-го уровня в зависимости от положения линии индикатора Awesom. Volumes
отображается, но полностью перекрывает остальные линии индикатора.
Не могу понять в чем ошибка. Прикладываю скрин. Спасибо!


Вас не смущает, что значения объема - это целые числа, 1,2,3 и т.д., и даже если вы поделили их на nPeriods (которое у вас по умолчанию равно 5), это будет на порядок больше значений AOBuffer (0.0003 и т.п.) Естественно, последний вы увидите только в в форме прямой линии вдоль нуля. Отмасштабируйте переменные, короче говоря.
 
Fox_RM:
И сразу второй вопрос, че мелочиться-то))
Хочу раскрасить одну из линий стохастика в 4-е цвета.
Цвет зависит от положения мувингов рассчинных от Volumes,
но линия красится только в один цвет. Также прикладываю скрин.

Еще раз спасибо.

Есть некоторые нюансы с отрисовкой линий разными цветами. Поэтому прежде чем начинать, задайте себе следующие вопросы (и постарайтесь сами найти ответы:)

  • Если точка индикатора 1 нарисована красным цветом, а точка 2 - синим, то каким цветом MT соединит эти точки на графике?
  • Если точки 1 и 3 нарисованы красным цветом, а между ними "синяя" точка 2, то что нарисует на графике MT?
  • Если в точке 1 заканчивается линия буфера 1, а в следующей за ней точке 2 начинается линия буфера 2, то будут ли эти линии соединены друг с другом на графике?
 
alsu:
Вас не смущает, что значения объема - это целые числа, 1,2,3 и т.д., и даже если вы поделили их на nPeriods (которое у вас по умолчанию равно 5), это будет на порядок больше значений AOBuffer (0.0003 и т.п.) Естественно, последний вы увидите только в в форме прямой линии вдоль нуля. Отмасштабируйте переменные, короче говоря.

пОнято!
 
alsu:

Есть некоторые нюансы с отрисовкой линий разными цветами. Поэтому прежде чем начинать, задайте себе следующие вопросы (и постарайтесь сами найти ответы:)

  • Если точка индикатора 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;} 

начинает красится?

 
Подправил название ветки. Оно должно быть содержательным.
 
Fox_RM:

Как в фильме штрафной удар, вопрос понятен - отвечаю) Логика ясна, я и сам над этим думаю попутно, но на текущий момент меня больше заботит почему при этих условиях

линия не раскрашивается ВООБЩЕ, а при этих

начинает красится?

EMPTY - это константа, которая используется для обозначения слова "пусто" при передаче параметров в функции. А EMPTY_VALUE - константа, служащая для сообщения отрисовщику графика, то ничего рисовать не надо.
 

alsu:
EMPTY - это константа, которая используется для обозначения слова "пусто" при передаче параметров в функции. А EMPTY_VALUE - константа, служащая для сообщения отрисовщику графика, то ничего рисовать не надо.
Я знаю. Пардон, там небольшая ошибочка, видимо при переносе кода возникла.

Там везде должно стоять значение (и оно использовалось при отладке во всех вариантах) EMPTY_VALUE. Вообще идея взята отсюда https://www.mql5.com/ru/articles/1569.

Может проблема в организации массивов МА1-МА3 и их заполнении? Спасибо alsu.


 
Первый вопрос снят, все получилось. Второй еще нет.
 
Fox_RM:

Может проблема в организации массивов МА1-МА3 и их заполнении?

Я ж не зря свои вопросы писал. При смене цвета вы не только должны скрыть те линии, которые не надо рисовать, но и открыть взад предыдущее и текущее значения той, которую надо рисовать. Иначе не получится линии (линия ведь состоит минимум из 2 точек).

Такой совет - для отладки сменить тип отрисовки на гистограмму DRAW_HISTOGRAM (она-то не зависит от сказанного выше), тогда, по крайней мере, будет видно, правильно ли заполняются буфера. После этого уже можно прорисовывать линиями.