文章 "跨平台的EA交易: 信号" - 页 3

 
Karl Klang:

你好,恩里科、

我现在找到了一种处理计算功能的方法,其中包括滞后功能,当 MA 和 TEMA 指标交叉时,该功能似乎可以起作用。

但是,我在订单管理器中遇到了一个问题。在优化过程中,当我运行策略测试器进行一些循环时,就会出现这个问题。最初的循环运行正常,但循环几次后,每根蜡烛线都会下单。

这里运行正常:


但在这里,订单管理器开始下多个订单:


当我调试 COrderManager 的以下代码部分时,语句 orders_total = OrdersTotal(); 工作时变为 1,但失败时变为 0,这导致 if 条件 m_max_order>orders_total 始终评估为 true。

希望您能帮助解决这个问题。

最诚挚的问候/
卡尔

你好,卡尔、

我以前从未遇到过这个问题。OrdersTotal() 方法只是计算活动订单对象的数量。如果编码策略有问题,就必须纠正。如果没有,那么一定是在如何管理(创建/销毁)和/或如何计算 COrder 实例方面出了问题。一旦发现这个问题,我会立即通知你。

 

你好,恩里科、

谷歌搜索 mt5 OrdersTotal() 问题,发现其他人也有同样的问题。例如策略测试器,也许能重现同样的问题。专家集也已上传,因此您可以使用与我相同的输入运行策略测试器。

致以最诚挚的问候/
卡尔

How to use the OrdersTotal() correctly?
How to use the OrdersTotal() correctly?
  • 2010.09.09
  • www.mql5.com
I tried many times to check OrdersTotal(), but I found it did not work...
 
Karl Klang:

你好,恩里科、

谷歌搜索 mt5 OrdersTotal() 问题,发现其他人也有同样的问题。例如策略测试器,也许能重现同样的问题。专家集也已上传,因此您可以使用与我相同的输入运行策略测试器。

最诚挚的问候/
卡尔

感谢您提供的文件,卡尔。我遇到了你描述的问题。

在主包含文件中,将以下内容(OnInit):

file.Open(savefile,FILE_READ);
if(!experts.Load(file.Handle()))
   return(INIT_FAILED);
file.Close();

改为

#ifdef __MQL5__
if (!(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION)))
#else
if (!(IsTesting() || IsOptimization()))
#endif
{
   file.Open(savefile,FILE_READ);
   if(!experts.Load(file.Handle()))
      return(INIT_FAILED);
   file.Close();
}


和 this (OnDeinit):

file.Open(savefile,FILE_WRITE);
experts.OnDeinit(reason,file.Handle());
file.Close();

改为 this:

#ifdef __MQL5__
if (!(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION)))
#else
if (!(IsTesting() || IsOptimization()))
#endif
{
  file.Open(savefile,FILE_WRITE);
  experts.OnDeinit(reason,file.Handle());
  file.Close();
}

由于某种原因,以前会话中保存的数据会被重新加载到以后的会话中。这就是为什么只有在初始回溯测试后才会出现问题,有时还会出现内存泄漏。根据我的测试,这个问题似乎只存在于净额结算模式,而不存在于 MT4 或 MT5 对冲模式。但如果您继续遇到这个问题,请告诉我。上述代码可防止在回溯测试和优化过程中加载和保存数据(我在写最后一篇文章时忽略了这一点)。

 

另外,关于 MT5 中的 OrdersTotal(),它只计算挂单(不等同于 MT4 的 OrdersTotal)。TradeOpen 中订单管理器的代码使用了类的 OrdersTotal() 方法:

bool COrderManager::TradeOpen(const string symbol,ENUM_ORDER_TYPE type,double price,bool in_points=true)
  {
   bool ret=false;
   double lotsize=0.0;
   int trades_total =TradesTotal();
   int orders_total = OrdersTotal();

中的代码使用了 OrdersTotal() 方法,该方法只是 COrders 方法(同名)的封装。COrders 扩展了 CArrayObj,因此它并没有真正使用 MT5 本地OrdersTotal() 函数。上述方法也等同于使用:

int orders_total = this.OrdersTotal();

另一方面,如果我们使用

int orders_total = ::OrdersTotal();

则会明确调用 MT5 本地函数。您可能已经对此有所了解,但为了以防万一,还是要为遇到类似问题的其他人提供帮助。

 

谢谢你,恩里科。问题消失了。

/卡尔

 
Enrico Lambino:
#ifdef __MQL5__
if (!(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION))) // MQL4 代码,而不仅仅是 MQL5。
#else
if (!(IsTesting() || IsOptimization()))
#endif
MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION) == MQLInfoInteger(MQL_TESTER)
 
fxsaber:
我明白了。是的,你说得对。
 

你好,恩里科、

在 Github 的 iceron/MQLx 中,有关于 m_new_signal 和 m_new_signal_close 的更改通知。

m_signal_new 可以通过 void CSignalsBase::NewSignal(const bool value) 方法更改,但没有可用的方法来更改 m_new_signal_close。

请详细说明 m_new_signal 和 m_new_signal_close 的用法。

   if(m_invert)
     {
      CSignal::SignalInvert(m_signal_open);
      CSignal::SignalInvert(m_signal_close);
     }
   if(m_new_signal)
     {
      if(m_signal_open==m_signal_open_last)
         m_signal_open = CMD_NEUTRAL;      
     }
   if(m_new_signal_close)
     {
      if(m_signal_close==m_signal_close_last)
         m_signal_close = CMD_NEUTRAL;      
     }

致以最诚挚的问候

卡尔

iceron - Overview
iceron - Overview
  • github.com
Sign up for your own profile on GitHub, the best place to host code, manage projects, and build software alongside 36 million developers. Sign up
 

这些方法是否适用于您的 MT5Bridge?

 

各位大师,你们好!

我在理解以下属于 SignalAC 类的 Mql 信号代码中的 "蜡烛计数"(第一、第二、第三 = idx,idx++,......)时遇到了严重问题。

有没有人可以帮助我在向下移动 代码时穿透 idx 数字?

在此先表示感谢。

//+------------------------------------------------------------------+
//| "投票 "认为价格会增长。|
//+------------------------------------------------------------------+
int CSignalAC::LongCondition(void)
  {
   int result=0;
   int idx   =StartIndex();
//--- if the first analyzed bar is "red", don't "vote" for buying
   if(DiffAC(idx++)<0.0)
      return(result);
//----第一个分析柱为 "绿色"(指标不反对买入)
   if(IS_PATTERN_USAGE(0))
      result=m_pattern_0;
//--- 如果第二个分析柱为 "红色",则不具备买入条件
   if(DiffAC(idx)<0.0)
      return(result);
//--- 第二根分析柱为 "绿色"(可能满足买入条件)
//--- 如果分析的第二个条形图小于零,我们需要分析第三个条形图
   if(AC(idx++)<0.0)
     {
      //--- 如果第三个分析柱为 "红色",则不具备买入条件
      if(DiffAC(idx++)<0.0)
         return(result);
     }
//--- 购买有条件
   if(IS_PATTERN_USAGE(1))
      result=m_pattern_1;
//--- 如果之前分析的条形图为 "红色",则买入条件刚刚满足
   if(IS_PATTERN_USAGE(2) && DiffAC(idx)<0.0)
      result=m_pattern_2;
//--- 返回结果
   return(result);
  }