文章 "MQL5 简介:如何编写简单的EA 交易和自定义指标" - 页 3

 

问题 4:文章内容如下:

......让我们在请求 结构中加入在本程序中调用OrderSend 函数的大多数情况下常见的值:

   request.symbol      =Symbol();
   request.volume      =Lots;
   request.tp          =0;
   request.deviation   =0;
   request.type_filling=ORDER_FILLING_AON;

request.symbol 元素包含执行交易操作的工具的符号名称,request . volume 元素包含金融工具合约的价值,request.tp 元素 包含止盈价格(在某些情况下,订单的止盈值未指定,因此我们在request.tp 结构元素中输入 0)....。

但为什么我们要在 request.tp 结构元素中输入 0 呢?因为如果我们有一个挂单 买入,request.tp=0 就意味着 TP 将始终低于当前买入价。在我看来,具有这样一个 TP 值的订单要么会因为 TP 参数值指定错误而被拒绝,要么会在服务器接受该订单后立即以当前买入价执行。

 

问题 5:文章内容如下:

...让我们指定在OnTick 函数 中使用的局部变量 及其类型:

double h[], l[], ma[], atr_h[], atr_l[],
          lev_h, lev_l, StopLoss,
          StopLevel=_Point*SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL),
          Spread   =NormalizeDouble(SymbolInfoDouble(Symbol(),SYMBOL_ASK) - SymbolInfoDouble(Symbol(),SYMBOL_BID),_Digits);

... StopLevel 变量用于存储 STOP_LEVEL 值--从当前价格到下单的最小距离(价格单位)。该值是点价(预定义变量_Point)与 STOP_LEVEL 值(以点为单位)的乘积。SymbolInfoInteger 函数返回 STOP_LEVEL 值。该函数的第一个参数是仪器的符号名称,第二个参数是所请求属性的标识符....。

MQL5 参考手册》还指出:"SYMBOL_TRADE_STOPS_LEVEL 是用于设置止损订单的当前收盘价的最小保证金(以点为单位)"。在我看来,这两种情况都需要满足不等式

ORDER_PRICE_CURRENT-request.price>=SYMBOL_TRADE_STOPS_LEVEL(如果是卖出止损订单)。

那么,为什么 Expert Advisor 代码要检查 Bid(Ask)和 StopLoss 之间的距离是否超过最小 StopLevel 缩进值?

               ...// 新的 StopLoss 是否不接近当前价格?
               && NormalizeDouble(SymbolInfoDouble(Symbol(),SYMBOL_BID)-StopLoss-StopLevel,_Digits)>0
               
               ...// 新的 StopLoss 是否不接近当前价格?
               && NormalizeDouble(StopLoss-SymbolInfoDouble(Symbol(),SYMBOL_ASK)-StopLevel,_Digits)>0

是在所有情况下都有必要进行这样的检查,还是在执行特定策略时才会出现这种情况?简而言之,在下挂单时,我是否应该总是检查买入价(卖出价)和止损之间的距离,以查看是否超出了最小止损线幅度?

 
Yedelkin:

但为什么我们要在 request.tp 结构元素中填 0 呢?因为如果我们有一个挂单 买入订单 ,那么 request.tp=0 意味着 TP 将始终低于当前 买入价。而且,在我看来,具有这样一个 TP 值的订单要么会因 TP 参数指定错误而被拒绝,要么会在服务器接受该订单后立即以当前买入价执行。
零意味着没有 TP。
 
Yedelkin:

简而言之,在下挂单时,我是否应该总是检查买入价(卖出价)和止损之间的距离,以查看是否超出了最低止损水平保证金?

当您在非常接近市场的位置设置订单时,有必要检查挂单的止损/止赢/入市价格水平是否达到最低 保证金。

如果您在合理和远离市场的模式下(几十或几百个点)使用止损或挂单,则可以跳过此类检查。

 
Renat:

当您在非常接近市场的情况下设置订单时,应始终检查挂单的 SL/TP/入市价格水平是否为最小缩进。

澄清问题 5.1。

我让 Expert Advisor 为每个挂单计算三个水平: 进入价格/SL/TP。

由于事先不知道入市价格水平与当前市场价格的距离,因此检查入市价格水平是否符合最低保证金 不会产生任何问题。

但是,我们应该对照什么水平来检查其余两个 SL/TP 水平呢?检查相对于当前市场价格的 SL/TP 水平有点不合逻辑,因为入市价格水平可能离当前市场价格很远,这样的检查就失去了意义。这就是为什么我在 Expert Advisor 中提供了|Entry price-TP(SL)|>SYMBOL_TRADE_STOPS_LEVEL 这一检查条件。一般来说,Expert Advisor 在这种条件下工作正常,但当我开始优化 EA 代码时,我想知道从服务器处理挂单的角度来看,这种检查是否必要。EA 代码不会因为检查该条件而超载(EA 策略本身不需要这样的检查)。

换句话说,具有三个进入价格/SL/TP 水平的挂单是否应始终检查最低保证金的 SL/TP 水平?如果是,是否应检查哪个水平(价格)的最低保证金?

 

我的帖子缺少编辑功能。所以我在这里补充一下:

= 对于每个挂单,"智能交易系统 "会独立计算三个级别:入市价格/SL/TP。不追求 "设置 更接近市场的挂单"的目的。 =

 

挂单水平中的 SL 和 TP 是根据入市价格评估的,因此它们不会低于最低水平。

在 MT4 中也是如此。

 
Renat:

挂单水平中的止损价和止盈价会从入市价开始评估,以便至少与入市价相差一个最低水平。

在 MT4 中也是如此。

好了,现在我都明白了。因此,我无法让 EA 代码变得更简单;最初,一切都按照文章的要求进行,即正确无误。

而且我不熟悉 MT4,所以这些问题都是 "傻瓜 "提出的。谢谢!

 
Renat:

......当需要在非常接近市场的位置设置订单时,请务必检查挂单的最小缩进幅度(SL/TP/Entry price level)。

......挂单水平中的 SL 和 TP 是根据入市价格估算的,因此它们与入市价格的距离不会小于最小水平。

问题 6:在下 挂单时, 检查最小缩进量是明确的。现在我们有一个问题,即在修改 未结头寸的 TP/SL,检查最小保证金的特殊性。

情况: 未结头寸有一个固定 TP 和一个 "上拉 "SL,当价格向有利方向移动时,SL 接近固定 TP。与设置挂单 类似,每次 Expert Advisor 发出修改未结头寸 TP/SL 的指令时,都会检查 TP 和 SL 水平的最小缩进量。

但在CTrade 类的 PositionModify 函数描述中,规定 tp 参数为 "将触发止盈的新价格(如果不需要更改,则为之前的值)"。

因此,问题是:如果不需要更改之前设置的止盈水平,在发送订单修改未结头寸的止盈/止损时,是否需要检查该止盈水平与当前(实际)价格的最小差额?或者在这种情况下,只检查与修改的 SL 有关的最低保证金是否足够?

换句话说,在发送修改未平仓头寸的 TP/SL 的指令时,如果 TP 水平在之前已经设定,并且不会改变,是否可以不检查与 TP 有关的最小保证金? 在修改指令中只需指定之前的 TP 值?

 

下载 "indicator_TP_en.mql5 "文件后,请将其重命名为 "indicator_TP.mql5"。