код ошибки 138 и реал-счет

 

Добрый день! Подскажите как это так? Одинаковый советник стоит на демо и на реал-микро ДЦ "Альпари". Работает он по сформированым барам и естественно в одном баре может быть только один ордер. Смотрю и вижу чудо на демо открылся ордер а на реале 2 в одном баре. Проанализировав свой код....

for(int ts=1;ts<6;ts++)
       {
         RefreshRates();
         ticket = OrderSend(Symbol(), OP_SELL, loti, Bid, 3, Ask + sl * Point, Ask - tp * Point, "AI", MagicNumber, 0, Red);        
         if(ticket < 0) 
            {
            prevtime = Time[1];
            Print("!_!_Ошибка №"+ts+" при попытке установить ордер на OP_SELL код ош="+GetLastError());
            Sleep(2000);
            }
         else
            {
            MagicNumber++;
            Sleep(6000);
            break;    
            } 

вижу что это невозможно, тогда смотрю лог а там "

!_!_Ошибка №1 при попытке установить ордер на OP_SELL код ош=138

". ВЫВОД: хоть и ошибка 138-новые цены ДЦ открывает позу а советник мой из-за ошибки исполняет еще ордер со 2-й попытки. Что так может быть ? Или ДЦ будет всегда считать что я по умолчанию соглашаюсь на новые цены ?

 
snik_666 >>:

Добрый день! Подскажите как это так? Одинаковый советник стоит на демо и на реал-микро ДЦ "Альпари". Работает он по сформированым барам и естественно в одном баре может быть только один ордер. Смотрю и вижу чудо на демо открылся ордер а на реале 2 в одном баре. Проанализировав свой код....

вижу что это невозможно, тогда смотрю лог а там "

". ВЫВОД: хоть и ошибка 138-новые цены ДЦ открывает позу а советник мой из-за ошибки исполняет еще ордер со 2-й попытки. Что так может быть ? Или ДЦ будет всегда считать что я по умолчанию соглашаюсь на новые цены ?

на таком рынке это частая ошибка

как вариант разумный SLIPPAGE решит проблему! у ВАС он = 3, что может не нравится некоторым ДЦ

---

как варант сейчас на таком рынке

прекрасно видно в каком ДЦ работать комфортней!

конкуренция вещь нормальная  - ищите сейчас ВАШ лучший ДЦ

---

не спрашивайте толкько список дц где работа идет хорошо у меня его нет

 
YuraZ писал(а) >>

на таком рынке это частая ошибка

как вариант разумный SLIPPAGE решит проблему! у ВАС он = 3, что может не нравится некоторым ДЦ

---

как варант сейчас на таком рынке

прекрасно видно в каком ДЦ работать комфортней!

конкуренция вещь нормальная - ищите сейчас ВАШ лучший ДЦ

---

не спрашивайте толкько список дц где работа идет хорошо у меня его нет

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

 
//+------------------------------------------------------------------+
int start()
  {
   if(Time[0] == prevtime) 
       return(0);
   prevtime = Time[0];
   if (IsTradeAllowed()==false)
   {
    Print("Торговля запрещена ");
    return(0);
   } 
     
   UpravlenieTrailingStop();
     
  
   int ticket = -1;
   double napr = OpredelitNapr();
   int spread=MarketInfo("EURUSD",MODE_SPREAD);
   if(spread>dopustimiySpread)
   {
      Print("Торговля запрещена из-за spread ="+spread);
      return(0);
   }
   else 
   {
      //Print("spread ="+spread);
   }
   
   if (!CheckTradeTime()) napr=0;//если пятница после 14 и понедельник до 2 то не торгуем
   
   // check for long or short position possibility
   double loti;
   if(napr > 0) 
     { 
       //long
       loti = (lots*getUvelichLot(OP_BUY))+getUvelichRisk(OP_BUY);
       Print("loti="+loti);  
       ///////////в цикл на 5 попыток
       for(int tb=1;tb<6;tb++)
       {
         RefreshRates();
         ticket = OrderSend(Symbol(), OP_BUY, loti, Ask, 3, Bid - sl * Point, Bid + tp * Point, "AI", MagicNumber, 0, Blue);
         if(ticket < 0) 
            {
            prevtime = Time[1];
            Print("!_!_Ошибка №"+tb+" при попытке установить ордер на OP_BUY код ош="+GetLastError());
            Sleep(2000);
            }
         else
            {  
            MagicNumber++;
            Sleep(6000);
            break;  
            }  
       }  
     } 
   else if(napr < 0) 
     { 
       // short
       loti = (lots*getUvelichLot(OP_SELL))+getUvelichRisk(OP_SELL);
       Print("loti="+loti); 
       for(int ts=1;ts<6;ts++)
       {
         RefreshRates();
         ticket = OrderSend(Symbol(), OP_SELL, loti, Bid, 3, Ask + sl * Point, Ask - tp * Point, "AI", MagicNumber, 0, Red);        
         if(ticket < 0) 
            {
            prevtime = Time[1];
            Print("!_!_Ошибка №"+ts+" при попытке установить ордер на OP_SELL код ош="+GetLastError());
            Sleep(2000);
            }
         else
            {
            MagicNumber++;
            Sleep(6000);
            break;    
            } 
       }    
     }

   return(0);
  }
//+------------------------------------------------------------------+
 

ну вот код

 
prevtime = Time[1];

При неудачной попытке значение prevtime меняется.

Ну и представьте, что на первой итерации была ошибка, а со второй - ордер открылся. Что будет на следующем тике?

 
Xupypr писал(а) >>

При неудачной попытке значение prevtime меняется.

Ну и представьте, что на первой итерации была ошибка, а со второй - ордер открылся. Что будет на следующем тике?

Нет, не этом дело. В начале starta стоит prevtime = Time[0];

 
Talex писал(а) >>

Нет, не этом дело. В начале starta стоит prevtime = Time[0];

Это как раз правильно, ограничение работы "раз на бар", после ошибки открытия, в цикле ордер откроется со второго раза, при этом потом start запустится на бар еще раз

А вот Хирург совершенно прав. Если уж Вы так обрабатываете ошибку, добавьте еще prevtime = Time[0] в else :

         else
            {
            prevtime = Time[0];
            MagicNumber++;
            Sleep(6000);
            break;    
            } 
 
Talex писал(а) >>

Нет, не этом дело. В начале starta стоит prevtime = Time[0];

Это контроль нового бара, разве не понятно. Просто если была ошибка открытия, то советник сработает на этом баре ещё один раз.

 
for(int tb=1;tb<6;tb++)
       {
         RefreshRates();
         ticket = OrderSend(Symbol(), OP_BUY, loti, Ask, 3, Bid - sl * Point, Bid + tp * Point, "AI", MagicNumber, 0, Blue);
         if(ticket < 0) 
            {
            prevtime = Time[1];
            Print("!_!_Ошибка №"+tb+" при попытке установить ордер на OP_BUY код ош="+GetLastError());
            Sleep(2000);
            }
         
такое происходит после того как хотябы 1 раз неустановился ордер, Флаг prevtime = Time[1]; "обнуляется" даже если при 2 проходе цикла ордер вседаки установился
 
Talex >>:

Нет, не этом дело. В начале starta стоит prevtime = Time[0];

имеется ввиду что получив на тике 5 попыток отлупа

  система будет отдыхать целый следующий бар!   при этом наличие сигнала ВПОЛНЕ и ВЕРОЯТНО существует!

это как раз и есть неверно!

необходимо взвести флаг на вход!  и сбросить флаг только после успешного входа!  или если сигнал отменился 

 ну или квант... закончиля

---

квант на одном тике отрабатывать не совсем верно!

---

допустим 

получен сигнал -

 на тике бъем на вход раз 5

  не пробили! вышли 

  на втором тике после сигнала входим и долбим далше!

   а тут система на втором тике уже в отлупе полном!

  

---

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