индикатор-вспомогательные средние линии

 

Добрый день!

Помогите пожалуйста в доработке простого индикатора.

Нужно дополнительно рисовать горизонтальную 1 линию посередине между

максимумом и минимумом значения индикатора в плавающем интервале например 100 последних свечей.

То есть значение линии должно меняться с течением времени. 0,15/ 0,22/ 0,33 например. Ниже код:

//+------------------------------------------------------------------+
//|                                                  Custom MACD.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2004, MetaQuotes Software Corp."
#property  link      "http://www.metaquotes.net/"
//---- indicator settings
#property  indicator_separate_window
extern int    myBar ;    // Начальный бар построения линий 
#property indicator_minimum 0
string per;
#property indicator_maximum 2
#property indicator_level1 0.01
#property indicator_level2 0.03
#property  indicator_buffers 2
#property  indicator_color1  Lime
#property  indicator_color2  Crimson
#property  indicator_color3  Gold
#property  indicator_width1  1
#property  indicator_width2  1
#property  indicator_width3  1
//extern color col = Magenta;
//---- indicator parameters
extern int SignalSMA=20;
//---- indicator buffers
double     MacdBuffer[];
double     MacdBuffer2[];
double     SignalBuffer[];
double     SignalBuffer2[];
//double     Delta[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- drawing settings
   IndicatorBuffers(5); 
//---- indicator buffers mapping
   SetIndexBuffer(0,SignalBuffer);
   SetIndexStyle (0,DRAW_LINE);
    SetIndexBuffer(1,SignalBuffer2);
    SetIndexStyle (1,DRAW_LINE);
      SetIndexBuffer(3,MacdBuffer);
      SetIndexBuffer(4,MacdBuffer2);
     //  SetLevelStyle(STYLE_DASH,1,Gold);
     //  SetLevelValue (2,0.013);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("ind_double("  +SignalSMA+")");
    SetIndexLabel(0,"Sred_Up");
    SetIndexLabel(1,"Sred_Dn");
  //------------------------------------------------
    SetIndexDrawBegin(0,SignalSMA);
    SetIndexDrawBegin(1,SignalSMA);
    SetIndexDrawBegin(2,SignalSMA);
   IndicatorDigits(3); 
// {#property indicator_maximum 1}
  //------------------------------------- 
    return(0);
  }
//+------------------------------------------------------------------+
//| Up/Down                                                          |
//+------------------------------------------------------------------+
int start()
 {
   //string name;
   int limit,znak;
   int counted_bars=IndicatorCounted();
    switch(Period())
     {
       case PERIOD_M1:   znak=6;    break;
       case PERIOD_M5:   znak=30;   break;
       case PERIOD_M15:  znak=90;   break;
       case PERIOD_M30:  znak=100;  break;
       case PERIOD_H1:   znak=60;    break;
       case PERIOD_H4:   znak=240;   break;
       case PERIOD_D1:   znak=1440; break;
     }   
    //---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- macd counted in the 1-st buffer
   for(int i=0; i<limit; i++)
     MacdBuffer[i]=(((iHigh(0,0,i) -  iOpen(0,0,i))*MathPow(10,Digits))/znak);
      // MacdBuffer[i]=(((iHigh(0,0,i) -  iOpen(0,0,i))*MathPow(10,Digits))/znak);
//---- signal line counted in the 2-nd buffer
   for(i=0; i<limit; i++)
      SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalSMA,0,MODE_EMA,i);
//-----------------------------------------------------------------------------------------------------------------------------    
   for(int j=0;j<limit;j++)
     MacdBuffer2[j]=(((iOpen(0,0,j) -  iLow(0,0,j))*MathPow(10,Digits))/znak);
      //  MacdBuffer2[j]=(((iOpen(0,0,j) -  iLow(0,0,j))*MathPow(10,Digits))/znak);
   //----------------------------------------------------------------------------------------------------------------------------
   for (j=0;j<limit;j++)
   SignalBuffer2[j]=iMAOnArray(MacdBuffer2,Bars,SignalSMA,0,MODE_EMA,j);
//-------------------------------------------------------------------------------------------------------------------------------
   return(0);
 }
//+------------------------------------------------------------------------------------------------------------------------------
 
fregat555:

Добрый день!

Помогите пожалуйста в доработке простого индикатора.

Нужно дополнительно рисовать горизонтальную 1 линию посередине между

максимумом и минимумом значения индикатора в плавающем интервале например 100 последних свечей.

