文章 "跨平台智能交易系统: 停止位" - 页 2

 

我想更改主要止损点的止损...我该怎么做?

这就是我正在做的:

COrder *order=orders.At(i);

....

COrderStop *order_stop=order.MainStop();
double new_sl=...;
order_stop.StopLoss(new_sl);
order.MainStop(order_stop);
order.CheckStops();

我为了做这件事真是伤透了脑筋...

Basic Principles - Trading Operations - MetaTrader 5 Help
Basic Principles - Trading Operations - MetaTrader 5 Help
  • www.metatrader5.com
Before you proceed to study the trade functions of the platform, you must have a clear understanding of the basic terms: order, deal and position...
 

没有更新是因为 COrderStopVirtualBase::Update 中进行了检查

if(CheckPointer(m_objsl))
  {
   double sl_line=m_objsl.GetPrice();
   if(sl_line!=StopLoss())
      stoploss= sl_line;
  }

StopLoss() 返回新值,但 sl_line 仍然是旧的...

 
Enrico Lambino:
你好,谢泼、

感谢您指出这些问题。我直到现在才注意到这一点。我会更新代码。

是的,我注意到了。这仍然是由于前向声明造成的。CStop 需要在其方法中使用 COrder 和 COrderStop 实例。当您尝试编译 CStop 时也是如此。所有这些相互需要的类都应该一起编译。如果每个类都单独编译,就会出错。例如

This 将无法编译。您必须声明一个前向声明,这样编译器才能识别 object1 类中的类成员 m_object2:

如果 Object1 和 Object2 位于同一个文件中,则可以这样做。如果它们在两个不同的文件中,那么就需要在 Object1 的类文件中为 Object2 进行正向声明,在 Object2 的类文件中为 Object1 进行正向声明。在为这两个类中的任何一个添加方法之前,情况确实如此。

当前版本的编译器可以识别前向声明,但不能识别前向声明的类中列出的方法。这就是为什么你不会收到类似 "CStop - declaration without type"(CStop-无类型声明)的错误信息,而会收到编译器错误信息的原因,比如你上面发布的方法。编译器能识别类,但不能识别向前声明的类的方法。


你好,恩里科、

感谢您的快速回复。关于前向声明,你说得很对。 我担心这可能是一个更深层次的问题。 使用前向声明类的对象不知道该类的成员,这是有道理的。

我的执行引擎使用的是另一种模式,它使用的是策略模式。 我在使用它的过程中遇到了一些恼人的问题,当我看到你的库时,我发现了这些问题。

你的作品真的很棒,你拥有出色的设计和工程技能,感谢你愿意与我分享。

谢谢,Shep。

 
Shephard Mukachi:

你好,恩里科、

感谢您的快速回复。关于前向声明,你说得很对。 我担心这可能是一个更深层次的问题。 使用前向声明类的对象不知道该类的成员,这是有道理的。

我的执行引擎使用的是另一种模式,它使用的是策略模式。 我在使用它的过程中遇到了一些恼人的问题,当我看到你的库时,我发现了这些问题。

你的作品真的很棒,你拥有出色的设计和工程技能,感谢你愿意与我分享。

谢谢,Shep。

你好,谢泼、

不客气,谢谢你告诉我。我记得在遇到前向声明的问题时,我也有点困惑。

很高兴听到你觉得这些文章很有用。祝你在创建自己的 EA 引擎时一切顺利。

恩里科

 
mbjen:

没有更新是因为 COrderStopVirtualBase::Update 中进行了检查

StopLoss() 返回新值,但 sl_line 仍然是旧值...

COrderStopVirtualBase::Update 的目的实际上与您的意图相反。它的目的是在自己的止损线更新时调整 sl/tp 值,通常是从 EA 外部更新(在图表上拖动或直接在对象属性 窗口中更改值)。对于虚拟止损,请使用 MoveStopLoss() 和 MoveTakeProfit() 方法。

这应该是下一篇文章的内容,但如果您很急切,不妨看看 COrderStopBase 的 CheckTrailing() 方法。它可以在符合追踪条件时修改订单止损。该方法适用于所有三种类型:

bool COrderStopBase::CheckTrailing(void)
  {
   if(!CheckPointer(m_stop) || m_order.IsClosed() || m_order.IsSuspended() || 
      (m_stoploss_closed && m_takeprofit_closed))
      return false;
   double stoploss=0,takeprofit=0;
   string symbol=m_order.Symbol();
   ENUM_ORDER_TYPE type=m_order.OrderType();
   double price=m_order.Price();
   double sl = StopLoss();
   double tp = TakeProfit();
   if(!m_stoploss_closed)
      stoploss=m_stop.CheckTrailing(symbol,type,price,sl,TRAIL_TARGET_STOPLOSS);
   if(!m_takeprofit_closed)
      takeprofit=m_stop.CheckTrailing(symbol,type,price,tp,TRAIL_TARGET_TAKEPROFIT);
   if(!IsStopLossValid(stoploss))
      stoploss=0;
   if(!IsTakeProfitValid(takeprofit))
      takeprofit=0;
   return Modify(stoploss,takeprofit); //<---- this
  }

另外,CTrail 类也可用于更改 sl/tp 水平,而无需检索订单止损的实例(不仅用于追踪或盈亏平衡)。

 

拟议中的跨平台方法离实践和便利有多远。作为其自身的笨重自行车,它没有问题。但为什么要发布呢?即使是初学者,完全自己编写也比研究和掌握这个怪物要容易得多。我不明白。

与这种循环文章相比,MT5 下的 SB 就是优雅的典范。它还可以移植到 MT4 上

Готовые советники из Мастера MQL5 работают в MetaTrader 4
Готовые советники из Мастера MQL5 работают в MetaTrader 4
  • 2017.03.09
  • Stanislav Korotky
  • www.mql5.com
Клиентские терминалы MetaTrader 4 и MetaTrader 5 предоставляют своим пользователям возможность легко создавать прототипы программ на языке MQL с помощью встроенного Мастера (MQL Wizard). Мастера обоих версий терминалов очень похожи, но все же имеют одно важное отличие. В Мастере MetaTrader 5 есть пункт генерации готовых советников, а в...
 

我非常喜欢这篇文章,它让我大开眼界。请写一篇后续文章。我真的很想知道,您将如何利用这一工具进行剥头皮交易。

非常感谢你的这篇文章和其他所有作品。

 
fxsaber:

拟议中的跨平台方法离实践和便利有多远。作为其自身的笨重自行车,它没有问题。但为什么要发布呢?即使是初学者,完全自己编写也比研究和掌握这个怪物要容易得多。我不明白。

与这种循环文章相比,MT5 下的 SB 就是优雅的典范。而且它还移植到了 MT4 上

我完全同意。即使对 OOP 非常熟悉,这位作者的方法也太变态了。过分的地方太多了,代码根本就不是代码,而是一个 "怪物"....。