Как правильно установить StopLoss и TakeProfit в OrderSend () в советнике MetaTrader4? - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь выяснить, существует ли правильный способ для установки уровней Stop Loss (SL) и Take Profit (TP) при отправке ордера в Советник , на 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 Reference в 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 показывает только 1053 * Bid цены на графике (по умолчанию) , а не оба Ask и Bid .

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

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

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

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

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

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

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

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

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

0 голосов
/ 07 июня 2018

Так, как правильно установить SL и TP для покупки?

Там нет такой вещи, как "Правильный путь", тамправила для удовлетворения

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

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

Некоторые брокеры делают этоНе допускайте возникновения ситуаций XTO из-за их T & C, поэтому перечитайте такие условия с должной осторожностью.Любое одно из их правил, в случае нарушения, приведет к тому, что ваша инструкция 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...