То есть значение линии должно меняться с течением времени. 0,15/ 0,22/ 0,33 например. Ниже код:

Уточните, о чем идет речь. Из описания вроде бы следует, что нужна линия, отображенная относительно границ подокна индикатора. При этом указываете, что границы плавающие. Тут же в коде приводите:

#property indicator_minimum 0
#property indicator_maximum 2

То есть границы фиксированные. В этом случае нужно всего лишь добавить:

#property indicator_level3 1.0

Выходит, что речь идет не о границах окна. Может Вы говорите о показаниях индикатора? Но тогда там будет не горизонтальная линия, а кривая.

Если же код не имеет отношения к тексту описания, то ответ: только мучаясь с графическим объектом, который перерисовывается на каждом событии графика (обрабатывается в OnChartEvent).

 
Ihor Herasko:

Уточните, о чем идет речь. Из описания вроде бы следует, что нужна линия, отображенная относительно границ подокна индикатора. При этом указываете, что границы плавающие. Тут же в коде приводите:

То есть границы фиксированные. В этом случае нужно всего лишь добавить:

Выходит, что речь идет не о границах окна. Может Вы говорите о показаниях индикатора? Но тогда там будет не горизонтальная линия, а кривая.

Если же код не имеет отношения к тексту описания, то ответ: только мучаясь с графическим объектом, который перерисовывается на каждом событии графика (обрабатывается в OnChartEvent).

Уточняю:

если листать график индикатора назад, то есть от 0 бара к N-ному, то максимум меняется

и нужно чтобы рисовалась на графике индикатора в его окне прямая-средняя,

например показания индикатора (минимум-максимум) были от 0 до 3,2 (средняя будет 1,6),

а потом  например 0-4,5 (средняя будет 2,25) и она будет нарисована,а старая стерта или

изменена на новую 100-периодную.

В мт4  вроде есть такие операторы  SetLevelStyle  и SetLevelValue.Как их использовать 

не знаю.

 
fregat555:

Уточняю:

если листать график индикатора назад, то есть от 0 бара к N-ному, то максимум меняется

и нужно чтобы рисовалась на графике индикатора в его окне прямая-средняя,

например показания индикатора (минимум-максимум) были от 0 до 3,2 (средняя будет 1,6),

а потом  например 0-4,5 (средняя будет 2,25) и она будет нарисована,а старая стерта или

изменена на новую 100-периодную.

В мт4  вроде есть такие операторы  SetLevelStyle  и SetLevelValue.Как их использовать 

не знаю.

явно не так...
и проблема с формулированием мыслей тоже присутсвует :-)

медианное значение индикатора за 100 пред.свечей - это кривая (выше об этом уже сказали).
Но вам нужен уровень.
Для какой точки кривой его рисовать ? для самой последней ?? для крайней справа в окне ??

в любом случае - это чисто визуальная вещь, ну и нарисуйте её как горизонталь. Координату возьмите от требуемой точки и следите за её изменениями


 
fregat555:

Уточняю:

если листать график индикатора назад, то есть от 0 бара к N-ному, то максимум меняется

Максимум чего меняется: подокна или значение какого-либо буфера?

и нужно чтобы рисовалась на графике индикатора в его окне прямая-средняя,

например показания индикатора (минимум-максимум) были от 0 до 3,2 (средняя будет 1,6),

а потом  например 0-4,5 (средняя будет 2,25) и она будет нарисована,а старая стерта или

изменена на новую 100-периодную.

В мт4  вроде есть такие операторы  SetLevelStyle  и SetLevelValue.Как их использовать 

не знаю.

Если показания индикатора, то укажите, какие именно показания интересуют. Ведь в коде объявлено четыре буфера. Какой из них нужен? Да и при таком подходе вообще непонятно, что будете получать. Ведь при одном масштабе в видимой части окна появятся одни данные, а при другом масштабе - другие. Получите линию, зависящую от масштаба. Замечательный способ для самообмана выйдет.

 

февраль 2018г.

февраль 2018

сейчас

апрель 2018

думаю легко понять что нужно.Кому в напряг не отвечайте, не напрягайте напрасно все свои  извилины...........,

 а то рассуждений на целую тонну пустых слов.

 

 в ответ на ваше:

-явно не так...
и проблема с формулированием мыслей тоже присутсвует :-)


должно быть так ,у культурных людей:

-извините,я не все понял.

Причина обращения: