Советники: 50% МАCD

 

50% МАCD:

Один из способов поиска уровней сопротивления и поддержки.

Author: ываыва

 
Забыл сказать, внутри код, он исключен скобками /*...*/, если скобки убрать то советник будет торговать, стратегия не сложная(простая переворотная с увеличением лота, с возможностью ручного трейлинга в тестере: создаём линию с именем SL и передвигаем её, после закрытия ордера линия удаляется), осталась от экспериментов над советником
 
Привет. Отличная идея. Но несовсем удобно ее использовать с другими индикаторами. возможно оформить это в виде индикатора. Уровни рисуются на актуальных барах. При смене уровней, новые фиксируются, также на актуальных для них барах. Чтобы не захламлять график можно сделать включение-выключение всех уровней на своих этапах. Попытался это реализовать, на основе вашего советника, но не получилось (мозгов не хватило).
 
Kostay:
Привет. Отличная идея. Но несовсем удобно ее использовать с другими индикаторами. возможно оформить это в виде индикатора. Уровни рисуются на актуальных барах. При смене уровней, новые фиксируются, также на актуальных для них барах. Чтобы не захламлять график можно сделать включение-выключение всех уровней на своих этапах. Попытался это реализовать, на основе вашего советника, но не получилось (мозгов не хватило).

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

#property copyright "Sanyooooook"
#property link      "sanyooooook@mail.ru"

поставьте строку

#property indicator_chart_window

сам не пробовал но должно работать

По отрисовке всех уровней достаточно проблематично, расчет ведётся до второго пересечения МАСД и нулевого уровня и при каждом новом пересечении МАКД и сигнальной происходит пересчет уровней, удаление и создание новых уровней. Но в принципе реализуемо, главное понять что нужно ). Принцип построения уровней выкладывал тут

 

"поставьте строку

#property indicator_chart_window"

Точно. Вот чего нехвалало. Но здесь другая проблема. нужно ждать первого пересечения MACD с нулевым уровнем, а старые еще действующие уровни не показываются. Как их можно отобразить. Все уровни не нужны, бог с ними, а вот последние еще актуальные неплохо было бы увидеть.

 
Kostay:

"поставьте строку

#property indicator_chart_window"

Точно. Вот чего нехвалало. Но здесь другая проблема. нужно ждать первого пересечения MACD с нулевым уровнем, а старые еще действующие уровни не показываются. Как их можно отобразить. Все уровни не нужны, бог с ними, а вот последние еще актуальные неплохо было бы увидеть.


даже нашел логическую ошибку )

закомментируйте эту строку и else ей принадлежащий

   //if(((MACD<MACD_Sig)&&(MACD1>MACD_Sig1))||((MACD>MACD_Sig)&&(MACD1<MACD_Sig1)))
ЗЫ: линии отрисовывоются в конце кода, уровень последней линии забивается последним
 

пример использования данных линий, это дэмка и можно предположить, что просто повезло, но результат(за сутки) на лицо


 
sanyooooook:
Kostay:

"поставьте строку

#property indicator_chart_window"

Точно. Вот чего нехвалало. Но здесь другая проблема. нужно ждать первого пересечения MACD с нулевым уровнем, а старые еще действующие уровни не показываются. Как их можно отобразить. Все уровни не нужны, бог с ними, а вот последние еще актуальные неплохо было бы увидеть.


даже нашел логическую ошибку )

закомментируйте эту строку и else ей принадлежащий

   //if(((MACD<MACD_Sig)&&(MACD1>MACD_Sig1))||((MACD>MACD_Sig)&&(MACD1<MACD_Sig1))) 
ЗЫ: линии отрисовывоются в конце кода, уровень последней линии забивается последним



 Все пытаюсь сделать, чтобы на графике показывал последние актуальные линии. ввел буферы, чтоб отрисовывал. Что не так?

 

