Прошу, помогите с кодом?)

 

Суть, написал советник. Какое то время торговал и вот, в один день как взбесился. Открываю терминал смотрю (CHFJPY) штук 30 открытых ордеров (больше видно не дал счет открыть), и еще с 50 может больше отложенных ордеров. Грешу на этот код, но не знаю где и как поймать ошибку ((((( :

Вопрос наверное в том даже, как поставить проверку на количество отложенных уже ордеров по конкретной паре? СПАСИБО!!! Вот мой многострадальный код:

void FindAndOpenStopLossOrder() {

 string Symb = Symbol();

 double OOP=0,OTP=0,OSL=0,OL=0;

 int    OT =0;

 for (int i=OrdersHistoryTotal()-1; i>=0; i--) {  

      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {

         OT = OrderType();

         OSL = NormalizeDouble(OrderStopLoss(),Digits);

         if ((OT==0||OT==1) && (OrderProfit()<0)) {//Включаем ордера с типом OP_BUY=0, OP_SELL=1 (потому что все закрытые ордера с результатом, только с типом 0 или 1) и Выберем ордера только убыточные

           if ( (Symb==OrderSymbol()) && ((TimeCurrent()-OrderCloseTime()) < 18000) ) {//моя проверка, 36000 - это 10 часов (в настройках в истории храниться 512000 баров)

             //if (NormalizeDouble(OrderClosePrice(),Digits)==OSL) { //Отменил, пока, т.к. при проверке цена закрытия ордера не всегда равняется цене стоп лосса

                 OOP = NormalizeDouble(OrderOpenPrice(),Digits);

                 OTP = NormalizeDouble(OrderTakeProfit(),Digits);

                 OL  = OrderLots();

             //  }

             }  

            else OOP=0;

            break;

         }

      }  

   }

   if (OOP!=0) {

      for (i=0; i<OrdersTotal(); i++) {  

         if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {  

           if (NormalizeDouble(OrderOpenPrice(),Digits) == OOP && OL == OrderLots()) return(0);

         }  

      }

      bool Otkrivaem_Pokupka = false; bool Otkrivaem_Prodaga = false;

      if(OT==OP_BUY ){OT=OP_BUYLIMIT; Otkrivaem_Pokupka = true;}

      if(OT==OP_SELL){OT=OP_SELLLIMIT;Otkrivaem_Prodaga = true;}

//Открываем отложенный ордер

      SendOrder(Symb, Otkrivaem_Pokupka, Otkrivaem_Prodaga, OOP, OSL);

 }     

}  

 

 
rabanik:

Суть, написал советник. Какое то время торговал и вот, в один день как взбесился. Открываю терминал смотрю (CHFJPY) штук 30 открытых ордеров (больше видно не дал счет открыть), и еще с 50 может больше отложенных ордеров. Грешу на этот код, но не знаю где и как поймать ошибку ((((( :

Вопрос наверное в том даже, как поставить проверку на количество отложенных уже ордеров по конкретной паре? СПАСИБО!!! Вот мой многострадальный код:

void FindAndOpenStopLossOrder() {

 string Symb = Symbol();

 double OOP=0,OTP=0,OSL=0,OL=0;

 int    OT =0;

 for (int i=OrdersHistoryTotal()-1; i>=0; i--) {  

      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {

         OT = OrderType();

         OSL = NormalizeDouble(OrderStopLoss(),Digits);

         if ((OT==0||OT==1) && (OrderProfit()<0)) {//Включаем ордера с типом OP_BUY=0, OP_SELL=1 (потому что все закрытые ордера с результатом, только с типом 0 или 1) и Выберем ордера только убыточные

           if ( (Symb==OrderSymbol()) && ((TimeCurrent()-OrderCloseTime()) < 18000) ) {//моя проверка, 36000 - это 10 часов (в настройках в истории храниться 512000 баров)

             //if (NormalizeDouble(OrderClosePrice(),Digits)==OSL) { //Отменил, пока, т.к. при проверке цена закрытия ордера не всегда равняется цене стоп лосса

                 OOP = NormalizeDouble(OrderOpenPrice(),Digits);

                 OTP = NormalizeDouble(OrderTakeProfit(),Digits);

                 OL  = OrderLots();

             //  }

             }  

            else OOP=0;

            break;

         }

      }  

   }

   if (OOP!=0) {

      for (i=0; i<OrdersTotal(); i++) {  

         if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {  

           if (NormalizeDouble(OrderOpenPrice(),Digits) == OOP && OL == OrderLots()) return(0);

         }  

      }

      bool Otkrivaem_Pokupka = false; bool Otkrivaem_Prodaga = false;

      if(OT==OP_BUY ){OT=OP_BUYLIMIT; Otkrivaem_Pokupka = true;}

      if(OT==OP_SELL){OT=OP_SELLLIMIT;Otkrivaem_Prodaga = true;}

//Открываем отложенный ордер

      SendOrder(Symb, Otkrivaem_Pokupka, Otkrivaem_Prodaga, OOP, OSL);

 }     

}  

 

а что на ваш взгляд этот код делает ? (или должен был делать при рождении) - для этого пишут коменты, чтобы самому не забыть и разобраться если вдруг что не так

на беглый взгляд функция ищет самый старый(!!) убыточный ордер и открывает лимитку по его цене. И так наверное каждый тик. Непонятно зачем, ну да вам виднее :-) Но если внутри ВАШЕЙ SendOrder есть вариант входа по рынку вместо отложки (например если цена слишком близко), то вполне получите то что получили.

 
Maxim Kuznetsov:

а что на ваш взгляд этот код делает ? (или должен был делать при рождении) - для этого пишут коменты, чтобы самому не забыть и разобраться если вдруг что не так

на беглый взгляд функция ищет самый старый(!!) убыточный ордер и открывает лимитку по его цене. И так наверное каждый тик. Непонятно зачем, ну да вам виднее :-) Но если внутри ВАШЕЙ SendOrder есть вариант входа по рынку вместо отложки (например если цена слишком близко), то вполне получите то что получили.


Блин, ну так у меня стоп лосс в 30 пп!!!??? Я могу представить, что произошло следующее. ордер закрылся по стоп лосс, после открывается Ордер, тутже закрывается по убытку и снова открывается и т.д. карусель (несмотря на то что у меня стоплосс в 30 пп повторюсь). Но как объяснить то, что было очень много отложенных ((( А можете подсказать, примерный код: 1. Чтобы не запускать данную функцию каждый тик, 2. Как можно ограничить количество открываемых ордеров? Спасибо.

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