Colored Moving Average

 

Нужно переделать из индикатора Vinina на индикатор такого типа:

имеються два мовинга, в один формируеться по  ценам открытия, а второй по закрытию.Если между ними,например, разница 8 пунктов,то цвет синий - если мовинги направлены вверх, и цвет красный если - мовинги направлены вниз, если разница меньше 8,  то цвет желтый.

Исходник Vinina

//+------------------------------------------------------------------+
//|                                             Vinin HighLow v1.mq4 |
//|                                        Victor Nicolaev aka Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Victor Nicolaev aka Vinin"
#property link      "mailto: vinin@mail.ru"


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Yellow
#property indicator_color2 Green
#property indicator_color3 Red


extern int period=34;
extern int price=0;
extern int Shift=0;

//---- buffers
double BufferGreen[];
double BufferYellow[];
double BufferRed[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
   int i;
   for (i=0;i<3;i++) {
      SetIndexStyle(i,DRAW_LINE);
      SetIndexDrawBegin(i,period);
      SetIndexShift(i,Shift);
   }
   SetIndexBuffer(0,BufferYellow);
   SetIndexBuffer(1,BufferGreen);
   SetIndexBuffer(2,BufferRed);
   

   return(0); }//int init() 
//+------------------------------------------------------------------+
int start() {
   int limit;
   double tmp1,tmp2,tmp3;
   int tmpBar, tmpTime;
   int counted_bars=IndicatorCounted();
   int i, j,k;
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   int cmd;
   for (i = limit;i>=0;i--){
      tmp1=iMA(Symbol(),0,period,0,MODE_SMA,price,i);
      tmp2=iMA(Symbol(),0,period,0,MODE_LWMA,price,i);
      tmp3=3.0*tmp2-2.0*tmp1;
      BufferGreen[i] =tmp3;
      BufferYellow[i]=tmp3;
      BufferRed[i]   =tmp3;
      if (BufferYellow[i]>BufferYellow[i+1]){
         BufferRed[i]=EMPTY_VALUE;
      } else if (BufferYellow[i]<BufferYellow[i+1]){
         BufferGreen[i] =EMPTY_VALUE;
      } else {
         BufferRed[i]=EMPTY_VALUE;         
         BufferGreen[i] =EMPTY_VALUE;
      }
   }
   return(0); 
}


Мои попытки.Проблема в том что рисует одним цветом.
//+------------------------------------------------------------------+
//|                                             Vinin HighLow v1.mq4 |
//|                                        Victor Nicolaev aka Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Victor Nicolaev aka Vinin"
#property link      "mailto: vinin@mail.ru"


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Yellow
#property indicator_color2 Green
#property indicator_color3 Red


extern int period=34;
extern int price=0;
extern int Shift=0;

//---- buffers
double BufferGreen[];
double BufferYellow[];
double BufferRed[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
   int i;
   for (i=0;i<3;i++) {
      SetIndexStyle(i,DRAW_LINE);
      SetIndexDrawBegin(i,period);
      SetIndexShift(i,Shift);
   }
   SetIndexBuffer(0,BufferYellow);
   SetIndexBuffer(1,BufferGreen);
   SetIndexBuffer(2,BufferRed);
   

   return(0); }//int init() 
//+------------------------------------------------------------------+
int start() {
   int limit;
   double tmp1,tmp2,tmp3;
   int tmpBar, tmpTime;
   int counted_bars=IndicatorCounted();
   int i, j,k;
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   int cmd;
   for (i = limit;i>=0;i--){
      tmp1=iMA(Symbol(),0,period,0,MODE_SMA,MODE_CLOSE,i);
      tmp2=iMA(Symbol(),0,period,0,MODE_SMA,MODE_OPEN,i);
      tmp3=3.0*tmp2-2.0*tmp1;
      BufferGreen[i] =tmp1;
      BufferRed[i]   =tmp2;
      BufferYellow[i]=tmp3;
      if (BufferGreen[i]>BufferRed[i]+Point*8){
         BufferRed[i]=EMPTY_VALUE;
         BufferYellow[i]=EMPTY_VALUE;
      } else if (BufferGreen[i]+Point*8<BufferRed[i]){
         BufferGreen[i] =EMPTY_VALUE;
         BufferYellow[i]=EMPTY_VALUE;
      } else {
         BufferRed[i]=EMPTY_VALUE;         
         BufferGreen[i] =EMPTY_VALUE;
      }
   }
   return(0); 
}

 

 

 
trade640 писал(а) >>

Нужно переделать из индикатора Vinina на индикатор такого типа:

имеються два мовинга, в один формируеться по ценам открытия, а второй по закрытию.Если между ними,например, разница 8 пунктов,то цвет синий - если мовинги направлены вверх, и цвет красный если - мовинги направлены вниз, если разница меньше 8, то цвет желтый.

Исходник Vinina


Мои попытки.Проблема в том что рисует одним цветом.

Для начала надо использовать нужные константы в коде

      tmp1=iMA(Symbol(),0,period,0,MODE_SMA,PRICE_CLOSE,i);
      tmp2=iMA(Symbol(),0,period,0,MODE_SMA,PRICE_OPEN,i);
И решить какая линия будет отрисовываться.
 
Vinin >>:

Для начала надо использовать нужные константы в коде

И решить какая линия будет отрисовываться.


Мне рисовать в принципе все равно что я пробывал даже использовать Close[i].А на счет констатнт я не понял.
 
trade640 писал(а) >>

Мне рисовать в принципе все равно что я пробывал даже использовать Close[i].А на счет констатнт я не понял.

Используемая цена для расчёта индикаторов может принимать любое из следующих значений:

Константа Значение Описание
PRICE_CLOSE 0 Цена закрытия
PRICE_OPEN 1 Цена открытия
PRICE_HIGH 2 Максимальная цена
PRICE_LOW 3 Минимальная цена
PRICE_MEDIAN 4 Средняя цена, (high+low)/2
PRICE_TYPICAL 5 Типичная цена, (high+low+close)/3
PRICE_WEIGHTED 6 Взвешенная цена закрытия, (high+low+close+close)/4

 
Так я же и использую Price_Close и Price_Open.Можна написать 0 и 1, разницы нет.
 
trade640 писал(а) >>
Так я же и использую Price_Close и Price_Open.Можна написать 0 и 1, разницы нет.

У тебя использовались другие константы

      tmp1=iMA(Symbol(),0,period,0,MODE_SMA,MODE_CLOSE,i);
      tmp2=iMA(Symbol(),0,period,0,MODE_SMA,MODE_OPEN,i);
Для отрисовки в цвете нескольких линий нужно для каждой использовать три буфера. Максимум можно отрисовать в цвете две линии. Максимальное количество буферов равно восьми.
 
Vinin >>:

У тебя использовались другие константы

Для отрисовки в цвете нескольких линий нужно для каждой использовать три буфера. Максимум можно отрисовать в цвете две линии. Максимальное количество буферов равно восьми.


Я наверное плохо обяснил, то что я хотел сделать.Я хотел так как у Вас чтобы отрисовывалось в одной линии разными цветами при определенных условиях.Сейчас у меня такие идеи:
for (i = limit;i>=0;i--){
      tmp1=iMA(Symbol(),0,14,0,MODE_SMA,MODE_CLOSE,i);
      tmp2=iMA(Symbol(),0,14,0,MODE_SMA,MODE_OPEN,i);
      tmp3=Close[i];
      BufferClose[i] =tmp1;
      BufferOpen[i]  =tmp2;
      BufferRed[i]   =tmp3;
      BufferGreen[i] =tmp3;
      BufferYellow[i]=tmp3;
      Comment(DoubleToStr(BufferClose[i],Digits));
      if (BufferClose[i]>BufferOpen[i]){ 
      //&& MathAbs(BufferGreen[i]-BufferRed[i])>=Point*8){
         BufferRed[i]   =EMPTY_VALUE;
         BufferYellow[i]=EMPTY_VALUE;
      } else if (BufferClose[i]<BufferOpen[i]){
      //&& MathAbs(BufferGreen[i]-BufferRed[i])>=Point*8){
         BufferGreen[i] =EMPTY_VALUE;
         BufferYellow[i]=EMPTY_VALUE;
      } else {
         BufferRed[i]=EMPTY_VALUE;         
         BufferGreen[i] =EMPTY_VALUE;
      }
   }
 
trade640 писал(а) >>

Я наверное плохо обяснил, то что я хотел сделать.Я хотел так как у Вас чтобы отрисовывалось в одной линии разными цветами при определенных условиях.Сейчас у меня такие идеи:

Файлы:
trade640.mq4  3 kb
 
Спасибо большое за помощь.
Причина обращения: