Проблема множественных заказов - страница 5

 
RaptorUK:

Прочитайте коды ошибок исполнения и приведите свой код в соответствие с приведенной там информацией, например, ....

ОШИБОЧНЫЙ_ТОРГОВЫЙ_ТАЙМАУТ128Достигнут тайм-аут для торговой операции. Перед повторной попыткой(по крайней мере, в 1-минутном времени) необходимо убедиться, что торговая операция действительно не завершилась успешно (не была открыта новая позиция, или не был изменен или удален существующий ордер, или не была закрыта существующая позиция).


Привет, RaptorUK,

Спасибо за подсказку.

Еще один вопрос (больше one.....);

Скажем, на ECN брокере открыта одна сделка и согласно "Требованиям и ограничениям при совершении сделок" рыночный ордер не может быть закрыт, если Stoploss находится внутри Freezing distance, будет ли в таком случае эта функция CloseAll закрывать даже те ордера, которые находятся внутри Freezing Distance?

С наилучшими пожеланиями

Луис

void CloseAllOnSL()
 {
   int OrdType, GLError;
   double OrderClosed;   
        RefreshRates(); 

   int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber);  
   if(LastClosedTicket>0)                                          
   {//28                                                  
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))             
      {//29        
         if(MathAbs(OrderTakeProfit()-OrderClosePrice())>            
            MathAbs(OrderStopLoss()-OrderClosePrice()))              
            {//30        
            Print("Order with ticketnr: ", LastClosedTicket,
                  " hit SL! Close all open orders");

      for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)       
         if(OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
            && OrderMagicNumber()== MagicNumber 
            && OrderSymbol()== Symbol())                                       
            {//31
            OrdType = OrderType();
            if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))
                  GLError = GetLastError();
              }//32               
             }//31      
         }//28 
      }//29     
   }//30 
 
  if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());           
}
 
luisneves:


Привет RaptorUK,

Спасибо за подсказку.

Еще один вопрос (больше one.....);

Скажем, на ECN брокере открыта одна сделка и согласно "Требованиям и ограничениям при совершении сделок" рыночный ордер не может быть закрыт, если Stoploss находится внутри Freezing distance, в таком случае будет ли эта функция CloseAll закрывать даже те ордера, которые находятся внутри Freezing Distance?

Нет, она не сработает, вероятно, ошибка 130
 

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

Если возможно, хотел бы попросить у вас помощи в этом вопросе;

Этот кусок кода находит последний OrderLots() и умножает его на коэффициент умножения, но иногда он проходит мимо этого коэффициента и у меня есть ордера таким образом; 0.01, 196,83, 590,49 и т.д.

Надо сказать, что у меня есть лимит на открытые ордера, в данном случае 5. Теперь, как я вижу эту логику, даже если приходит условие открыть ордер выше 5, он не откроется, и тогда количество ордеров в пуле ограничено 5, поэтому, если код видит только 5 ордеров в пуле, размер лота для этих ордеров должен быть ; 0.01, 0.02, 0.04, 0.08, 0.16. Может в этом коде есть что-то неправильное, о чем я не знаю?

(надеюсь, отступы в порядке...)

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
 if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
   {//12
 if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
   {//13
     LastLot = OrderLots();
   }//13              
     MLots = 0;                       
     MLots = LastLot * Multiplier;        
   }//12
 else MLots = LotSize;
   }//11 
 return(0);
 }//0 

С наилучшими пожеланиями

Луис

 
luisneves:

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

Если возможно, хотел бы попросить у вас помощи в этом вопросе;

Этот кусок кода находит последний OrderLots() и умножает его на коэффициент умножения, но иногда он проходит мимо этого коэффициента и у меня есть ордера таким образом; 0.01, 196,83, 590,49 и т.д.

Надо сказать, что у меня есть лимит на открытые ордера, в данном случае 5. Теперь, как я вижу эту логику, даже если приходит условие открыть ордер выше 5, он не откроется, и тогда количество ордеров в пуле ограничено 5, поэтому, если код видит только 5 ордеров в пуле, размер лота для этих ордеров должен быть ; 0.01, 0.02, 0.04, 0.08, 0.16. Может быть, в этом коде есть что-то неправильное, о чем я не знаю?

(надеюсь отступы в порядке...)

Я делаю это следующим образом ...

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
   if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
      {//12
      if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
         {//13
         LastLot = OrderLots();
         }//13              
      MLots = 0;                       
      MLots = LastLot * Multiplier;        
      }//12
   else MLots = LotSize;
   }//11 
