Помогите настроить советника.

 

Если кто понимает, помогите настроить советника. Я стряпал нечто, но оно не работает так, как надо!!!

Суть советника в том, что когда три переменные MC1, MC2, и MC3 получают положительное значение, открывается ордер DUY, а когда все три переменные становятся отрицательными - SELL.

Но Советник срабатывает в одном случае из пяти, да и то, с опозданием на 3-7 тиков. А при тестировании вообще не видит не одной сделки!!! Тот же фокус и с другими Советниками.

Подскажите, где ошибка.

#property copyright "Griggy"

extern double TakeProfit = 50;
extern double StopLoss = 20;
extern double Lots = 0.5;
extern double TrailingStop = 20;
extern double MACDOpenLevel=3;
extern double MACDCloseLevel=2;
extern double MATrendPeriod=26;
extern int FastEMA=13;
extern int SlowEMA=26;
extern int SignalSMA=9;
extern int n=10;
extern int k=2;
int start()
  {
   double MC1;
   double MC2;
   double MC3;

   int cnt, ticket, total;
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  
     }

   MC1=(iMACD(NULL,0,FastEMA,SlowEMA,SignalSMA,PRICE_CLOSE,MODE_MAIN,0)-iMACD(NULL,0,FastEMA,SlowEMA,SignalSMA,PRICE_CLOSE,MODE_SIGNAL,0))*n;
   MC2=(iMACD(NULL,0,FastEMA*4,SlowEMA*4,SignalSMA,PRICE_CLOSE,MODE_MAIN,0)-iMACD(NULL,0,FastEMA*4,SlowEMA*4,SignalSMA,PRICE_CLOSE,MODE_SIGNAL,0))*n*4;
   MC3=(iMACD(NULL,0,FastEMA*16,SlowEMA*16,SignalSMA,PRICE_CLOSE,MODE_MAIN,0)-iMACD(NULL,0,FastEMA*16,SlowEMA*16,SignalSMA,PRICE_CLOSE,MODE_SIGNAL,0))*n*16;

Comment("MC1    ",MC1," ","     MC2    ",MC2," ","     MC3    ",MC3);


   total=OrdersTotal();
   if(total<1)
     {
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      if(MC1>0 && MC2>0 && MC3>0)
                       {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,0, "MC1",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
               return(0); 
              }
      if(MC1<0 && MC2<0 && MC3<0)
                       {

         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,0, "MC2",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
               return(0); 
              }
      return(0);
     }
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&    
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   
           {
                if(MC3>0 && MC2<0)
                  {
                     OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                     return(0); // exit
                    }
              }
          if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*StopLoss,0,0,Green);
                     return(0);
                     }
                   }
                }
         else 
           {
      if(MC3<0 && MC2>0)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0);
              }
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*StopLoss,0,0,Red);
                     return(0);
                      }
                    }
                 }
              }
           }
        }
   return(0);
  }
// the end.
 

Ваш код, в том виде в котором вы вставили никто не поймёт и разбираться в нём не будет. Подскажу вам маленько. Есть такая волшебная кнопочка, как вставить правильно код - и код будет вставлен в правильном виде. Тогда может кто-нибудь поймёт и поможет.... )))))

 

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

И в тестере все нормально.

 

Уууу... Для начала ордер на продажу стоит открывать по цене Bid.

Да и "все 3 переменные имеют положительное значение", плохо вяжется с :

if(MC1>0 && MC2>0 && MC3>(-0.0001*k))

где k = 2;

для все три меньше нуля - тоже самое, исправьте это, плюс проверьте уровни стопов на корректность, а дальше посмотрим может там еще что.. Это первое что бросилось в глаза. Да и 3-7 тиков - это вполне может быть время на открытие ордера, кто Вам сказал что это должно быть мгновенно?

 
А я не заметил про продажи, проверил, и точно - на тестере только длинные ордера прошли. Может короткие... того...и не надо...?:-)
 
Figar0 писал(а) >>

Уууу... Для начала ордер на продажу стоит открывать по цене Bid.

Да и "все 3 переменные имеют положительное значение", плохо вяжется с :

где k = 2;

для все три меньше нуля - тоже самое, исправьте это, плюс проверьте уровни стопов на корректность, а дальше посмотрим может там еще что.. Это первое что бросилось в глаза. Да и 3-7 тиков - это вполне может быть время на открытие ордера, кто Вам сказал что это должно быть мгновенно?

Все исправил (это ошибка в версии на сайте), но все по старому. И при тестировании на 5м не видит сделок. Может что-то еще исправить?

Да, что такое "проверить уровни стопов на корректность"?

 
Griggy писал(а) >>

И при тестировании на 5м не видит сделок.

Да, что такое "проверить уровни стопов на корректность"?

Что такое "5ый"?

Корректность - в данном случае хотя бы соответствие стопевелу.

Да и Roger картинку впоне работающего эксперта выкладывал...

 

Может у тебя истории пятиминуток нет? У меня работает.

Уровни стопов проверяют на количество знаков после запятой (тебе не надо) и на близость к цене - если ближе чем STOPLEVEL, выйдет ошибка 130.

 
Roger писал(а) >>

Может у тебя истории пятиминуток нет? У меня работает.

Уровни стопов проверяют на количество знаков после запятой (тебе не надо) и на близость к цене - если ближе чем STOPLEVEL, выйдет ошибка 130.

И все таки она пропускает большинство позиций, а на тесте дает 0.

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

 
Griggy писал(а) >>

Все исправил (это ошибка в версии на сайте), но все по старому. И при тестировании на 5м не видит сделок. Может что-то еще исправить?

Да, что такое "проверить уровни стопов на корректность"?

по моему ошибка здесь : if(MC1>0 && MC2>0 && MC3>(-0.0001*k))

MC3 принимается всегда как целое число=0,а не с точностью 4 знака после запятой как вам надо,
я делаю так::

double macd;
macd=NormalizeDouble(macd,5);

 
Griggy писал(а) >>

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

Это точно, советник расчитан только на одну пару. Если хочешь по нескольким, надо много переделывать.

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