произвольно открывается ордер в советнике.

 

Добрый день всем!

Прошу по возможности помочь, кто сталкивался или знаком с такой ситуацией - при тестировании советника (в МТ4) ордер открывается вообще сам по себе. Кто-нибудь с таким сталкивался? Из-за чего это может происходить?

Т.е. даже в журнале не показывает открытие этих ордеров, хотя закрытие показывает. Функции открытия закрытия стандартные, до этого все работало нормально. В самой функции открытия прописаны принты при любом открытии, на эти ордера ничего не выводит, создается впечатление что их не советник вообще открывает (хотя в нем они закрываются).

Фрагмент журнала:


2 04:54:18 2014.11.10 02:23  Новый 080115 ДНИ EURUSD,M5: open #1 sell 0.10 EURUSD at 1.24611 ok
0 04:54:18 2014.11.10 02:23  Новый 080115 ДНИ EURUSD,M5:  OPEN ORDER  SELL numOrderSell  1 Signal_Open()  0
2 04:54:18 2014.11.10 03:56  Новый 080115 ДНИ EURUSD,M5: open #2 buy 0.10 EURUSD at 1.24698 ok
0 04:54:18 2014.11.10 03:56  Новый 080115 ДНИ EURUSD,M5:  OPEN ORDER  BAY numOrderBay  0 Signal_Open()  1
2 04:54:18 2014.11.10 06:55  Новый 080115 ДНИ EURUSD,M5: open #3 sell 0.10 EURUSD at 1.24797 ok
0 04:54:18 2014.11.10 06:55  Новый 080115 ДНИ EURUSD,M5:  OPEN ORDER  SELL numOrderSell  2 Signal_Open()  0
2 04:54:18 2014.11.10 09:04  Новый 080115 ДНИ EURUSD,M5: close #2 buy 0.05 EURUSD at 1.24698 at price 1.24672
2 04:54:18 2014.11.10 09:04  Новый 080115 ДНИ EURUSD,M5: close #1 sell 0.10 EURUSD at 1.24611 at price 1.24692
2 04:54:18 2014.11.10 09:04  Новый 080115 ДНИ EURUSD,M5: close #3 sell 0.10 EURUSD at 1.24797 at price 1.24692
0 04:54:18 2014.11.10 09:04  Новый 080115 ДНИ EURUSD,M5:  CLOSE ALL ORDER  numOrderSell  0 numOrderBay  0
2 04:54:18 2014.11.10 09:04  Новый 080115 ДНИ EURUSD,M5: open #5 sell 0.10 EURUSD at 1.24670 ok
0 04:54:18 2014.11.10 09:04  Новый 080115 ДНИ EURUSD,M5:  OPEN ORDER  SELL numOrderSell  1 Signal_Open()  0
2 04:54:18 2014.11.10 11:27  Новый 080115 ДНИ EURUSD,M5: open #6 buy 0.10 EURUSD at 1.24831 ok
0 04:54:18 2014.11.10 11:27  Новый 080115 ДНИ EURUSD,M5:  OPEN ORDER  BAY numOrderBay  0 Signal_Open()  1
2 04:54:18 2014.11.10 13:53  Новый 080115 ДНИ EURUSD,M5: open #7 sell 0.12 EURUSD at 1.24861 ok
0 04:54:18 2014.11.10 13:53  Новый 080115 ДНИ EURUSD,M5:  OPEN ORDER  SELL numOrderSell  2 Signal_Open()  0
2 04:54:18 2014.11.10 16:08  Новый 080115 ДНИ EURUSD,M5: close #6 buy 0.05 EURUSD at 1.24831 at price 1.24725
2 04:54:18 2014.11.10 16:08  Новый 080115 ДНИ EURUSD,M5: close #5 sell 0.10 EURUSD at 1.24670 at price 1.24745
2 04:54:18 2014.11.10 16:08  Новый 080115 ДНИ EURUSD,M5: close #7 sell 0.12 EURUSD at 1.24861 at price 1.24745
0 04:54:18 2014.11.10 16:08  Новый 080115 ДНИ EURUSD,M5:  CLOSE ALL ORDER  numOrderSell  0 numOrderBay  0
2 04:54:18 2014.11.10 16:08  Новый 080115 ДНИ EURUSD,M5: open #9 sell 0.12 EURUSD at 1.24726 ok
0 04:54:18 2014.11.10 16:08  Новый 080115 ДНИ EURUSD,M5:  OPEN ORDER  SELL numOrderSell  1 Signal_Open()  0
2 04:54:18 2014.11.10 23:59  Tester: order #9 is closed
2 04:54:18 2014.11.10 23:59  Tester: order #8 is closed
2 04:54:18 2014.11.10 23:59  Tester: order #4 is closed

Непонятно откуда взявшиеся ордера № 4 и 8 - оба эти ордера на бай и открываются в тот же момент что ордера на селл № 5 и 9

Спасибо всем кто хоть как-нибудь поможет.

 
Код будет?
 

void orderOpen( int orderType, double lot, int numOrderDogon = 0, int orderNum = 0 ){
   orderNumber = 0; 
   switch( orderType ){
      case 0:
         while( orderNumber == 0 ){                    
            orderNumber = OrderSend(Symbol(), OP_SELL, lot, NormalizeDouble(Bid, Digits), 2, 0, 0, "Sell by Grafik", 8888, 0, Green);   
            Print ( " OPEN ORDER  SELL numOrderSell  ", numOrderSell, " Signal_Open()  ", Signal_Open() );
         }
         if( numOrderDogon == 0 ){
            openOrderSell[numOrderSell][0] = orderNumber;
            if( OrderSelect( orderNumber, SELECT_BY_TICKET, MODE_TRADES ) ) openOrderSell[numOrderSell][1] = 100000*NormalizeDouble(OrderOpenPrice(), 5);
            openOrderSell[numOrderSell][2] = lot;
            openOrderSell[numOrderSell][3] = 0;
            openOrderSell[numOrderSell][4] = 0;
            numOrderSell = numOrderSell + 1;
            lastOrderSell = 0;
         }else{

         }
         break;
      case 1:
         while( orderNumber == 0 ){                    
            orderNumber = OrderSend(Symbol(), OP_BUY, Lots, NormalizeDouble(Ask, Digits), 2, 0, 0, "Buy by Grafik", 8888, 0, Green);   
            Print ( " OPEN ORDER  BAY numOrderBay  ", numOrderBay, " Signal_Open()  ", Signal_Open() );
         }
         if( numOrderDogon == 0 ){
            openOrderBay[numOrderBay][0] = orderNumber;
            if( OrderSelect( orderNumber, SELECT_BY_TICKET, MODE_TRADES ) ) openOrderBay[numOrderBay][1] = 100000*NormalizeDouble(OrderOpenPrice(), 5);
            openOrderBay[numOrderBay][2] = lot;
            openOrderBay[numOrderBay][3] = 0;
            openOrderBay[numOrderBay][4] = 0;
            numOrderBay = numOrderBay + 1;
         }else{
            int i = orderListNumber( 0, orderNum );
            switch( numOrderDogon ){
               case 1:
                  orderSellDogon[i][1] = orderNumber;
                  if( OrderSelect( orderNumber, SELECT_BY_TICKET, MODE_TRADES ) ) orderSellDogon[i][2] = 100000*NormalizeDouble(OrderOpenPrice(), 5);
//                  openOrderSell[i][5] = orderSellDogon[i][2];
                  openOrderSell[i][4] = 1;                  
                  break;
               case 2:
                  orderSellDogon[i][3] = orderNumber;
                  if( OrderSelect( orderNumber, SELECT_BY_TICKET, MODE_TRADES ) ) orderSellDogon[i][4] = 100000*NormalizeDouble(OrderOpenPrice(), 5);
//                  openOrderSell[i][5] = (orderSellDogon[i][2] + orderSellDogon[i][4])/2;                 
                  openOrderSell[i][4] = 2;
                  break;
            }
            lastOrderSell = 1;
         }
         break;  
   } 
}

 
Само собой других функций открывающих ордера в коде нет. Вопрос как могут ордера открыться во-первых без принта, прописанного в открытии ордера, а во-вторых почему в журнале не пишет открытие, хотя закрытие пишет? В "Результатах" в терминале открытие ордера отображено.
 

