//+------------------------------------------------------------------+ //| Check for long position SL | //+------------------------------------------------------------------+ bool CSampleExpert::LongSL(void) { bool res=false; double sl=0; if((ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) { for(int i=PositionsTotal()-1;i>=0;i--) if(!position.SelectByIndex(i)) continue; if(_Symbol==PositionGetString(POSITION_SYMBOL) && MAGIC==PositionGetInteger(POSITION_MAGIC)) if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) { sl=NormalizeDouble(position.PriceOpen()-symbol.Point()*StopLoss,symbol.Digits()); if(symbol.Bid()-sl<symbol.StopsLevel()*symbol.Point()) sl=NormalizeDouble(symbol.Bid()-symbol.StopsLevel()*symbol.Point()-10*symbol.Point(),symbol.Digits()); { //--- check if(symbol.Bid()-sl>symbol.StopsLevel()*symbol.Point() && symbol.Bid()>sl) if(PositionGetDouble(POSITION_SL)==0 && position.PriceOpen()-sl>symbol.StopsLevel()*symbol.Point()) //--- modify position if(trade.PositionModify(Symbol(),sl,0)) printf("Long position by %s to be modified,SL=%f",Symbol(),sl); else { printf("Error modifying position by %s : '%s'",Symbol(),trade.ResultComment()); printf("Modify parameters : SL=%f",sl,0); } //--- modified and must exit from expert res=true; } } } //--- result return(res); } //+------------------------------------------------------------------+ //| Check for short position SL | //+------------------------------------------------------------------+ bool CSampleExpert::ShortSL(void) { bool res=false; double sl=0; if((ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) { for(int i=PositionsTotal()-1;i>=0;i--) if(!position.SelectByIndex(i)) continue; if(_Symbol==PositionGetString(POSITION_SYMBOL) && MAGIC==PositionGetInteger(POSITION_MAGIC)) if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL) { sl=NormalizeDouble(position.PriceOpen()+symbol.Point()*StopLoss,symbol.Digits()); if(sl-symbol.Ask()<symbol.StopsLevel()*symbol.Point()) sl=NormalizeDouble(symbol.Ask()+symbol.StopsLevel()*symbol.Point()+10*symbol.Point(),symbol.Digits()); { //--- check if(sl-symbol.Ask()>symbol.StopsLevel()*symbol.Point() && symbol.Ask()<sl) if(PositionGetDouble(POSITION_SL)==0 && sl-position.PriceOpen()>symbol.StopsLevel()*symbol.Point()) //--- modify position if(trade.PositionModify(Symbol(),sl,0)) printf("Short position by %s to be modified,SL=%f",Symbol(),sl); else { printf("Error modifying position by %s : '%s'",Symbol(),trade.ResultComment()); printf("Modify parameters : SL=%f",sl,0); } //--- modified and must exit from expert res=true; } } } //--- result return(res); }
trade.PositionModify(Symbol(),sl,0)
trade.PositionModify(PositionGetInteger(POSITION_TICKET),sl,0)
fxsaber:
Премного благодарен! Я был невнимателен.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Советник открывает последовательно две позиции. При попытке установить стоп-лосс, модифицирует только первую открывшеюся позицию.
Вторая позиция модифицируется после закрытия первой. Позиции разнонаправленные. Пробовал по всякому: выбрать через тикет, выбрать символ по инексу позиции и тд. Счет хеджинговый. билд 1643. Что не так? и Што делать?