文章 "利用 MQL5 面向对象编程法编写"EA 交易""

 

新文章 利用 MQL5 面向对象编程法编写"EA 交易"已发布:

本文将着重讲述的是面向对象法,将我们曾在"针对初学者以 MQL5 编写"EA 交易"的分步指南"文中谈到的内容落到实处-创建简单的"EA 交易"。 很多人都觉得难,但是,我向您保证,看完本文之后,您就能够编写自己的面向对象 "EA 交易"了。

作者:Samuel

 

总的来说,它还不错,但在遵循名称中使用的 OOP 口号方面有点蹩脚。例如,为什么把止损、止盈和价格放在类之外?STP 和 TKP 应该是成员,我们需要 setSLTP 方法;最新价格和水平应该放在 openBuy/openSell 中考虑。它们本身的写法也很不合理--最好只留下一个带 MarginOK 调用的 if,并在其中添加第一行检查 if(Chk_Margin == 0) return(true);

还有一件小事。为什么 Chk_Margin 被声明为 int-,而只是作为 bool 使用?最好用一个最小的足够类型来描述它,否则在阅读源代码时会有疑问,如果 Chk_Margin == 2、3 等,会发生什么?

 
使用默认输入参数,在指定周期内使用指定货币对,你不可能得到如此漂亮的平衡图表。作者还有其他报价吗?能否附上获得该图表的输入参数?
 
capr:
使用默认输入参数,在指定周期内使用指定货币对,你不可能得到如此漂亮的平衡图表。作者还有其他报价吗?能否附上获得这样图表的输入参数?

你和作者之间的报价应该有多大差异,结果才会大相径庭)))))))。我得到的几乎一样,最终结果甚至更好一些:

 

设计令人费解

   if(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4)
     {
       return(true);
     }
     else
     {
       return(false);
     }
[删除]  
ortv:

设计令人费解

你到底为什么这么不喜欢它?当然,我还没有在代码....。
 
Interesting:
你到底为什么这么不喜欢它?当然,我没有在代码.....。

在这种情况下,你通常不是这样写的吗?

return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4);
[删除]  
ortv:

在这种情况下,他们通常不是这样写的吗?

如果完全照搬代码,并且在处理过程中没有其他问题,就可以这样做...
 

我不明白代码的以下部分:

// 将上一栏(第 1 栏)的收盘价复制到相应的 Expert Advisor 变量中
   Cexpert.setCloseprice(mrate[1].close);  // 栏 1 收盘价
//--- 检查是否有买入头寸
   if (Cexpert.checkBuy()==true)
   {
      if (Buy_opened) 
         {
            Alert("我们已经有了一个购买位置!!"); 
            return;    // 不增加多头头寸
         }
      double aprice = NormalizeDouble(latest_price.ask,_Digits);
      double stl    = NormalizeDouble(latest_price.ask - STP*_Point,_Digits);
      double tkp    = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits);
      int    mdev   = 100;
      // 下订单
      Cexpert.openBuy(ORDER_TYPE_BUY,Lot,aprice,stl,tkp,mdev);
   }
如果我们要建立一个买入头寸,我们应该关注 latest_price.ask 价格,但在为该头寸设置止损和止盈时,我们应该关注 latest_price.bid 价格。这样做对吗?为什么在代码文本中,止损和止盈都是根据卖出价设置的?是打印错误还是特定策略的特殊性(代码中也有类似的卖出建仓 结构)?
[删除]  
Yedelkin:

我不明白代码的以下部分:

如果我们要建立一个买入头寸,我们应该关注 latest_price.ask 价格,但在为该头寸设置止损和止盈时,我们应该关注 latest_price.bid 价格。这是否正确?那为什么在代码文本中,止损和止盈都是根据卖出价设置的?是印错了还是特定策略的特殊性(代码中的卖出建仓结构类似)?

逻辑是这样的(可能吧,我通常也这么用):

1.买入的开仓价 被认为是卖出价(这是正确的);

比方说,我们以 EURUSD 的 1.27 开仓。

2.2. 开仓时,我们获得的差价等于点差,买入时为卖出价-买入价(如果我们以当前价格平仓,则可能出现亏损);

假设点差等于 5 点。因此,开仓时的买入价为 1.2695(对吗?)

3.多头以买入价平仓(这很符合逻辑)。

因此,当买入价升至 1.27 时,我们将获得一个 BU 头寸(对吗?)

4.但我们也需要获得利润(标准报价为 100 点)。

也就是说,TP 应该比 Open 高 100 点。我们的情况是 1.28(对吗?)

同时,如果 Bid(而非 Ask)达到 1.28....,TP 将被触发。

5.还需要设置 SL(假设为 50 点)。因此,在我们的例子中,它将位于 1.2650(比开盘价低 50 个点)。

在什么情况下 SL 起作用?

从逻辑上讲,当价格越过这对我们不利的 50 个点时,它就应该起作用(也就是说,SL 的收盘价从逻辑上讲应该是 1.2650)。

在这种情况下,买入价应该在哪里?此时它将位于 1.2645(因为 Spred 的条件是我们有 5 个点)。

记住多头是固定的。

6.现在让我们看看实际发生的情况(以 MQL4 中的多头开盘为例)。

//Взято из справки по OrderSend
 ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-25*Point,Ask+25*Point);

我们可以看到

开盘价被视为 Ask,SL 被视为 Bid,TP 被视为 Ask。

在我们的案例中,我们将得到这种模式。

OrderSend(Symbol(),OP_BUY,1,Open = Ask,3,SL = Bid-50*Point,TP Ask+100*Point);

让我们在这里替换我们的数据:

OrderSend(Symbol(),OP_BUY,1,1.2700,3,1.2695-50*Point,TP 1.2700+100*Point);

最终结果 - 开仓价 = 1.2700 SL= 1.2645 TP 1.28

PS

让我们与原始数据进行比较:

订单 - Open = 1.2700 SL= 1.2645 TP 1.28

模型 - 开仓 = 1.2700 SL= 1.2645 TP 1.28

 
Interesting:

这里有这样一种逻辑(很有可能,我也倾向于使用这种逻辑):

1.买入的开盘价 被认为是卖出价(这是正确的);

假设欧元兑美元开盘价为 1.27

2.开仓时,我们获得的差价等于点差,买入时为卖出价-买入价(如果我们以当前价格平仓,则可能出现亏损);

假设点差等于 5 点。因此,开仓时的买入价为 1.2695(对吗?)

5.还应设置止损点(假设为 50 点)。因此,在我们的示例中,它将位于 1.2650(比开盘价低 50 个点)

在什么情况下会触发止损?

从逻辑上讲,当价格超过对我们不利的这 50 个点时,它就会起作用(即,从逻辑上讲,SL 的收盘价应为 1.2650)。

在这种情况下,买入价应该在哪里?此时,它将位于 1.2645(因为 Spred 的条件是我们有 5 个点)。

记住,多头是固定的。

如果开盘时的买入价是 1.2695,那么我们已经自动损失了 5 个点。如果同时根据开发者的想法,止损点为 50 点,那么在触发止损之前,我们还有 45 点的时间向不利方向移动。也就是说,当触发止损时,买入价不应在 1.2645,而应在 1.2650;卖出价应在 1.2655。