【问题标题】:What is the correct way to set StopLoss and TakeProfit in OrderSend() in MetaTrader4 EA?在 MetaTrader4 EA 的 OrderSend() 中设置止损和止盈的正确方法是什么?
【发布时间】:2018-06-07 16:26:04
【问题描述】:

我正在尝试确定在发送订单时是否有正确的方法来设置止损 (SL) 和止盈 (TP) 水平在Expert Advisor 中,在 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);

但是,有多少脚本和 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); 

在“相同”文档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

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

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


编辑:2018-06-12

除了一些细节,答案其实很简单,虽然不是很明显。或许因为 MT4 仅在图表上显示 Bid 价格(默认),而不是同时显示 AskBid

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

因此,当您使用测量工具获取当前显示价格与“准确”止损/止盈设置之间的差异时,您需要牢记这一点。

因此,为了避免在上面的代码中添加 Slippage,我对 OP_BUY 使用了以下内容:TP = ND(Bid + dTP);(而 OP_SELL 则相反.)

【问题讨论】:

    标签: mql4 algorithmic-trading metatrader4


    【解决方案1】:

    如果您买入,您OP_BUYAsk 并在Bid 关闭(止损、止盈)。
    如果您卖出,OP_SELL 操作以Bid 价格进行,并以Ask 收盘。

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

    STOP_LEVEL 可能为零 - 在这种情况下(而 MT4 接受订单)经纪人可能会根据自己的算法拒绝它(条款和条件可能将其称为“浮动止损水平”规则或类似规则营销明智的“重新打扮”术语)。

    建议发送OrderSend()请求,止损和止盈为零,看到订单发送成功后修改。有时不需要,有时甚至是强制性的。

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

    【讨论】:

      【解决方案2】:

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

      没有“正确的方式”之类的东西,有规则要满足

      Level 0:语法是满足呼号(最简单的一种)
      Level 1:所有在Market XTO-s都必须满足权当前价格 +/- 滑点的水平,确保重复 RefreshRates()-测试接近 PriceDOMAIN 水平设置,否则它们会被经纪人方面拒绝(在非确定性附加组件中阻止交易引擎RTT-延迟) + GetLastError() == 129 | ERR_INVALID_PRICE

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

      一些经纪商由于其 T&C 不允许某些 XTO 情况,因此请谨慎阅读此类条件。他们的任何一条规则,如果违反,将导致您的 XTO 指令被合法拒绝,并产生所有不利影响,如上所述。检查所有规则,因为您不希望看到以下任何错误状态+任何其他错误状态,受您的经纪人的 T&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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-17
        • 2022-08-20
        • 2016-02-27
        • 1970-01-01
        • 1970-01-01
        • 2022-11-08
        相关资源
        最近更新 更多