Скачать MetaTrader 5

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

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

всем привет,

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

//+------------------------------------------------------------------+
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


Sergey Chalyshev
5279
Sergey Chalyshev  
Vladon:

всем привет,

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

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

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

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

 

 

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


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

10009

TRADE_RETCODE_DONE

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

pako
3309
pako  
Vladon:

всем привет,

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

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

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

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

 

 

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


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

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

ERR_TRADE_POSITION_NOT_FOUND

4753

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


Aleksey
2570
Aleksey  
А где сброс ошибки?
Vladislav Andruschenko
117660
Vladislav Andruschenko  

аналогично:

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
Vladislav Andruschenko
117660
Vladislav Andruschenko  
т.е. он открывает позицию все ок, но не модифицирует потому что не может выбрать позицию после открытия, еее как бы нет. 
Igor Konyashin
3169
Igor Konyashin  

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

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

ZeroMemory(request);
ZeroMemory(result);

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

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

Также:

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

Vladislav Andruschenko
117660
Vladislav Andruschenko  
i_logic:

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

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

спасибо к сожалению не помогло.
Vladislav Andruschenko
117660
Vladislav Andruschenko  
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));
     }
  }
Igor Konyashin
3169
Igor Konyashin  

Vladon:


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

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