Обсуждение статьи "Кроссплатформенный торговый советник: Классы 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();

А в функции signal я просто создаю пользовательские объекты индикатора так же, как в ваших примерах.

 
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();

А в функции signal я просто создаю пользовательские объекты индикатора так же, как и в ваших примерах.


Это нормально, моя ошибка

 

Позвольте мне сообщить еще об одной возможной ошибке, если вы не возражаете.

Он не возвращает количество открытых ордеров. Я начал проверять и обнаружил, что проблема связана с 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()).

Я не могу воспроизвести возникшую у вас проблему. Мои результаты всегда возвращаются отсортированными на протяжении всего теста. Попробуйте найти момент времени, когда массив впервые становится неотсортированным в вашем тесте. Это может дать подсказку об источнике проблемы.

 

Здравствуйте,

Я дам вам знать, если снова столкнусь с этой проблемой.

У меня есть еще один вопрос. Как получить текущий экземпляр эксперта, который вызывает модуль signal?

Допустим, у меня есть класс signal, в котором есть функция проверки результатов предыдущих ордеров. У меня есть несколько экземпляров экспертов. Так как же мне получить текущие ордера эксперта, который вызывает функцию проверки сигнала?

Или, может быть, есть другое правильное решение? Не могли бы вы поделиться какой-нибудь идеей или куском кода для этого.

Моя цель - создать сигнал, который будет работать по-разному в зависимости от результата предыдущего ордера/позиции.

 

Существует множество способов сделать это, и они могут отличаться у разных программистов. По умолчанию экземпляры экспертов действуют независимо друг от друга. Вы можете реализовать это так, чтобы экземпляры могли обмениваться одной и той же информацией.

Если вы хотите различать сделки, открытые каждым из экспертов, вы можете начать с присвоения уникального магического номера для каждого экземпляра. Я не смогу помочь вам дальше, если вы не покажете свой код.

 

Энрико,

Мой код полностью основан на ваших последних примерах.

У меня есть только одно глобальное определение CExpertAdvisors experts;

В OnInit() я инициализирую модуль money/stops/signal и затем добавляю их для каждого эксперта.

В 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() я должен указать имя символа.

 

Как создать тип ММ на основе результатов предыдущих заказов? Это так негибко...