在MetaTrader4 EA的OrderSend()中设置StopLoss和TakeProfit的正确方法是什么?

时间:2018-06-07 16:26:04

标签: mql4 algorithmic-trading metatrader4

我在发送时试图确定是否有正确的方式设置止损(SL)和获利(TP)级别MQL4(Metatrader4)中 EA交易中的订单。功能模板是:

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

然而,存在与脚本和EA一样多的变体。到目前为止,我遇到过这些。

MetaEditor 中的 MQL4参考中,文档说要使用:

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

在"同一"文档online,他们使用:

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

所以它继续有各种风格,hereherehere ......

假设我们对OP_BUY感兴趣并且标志正确,我们可以选择基于SL和TP值:

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

那么为买入设置SL和TP的正确方法是什么?

(使用各种变化有哪些优点或缺点?)

编辑:2018-06-12

除了一些细节,答案其实很简单,虽然不是很明显。也许因为MT4仅在图表上显示出价价格(默认情况下),而不是询问出价。< / p>

因为:Ask > BidAsk - Bid = Slippage,只要我们了解滑点,我们选择的并不重要。然后,根据您在图表上跟随的价格,您可能希望决定使用其中一个,相应地增加或减少滑点。

因此,当您使用度量工具获取当前显示价格的 Pip 差异时,与您的&#34;确切的&#34; SL / TP设置,你需要记住这一点。

为了避免将Slippage放在上面的代码中,我使用了以下内容 OP_BUY TP = ND(Bid + dTP);(与 {{1相反}} 。)

2 个答案:

答案 0 :(得分:1)

如果您购买,则在OP_BUY Ask 并在Bid关闭(SL,TP)。
如果您销售, OP_SELL 操作以Bid价格进行,并在Ask结束。

SL和TP应至少保持在距离当前价格STOP_LEVEL * Point()的距离内(买入Bid,卖出Ask)。

STOP_LEVEL可能为零 - 在这种情况下(当MT4接受订单时)经纪人可以根据自己的算法拒绝它(条款和条件可以称之为&#34;浮动Stoplevel& #34;规则或类似的营销方式&#34;重新打扮的术语)。

建议发送一个OrderSend()请求,其中包含SL和TP的零值,并在看到订单成功发送后进行修改。有时它不是必需的,有时甚至是强制性的。

您给我们的两个链接没有区别:您可以计算SL和TP,然后将它们传递给函数或根据OrderOpenPrice() +/- distance * Point()计算它们。

答案 1 :(得分:0)

  

那么为买入设置SL和TP的正确方法是什么?

没有“正确的方式”这样的东西,有规则可以满足

等级0 :语法是满足呼号(最简单的一种)
等级1 :所有在市场XTO-s必须达到当前价格+/-滑点的正确水平,确保重复RefreshRates() - 测试接近PriceDOMAIN水平设置,否则他们会被经纪人拒绝(以非确定性的附加RTT延迟阻止一个人的交易引擎)+ GetLastError() == 129 |的 ERR_INVALID_PRICE

等级2 :在[交易条款和条件]的相应服务/产品定义中,另一个规则从经纪人方面设置。如果一个人的 OrderSend() - 请求未能满足其中任何一个,则XTO将被拒绝,具有相同的不利阻止效果,如第1级所述。

某些经纪人由于他们的T&amp; C而不允许某些XTO情况,因此应仔细阅读这些条件。如上所述,如果违反,他们的任何一条规则将导致您的XTO指令被法律拒绝,并产生所有不利影响。检查所有规则,因为您不希望看到以下任何错误状态+任何其他错误状态,受到您的经纪商T&amp; C的限制:

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