Что еще можно использовать кроме MODE_STOPLEVEL ? (mql4)

 

Проверяю минимально допустимый уровень стоп-лосса/тейк-профита в пунктах с помощью

MarketInfo(Symbol(), MODE_STOPLEVEL);

Выдает значение 20. Ставлю SL и TP на расстоянии 21 или 22 - ошибка выставления SL и TP. Тестировала на спокойном рынке, при какой цене рассчитывала уровни, при такой же цене и пыталось произойти открытие, т.е. Ask и Bid не успел измениться.

SL и TP выставляю одновременно с открытием ордера.

Вручную могу выставить SL и TP  и на расстоянии 13.

Что еще можно использовать кроме MODE_STOPLEVEL ?

 

Пока писала на форум -  пришла идея! Протестировала - помогло.

У 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;

Может кому понадобится.

 

Неа.

Цена пока идёт в кухню(если есть уровень то это кухня) меняется а стоп расчитывается по старой цене.

 

Сначало выставляй ордер а потом выбирай его а потом ставь ему стопы 

 
Oksana Berenko:

Пока писала на форум -  пришла идея! Протестировала - помогло.

У 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:

...Сначала выставляй ордер а потом выбирай его а потом ставь ему стопы 

После того, как выставлю ордер со Sl и TP, я еще раз проверяю корректность Sl и TP.
 
Artyom Trishkin:

Давно уже делал ф-ции, возвращающие корректные стопы/тейки с учётом StopLevel...

Спасибо!!!
 
Oksana Berenko:
Спасибо!!!
Пожалуйста ;)
 
Oksana Berenko:

Проверяю минимально допустимый уровень стоп-лосса/тейк-профита в пунктах с помощью

Выдает значение 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 сразу задавать.

 
Alexey Volchanskiy:

А счет какоей - ECN? Некоторые ДЦ с ECN счетами не позволяют в OrderSend задавать SL и TP. Иначе возвращается именно такой код ошибки. Их надо задавать нулями, а потом устанавливать через OrderdModify. Связано с тем, что ДЦ заранее не знает реальную цену, по которой откроется ордер, а значит не может оценить правильность SL и TP.

Например, так происходит на альпе, а на броко можно SL и TP сразу задавать.

Решается добавлением в свою функцию выставления ордеров соотв проверки - SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE). И соотв обработкой результата проверки :)
 
Alexander Puzanov:
Решается добавлением в свою функцию выставления ордеров соотв проверки - 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

 
Alexey Volchanskiy:

А счет какоей - ECN? Некоторые ДЦ с ECN счетами не позволяют в OrderSend задавать SL и TP. Иначе возвращается именно такой код ошибки. Их надо задавать нулями, а потом устанавливать через OrderdModify. Связано с тем, что ДЦ заранее не знает реальную цену, по которой откроется ордер, а значит не может оценить правильность SL и TP.

Например, так происходит на альпе, а на робо можно SL и TP сразу задавать.

Спасибо! Обязательно проверю то, что вы написали. И там и там у меня есть ECN.