Как правильно установить StopLoss и TakeProfit в OrderSend() в советнике MetaTrader4?

Я пытаюсь выяснить, существует ли правильный способ установки уровней Stop Loss (SL) и Take Profit (TP) при отправке ордера в < em>Советник на языке MQL4 (Metatrader4). Функциональный шаблон:

OrderSend( symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color);

Поэтому, естественно, я попытался сделать следующее:

double dSL = Point*MM_SL;
double dTP = Point*MM_TP;

if (buy)  { cmd = OP_BUY;  price = Ask; SL = ND(Bid - dSL);  TP = ND(Ask + dTP); }
if (sell) { cmd = OP_SELL; price = Bid; SL = ND(Ask + dSL);  TP = ND(Bid - dTP); }

ticket = OrderSend(SYM, cmd, LOTS, price, SLIP, SL, TP, comment, magic, 0, Blue);

Однако вариаций столько же, сколько скриптов и советников. Пока я сталкивался с такими.

В Справочнике MQL4 в MetaEditor в документации сказано использовать:

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,
  NormalizeDouble(Bid - StopLoss*Point,Digits),
  NormalizeDouble(Ask + TakeProfit*Point,Digits), 
  "My order #2",3,D'2005.10.10 12:30',Red); 

В то время как в "той же" документации онлайн используются:

double stoploss = NormalizeDouble(Bid - minstoplevel*Point,Digits);
double takeprofit = NormalizeDouble(Bid + minstoplevel*Point,Digits);
int ticket=OrderSend(Symbol(),OP_BUY,1,price,3,stoploss,takeprofit,"My order",16384,0,clrGreen);

И так далее с разными вариантами, здесь, здесь и здесь...

Предполагая, что нас интересует OP_BUY и у нас правильные знаки, у нас есть варианты для определения наших значений SL и TP на:

bid, bid 
bid, ask
ask, ask
ask, bid

Так как же правильно установить SL и TP для ПОКУПКИ?

(Каковы преимущества или недостатки использования различных вариантов?)


РЕДАКТИРОВАНИЕ: 2018-06-12

Помимо нескольких деталей, ответ на самом деле довольно прост, хотя и не очевиден. Возможно, потому что MT4 показывает на графике только цены Bid (по умолчанию), а не одновременно Ask и Bid.

Итак, потому что: Ask > Bid и Ask - Bid = Slippage не имеет значения, что мы выбираем, пока мы знаем о проскальзывании. Затем, в зависимости от того, за какой ценой вы следите на графике, вы можете принять решение об использовании одного над другим, соответственно добавляя или вычитая проскальзывание.

Поэтому, когда вы используете инструмент измерения, чтобы получить разницу пипсов между текущими отображаемыми ценами и вашими «точными» настройками SL/TP, вы должны помнить об этом.

Поэтому, чтобы не добавлять проскальзывание в приведенный выше код, я использовал для OP_BUY следующее: TP = ND(Bid + dTP); (и наоборот для OP_SELL).


person not2qubit    schedule 07.06.2018    source источник


Ответы (2)


Если вы покупаете, вы OP_BUY по Ask и закрываете (SL, TP) по Bid.
Если вы продаете, OP_SELL операция совершается по цене Bid и закрывается по цене Ask.

И SL, и TP должны оставаться на расстоянии не менее STOP_LEVEL * Point() от текущей цены до закрытия (Bid для покупки, Ask для продажи).

Возможно, что STOP_LEVEL равно нулю - в таких случаях (пока MT4 принимает ордер) Брокер может отклонить его, основываясь на своих собственных алгоритмах (Правила и условия могут называть это правилом "плавающего стоп-уровня" или каким-то подобным маркетинговым "регламентом"). «одетый» термин).

Рекомендуется отправить запрос OrderSend() с нулевыми значениями SL и TP и модифицировать его после того, как вы увидите, что ордер был успешно отправлен. Иногда это не требуется, иногда даже обязательно.

Между двумя ссылками, которые вы нам дали, нет никакой разницы: вы можете вычислить SL и TP и затем передать их в функцию или вычислить их на основе OrderOpenPrice() +/- distance * Point().

person Daniel Kniaz    schedule 07.06.2018

Так как же правильно установить SL и TP для ПОКУПКИ?

Нет такого понятия, как «Правильный путь», есть правила, которым нужно следовать.

Уровень 0: синтаксис должен соответствовать позывному (самый простой)
Уровень 1: все XTO на рынке должны соответствовать правильному уровню текущая цена +/- проскальзывание, обязательно повторите RefreshRates()-тест как можно ближе к настройкам уровней PriceDOMAIN, иначе они будут отклонены со стороны брокера (блокировка торгового движка при недетерминированном дополнении RTT-латентность) + GetLastError() == 129 | ERR_INVALID_PRICE

Уровень 2: еще одно правило устанавливается со стороны брокера в соответствующем определении услуги/продукта в [Торговых условиях]. Если чей-то OrderSend()-запрос не соответствует ни одному из этих требований, XTO снова будет отклонен с теми же неблагоприятными блокирующими эффектами, что и на уровне 1.

Некоторые Брокеры не разрешают некоторые ситуации XTO из-за своих Условий, поэтому внимательно перечитайте такие условия. Любое их правило, если оно будет нарушено, приведет к юридическому отклонению вашей XTO-инструкции со всеми неблагоприятными последствиями, как указано выше. Проверьте все правила, так как вам не понравится любое из следующих состояний ошибки + любое другое, ограниченное условиями вашего Брокера:

ERR_LONG_POSITIONS_ONLY_ALLOWED  Buy orders only allowed 
ERR_TRADE_TOO_MANY_ORDERS        The amount of open and pending orders has reached the limit set by the broker
ERR_TRADE_HEDGE_PROHIBITED       An attempt to open an order opposite to the existing one when hedging is disabled
ERR_TRADE_PROHIBITED_BY_FIFO     An attempt to close an order contravening the FIFO rule
ERR_INVALID_STOPS                Invalid stops
ERR_INVALID_TRADE_VOLUME         Invalid trade volume
...
..
.
#ASSUME NOTHING                ; Is the best & safest design-side (self)-directive
person user3666197    schedule 07.06.2018