Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Пополняй свой счет через PayPal
Vladislav Andruschenko
92017
Vladislav Andruschenko 2014.04.09 15:23 

всем привет,

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

//+------------------------------------------------------------------+
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
4513
Sergey Chalyshev 2014.04.09 17:10  
Vladon:

всем привет,

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

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

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

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

 

 

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


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

10009

TRADE_RETCODE_DONE

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

pako
3308
pako 2014.04.09 17:19  
Vladon:

всем привет,

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

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

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

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

 

 

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


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

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

ERR_TRADE_POSITION_NOT_FOUND

4753

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


Aleksey
2452
Aleksey 2014.04.09 19:51  
А где сброс ошибки?
Vladislav Andruschenko
92017
Vladislav Andruschenko 2014.04.09 20:15  

аналогично:

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

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

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

ZeroMemory(request);
ZeroMemory(result);

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

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

Также:

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

Vladislav Andruschenko
92017
Vladislav Andruschenko 2014.04.09 20:23  
i_logic:

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

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

спасибо к сожалению не помогло.
Vladislav Andruschenko
92017
Vladislav Andruschenko 2014.04.09 20:24  
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
3110
Igor Konyashin 2014.04.09 20:28  

Vladon:


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

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