Спасите помогите кто может с советником SimpleMACD - страница 3

 
Talex:
Alexander1984:

По индикатору MACD! Как сделать так чтобы вся гистограмма выше "0" красилась в синий, а ниже "0" в красный.

Надо использовать два буфера вместо одного. в 1-й буфер заносить значения > 0, в другой < 0.

Пожайлуста, можно по подробнее.
 
Alexander1984:
Пожайлуста, можно по подробнее.

//+------------------------------------------------------------------+
//|                                                  Custom MACD.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       https://www.metaquotes.net// |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2004, MetaQuotes Software Corp."
#property  link      "https://www.metaquotes.net//"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Lime
#property  indicator_color2  Red
//---- indicator parameters
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;
//---- indicator buffers
double     ind_buffer1[];
double     ind_buffer2[];
 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2);
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1);
//---- indicator buffers mapping
   if(!SetIndexBuffer(0,ind_buffer1) && !SetIndexBuffer(1,ind_buffer2))
      Print("cannot set indicator buffers!");
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("MACD("+FastEMA+","+SlowEMA+","+SignalSMA+")");
   SetIndexLabel(0,"MACD+");
   SetIndexLabel(1,"MACD-");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars=IndicatorCounted();
   double x;
//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- 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++) {
      x=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
      if(x<0)ind_buffer1[i]=x; else ind_buffer2[i]=x;
   }
   return(0);
  }
Переделал на скорую руку, но работать должен. Убрал сигнальную линию и ее буфер использовал.
 
Ага. ясненько. Спасибо!
 
Talex писал (а) >>

Попробуйте, так. Похоже исправить легче, чем все время пытаться навести на ошибки.

Здравствуйте. А как заставить советника выставлять отложенные ордера с заданным уровнем, например, советник сработал на цене 105.2, а выставляется на покупку 105.0 и наоборот при продаже.Это чтобы уменьшить просадку на часовиках. Спасибо

 
anatolyp писал (а) >>

А как заставить советника выставлять отложенные ордера с заданным уровнем, например, советник сработал на цене 105.2, а выставляется на покупку 105.0 и наоборот при продаже.

   // RefreshRates();
   double price=Bid+Delta*Point;
   double loss=price-(StopLoss)*Point;
   double profit=0; if (TakeProfit>0) profit=price+TakeProfit*Point;
   ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,price,3,loss,profit,"",Magic,0,CLR_NONE);
   if(ticket < 0) { Print("Ошибка открытия ордера BUY #", GetLastError());return (0); }

Где Delta=105.20-105.00=20

Можно этот параметр задать в глобальных пременных.

extern int       Delta=20;

Для одера СеллСтоп, а также для лимитных ордеров - аналогично.

Разве что, стопы чуть иначе будут ставиться с бидами и асками...

.

 
rid писал (а) >>

Разве что, стопы чуть иначе будут ставиться с бидами и асками...

Проконсультировать можете? Заранее благодарен.

 
Talex писал (а) >>

Переделал на скорую руку, но работать должен. Убрал сигнальную линию и ее буфер использовал.

А как сделать, чтобы этот советник работал на разных парах одновременно. Очень прошу помочь, кто может.

 

Есть такая идея: Рисовать МАСД по усредненным трем-пяти предыдущим барам и все это совместить с обычной МАСД по текущему бару.Тогда точки пересечения - это входы в рынок.Желательно сделать все параметры настраиваемыми, в т.ч. цены закрытия,средние и т.п.Кто возьмется проверить такую идею?

 
// RefreshRates();
double price=Bid+Delta*Point;
double loss=price-(StopLoss)*Point;
double profit=0; if (TakeProfit>0) profit=price+TakeProfit*Point;
ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,price,3,loss,profit,"",Magic,0,CLR_NONE);
if(ticket < 0) { Print("Ошибка открытия ордера BUY #", GetLastError());return (0); }

А куда вставлять эти строки?

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