【问题标题】:why mql4 show error 130 when we use Stoploss in OrderSend function为什么当我们在 OrderSend 函数中使用止损时 mql4 显示错误 130
【发布时间】:2021-02-23 07:19:18
【问题描述】:

我正在尝试在 mql4 中创建一个 EA,但是在 OrderSend 函数中,当我使用某个值而不是零时,它会显示 ordersend 错误 130。请帮助解决这个问题

代码行是

          int order = OrderSend("XAUUSD",OP_SELL,0.01,Bid,3,Bid+20*0.01,tp,"",0,0,Red);

【问题讨论】:

  • tp 值错误?此外,对于 XAUUSD,20 美分似乎是一个非常紧的止损点。你很可能会达到停止水平(MODE_STOPLEVEL)。

标签: mql4


【解决方案1】:

错误号 130 表示无效停止。 所以这意味着您使用 ordersend 函数设置的止损有问题。 我建议你这样设置:

int order = OrderSend("XAUUSD",OP_SELL,0.01,Bid,3,Bid+20*Point,tp,"",0,0,Red);

所以你可以使用 Point 而不是硬编码。

并检查错误号是什么意思。我想你可以参考:https://book.mql4.com/appendix/errors

【讨论】:

  • 我还检查了 0.0001 和 0.01 而不是 Point,但没有工作
  • 您必须检查经纪商允许的最低止损水平,并使止损的距离高于该止损水平您可以通过调用 MarketInfo(Symbol(),MODE_STOPLEVEL) 了解止损水平跨度>
【解决方案2】:

您应该知道存在以点为单位的最小止损大小 (mSLS)。 “mSLS”随着货币和经纪人的变化而变化。因此,您需要在 EA 的 OnInit() 过程中放入一个变量来获取它:

int mSLS = MarketInfo(symbol,MODE_STOPLEVEL);

您的订单开仓价 (OOP) 和止损价 (SLP) 的距离(以点为单位)不能小于 mSLS 值。

我将尝试解释我在 EA 中用于开仓订单的通用算法,然后在止损水平上应用约束(在第 3 步):

第 1 步。我为要打开的操作类型引入一个标志 (f),即:

f = 1 表示买入,并且 f = -1 表示卖出

您知道有 mql4 常量 OP_SELL=1 和 OP_BUY=0 (https://docs.mql4.com/constants/tradingconstants/orderproperties)。

定义 f 后,我将操作类型变量设置为

int OP_TYPE =  int(0.5((1+f)*OP_BUY+(1-f)*OP_SELL)); 

当 f=1 时取值 OP_TYPE=OP_BUY,而当 f=-1 时取值 OP_TYPE=OP_SELL。

注意:关于订单的颜色,我将它们放在一个数组中

color COL[2]= {clrBlue,clrRed};

然后,有了 OP_TYPE,我设置了

color COLOR=COL[OP_TYPE];

第 2 步。同样,我将订单开仓价设置为

double OOP =  int(0.5*((1+f)*Ask+(1-f)*Bid));

当 f=1 时取值 OOP=Ask,而当 f=-1 时取值 OOP=Bid。

第 3 步。然后,给定我想要的止损点数(我的 EA 的外部正参数,我命名为 sl),我确保 sl > SLS。换句话说,我检查

if (sl <= mSLS) // I set my sl as the minimum allowed
  {
    sl = 1 + mSLS;
  }

第 4 步。然后我计算订单的止损价格为

double SLP =  OOP - f * sl * Point;

步骤 5. 给定我想要的获利点数(我的 EA 的一个外部正参数,我将其命名为 tp),我计算订单的获利价格 (TPP) 为

double TPP =  OOP + f * tp * Point;

观察: 我不能肯定,但根据 mql4 文档,止损限价和开盘价之间的最小距离规则也适用于止盈限价。在这种情况下,需要进行“tp”检查,类似于上面的 sl 检查。也就是说,在计算 TPP 之前,必须执行下面的控制线

if (tp <= mSLS) // I set my tp as the minimum allowed
  {
    tp = 1 + mSLS;
  }

第 5 步。我要求以给定的手数 (ls) 和操作货币对上的滑点 (slip) 开仓(我从中获得买价和买价)

float ls = 0.01;
int slip = 3; //(pips)

int order = OrderSend(Symbol(),OP_TYPE,ls,OOP,slip,SLP,TPP,"",0,0,COLOR);

请注意,通过这几行代码,很容易构建一个函数,在您的命令下,在您操作的任何货币对中打开任何类型的订单,而不会收到错误消息 130,只向函数传递 3 个参数:f、 sl 和 tp。

当 sl 被修正为小于允许值时,值得在 EA 的测试阶段加入警告,这将允许您增加其值,使其不违反止损最小值规则,同时您可以更好地控制其运营风险。请记住,“sl”参数定义了如果订单失败,您将损失多少,因为资产价格最终在与预期相反的方向上变化太大。

希望能帮到你!

【讨论】:

    【解决方案3】:

    虽然其他两个答案不一定是错误的(我不会重复他们已经介绍过的内容),但为了答案的完整性,他们没有提到对于某些经纪商(特别是 ECN 经纪商),您必须打开您的订单首先,没有设置止损或获利。开单后,使用OrderModify() 设置止损和/或止盈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多