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

 

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

Суть советника в том, что когда три переменные 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 писал(а) >>

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

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