Установка StopLoss и TakeProfit

 

У меня тут возникла пробелема при задании параметров StopLoss и TakeProfit при открытии ордера.

делаю переменную в которой хранится значения в пунктах (ну как все наверное) ), затем при открытии ордера пишу например Ask - StopLoss * Point

привожу кусок кода открытия позиции

Price_open = NormalizeDouble(Ask, Digits);
cmd = OP_BUY;
// расчитываем цены ограничителей
if (StopLoss > 0)
  StopLoss = Bid - StopLoss * Point;
if (TakeProfit > 0) 
  TakeProfit = Ask + TakeProfit * Point;
...
ticket = OrderSend(Symbol(), cmd, Lots, Price_open, SlipPage, StopLoss, TakeProfit, 0, magik);

StopLoss у меня стоит 30 пунктов, но реально он выставляется 35 на позиции а TakeProfit наоборот уменьшается на 5 пунктов и становится 25 (установленное тоже 30)

Использование ф-ии NormalizeDouble не меняет ситуацию, и с ней и без нее такое происходит. Однако не на всех открываемых позициях

Подскажите где "собака порылась", на что обратить внимание чтобы все таки понять почему так происходит

 
Price_open = NormalizeDouble(Ask, Digits);
cmd = OP_BUY;
// расчитываем цены ограничителей
if (StopLoss > 0)
  StopLoss = Ask - StopLoss * Point;
if (TakeProfit > 0) 
  TakeProfit = Bid + TakeProfit * Point;
...
ticket = OrderSend(Symbol(), cmd, Lots, Price_open, SlipPage, StopLoss, TakeProfit, 0, magik);

Попробуйте так.
 
И хорошо бы сделать нормалайз для рассчитанных стопа и тейка. .. На всякий случай... Во избежание, так сказать...
 
sashken:
Price_open = NormalizeDouble(Ask, Digits);
cmd = OP_BUY;
// расчитываем цены ограничителей
if (StopLoss > 0)
  StopLoss = Ask - StopLoss * Point;
if (TakeProfit > 0) 
  TakeProfit = Bid + TakeProfit * Point;
...
ticket = OrderSend(Symbol(), cmd, Lots, Price_open, SlipPage, StopLoss, TakeProfit, 0, magik);

Попробуйте так.


Опять неправильно - если покупаем нужно покупать по Ask (что и сделано), но всегда закрываем по Bid. Таким образом код должен быть:

Price_open = NormalizeDouble(Ask, Digits);
cmd = OP_BUY;
// расчитываем цены ограничителей
if (StopLoss > 0)
  StopLoss = Bid - StopLoss * Point;
if (TakeProfit > 0) 
  TakeProfit = Bid + TakeProfit * Point;
...
ticket = OrderSend(Symbol(), cmd, Lots, Price_open, SlipPage, StopLoss, TakeProfit, 0, magik);
 

А поясните мне смысл параметра SlipPage. я немного не уловил каким его лучше ставить и что от него зависит

 
scorpionk:

А поясните мне смысл параметра SlipPage. я немного не уловил каким его лучше ставить и что от него зависит


Это проскальзывание в пунктах, при исполнении ордера.

slippage - Максимально допустимое отклонение цены для рыночных ордеров (ордеров на покупку или продажу).

 
Itso:
sashken:

Price_open = NormalizeDouble(Ask, Digits);
cmd = OP_BUY;
// расчитываем цены ограничителей
if (StopLoss > 0)
  StopLoss = Ask - StopLoss * Point;
if (TakeProfit > 0) 
  TakeProfit = Bid + TakeProfit * Point;
...
ticket = OrderSend(Symbol(), cmd, Lots, Price_open, SlipPage, StopLoss, TakeProfit, 0, magik);

Попробуйте так.


Опять неправильно - если покупаем нужно покупать по Ask (что и сделано), но всегда закрываем по Bid. Таким образом код должен быть:

Price_open = NormalizeDouble(Ask, Digits);
cmd = OP_BUY;
// расчитываем цены ограничителей
if (StopLoss > 0)
  StopLoss = Bid - StopLoss * Point;
if (TakeProfit > 0) 
  TakeProfit = Bid + TakeProfit * Point;
...
ticket = OrderSend(Symbol(), cmd, Lots, Price_open, SlipPage, StopLoss, TakeProfit, 0, magik);

Люди, вы чего друг друга путаете? :o
Если покупаем, то всегда по Ask. Это цена открытия позиции. Поэтому и StopLoss будет разницей Ask и заданного количества пунктов:

StopLoss = Ask - StopLoss*Point
 
TakeProfit = Ask + TakeProfit*Point
Для Sell то же самое, только с Bid!!!!

А разница у человека в 5 пунктов - это его спрэд.
 
Scriptong:
Itso:
sashken:

Price_open = NormalizeDouble(Ask, Digits);
cmd = OP_BUY;
// расчитываем цены ограничителей
if (StopLoss > 0)
  StopLoss = Ask - StopLoss * Point;
if (TakeProfit > 0) 
  TakeProfit = Bid + TakeProfit * Point;
...
ticket = OrderSend(Symbol(), cmd, Lots, Price_open, SlipPage, StopLoss, TakeProfit, 0, magik);

Попробуйте так.


Опять неправильно - если покупаем нужно покупать по Ask (что и сделано), но всегда закрываем по Bid. Таким образом код должен быть:

Price_open = NormalizeDouble(Ask, Digits);
cmd = OP_BUY;
// расчитываем цены ограничителей
if (StopLoss > 0)
  StopLoss = Bid - StopLoss * Point;
if (TakeProfit > 0) 
  TakeProfit = Bid + TakeProfit * Point;
...
ticket = OrderSend(Symbol(), cmd, Lots, Price_open, SlipPage, StopLoss, TakeProfit, 0, magik);

Люди, вы чего друг друга путаете? :o
Если покупаем, то всегда по Ask. Это цена открытия позиции. Поэтому и StopLoss будет разницей Ask и заданного количества пунктов:

StopLoss = Ask - StopLoss*Point
 
TakeProfit = Ask + TakeProfit*Point
Для Sell то же самое, только с Bid!!!!

А разница у человека в 5 пунктов - это его спрэд.

Вроде всегда было одно провило. Есть цена открытия, есть цена закрытия. Открылись по одной, а все остальное считаем по другой.
 
StopLoss = Ask - StopLoss*Point
 
TakeProfit = Ask + TakeProfit*Point
так правильно
 
тут просто весь вопрос в том, какой результат он хочет получить. Если его интересует чистая прибыль/убыток в 30 пунктов, то тогда конечно от цены открытия (ASK). А если нужно отсчитывать от текущей цены, то тогда от цены закрытия. Например от неё отсчитывается минимальный уровень стопов
 

Сразу после открытия Профит=-1*Спред. Поэтому, если хотите, что в момент срабатывания тейка или стопа разница в пипсах была именно такая, какая вы задали в параметров, то нужно делать так, как я уже упомянул выше. А если хотите что-нибудь другое, делайте что хотите.

Нужно еще иметь ввиду, что чарт строится по Bid и соответсвенно визуально Ask находиться на 1 спред выше графика - и все закрытия шортов и открытия лонгов тоже вычерчиваются на спред выше.

Причина обращения: