Пока писала на форум - пришла идея! Протестировала - помогло.
У buy позиций проверяю:
double _mi_lv = MarketInfo(Symbol(), MODE_STOPLEVEL); if(Bid - SL < _mi_lv*Point) SL = Bid - _mi_lv*Point;
У sell позиций проверяю:
double _mi_lv = MarketInfo(Symbol(), MODE_STOPLEVEL); if(SL - Ask < _mi_lv*Point) SL = Ask + _mi_lv*Point;
Может кому понадобится.
Неа.
Цена пока идёт в кухню(если есть уровень то это кухня) меняется а стоп расчитывается по старой цене.
Сначало выставляй ордер а потом выбирай его а потом ставь ему стопы
Пока писала на форум - пришла идея! Протестировала - помогло.
У buy позиций проверяю:
У sell позиций проверяю:
Может кому понадобится.
Давно уже делал ф-ции, возвращающие корректные стопы/тейки с учётом StopLevel:
//+------------------------------------------------------------------+ double GetCorrectStopLoss(string sy,int op,double price_set,double stop_loss) { if(stop_loss==0) return(0); double pt=SymbolInfoDouble(sy,SYMBOL_POINT); double price=(op==OP_BUY)?SymbolInfoDouble(sy,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(sy,SYMBOL_ASK):price_set; int lv=StopLevel(sy), dg=(int)SymbolInfoInteger(sy,SYMBOL_DIGITS); if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg)); else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg)); } //+------------------------------------------------------------------+ double GetCorrectStopLoss(string sy,int op,double price_set,int stop_loss) { if(stop_loss==0) return(0); double pt=SymbolInfoDouble(sy,SYMBOL_POINT); double price=(op==OP_BUY)?SymbolInfoDouble(sy,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(sy,SYMBOL_ASK):price_set; int lv=StopLevel(sy), dg=(int)SymbolInfoInteger(sy,SYMBOL_DIGITS); if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg)); else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg)); } //+------------------------------------------------------------------+ double GetCorrectTakeProfit(string sy,int op,double price_set,double take_profit) { if(take_profit==0) return(0); double pt=SymbolInfoDouble(sy,SYMBOL_POINT); double price=(op==OP_BUY)?SymbolInfoDouble(sy,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(sy,SYMBOL_ASK):price_set; int lv=StopLevel(sy), dg=(int)SymbolInfoInteger(sy,SYMBOL_DIGITS); if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg)); else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg)); } //+------------------------------------------------------------------+ double GetCorrectTakeProfit(string sy,int op,double price_set,int take_profit) { if(take_profit==0) return(0); double pt=SymbolInfoDouble(sy,SYMBOL_POINT); double price=(op==OP_BUY)?SymbolInfoDouble(sy,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(sy,SYMBOL_ASK):price_set; int lv=StopLevel(sy), dg=(int)SymbolInfoInteger(sy,SYMBOL_DIGITS); if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg)); else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg)); } //+------------------------------------------------------------------+
//+------------------------------------------------------------------+ int GetStopLevel(string sy) { int sp=(int)SymbolInfoInteger(sy,SYMBOL_SPREAD); int lv=(int)SymbolInfoInteger(sy,SYMBOL_TRADE_STOPS_LEVEL); return((lv==0)?sp*2:lv); } //+------------------------------------------------------------------+
Vasyl Nosal:
...Сначала выставляй ордер а потом выбирай его а потом ставь ему стопы
Давно уже делал ф-ции, возвращающие корректные стопы/тейки с учётом StopLevel...
Спасибо!!!
Проверяю минимально допустимый уровень стоп-лосса/тейк-профита в пунктах с помощью
Выдает значение 20. Ставлю SL и TP на расстоянии 21 или 22 - ошибка выставления SL и TP. Тестировала на спокойном рынке, при какой цене рассчитывала уровни, при такой же цене и пыталось произойти открытие, т.е. Ask и Bid не успел измениться.
SL и TP выставляю одновременно с открытием ордера.
Вручную могу выставить SL и TP и на расстоянии 13.
Что еще можно использовать кроме MODE_STOPLEVEL ?
А счет какоей - ECN? Некоторые ДЦ с ECN счетами не позволяют в OrderSend задавать SL и TP. Иначе возвращается именно такой код ошибки. Их надо задавать нулями, а потом устанавливать через OrderdModify. Связано с тем, что ДЦ заранее не знает реальную цену, по которой откроется ордер, а значит не может оценить правильность SL и TP.
Например, так происходит на альпе, а на робо можно SL и TP сразу задавать.
А счет какоей - ECN? Некоторые ДЦ с ECN счетами не позволяют в OrderSend задавать SL и TP. Иначе возвращается именно такой код ошибки. Их надо задавать нулями, а потом устанавливать через OrderdModify. Связано с тем, что ДЦ заранее не знает реальную цену, по которой откроется ордер, а значит не может оценить правильность SL и TP.
Например, так происходит на альпе, а на броко можно SL и TP сразу задавать.
Решается добавлением в свою функцию выставления ордеров соотв проверки - SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE). И соотв обработкой результата проверки :)
Спасибо, Кэп, но эта функция проблемы с разрешенной установкой стопов и тейков в OrderSend(...) не решает. Это вопрос обсуждался на форуме, пришли к мнению, что он может быть решен только путем эксперимента.
Я во всех роботах делаю такую настройку
extern bool OrderModifyAfterOpen= true;
Только что обновил МТ4 до 910, решил проверить на всякий случай.
void OnStart() { if(SymbolInfoInteger(Symbol(), SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_REQUEST) Print("SYMBOL_TRADE_EXECUTION_REQUEST"); if(SymbolInfoInteger(Symbol(), SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_INSTANT) Print("SYMBOL_TRADE_EXECUTION_INSTANT"); if(SymbolInfoInteger(Symbol(), SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_MARKET) Print("SYMBOL_TRADE_EXECUTION_MARKET"); if(SymbolInfoInteger(Symbol(), SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE) Print("SYMBOL_TRADE_EXECUTION_EXCHANGE"); }
Результаты:
Alpa ECN - в OrderSend надо указывать SL=0, TP=0
2015.11.14 13:13:56.403 TestTradeMode EURUSD,M1: SYMBOL_TRADE_EXECUTION_MARKET
Robo ECN - в OrderSend можно указывать пользовательские SL и TP
2015.11.14 13:15:54.058 TestTradeMode GBPUSD,M15: SYMBOL_TRADE_EXECUTION_MARKET
А счет какоей - ECN? Некоторые ДЦ с ECN счетами не позволяют в OrderSend задавать SL и TP. Иначе возвращается именно такой код ошибки. Их надо задавать нулями, а потом устанавливать через OrderdModify. Связано с тем, что ДЦ заранее не знает реальную цену, по которой откроется ордер, а значит не может оценить правильность SL и TP.
Например, так происходит на альпе, а на робо можно SL и TP сразу задавать.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Проверяю минимально допустимый уровень стоп-лосса/тейк-профита в пунктах с помощью
MarketInfo(Symbol(), MODE_STOPLEVEL);
Выдает значение 20. Ставлю SL и TP на расстоянии 21 или 22 - ошибка выставления SL и TP. Тестировала на спокойном рынке, при какой цене рассчитывала уровни, при такой же цене и пыталось произойти открытие, т.е. Ask и Bid не успел измениться.
SL и TP выставляю одновременно с открытием ордера.
Вручную могу выставить SL и TP и на расстоянии 13.
Что еще можно использовать кроме MODE_STOPLEVEL ?