всем привет,
есть код модификации позиций:
на обычных счетах все работает
на счетах где есть буква суфикс, напрмиер EURUSD.m - не хочет выбирать позицию
пишет ошибку позиция не найдена:
кто значет что это может быть? Ошибка 4753
Ошибка 4753 вроде бы выдает другая функция. Приведенная функция пишет что все ок.
10009 | TRADE_RETCODE_DONE | Заявка выполнена |
всем привет,
есть код модификации позиций:
на обычных счетах все работает
на счетах где есть буква суфикс, напрмиер EURUSD.m - не хочет выбирать позицию
пишет ошибку позиция не найдена:
кто значет что это может быть? Ошибка 4753
- www.mql5.com
Это Вы мне ссылку дали для чего?
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) стопы и тейки перед тем как записать их в структуру.
Владислав, не знаю, поможет или нет, но точно хуже не будет.
Попробуйте занулять структуры перед заполнением.
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:
он до нее даже не доходит, тоесть он не может выбрать символ, а символ записан в строковую переменную, эта строковая переменная используется и при открытии ордера
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
всем привет,
есть код модификации позиций:
на обычных счетах все работает
на счетах где есть буква суфикс, напрмиер EURUSD.m - не хочет выбирать позицию
пишет ошибку позиция не найдена:
кто значет что это может быть? Ошибка 4753