return(0);
}//0 

если OrderSelect() не срабатывает MLots = LotSize ?? почему ? Ваш отступ не помогает увидеть, что происходит с вашими операторами if и скобками . Вы хотели сделать так?

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
   if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
      {//12
      if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
         {//13
         LastLot = OrderLots();
         MLots = 0;                       
         MLots = LastLot * Multiplier; 
         }//13              
      }//12
   }//11 
if(MLots < 0.001) MLots = LotSize;  //  if MLots == 0.0
return(0);
}//0 

Я сделал это...

if(MLots < 0.001)

. как быстрый и грязный метод избежать проблем с двойным сравнением, вы читали это?Может ли цена != цена ?

 
RaptorUK:

Я делаю это следующим образом...

если OrderSelect() не срабатывает MLots = LotSize ?? почему ? ваши отступы не помогают увидеть, что происходит с вашими операторами if и скобками . Вы хотели сделать так?

Я сделал это...

. как быстрый и грязный метод избежать проблем с двойным сравнением, вы читали это?Может ли цена != цена?


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

Спасибо за быстрый ответ.

Итак, я полагаю, что лучше просто не использовать else, потому что это не нужно. И спасибо за предоставленную ссылку.

С наилучшими пожеланиями

Луис

 

Привет RaptorUK,

У меня есть одна проблема (больше one.....)

Некоторые ордера закрываются раньше времени, я имею в виду следующее;

Эти ордера были открыты и есть лимит на открытие до 6. Все ордера должны закрыться по TrailingStop, но ордера 1. 3 и 5 были закрыты раньше остальных, которые были закрыты после (07:43).

Поскольку эти 3 ордера закрылись раньше остальных, это дает возможность открыть ордера 7, 8 и 9, которые открываются с лотом, основанным на последнем лоте (2.43).

Таким образом, насколько я понимаю, такого ошибочного закрытия ордеров в 07:23 не должно было произойти и никаких ошибок не обнаружено...

1 - 49518192013.01.28 19:51продать0.01eurusdi1.345471.350471.343472013.01.29 07:231.34347-0.060.000.001.49
2 - 49520362013.01.28 20:04купить0.03эурусди1.345791.340791.347792013.01.29 07:431.34421-0.170.00-0.04-3.53
3 - 49520742013.01.28 20:12продать0.09эурусди1.345481.350481.343482013.01.29 07:231.34348-0.500.000.0013.40
4 - 49520932013.01.28 20:20купить0.27эурусди1.345791.340791.347792013.01.29 07:431.34421-1.490.00-0.38-31.74
5 - 49521102013.01.28 20:27продать0.81эурусди1.345481.350481.343482013.01.29 07:231.34348-4.460.000.00120.58
6 - 49521502013.01.28 20:48купить2.43эурусди1.345791.340791.347792013.01.29 07:431.34421-13.370.00-3.43-285.63
7 - 49593372013.01.29 07:23продать7.29эурусди1.343511.348511.341512013.01.29 07:431.34424-40.100.000.00-395.89
8 - 49598582013.01.29 07:40купить21.87эурусди1.343821.344221.345822013.01.29 07:431.34422-120.290.000.00650.79
9 - 49598602013.01.29 07:40продать65.61эурусди1.343821.348821.341822013.01.29 07:431.34424-360.860.000.00-2 049.95

Код для закрытия всех этих ордеров с помощью TrailingStop вот такой;

Может ли этот код не сработать и закрыть ордера в разное время?

void CloseAllOnSL()
 {
   int OrdType, GLError;
   double OrderClosed;
        
   int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber);  
   if(LastClosedTicket > 0 )                                          
   {//28                                                  
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))             
      {//29        
         if(MathAbs(OrderTakeProfit()- OrderClosePrice())>            
            MathAbs(OrderStopLoss()- OrderClosePrice()))             
            {//30        
            Print("Order with ticketnr: ", LastClosedTicket,
                  " hit SL! Close all open orders");

      for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)       
         if(OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
            && OrderMagicNumber()== MagicNumber 
            && OrderSymbol()== Symbol())                                       
            {//31
            OrdType = OrderType();
            if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              while(IsTradeContextBusy()) Sleep(SleepTime);  
                   RefreshRates();
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))                
                 GLError = GetLastError();
              }//32               
             }//31      
         }//28 
      }//29     
   }//30 

С наилучшими пожеланиями

