在 MetaTrader4 EA 的 OrderSend() 中设置止损和止盈的正确方法是什么?



我试图弄清楚在 MQL4 (Metatrader4( 中在 EA 交易中发送订单时,是否有正确的方法来设置止损(SL( 和止盈 (TP( 水平。功能模板为:

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 的变体就有多少变化。到目前为止,我已经遇到了这些。

MetaEditorMQL4 参考中,文档说使用:

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

那么,为买入设置止损和止盈的正确方法是什么?

(使用各种变体的优点或缺点是什么?


编辑: 2018-06-12

除了一些细节,答案其实很简单,虽然不明显。也许是因为MT4只在图表上显示买入价(默认情况下(,而不是同时显示卖出价和买入价。

所以因为:Ask > BidAsk - Bid = Slippage,只要我们知道滑点,我们选择哪个并不重要。然后,根据您在图表上遵循的价格,您可能希望决定使用一个而不是另一个,相应地添加或减去滑点。

因此,当您使用测量工具获取当前显示价格与"精确"SL/TP设置的差时,您需要牢记这一点。

因此,为了避免在上面的代码中放置滑点,我使用了以下内容来OP_BUYTP = ND(Bid + dTP);(OP_SELL则相反。

如果您买入,则OP_BUYAsk,收盘价为Bid
如果您卖出,则OP_SELLBid价格进行操作,并以Ask的价格收盘。

止损和止盈都应至少保持在当前收盘价STOP_LEVEL * Point()距离内(买入Bid卖出,卖出Ask卖出(。

STOP_LEVEL可能为零 - 在这种情况下(当MT4接受订单时(,经纪人可以根据自己的算法拒绝它(条款和条件可能称之为"浮动止损"规则或一些类似的营销"重新装扮"术语(。

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

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

那么为

买入设置止损和止盈的正确方法是什么?

没有"正确的方式"这样的东西,有规则要满足

级别0:语法是满足调用签名(最简单的一个(
级别 1:市场 XTO-s 的所有内容都必须满足当前价格 +/- 滑点的正确水平,确保重复接近 PriceDOMAIN 级别设置的RefreshRates()测试,否则它们会被经纪商方拒绝(在非确定性附加 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

相关内容

最新更新