Вопрос разрешился, правда все равно не понятна взаимосвязь...

Ордера Bay открывались с параметром Лота который определялся вне функции, ордера Sell с параметром Лота, который в функцию передавался. Уже просто от бессилия поменял в открытии Bay параметр Лот на передающийся в функцию и проблема исчезла. Вот вообще непонятна, какая здесь взаимосвязь... ведь на тех "левых" ордерах, советник даже в функцию открытия не заходил, если судить по тому, что принты не выводил....

 
SvarogIS:

 

      

SRC!

void orderOpen( int orderType, double lot, int numOrderDogon = 0, int orderNum = 0 ){
   orderNumber = 0;  
   switch( orderType ){
      case 0:
         while( orderNumber == 0 ){                     
            orderNumber = OrderSend(Symbol(), OP_SELL, lot, NormalizeDouble(Bid, Digits), 2, 0, 0, "Sell by Grafik", 8888, 0, Green);    
            Print ( " OPEN ORDER  SELL numOrderSell  ", numOrderSell, " Signal_Open()  ", Signal_Open() );
         } 
         if( numOrderDogon == 0 ){
            openOrderSell[numOrderSell][0] = orderNumber;
            if( OrderSelect( orderNumber, SELECT_BY_TICKET, MODE_TRADES ) ) openOrderSell[numOrderSell][1] = 100000*NormalizeDouble(OrderOpenPrice(), 5);
            openOrderSell[numOrderSell][2] = lot;
            openOrderSell[numOrderSell][3] = 0;
            openOrderSell[numOrderSell][4] = 0;
            numOrderSell = numOrderSell + 1; 
            lastOrderSell = 0;
         }else{

         }
         break;
      case 1:
         while( orderNumber == 0 ){                     
            orderNumber = OrderSend(Symbol(), OP_BUY, Lots, NormalizeDouble(Ask, Digits), 2, 0, 0, "Buy by Grafik", 8888, 0, Green);    
            Print ( " OPEN ORDER  BAY numOrderBay  ", numOrderBay, " Signal_Open()  ", Signal_Open() );
         }
         if( numOrderDogon == 0 ){
            openOrderBay[numOrderBay][0] = orderNumber;
            if( OrderSelect( orderNumber, SELECT_BY_TICKET, MODE_TRADES ) ) openOrderBay[numOrderBay][1] = 100000*NormalizeDouble(OrderOpenPrice(), 5);
            openOrderBay[numOrderBay][2] = lot;
            openOrderBay[numOrderBay][3] = 0;
            openOrderBay[numOrderBay][4] = 0;
            numOrderBay = numOrderBay + 1;
         }else{
            int i = orderListNumber( 0, orderNum );
            switch( numOrderDogon ){
               case 1:
                  orderSellDogon[i][1] = orderNumber;
                  if( OrderSelect( orderNumber, SELECT_BY_TICKET, MODE_TRADES ) ) orderSellDogon[i][2] = 100000*NormalizeDouble(OrderOpenPrice(), 5);
//                  openOrderSell[i][5] = orderSellDogon[i][2];
                  openOrderSell[i][4] = 1;                   
                  break;
               case 2:
                  orderSellDogon[i][3] = orderNumber;
                  if( OrderSelect( orderNumber, SELECT_BY_TICKET, MODE_TRADES ) ) orderSellDogon[i][4] = 100000*NormalizeDouble(OrderOpenPrice(), 5);
//                  openOrderSell[i][5] = (orderSellDogon[i][2] + orderSellDogon[i][4])/2;                  
                  openOrderSell[i][4] = 2;
                  break;
            }
            lastOrderSell = 1;
         }
         break;   
   }  
}