您应该知道存在以点为单位的最小止损大小 (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”参数定义了如果订单失败,您将损失多少,因为资产价格最终在与预期相反的方向上变化太大。
希望能帮到你!