Луис

 
luisneves:


Код для закрытия всех ордеров с помощью TrailingStop - вот этот;

Может ли этот код не сработать и закрыть ордера в разное время?

Хорошо, это не имеет смысла ... трейлинг SL устанавливается для того, чтобы, если цена идет с ордером, SL перемещался в сторону цены, так что если новый SL будет достигнут, то убыток будет меньше или даже прибыль. Зачем нужен трейлинг SL, если вы все равно собираетесь закрыть сделку через OrderClose()? Для меня это не трейлинг SL, это вообще не SL, поскольку вы активно закрываете сделку через советника, а не SL.

Возможно, вашафункция CloseAllOnSL() делает что-то другое, чем я думаю, но, тем не менее, у вас нет комментариев, объясняющих, что пытается сделать ваш код. Нет трейлингового СЛ, как нет и OrderModify().

 

Читайте здесь:Что такое возвратные значения функций? Как их использовать?

if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              while(IsTradeContextBusy()) Sleep(SleepTime);  
                   RefreshRates();
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))                
                 {
                 GLError = GetLastError();

                 //  ? ? ? ? ?  why aren't you printing the information about the OrderClose() failure ? ? 
                 Print("OrderClose failed, error# ", GLError);  //<-----  like this  but more info
                 } 
              }//32 

добавьте больше информации в оператор Print, добавьте OrderTicket(), OrderLots(), OrderClosePrice(), Bid, Ask, и т.д., и т.п. любую информацию, которая вам нужна, чтобы определить, в чем была проблема, когда произошла ошибка, вы не можете легко вернуться в прошлое и выяснить все это, поэтому, когда это происходит, печатайте это в журнал.

 
luisneves:


Итак, насколько я понял, ошибки в закрытии ордеров в 07:23 не должно было произойти и ошибок не обнаружено...

1 - 49518192013.01.28 19:51продать0.01eurusdi1.345471.350471.343472013.01.29 07:231.34347-0.060.000.001.49
2 - 49520362013.01.28 20:04купить0.03эурусди1.345791.340791.347792013.01.29 07:431.34421-0.170.00-0.04-3.53
3 - 49520742013.01.28 20:12продать0.09эурусди1.345481.350481.343482013.01.29 07:231.34348-0.500.000.0013.40
4 - 49520932013.01.28 20:20купить0.27эурусди1.345791.340791.347792013.01.29 07:431.34421-1.490.00-0.38-31.74
5 - 49521102013.01.28 20:27продать0.81эурусди1.345481.350481.343482013.01.29 07:231.34348-4.460.000.00120.58
6 - 49521502013.01.28 20:48купить2.43эурусди1.345791.340791.347792013.01.29 07:431.34421-13.370.00-3.43-285.63
7 - 49593372013.01.29 07:23продать7.29эурусди1.343511.348511.341512013.01.29 07:431.34424-40.100.000.00-395.89
8 - 49598582013.01.29 07:40купить21.87эурусди1.343821.344221.345822013.01.29 07:431.34422-120.290.000.00650.79
9 - 49598602013.01.29 07:40продать65.61эурусди1.343821.348821.341822013.01.29 07:431.34424-360.860.000.00-2 049.95

Покажите вывод из журнала, когда это произошло. ...
 
RaptorUK:

Читайте здесь:Что такое возвратные значения функций? Как их использовать?

добавьте больше информации в оператор Print, добавьте OrderTicket(), OrderLots(), OrderClosePrice(), Bid, Ask, и т.д., и т.п. любую информацию, которая вам нужна, чтобы определить, в чем была проблема, когда произошла ошибка, вы не можете легко вернуться в прошлое и выяснить все это, поэтому, когда это происходит, печатайте это в журнал.


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

Спасибо за ваше время.

Код для TrailingStop находится в другой части, отправленный код только для закрытия всех ордеров, которые были закрыты с помощью TrailingStop.

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

Кстати, в следующем коде имеет смысл изменить положение MLots = 0; с фактического места на место перед циклом for?

   MLots = 0; <-----------------------------------------------------------------to here 
   for(int cnt = 0; cnt < OrdersTotal(); cnt++)
      {//11
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         {//12
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {//13
            LastLot = OrderLots();
            }//13            
         MLots = 0;  <-----------------------------------------------------------from here                      
         MLots = LastLot * Multiplier;        
         }//12      
      }//11 
   return(0);
   }//0 

С наилучшими пожеланиями

Луис