总的来说,它还不错,但在遵循名称中使用的 OOP 口号方面有点蹩脚。例如,为什么把止损、止盈和价格放在类之外?STP 和 TKP 应该是成员,我们需要 setSLTP 方法;最新价格和水平应该放在 openBuy/openSell 中考虑。它们本身的写法也很不合理--最好只留下一个带 MarginOK 调用的 if,并在其中添加第一行检查 if(Chk_Margin == 0) return(true);
还有一件小事。为什么 Chk_Margin 被声明为 int-,而只是作为 bool 使用?最好用一个最小的足够类型来描述它,否则在阅读源代码时会有疑问,如果 Chk_Margin == 2、3 等,会发生什么?
设计令人费解
if(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4) { return(true); } else { return(false); }
设计令人费解
你到底为什么这么不喜欢它?当然,我没有在代码.....。
在这种情况下,你通常不是这样写的吗?
return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4);
在这种情况下,他们通常不是这样写的吗?
我不明白代码的以下部分:
// 将上一栏(第 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 价格。这样做对吗?为什么在代码文本中,止损和止盈都是根据卖出价设置的?是打印错误还是特定策略的特殊性(代码中也有类似的卖出建仓 结构)?
我不明白代码的以下部分:
如果我们要建立一个买入头寸,我们应该关注 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
这里有这样一种逻辑(很有可能,我也倾向于使用这种逻辑):
1.买入的开盘价 被认为是卖出价(这是正确的);
假设欧元兑美元开盘价为 1.27
2.开仓时,我们获得的差价等于点差,买入时为卖出价-买入价(如果我们以当前价格平仓,则可能出现亏损);
假设点差等于 5 点。因此,开仓时的买入价为 1.2695(对吗?)
5.还应设置止损点(假设为 50 点)。因此,在我们的示例中,它将位于 1.2650(比开盘价低 50 个点)
在什么情况下会触发止损?
从逻辑上讲,当价格超过对我们不利的这 50 个点时,它就会起作用(即,从逻辑上讲,SL 的收盘价应为 1.2650)。
在这种情况下,买入价应该在哪里?此时,它将位于 1.2645(因为 Spred 的条件是我们有 5 个点)。
记住,多头是固定的。
新文章 利用 MQL5 面向对象编程法编写"EA 交易"已发布:
本文将着重讲述的是面向对象法,将我们曾在"针对初学者以 MQL5 编写"EA 交易"的分步指南"文中谈到的内容落到实处-创建简单的"EA 交易"。 很多人都觉得难,但是,我向您保证,看完本文之后,您就能够编写自己的面向对象 "EA 交易"了。
作者:Samuel