代码之家  ›  专栏  ›  技术社区  ›  not2qubit

在metatrader4 ea的ordersend()中设置stopLoss和takeProfit的正确方法是什么?

  •  2
  • not2qubit  · 技术社区  · 6 年前

    我想知道是否有 正确方法 设置 停止损耗 (SL)和获利(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);
    

    但是,有很多不同的脚本和ea。到目前为止,我已经遇到了这些。

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

    所以它有各种口味, here , here here

    假设我们对 OP_BUY 如果标志正确,我们可以根据以下条件选择SL和TP值:

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

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

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


    编辑 2018~06-12

    除了一些细节,答案其实很简单,虽然不明显。也许 因为MT4只显示 投标 图表上的价格(默认) 并不是两者兼而有之 投标 .

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

    所以当你使用测量工具 匹普 当前显示的价格与您的“精确”SL/TP设置的差异,您需要记住这一点。

    为了避免在上面的代码中出现错误,我使用了 奥普买特 : TP = ND(Bid + dTP); (与此相反 OP_SELL )

    2 回复  |  直到 6 年前
        1
  •  1
  •   user3666197    6 年前

    如果你买,你 OP_BUY Ask 关闭(SL,TP) Bid
    如果你卖, OP_SELL 手术时间 投标 价格,成交价 .

    SL和TP应至少保持在 STOP_LEVEL * Point() 从当前价格到收盘价的距离( 投标 购买, 出售。

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

    建议发送一个 OrderSend() 使用零值sl和tp请求,并在看到订单已成功发送后对其进行修改。有时它不是必需的,有时甚至是强制性的。

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

        2
  •  0
  •   user3666197    6 年前

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

    没有“正确的方法”,有规则可循

    0级 :语法是满足调用签名(最简单的一个)
    1级 :市场上的所有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