#property indicator_chart_window
//---- input parameters
//extern double    Lots=0.1;
extern int       fast_ema_period=12;
extern int       slow_ema_period=26;
extern int       signal_period=4;
extern int       applied_price=4;
bool Long=true;
//extern int MAGIC=20100930;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
double Level1,MACD_Buff_Low[],MACD_Buff_High[];
double Level2;
double LevelExtr;
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
SetIndexStyle(0, DRAW_LINE, STYLE_SOLID);
   SetIndexBuffer(0, MACD_Buff_Low);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1, DRAW_LINE, STYLE_SOLID);
   SetIndexBuffer(1, MACD_Buff_High);
   SetIndexEmptyValue(1,0.0);
   
   
   double MACD_Buff_High[100];
   double MACD_Buff_Low[100];
   ArrayInitialize(MACD_Buff_High,0.0);
   ArrayInitialize(MACD_Buff_Low,0.0);
   double MACD=iMACD(NULL,0,fast_ema_period,slow_ema_period,signal_period,applied_price,MODE_MAIN,1);
   double MACD_Sig=iMACD(NULL,0,fast_ema_period,slow_ema_period,signal_period,applied_price,MODE_SIGNAL,1);
   double MACD1=iMACD(NULL,0,fast_ema_period,slow_ema_period,signal_period,applied_price,MODE_MAIN,1+1);
   double MACD_Sig1=iMACD(NULL,0,fast_ema_period,slow_ema_period,signal_period,applied_price,MODE_SIGNAL,1+1);
   int i=0;
   int H;
   int Stop=0;
   int Start;
   double Price_Low=Low[0];
   double Price_High=High[0];
   if(((MACD<MACD_Sig)&&(MACD1>MACD_Sig1))||((MACD>MACD_Sig)&&(MACD1<MACD_Sig1)))
   {
      if(MACD>0)
      {
         Comment("MACD>0");
         while(Stop<2)
         {
            MACD=iMACD(NULL,0,fast_ema_period,slow_ema_period,signal_period,applied_price,MODE_MAIN,i);
            MACD_Sig=iMACD(NULL,0,fast_ema_period,slow_ema_period,signal_period,applied_price,MODE_SIGNAL,i);
            if(MACD<0&&Stop==0)
            {
               Stop=1;
               Start=i;
            }
            if(Price_Low>=Low[i]&&Stop==1)Price_Low=Low[i];
            if(MACD>0&&Stop==1)Stop=2;
            i++;
         }
         MACD_Buff_High[0]=Price_Low;
         H++;
         i=Start;
         MACD_Buff_High[H]=Low[i];
         while(i>=0)
         {
            MACD=iMACD(NULL,0,fast_ema_period,slow_ema_period,signal_period,applied_price,MODE_MAIN,i);
            MACD_Sig=iMACD(NULL,0,fast_ema_period,slow_ema_period,signal_period,applied_price,MODE_SIGNAL,i);
            MACD1=iMACD(NULL,0,fast_ema_period,slow_ema_period,signal_period,applied_price,MODE_MAIN,i+1);
            MACD_Sig1=iMACD(NULL,0,fast_ema_period,slow_ema_period,signal_period,applied_price,MODE_SIGNAL,i+1);
            if(Price_Low<=High[i])
            {
               Price_Low=High[i];
            }
            if((MACD-MACD_Sig)*(MACD1-MACD_Sig1)<0&&MACD<MACD_Sig&&Price_Low>MACD_Buff_High[H-1])
            {
               MACD_Buff_High[H]=Price_Low;
               H++;
            }
            i--;
         }
      }
      else
      {
         Comment("MACD<0");
         while(Stop<2)
         {
            MACD=iMACD(NULL,0,fast_ema_period,slow_ema_period,signal_period,applied_price,MODE_MAIN,i);
            MACD_Sig=iMACD(NULL,0,fast_ema_period,slow_ema_period,signal_period,applied_price,MODE_SIGNAL,i);
            if(MACD>0&&Stop==0)
            {
               Stop=1;
               Start=i;
            }
            if(Price_High<=High[i]&&Stop==1)Price_High=High[i];
            if(MACD<0&&Stop==1)Stop=2;
            i++;
         }
         MACD_Buff_Low[0]=Price_High;
         H=1;
         i=Start;
         MACD_Buff_Low[H]=High[i];
         while(i>=0)
         {
            MACD=iMACD(NULL,0,fast_ema_period,slow_ema_period,signal_period,applied_price,MODE_MAIN,i);
            MACD_Sig=iMACD(NULL,0,fast_ema_period,slow_ema_period,signal_period,applied_price,MODE_SIGNAL,i);
            MACD1=iMACD(NULL,0,fast_ema_period,slow_ema_period,signal_period,applied_price,MODE_MAIN,i+1);
            MACD_Sig1=iMACD(NULL,0,fast_ema_period,slow_ema_period,signal_period,applied_price,MODE_SIGNAL,i+1);
            if(Price_High>=Low[i])
            {
               Price_High=Low[i];
               //MACD_Buff_Low[H]=Low[i];
               //Print("1");
            }
            if((MACD-MACD_Sig)*(MACD1-MACD_Sig1)<0&&MACD>MACD_Sig&&Price_High<MACD_Buff_Low[H-1])
            {
               MACD_Buff_Low[H]=Price_High;
               H++;
               //Print("2");
            }
            i--;
         }
      }
   }
   double Aver;
   double Extremum;
   int del;
   if(H>1)
   {
      i=1;
      if(MACD_Buff_High[0]>0)
      {
         Aver=MACD_Buff_High[0];
         for(del=ObjectsTotal()-1;del>=0;del--)
         {
            if(StringFind(ObjectName(del),"SanyokLine")>=0)
            {
               ObjectDelete(ObjectName(del));
            }
         }
         while(i<H)
         {
            Aver=(Aver+MACD_Buff_High[i])/2;
            if(i+1!=H)
            ObjectCreate("SanyokLine"+i,OBJ_HLINE,0,0,Aver);
           // Print(Aver);
            i++;
         }
         Extremum=MACD_Buff_High[H-1];
      }
      else
      {
         if(MACD_Buff_Low[0]>0)
         {
            Aver=MACD_Buff_Low[0];
            for(del=ObjectsTotal()-1;del>=0;del--)
            {
               if(StringFind(ObjectName(del),"SanyokLine")>=0)
               {
                  ObjectDelete(ObjectName(del));
               }
            }
            while(i<H)
            {
               Aver=(Aver+MACD_Buff_Low[i])/2;
               if(i+1!=H)
               ObjectCreate("SanyokLine"+i,OBJ_HLINE,0,0,Aver);
               //Print(Aver);
               i++;
            }
         Extremum=MACD_Buff_Low[H-1];
         }
      }
   }
   if(Aver>0)
   {
      if(ObjectFind("SanyokLine")==-1)
      {
         ObjectCreate("SanyokLine",OBJ_HLINE,0,0,Aver);
         Level1=NormalizeDouble(Aver,Digits);
      }
      else
      {
         if(MathAbs(ObjectGet("SanyokLine",OBJPROP_PRICE1)-Aver)>Point)
         {
            //ObjectDelete("L");
            ObjectSet("SanyokLine",OBJPROP_PRICE1,Aver);
            Level2=Level1;
            Level1=NormalizeDouble(Aver,Digits);
            //Comment (Level1," ",Level2);
         }
      }
   }
   if(Extremum>0)
   {
      if(ObjectFind("Extr")==-1)
      {
         ObjectCreate("Extr",OBJ_HLINE,0,0,Extremum);
         Level1=NormalizeDouble(Extremum,Digits);
      }
      else
      {
         if(MathAbs(ObjectGet("Extr",OBJPROP_PRICE1)-Extremum)>Point)
         {
            //ObjectDelete("L");
            ObjectSet("Extr",OBJPROP_PRICE1,Extremum);
            //Level2=Level1;
            //Level1=NormalizeDouble(Extremum,Digits);
            //Comment (Level1," ",Level2);
         }
      }
   }
   return(0);
}

ээээ 

 
скинул в личку первую версию с одной линией.
Причина обращения: