Прошу помочь...

 

Советник из 100% сделок открывает примерно только 10%

//+------------------------------------------------------------------+
//|                                 Проба01.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link      ""
extern string TimeTrade        = "00:01";
extern string CloseTime        = "13:00";
 
int ticket;

//---- input parameters
int start()


{
     if (TimeCurrent()==StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+CloseTime))
     {  
          OrderClose(ticket,0.1,Ask,3,White);
          OrderClose(ticket,0.1,Bid,3,White);
      }    
     if (TimeCurrent()==StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTrade))
     {
       
        if(iStochastic(NULL,15,5,3,3,MODE_SMA,0,MODE_MAIN,0)>=50) 
       {
       ticket=OrderSend("GBPUSD",OP_BUY,0.1,Ask,3,Bid-100*Point,Ask+130*Point,"Order Open",16384,0,Blue);
       }
        if(iStochastic(NULL,15,5,3,3,MODE_SMA,0,MODE_MAIN,0)<50) 
       {
       ticket=OrderSend("GBPUSD",OP_SELL,0.1,Bid,3,Ask+100*Point,Bid-130*Point,"Order Open",16384,0,Red);
       }
     }
     
return;
}

Пишет:



ERR_INVALID_TICKET

4108

Неверный номер тикета



 

Если Вас удовлетворит только указание на ошибки, то я объясню.

Во-первых, открытие или закрытие ордеров у Вас происходит, если тик поступил только в ту секунду, которая указана у Вас (в первую секунду начала минуты). Если пропустил - условие не выполнится.

Во вторых, Вы не проверяете, а открыт ли у Вас вообще какой-нибудь ордер или нет, а сразу идете на закрытие, отсюда и ошибка 4108.

 
Понял, буду подробней разбирать
 
Исправил, ошибку уже не выбивает но сделок все равно сколько нужно не открывает!!!!
 
//+------------------------------------------------------------------+
//|                                 Проба01.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link      ""
extern string TimeTrade1        = "00:01";
extern string TimeTrade2        = "00:07";
extern string CloseTime1        = "13:00";
extern string CloseTime2        = "13:07"; 
int ticket,   total, bb=0,ss=0;

//---- input parameters
int start()


{
  total=OrdersTotal();
     if (TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+CloseTime1)&& 
     TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+CloseTime2) )
     {  
      for (int i=total;i>=0;i--) { 
           if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderType()==OP_BUY)
            {OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE); bb=0;}} 
      for (i=total;i>=0;i--) {
              if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderType()==OP_SELL)
                  {OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);ss=0;}}
      }    
     if (TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTrade1)&&
     TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTrade2))
     {
       
        if(iStochastic(NULL,15,5,3,3,MODE_SMA,0,MODE_MAIN,0)>=50 && bb==0) 
       {
       ticket=OrderSend("GBPUSD",OP_BUY,0.1,Ask,3,Bid-100*Point,Ask+130*Point,"Order Open",0,0,Blue);
       bb=1;
       }
        if(iStochastic(NULL,15,5,3,3,MODE_SMA,0,MODE_MAIN,0)<50  && ss==0 ) 
       {
       ticket=OrderSend("GBPUSD",OP_SELL,0.1,Bid,3,Ask+100*Point,Bid-130*Point,"Order Open",0,0,Red);
       ss=1;
       }
     }
     
return;
}

 
oyshen писал(а) >>
Исправил, ошибку уже не выбивает но сделок все равно сколько нужно не открывает!!!!

Вероятно, прежде, чем менять значение переменных (bb, ss), нужно проверять значение ticket, чтобы убедиться, что ордер открылся. Например, так

ticket=OrderSend("GBPUSD",OP_BUY,0.1,Ask,3,Bid-100*Point,Ask+130*Point,"Order Open",0,0,Blue);
if (ticket >= 0) bb=1;

То же, с ss

 

добавлю - лучше использовать более общую конструкцию:


goodopen=OrderSend(Symbol(), OP_BUY, 0.1,Ask,3,Bid-100*Point,Ask+130*Point,"Order Open",0,0,Blue);
  if (goodopen < 0)  {

      Print("Ошибка открытия Buy: ", GetLastError());

     // другие действия при ошибке по вкусу - типа Алерта

   }
  else {

     bb=1;
     Sleep(777);
     // удачное открытие - что ещё добавить хотите, например Print("Bay открылся, поздравляю!");
  }

RefreshRates();

аналогично конструкцию на закрытие ордера - тоже не всегда может закрываться (тот же реквот), а вв присвоится в 0 и новый откроется.

и вообще совет - ВСЕ действия с ордерами проверяете выполнение. иначе тестер не покажет, а реал - сольет.

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