Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Создавай интересные темы на форуме по автоматическому трейдингу!
Евгений
23
Евгений 2012.03.16 09:16 
Проблема заключается в попытке изменить уровень, к примеру TakeProfit, когда ордер уже исполнился. Сервер выдает ошибки либо Common Error, либо Error2. После эксперт зависает, помогает перезагрузка и перекомпиляция. В программировании не очень силён, избавиться от таких зависаний не могу. Моет быть это связано как то с демо счетом?
bool CheckModifyOrder(string SymforTrade, int order, double Price, double SL, double TP, color col){
  
   int err;
   int N;
   int Counts = 10;
   double dBid = MarketInfo(SymforTrade,MODE_BID);

   while(N < Counts){
       for(int g = OrdersTotal() - 1; g >= 0; g--){
         if(OrderSelect(g,SELECT_BY_POS,MODE_TRADES)==false) break;
         if(OrderSymbol()==SymforTrade && OrderMagicNumber()==MAGIC && OrderType()==order){
            if(OrderOpenPrice()==Price && OrderTakeProfit()==TP)return;
            if(OrderModify(OrderTicket(),Price,SL,TP,0,col))
                          {Alert ("!!! Ордер ",SymforTrade," изменен Price = ",Price," SL = ", SL," TP = ", TP);
                           return(true);}
           N++;
           err=GetLastError();
           if(err > 0){
           if(OrderType() == OP_BUY)
              {Comment(" ! ! ! !!! ERROR !!! Ошибка изменения части ордера Buy !.. Err="+err+" "+ErrorDescription(err));
               Print(" ! ! ! !!! ERROR !!! Ошибка изменения части ордера Buy !.. Err=",err," ",ErrorDescription(err));}
           if(OrderType() == OP_SELL)
              {Comment(" ! ! ! !!! ERROR !!! Ошибка изменения части ордера SELL !.. Err="+err+" "+ErrorDescription(err));
               Print(" ! ! ! !!! ERROR !!! Ошибка изменения части ордера SELL !.. Err=",err," ",ErrorDescription(err));}
         }}}
         Sleep(1000);
       RefreshRates();
     }
   Comment("!!! Требуется ручное изменения ордера ",SymforTrade," № ",OrderTicket()," !!! " );
   Print("!!! Требуется ручное изменения ордера ",SymforTrade," № ",OrderTicket()," !!! ") ;
   return(false);
}
Vladyslav Goshkov
1960
Vladyslav Goshkov 2012.03.16 09:57  
Slashlap:
Проблема заключается в попытке изменить уровень, к примеру TakeProfit, когда ордер уже исполнился. Сервер выдает ошибки либо Common Error, либо Error2. После эксперт зависает, помогает перезагрузка и перекомпиляция. В программировании не очень силён, избавиться от таких зависаний не могу. Моет быть это связано как то с демо счетом?

Зацикливание в функции, скорее всего.

bool CheckModifyOrder(string SymforTrade, int order, double Price, double SL, double TP, color col){
  
   int err;

   int N; // ??????? Где инициализация ????? 

   int Counts = 10;
   double dBid = MarketInfo(SymforTrade,MODE_BID);

   while(N < Counts){
       for(int g = OrdersTotal() - 1; g >= 0; g--){
         if(OrderSelect(g,SELECT_BY_POS,MODE_TRADES)==false) break;

         if(OrderSymbol()==SymforTrade && OrderMagicNumber()==MAGIC && OrderType()==order){

            if(OrderOpenPrice()==Price && OrderTakeProfit()==TP)return;
            if(OrderModify(OrderTicket(),Price,SL,TP,0,col))
                          {Alert ("!!! Ордер ",SymforTrade," изменен Price = ",Price," SL = ", SL," TP = ", TP);
                           return(true);}

           N++; // !!!!!!!!!  Если выделенное выше условие не будет выполняться, то счетчик 
                // не будет увеличиваться - цикл может стать бесконечным.......

           err=GetLastError();
           if(err > 0){
           if(OrderType() == OP_BUY)
              {Comment(" ! ! ! !!! ERROR !!! Ошибка изменения части ордера Buy !.. Err="+err+" "+ErrorDescription(err));
               Print(" ! ! ! !!! ERROR !!! Ошибка изменения части ордера Buy !.. Err=",err," ",ErrorDescription(err));}
           if(OrderType() == OP_SELL)
              {Comment(" ! ! ! !!! ERROR !!! Ошибка изменения части ордера SELL !.. Err="+err+" "+ErrorDescription(err));
               Print(" ! ! ! !!! ERROR !!! Ошибка изменения части ордера SELL !.. Err=",err," ",ErrorDescription(err));}
         }}}
         Sleep(1000);
       RefreshRates();
     }
   Comment("!!! Требуется ручное изменения ордера ",SymforTrade," № ",OrderTicket()," !!! " );
   Print("!!! Требуется ручное изменения ордера ",SymforTrade," № ",OrderTicket()," !!! ") ;
   return(false);
}
Евгений
23
Евгений 2012.03.16 11:27  
VladislavVG:

Зацикливание в функции, скорее всего.

Не понял, почему не могу N проинициализировать там? есть какие то определенные условия?
Vladyslav Goshkov
1960
Vladyslav Goshkov 2012.03.16 11:35  
Slashlap:
Не понял, почему не могу N проинициализировать там? есть какие то определенные условия?

Покажите место, где у Вас инициализация переменной N, то есть присваивание начального значения, перед его использованием ? Я такого не вижу - может, смотрю невнимательно ? Где инициализация переменной Count - вижу.

Но зацикливается не по этой причине: у Вас операция инкремента не всегда выполняется. Возможно наличие таких условий, что вообще не выполнится или сработает менее нужного количества раз - например, если количество ордеров менее 10 (значения переменной Count и то это в том случае, если переменная N будет проинициализирована нулем).

Евгений
367
Евгений 2012.03.16 11:48  
"да уш. не фонтан. в коде не нашел ни одной нормализации цены или проверки на стопуровень, заморозки. Поэтому торговые ошибки обеспечены."(А.Сергеев)
Николай
125
Николай 2012.03.19 23:00  
Slashlap:
Не понял, почему не могу N проинициализировать там? есть какие то определенные условия?

объясню корректней, у вас переменная объявляется, но не инициализируется, это разные вещи

int N=0;

вот так надо, а N++; перенесите сразу под while(N<Counts)

а вообще советую совсем отказаться от while

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий