为什么mql4显示错误130当我们使用止损在OrderSend函数



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

代码行为

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

错误编号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

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

int mSLS = MarketInfo(symbol,MODE_STOPLEVEL);

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

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

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

f = 1 for Buy, andf = -1 for Sell

您知道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的一个外部POSITIVE参数,我命名为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的一个外部POSITIVE参数,我命名为tp),我计算订单的获利了结价格(TPP)为

double TPP =  OOP + f * tp * Point;

观察:我不能肯定,但是,根据mql4文件,止损限价和开盘价之间的最小距离规则也适用于获利限价。在这种情况下," t"需要进行检查,类似于上面的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。

值得在EA的测试阶段包含一个警告,当sl被纠正为小于允许的值时,这将允许您增加其值,以便它不会违反止损最小值规则,同时您对其操作的风险有更多的控制。请记住,这句话的意思是:参数定义如果由于资产价格最终在与预期相反的方向上变化太多而导致订单失败,您将损失多少。

希望我能帮上忙!

虽然其他两个答案不一定是错误的(我不会详细介绍它们已经涵盖的内容),但为了完整的回答,它们没有提到对于一些经纪商(特别是ECN经纪商),您必须首先打开订单,而不能设置止损或获利了结。一旦开单,使用OrderModify()设置止损和/或获利。

最新更新