проблема с выбором позиций с приставкой /m

 

всем привет,

есть код модификации позиций:

//+------------------------------------------------------------------+
void Modify(string symToWork2,int sl2,int tp2)
//+------------------------------------------------------------------+
  {


Print(symToWork2);

      if(PositionSelect(symToWork2))
        {

         if((PositionGetString(POSITION_SYMBOL)!=symToWork2)) return;

         order_open_price = PositionGetDouble(POSITION_PRICE_OPEN);
         order_type       = PositionGetInteger(POSITION_TYPE);
         request.order    = PositionGetInteger(POSITION_IDENTIFIER);

         if(order_type==POSITION_TYPE_BUY)
           {

            double sl,tp;

            if(sl2!=0 ) sl=SymbolInfoDouble(symToWork2,SYMBOL_BID)-sl2*SymbolInfoDouble(symToWork2,SYMBOL_POINT); else sl=0;
            if(tp2!=0 ) tp=SymbolInfoDouble(symToWork2,SYMBOL_BID)+tp2*SymbolInfoDouble(symToWork2,SYMBOL_POINT); else tp=0;


            request.action=TRADE_ACTION_SLTP;
            request.symbol= symToWork2;
            if( sl!=PositionGetDouble(POSITION_SL))request.sl     = sl;else request.sl=PositionGetDouble(POSITION_SL);
            if( tp!=PositionGetDouble(POSITION_TP))request.tp     = tp;else request.tp=PositionGetDouble(POSITION_TP);
            request.deviation=(ulong)((SymbolInfoDouble(symToWork2,SYMBOL_ASK)-SymbolInfoDouble(symToWork2,SYMBOL_BID))/SymbolInfoDouble(symToWork2,SYMBOL_POINT))*2; // по спреду 
            if(request.sl==PositionGetDouble(POSITION_SL) && request.tp==PositionGetDouble(POSITION_TP))return;
OrderSend(request,result);

            if(result.retcode==TRADE_RETCODE_DONE)
              {
               if(Sounds)PlaySound("ok.wav"); Print("Result = "+(string)result.retcode+
                  " symbol "+(string)request.symbol+" volume "+(string)request.volume+" action "+(string)request.action+" tp "+(string)request.tp+" sl "
                  +(string)request.sl+" type "+(string)request.type+" price "+(string)request.price+"   "+ErrorDescription(result.retcode));
              }
            else
              {
               if(Sounds)PlaySound("stops.wav");
               Print("ERROR Result = "+(string)result.retcode+
                     " symbol "+(string)request.symbol+" volume "+(string)request.volume+" action "+(string)request.action+" tp "+(string)request.tp+" sl "
                     +(string)request.sl+" type "+(string)request.type+" price "+(string)request.price+"   "+ErrorDescription(result.retcode));
              }

            return;
           }// end POSITION_TYPE_BUY    

         else if(order_type==POSITION_TYPE_SELL)
           {

            double sl,tp;

            if(sl2!=0) sl=SymbolInfoDouble(symToWork2,SYMBOL_ASK)+sl2*SymbolInfoDouble(symToWork2,SYMBOL_POINT); else sl=0;
            if(tp2!=0) tp=SymbolInfoDouble(symToWork2,SYMBOL_ASK)-tp2*SymbolInfoDouble(symToWork2,SYMBOL_POINT); else tp=0;
            request.action = TRADE_ACTION_SLTP;
            request.symbol = symToWork2;
            if(sl!=PositionGetDouble(POSITION_SL))request.sl     = sl;else request.sl=PositionGetDouble(POSITION_SL);
            if(tp!=PositionGetDouble(POSITION_TP))request.tp     = tp;else request.tp=PositionGetDouble(POSITION_TP);
            request.deviation=(ulong)((SymbolInfoDouble(symToWork2,SYMBOL_ASK)-SymbolInfoDouble(symToWork2,SYMBOL_BID))/SymbolInfoDouble(symToWork2,SYMBOL_POINT))*2; // по спреду 
            if(request.sl==PositionGetDouble(POSITION_SL) && request.tp==PositionGetDouble(POSITION_TP))return;

            OrderSend(request,result);
            if(result.retcode==TRADE_RETCODE_DONE)
              {
               if(Sounds)PlaySound("ok.wav"); Print("Result = "+(string)result.retcode+
                  " symbol "+(string)request.symbol+" volume "+(string)request.volume+" action "+(string)request.action+" tp "+(string)request.tp+" sl "
                  +(string)request.sl+" type "+(string)request.type+" price "+(string)request.price+"   "+ErrorDescription(result.retcode));
              }
            else
              {
               if(Sounds)PlaySound("stops.wav");
               Print("Result = "+(string)result.retcode+
                     " symbol "+(string)request.symbol+" volume "+(string)request.volume+" action "+(string)request.action+" tp "+(string)request.tp+" sl "
                     +(string)request.sl+" type "+(string)request.type+" price "+(string)request.price+"   "+ErrorDescription(result.retcode));
              }

           }// end POSITION_TYPE_SELL

        }// end if select                

  Print( GetLastError());
  }

