文章 "跨平台智能交易系统: CExpertAdvisor 和 CExpertAdvisors 类" - 页 2

 


52959000 undeleted objects left

6619875 objects of type CExpertAdvisor left

6619875 objects of type CAccountInfo left

6619875 objects of type CSymbolManager left

6619875 objects of type COrderManager left

13239750 objects of type COrders left

6619875 objects of type CTradeManager left

6619875 objects of type CCandleManager left

1689399848 bytes of leaked memory


如何修复这些错误?程序是根据您的示例设计的。

在 OnDeinit()函数 中,我只有 experts.OnDeinit()。

在 OnInit() 函数中只有 experts.OnTick();

而在信号函数中,我只是以与您的示例相同的方式创建自定义指标对象。

 
mbjen:


52959000 undeleted objects left

6619875 objects of type CExpertAdvisor left

6619875 objects of type CAccountInfo left

6619875 objects of type CSymbolManager left

6619875 objects of type COrderManager left

13239750 objects of type COrders left

6619875 objects of type CTradeManager left

6619875 objects of type CCandleManager left

1689399848 bytes of leaked memory


如何修复这些错误?程序是根据您的示例设计的。

在 OnDeinit()函数 中,我只有 experts.OnDeinit()。

在 OnInit() 函数中只有 experts.OnTick();

而在信号函数中,我只是以与您的示例相同的方式创建了自定义指标对象。


没关系,是我的错

 

如果您不介意的话,让我报告另一个可能的错误。

它没有返回未结订单数。我开始检查,发现问题与 OrdersBase 和排序模式有关。

我不得不添加以下代码:

COrder *COrdersBase::NewOrder(const ulong ticket,const string symbol,const int magic,const ENUM_ORDER_TYPE type,const double volume,const double price)
  {
   COrder *order=new COrder(ticket,symbol,type,volume,price);
   if(CheckPointer(order)==POINTER_DYNAMIC)
     {
      order.SetContainer(GetPointer(this));
      if(SortMode()==-1)
         Sort(0);
      if(InsertSort(GetPointer(order)))
        {
         order.Magic(magic);
         if(type==ORDER_TYPE_BUY || type==ORDER_TYPE_SELL)
            order.Init(GetPointer(this),m_stops);
         else order.Initialized(false);
         return order;
        }
     }
   return NULL;
  }


我不知道为什么没有用正确的排序模式初始化它,或者我必须额外初始化它......我也不知道。

 
mbjen:

如果您不介意的话,让我报告另一个可能的错误。

它不返回未结订单数。我开始检查,发现问题与 OrdersBase 和排序模式有关。

我不得不添加以下代码:


我不知道为什么没有用正确的排序模式初始化它,或者我必须额外初始化它......我也不知道。

COrdersBase 构造函数的代码如下:

COrdersBase::COrdersBase(void)
  {
   if(!IsSorted())
      Sort();
  }

一开始,如果内部对象数组尚未排序,它就会对其进行排序,但我相信你已经意识到这一点了。

如果不使用 NewOrder()(例如 Add())就向其添加其他项目,它就会变得未排序。

我无法复制您遇到的问题。在整个测试过程中,我的结果总是返回排序的。试着找出测试中数组第一次未排序的时间点。这或许能提供问题根源的线索。

 

您好、

如果我再次遇到这个问题,我会告诉你的。

我还有一个问题。如何获取调用信号模块的当前专家实例?

比方说,我有一个信号类,它有一个检查先前订单结果的函数。我有多个专家实例。那么,如何获取调用信号检查函数的当前专家订单?

或许还有其他合适的解决方案。请与我分享一些想法或代码。

我的目标是创建一个信号,根据之前的订单/仓位结果以不同方式工作。

 

有很多方法可以做到这一点,不同的程序员可能会有不同的做法。默认情况下,专家实例彼此独立。您可以实现让这些实例共享相同的信息。

如果要区分每个专家开立的交易,可以先为每个实例分配一个唯一的神奇数字。除非您展示代码,否则我无法提供进一步帮助。

 

恩里科

我的代码完全是根据您最后的例子编写的。

我只有一个全局定义 CExpertAdvisors 专家;

在 OnInit() 中,我初始化了资金/止损/信号模块,然后将它们添加到每个专家实例中。

在 OnTick() 中,我只有 experts.OnTick()

而我的自定义信号类包含 Calculate()、LongCondition()、ShortCondition() 等。每个专家实例都会添加该信号。

现在,我只希望信号的逻辑取决于每个特定专家实例的最后订单/仓位结果。这与魔力值无关(顺便说一下,我的所有专家实例都有不同的魔力值)。在信号调用函数 Calculate()、LongCondition()、ShortCondition() 中,我没有魔数或任何其他细节可以帮助我识别专家实例并找到其下一个订单。

至于代码,就像这样使用 Calculate() 函数吧:

bool SignalClass::Calculate()

{ //--- some code to find out if the expert last order was profitable or not return true;

}

希望您能理解。有什么方法可以在不修改您的库代码的情况下实现这一点吗?

 

你好,恩里科、

我仍在试图找到一种可行的方法来识别哪个专家实例调用了信号检查函数。我该怎么做呢?有什么提示吗?

 

还有一个问题。如果我想拥有多对交易专家,该如何初始化?在CExpertAdvisorBase::Init() 中,我必须指定一个符号名称。

 

如何根据以前的订单结果创建 MM 类型?这太不灵活了...