Советник не открывает сделки

 

Здравствуйте,

Я написал советник, код которого приведен ниже. 

Суть советника в том, что он в самом начале открывает сделку buy, лотом 0.01. Если она выбьет стоп лосс, открывается еще одна сделка в ту же сторону, но удвоенным лотом. Мартингейл короче. Но, это Мартингейл с насыщением так сказать. Если LotFactor поставить 10, то он ограничит рост лота на отметке 5.12(если изначальный был 0.01) и дальше лот изменяться не будет до тех пор, пока не появится выигрышная сделка. Возможно в коде есть ошибка, однако в тестере стратегий этот советник работает четко как надо.

Он нормально тестируется в тестере, но когда я ставлю его на график, он почему-то не торгует. На скриншоте видны настройки и то, что советник включен(смайлик). В журнале единственная строчка: 2013.04.26 15:56:04 Expert PureMartingale EURUSD,H1: loaded successfully. Однако когда я ставлю ручное подтверждение в настройках, он сразу предлагает открыть сделку. Я пробовал данный советник на разных компьютерах с MT4, и на обоих одно и тоже. Подскажите, в чем может быть проблема? Заранее большое спасибо!


Код советника:

extern int LotFactor=10; //Эта переменная только для удобства оптимизации советника.
extern int StopLoss=500;
extern int TakeProfit=750;
extern double Lot=0.01; //Изначальный лот.
double LotF=513; //Это множитель для насыщения.
bool buy=true; //Будет ли сделка BUY или SELL

int init()
  {
   return(0);
  }

int start()
  {
   switch(LotFactor) //Тут в зависимости от переменной LotFactor будет выбираться множитель для лота. По умолчанию LotFactor = 10, т.е. множитель (LotF) равен 513.
    {
      case 1 : LotF=1.5; break;
      case 2 : LotF=3; break;
      case 3 : LotF=5; break;
      case 4 : LotF=9; break;
      case 5 : LotF=17; break;
      case 6 : LotF=33; break;
      case 7 : LotF=65; break;
      case 8 : LotF=129; break;
      case 9 : LotF=257; break;
      case 10 : LotF=513; break;
      case 11 : LotF=1025; break;
      case 12 : LotF=2049; break;
      default : LotF=513; break;
    }
   int total, oldtotal, cnt, myTicket, myMagic=111;
   bool myTrades = false;
   total = OrdersTotal();
   for(cnt = 0; cnt < total; cnt++)
     {
       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
       if(OrderMagicNumber() == myMagic) 
         {
           myTicket = OrderTicket();
           myTrades = true;
         } 
     }
   double Lots = Lot; // Lots - это лот, на который советник будет торговать. В начале он задается равным тому лоту, что мы ставим в настройках советника.
   oldtotal = OrdersHistoryTotal();
   if(oldtotal > 0) 
     {
       OrderSelect(oldtotal - 1, SELECT_BY_POS, MODE_HISTORY); //Выбираем предыдущий ордер из истории.
       if(OrderProfit() > 0) //Если этот предыдущий ордер из истории был выигрышным - меняем направление сделки.
       {
         if(OrderType() == OP_BUY) 
           {
           buy=false;
           }
         if(OrderType() == OP_SELL) 
           {
           buy=true;
           }
       } 
       if(OrderProfit() < 0) //Если этот предыдущий ордер из истории был проигрышным - сохраняем направление сделки.
         { 
           Lots = OrderLots() * 2; // И удваиваем лот. 
           if(OrderType() == OP_BUY) 
           {
           buy=true;
           }
           if(OrderType() == OP_SELL) 
           {
           buy=false;
           }
         }
       else 
         { 
           Lots = Lot; // Когда попалась выигрышная сделка, лот сбрасывается.
         } 
     }   
   if(Lots > Lot*LotF) // Если лот превышает установленный лот, домноженный на LotF, то больше лот не удваивается, а сохраняется таким, какой он есть, до первой выигрышной сделки. 
ПРИМЕР: Lot = 0.01, LotF = 513; Если текущий лот из-за серии убытков стал больше чем 0.01*513 = 5.13, то при дальнейших убытках лот будет сохранять значение 5.13, и когда появится выигрышная сделка, он сбросится до 0.01.
     {
       Lots = OrderLots();
     }
 
   int myColour, cmd;
   double myPrice, myPriceClose, myStop, myProfit;
   if(myTrades == false)
     {
       if(buy == true) // BUY
         {
           cmd = 0; 
           myPrice = Ask; 
           myPriceClose = Bid; 
           myColour = Green; 
           myStop = Ask - Point*StopLoss; 
           myProfit = Ask + Point*TakeProfit;
         }
       if(buy == false) // SELL
         {
           cmd = 1; 
           myPrice = Bid; 
           myPriceClose = Ask; 
           myColour = Red; 
           myStop = Bid + Point*StopLoss; 
           myProfit = Bid - Point*TakeProfit;
         }      
       myTicket = OrderSend(Symbol(),cmd,Lots,myPrice,3,myStop,myProfit,NULL,myMagic,0,myColour); //Открытие сделки.
    }
   return(0);
  }
 

А про эту кнопочку не забыли?:

 

Должна гореть зеленым и рожа советника в правом верхнем углу должна улыбаться

  

 

Sepulca, прочитайте внимательнее :)

Я написал, что советник включен (рожа улыбается). И на скриншоте это видно, я специально показал.

 

А, да, не заметил сразу, извините. Попробовал Ваш советник у себя не демо, не торгует(но пытается) потому что сразу начинает открывать большой лот, и моих демовских денег просто не хватает. Но при этом в журнале пишет 

2013.04.26 16:46:24 '4005553': order sell 1.50 EURUSD opening at 1.30312 sl: 1.30812 tp: 1.29562 failed [Not enough money]
Попробуйте переделать что бы начинал с меньших лотов. У меня остаток 70 USD. А советник сразу пытается открыть 1.5 лота.....

 
А какой у вас изначальный лот был в настройках советника? Я обычно ставлю 0.01.
 
Grunt:
А какой у вас изначальный лот был в настройках советника? Я обычно ставлю 0.01.

Где это Вы ставите? А в советнике не видите?

   switch(LotFactor)
    {
      case 1 : LotF=1.5; break;
      case 2 : LotF=3; break;
      case 3 : LotF=5; break;
      case 4 : LotF=9; break;
      case 5 : LotF=17; break;
      case 6 : LotF=33; break;
      case 7 : LotF=65; break;
      case 8 : LotF=129; break;
      case 9 : LotF=257; break;
      case 10 : LotF=513; break;
      case 11 : LotF=1025; break;
      case 12 : LotF=2049; break;
      default : LotF=513; break;
    }
Самоубийство! Кто больше?

Игрушка миллиардеров! 

 
Grunt:
А какой у вас изначальный лот был в настройках советника? Я обычно ставлю 0.01.



Так этот 0.01 у Вас умножается на довольно большой коэфф. Я тоже поставил начальный в параметрах 0.01, однако все равно начала с 1.5. Что-то с логикой в советнике не так.

Насколько я понимаю из текста советника, если во всей предыдущей истории счета  найдется хотя бы один убыточный ордер ( а такой 99.99% найдется)  то Вы открываете новый ордер лотом в два раза больше чем размер лота последнего убыточного. 

При этом не пытаетесь  отфильтровать убыточный по инструменту, магику, типу и т.д.  

   oldtotal = OrdersHistoryTotal();
   if(oldtotal > 0) 
     {
       OrderSelect(oldtotal - 1, SELECT_BY_POS, MODE_HISTORY);
       if(OrderProfit() > 0)
       {
         if(OrderType() == OP_BUY) 
           {
           buy=false;
           }
         if(OrderType() == OP_SELL) 
           {
           buy=true;
           }
       } 
       if(OrderProfit() < 0) 
         { 
           Lots = OrderLots() * 2;
           if(OrderType() == OP_BUY) 
           {
           buy=true;
           }
           if(OrderType() == OP_SELL) 
           {
           buy=false;
           }
         }
       else 
         { 
           Lots = Lot; 
         } 
     }   
 

Суть советника в том, что он в самом начале открывает сделку buy, лотом 0.01. Если она выбьет стоп лосс, открывается еще одна сделка в ту же сторону, но удвоенным лотом. Мартингейл короче. Но, это Мартингейл с насыщением так сказать. Если LotFactor поставить 10, то он ограничит рост лота на отметке 5.12(если изначальный был 0.01) и дальше лот изменяться не будет до тех пор, пока не появится выигрышная сделка. Возможно в коде есть ошибка, однако в тестере стратегий этот советник работает четко как надо.


Написал в коде подробные комментарии.

 

borilunad, перед тем как давать импульсивные комментарии, посмотрите внимательно на код. Эти гигантские цифры - это переменная LotF, которая не является лотом, а является лишь множителем. Если мы 513 умножим на лот = 0.01, получается 5.13 - это порог насыщения, когда лот больше не будет расти во избежание разорения.


Sepulca, очевидно, когда вы тестировали, у вас лот стоял 1.

И вы неправильно интерпретируете:

 OrderSelect(oldtotal - 1, SELECT_BY_POS, MODE_HISTORY);

Видите oldtotal - 1, он смотрит убыточный ли предыдущий ордер, а не вообще во всей истории.

 
Grunt:

borilunad, перед тем как давать импульсивные комментарии, посмотрите внимательно на код. Эти гигантские цифры - это переменная LotF, которая не является лотом, а является лишь множителем. Если мы 513 умножим на лот = 0.01, получается 5.13 - это порог насыщения, когда лот больше не будет расти во избежание разорения.


Sepulca, очевидно, когда вы тестировали, у вас лот стоял 1.

И вы неправильно интерпретируете:

Видите oldtotal - 1, он смотрит убыточный ли предыдущий ордер, а не вообще во всей истории.

))))) Так нет же, представьте, запускаете свой советник после десятилетнего перерыва деятельности на форекс. Вроде как он должен начать с 0.01 лота. Но десять лет назад последний закрытый ордер был убыточный, и советник берет лоты этого древнего ордера, умножает их на два и пытается открыть новую позицию. Что у меня и случилось после слива демодепозита, так как последние ордера (без участия Вашего советника были закрыты) в минус. Безопасней запоминать OrderTicket последнего открытого ордера во внешней переменной плюс (на случай перезапуска советника) в GlobalVariables. А закрылся он или нет определять с помощью OrderCloseTime( ) > 0.

Или, второй вариант, чтобы глобально все не переделывать, введите проверку на магик последнего закрытого ордера в истории oldtotal-1.

 
Sepulca, да, я вас понял. Дельная мысль, спасибо :) Однако смотрите, я открыл демо счет, сделал одну сделку, закрыл ее и запустил советник. Вроде как он должен открыть сделку двойным лотом от предыдущей, но вся проблема в том, что он вообще не открывает сделок. Висит и не торгует.