на обычных счетах все работает

на счетах где есть буква суфикс, напрмиер EURUSD.m - не хочет выбирать позицию

пишет ошибку позиция не найдена:

2014.04.09 16:25:23.680	Exp - The X (UniversalEA + Averager) (EURCHF.m,M1)	Result = 10009 symbol EURCHF.m volume 0.01 action 1 tp 0 sl 0 type 0 price 1.21766   TRADE_RETCODE_DONE Заявка выполнена
2014.04.09 16:25:23.679	Exp - The X (UniversalEA + Averager) (EURCHF.m,M1)	4753
2014.04.09 16:25:23.679	Exp - The X (UniversalEA + Averager) (EURCHF.m,M1)	EURCHF.m

 

 

кто значет что это может быть?   Ошибка 4753


 
Vladon:

всем привет,

есть код модификации позиций:

на обычных счетах все работает

на счетах где есть буква суфикс, напрмиер EURUSD.m - не хочет выбирать позицию

пишет ошибку позиция не найдена:

 

 

кто значет что это может быть?   Ошибка 4753


Ошибка 4753 вроде бы выдает другая функция. Приведенная функция пишет что все ок.

10009

TRADE_RETCODE_DONE

Заявка выполнена

 
Vladon:

всем привет,

есть код модификации позиций:

на обычных счетах все работает

на счетах где есть буква суфикс, напрмиер EURUSD.m - не хочет выбирать позицию

пишет ошибку позиция не найдена:

 

 

кто значет что это может быть?   Ошибка 4753


https://www.mql5.com/ru/docs/constants/errorswarnings/errorcodes
Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки времени выполнения
Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки времени выполнения
  • www.mql5.com
Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки времени выполнения - Документация по MQL5
 

Это Вы мне ссылку дали для чего?

ERR_TRADE_POSITION_NOT_FOUND

4753

Позиция не найдена


 
 

аналогично:

void Modify(string symToWork2,int sl2,int tp2)
//+------------------------------------------------------------------+
  {

ResetLastError();
Print(symToWork2);

      if(PositionSelect(symToWork2))
        {
          Print("fffffffffffffffffffffffffffffffffd");
         if((PositionGetString(POSITION_SYMBOL)!=symToWork2)) return;

         order_open_price = PositionGetDouble(POSITION_PRICE_OPEN);
         order_type       = PositionGetInteger(POSITION_TYPE);
         request.order    = PositionGetInteger(POSITION_IDENTIFIER);

         if(order_type==POSITION_TYPE_BUY)
           {

            double sl,tp;

            if(sl2!=0 ) sl=SymbolInfoDouble(symToWork2,SYMBOL_BID)-sl2*SymbolInfoDouble(symToWork2,SYMBOL_POINT); else sl=0;
            if(tp2!=0 ) tp=SymbolInfoDouble(symToWork2,SYMBOL_BID)+tp2*SymbolInfoDouble(symToWork2,SYMBOL_POINT); else tp=0;


            request.action=TRADE_ACTION_SLTP;
            request.symbol= symToWork2;
            if( sl!=PositionGetDouble(POSITION_SL))request.sl     = sl;else request.sl=PositionGetDouble(POSITION_SL);
            if( tp!=PositionGetDouble(POSITION_TP))request.tp     = tp;else request.tp=PositionGetDouble(POSITION_TP);
            request.deviation=(ulong)((SymbolInfoDouble(symToWork2,SYMBOL_ASK)-SymbolInfoDouble(symToWork2,SYMBOL_BID))/SymbolInfoDouble(symToWork2,SYMBOL_POINT))*2; // по спреду 
            if(request.sl==PositionGetDouble(POSITION_SL) && request.tp==PositionGetDouble(POSITION_TP))return;
OrderSend(request,result);

            if(result.retcode==TRADE_RETCODE_DONE)
              {
               if(Sounds)PlaySound("ok.wav"); Print("Result = "+(string)result.retcode+
                  " symbol "+(string)request.symbol+" volume "+(string)request.volume+" action "+(string)request.action+" tp "+(string)request.tp+" sl "
                  +(string)request.sl+" type "+(string)request.type+" price "+(string)request.price+"   "+ErrorDescription(result.retcode));
              }
            else
              {
               if(Sounds)PlaySound("stops.wav");
               Print("ERROR Result = "+(string)result.retcode+
                     " symbol "+(string)request.symbol+" volume "+(string)request.volume+" action "+(string)request.action+" tp "+(string)request.tp+" sl "
                     +(string)request.sl+" type "+(string)request.type+" price "+(string)request.price+"   "+ErrorDescription(result.retcode));
              }

            return;
           }// end POSITION_TYPE_BUY    

         else if(order_type==POSITION_TYPE_SELL)
           {

            double sl,tp;

            if(sl2!=0) sl=SymbolInfoDouble(symToWork2,SYMBOL_ASK)+sl2*SymbolInfoDouble(symToWork2,SYMBOL_POINT); else sl=0;
            if(tp2!=0) tp=SymbolInfoDouble(symToWork2,SYMBOL_ASK)-tp2*SymbolInfoDouble(symToWork2,SYMBOL_POINT); else tp=0;
            request.action = TRADE_ACTION_SLTP;
            request.symbol = symToWork2;
            if(sl!=PositionGetDouble(POSITION_SL))request.sl     = sl;else request.sl=PositionGetDouble(POSITION_SL);
            if(tp!=PositionGetDouble(POSITION_TP))request.tp     = tp;else request.tp=PositionGetDouble(POSITION_TP);
            request.deviation=(ulong)((SymbolInfoDouble(symToWork2,SYMBOL_ASK)-SymbolInfoDouble(symToWork2,SYMBOL_BID))/SymbolInfoDouble(symToWork2,SYMBOL_POINT))*2; // по спреду 
            if(request.sl==PositionGetDouble(POSITION_SL) && request.tp==PositionGetDouble(POSITION_TP))return;

            OrderSend(request,result);
            if(result.retcode==TRADE_RETCODE_DONE)
              {
               if(Sounds)PlaySound("ok.wav"); Print("Result = "+(string)result.retcode+
                  " symbol "+(string)request.symbol+" volume "+(string)request.volume+" action "+(string)request.action+" tp "+(string)request.tp+" sl "
                  +(string)request.sl+" type "+(string)request.type+" price "+(string)request.price+"   "+ErrorDescription(result.retcode));
              }
            else
              {
               if(Sounds)PlaySound("stops.wav");
               Print("Result = "+(string)result.retcode+
                     " symbol "+(string)request.symbol+" volume "+(string)request.volume+" action "+(string)request.action+" tp "+(string)request.tp+" sl "
                     +(string)request.sl+" type "+(string)request.type+" price "+(string)request.price+"   "+ErrorDescription(result.retcode));
              }

           }// end POSITION_TYPE_SELL

        }// end if select                

  Print( GetLastError());
  }

 не выбирает он позицию и все. 

 

2014.04.09 21:22:29.807 Exp - The X (UniversalEA + Averager) (EURGBP.m,M1)      Result = 10009 symbol EURGBP.m volume 0.01 action 1 tp 0 sl 0 type 0 price 0.82519   TRADE_RETCODE_DONE Заявка выполнена
2014.04.09 21:22:29.807 Exp - The X (UniversalEA + Averager) (EURGBP.m,M1)      4753
2014.04.09 21:22:29.807 Exp - The X (UniversalEA + Averager) (EURGBP.m,M1)      EURGBP.m
2014.04.09 21:22:29.701 Exp - The X (UniversalEA + Averager) (EURGBP.m,M1)      0
 
т.е. он открывает позицию все ок, но не модифицирует потому что не может выбрать позицию после открытия, еее как бы нет. 
 

Владислав, не знаю, поможет или нет, но точно хуже не будет.

Попробуйте занулять структуры перед заполнением.

ZeroMemory(request);
ZeroMemory(result);

И вот эта строка мне кажется совершенно лишняя:

if((PositionGetString(POSITION_SYMBOL)!=symToWork2)) return;

Также:

Хорошо бы нормализовывать(NormalizeDouble) стопы и тейки перед тем как записать их в структуру.

 
i_logic:

Владислав, не знаю, поможет или нет, но точно хуже не будет.

Попробуйте занулять структуры перед заполнением.

спасибо к сожалению не помогло.
 
if((PositionGetString(POSITION_SYMBOL)!=symToWork2)) return;
он до нее даже не доходит, тоесть он не может выбрать символ, а символ записан в строковую переменную, эта строковая переменная используется и при открытии ордера:
void OpenBUY(string symToWork2)
  {
  ZeroMemory(request);
ZeroMemory(result);

   request.comment="by www.expforex.com";
   request.symbol = symToWork2;
   request.volume = GetSizeLot(symToWork2);
   request.action=TRADE_ACTION_DEAL; // операция с рынка
   request.type_filling=ORDER_FILLING_FOK; // операция с рынка
   if(SymbolInfoInteger(symToWork2,SYMBOL_TRADE_EXEMODE)!=SYMBOL_TRADE_EXECUTION_MARKET)
     {
      if(TakeProfits==0)request.tp=0;else if(TakeProfits!=0)request.tp=SymbolInfoDouble(symToWork2,SYMBOL_BID)+TakeProfits*SymbolInfoDouble(symToWork2,SYMBOL_POINT);
      if(StopLosss==0)request.sl=0;else if(StopLosss!=0)request.sl=SymbolInfoDouble(symToWork2,SYMBOL_BID)-StopLosss*SymbolInfoDouble(symToWork2,SYMBOL_POINT);
        }else {request.tp=0;request.sl=0;
     }
   request.deviation=(ulong)((SymbolInfoDouble(symToWork2,SYMBOL_ASK)-SymbolInfoDouble(symToWork2,SYMBOL_BID))/SymbolInfoDouble(symToWork2,SYMBOL_POINT))*2; // по спреду 
                                                                                                                                                             // request.type_filling=ORDER_FILLING_CANCEL;
   request.type=ORDER_TYPE_BUY;
   request.price=SymbolInfoDouble(symToWork2,SYMBOL_ASK);
   double margin=EMPTY_VALUE;
   Print(result.retcode);

   bool check=OrderCalcMargin(request.type,request.symbol,request.volume,request.price,margin);
   if(margin<AccountInfoDouble(ACCOUNT_FREEMARGIN))OrderSend(request,result);
   if(result.retcode==TRADE_RETCODE_DONE)
     {
      if(SymbolInfoInteger(symToWork2,SYMBOL_TRADE_EXEMODE)==SYMBOL_TRADE_EXECUTION_MARKET)
        {
         Modify(symToWork2,StopLosss,TakeProfits);
        }

     }
   if(result.retcode==TRADE_RETCODE_DONE)
     {
      if(Sounds)PlaySound("ok.wav"); Print("Result = "+(string)result.retcode+
         " symbol "+(string)request.symbol+" volume "+(string)request.volume+" action "+(string)request.action+" tp "+(string)request.tp+" sl "
         +(string)request.sl+" type "+(string)request.type+" price "+(string)request.price+"   "+ErrorDescription(result.retcode));
     }
   else
     {
      if(Sounds)PlaySound("stops.wav");
      Print("Result = "+(string)result.retcode+
            " symbol "+(string)request.symbol+" volume "+(string)request.volume+" action "+(string)request.action+" tp "+(string)request.tp+" sl "
            +(string)request.sl+" type "+(string)request.type+" price "+(string)request.price+"   "+ErrorDescription(result.retcode));
     }
  }
 

Vladon:


он до нее даже не доходит, тоесть он не может выбрать символ, а символ записан в строковую переменную, эта строковая переменная используется и при открытии ордера

Тогда посоветую перебирать позиции в цикле, начиная с PositionTotal и до нуля. Те, которое не относятся к нужному символу, естественно отбрасывать.
Причина обращения: