Обсуждение статьи "Кроссплатформенный торговый советник: Сигналы" - страница 3

 
Karl Klang:

Привет, Энрико,

Я нашел способ обработки функции Calculate, теперь включающий функцию гистерезиса, которая, похоже, работает, когда MA и индикатор TEMA пересекаются.

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

Здесь все работает нормально:


Но здесь менеджер ордеров начинает выставлять несколько ордеров:


Когда я отлаживал следующую часть кода COrderManager, оператор orders_total = OrdersTotal(); становится 1, когда он работает, но становится 0, когда он не работает, что приводит к тому, что условие if m_max_order>orders_total всегда оценивается как true.

Надеюсь, вы сможете помочь разобраться с этим.

С наилучшими пожеланиями/
Карл

Привет, Карл,

Я никогда раньше не сталкивался с этой проблемой. Метод OrdersTotal() просто подсчитывает количество активных объектов COrder. Если что-то не так с кодом стратегии, то это должно быть исправлено. Если нет, то, должно быть, есть какая-то проблема в том, как управляются (создаются/уничтожаются) экземпляры COrder и/или как они подсчитываются. Я дам вам знать, как только столкнусь с этой проблемой.

 

Привет, Энрико,

Гугление по проблемам mt5 OrdersTotal() показывает, что у других тоже есть проблемы. Например, тестер стратегий с этой стратегией. Набор экспертов также загружен, так что вы можете запустить тестер стратегий с теми же входными данными, что и я.

С наилучшими пожеланиями/
Karl

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


И это (OnDeinit):

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

на это:

#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. Но дайте мне знать, если вы продолжите испытывать эту проблему. Приведенный выше код не позволяет загружать и сохранять данные во время бэктестинга и оптимизации (я упустил это из виду при написании последней статьи).

 

Кроме того, что касается функции OrdersTotal() в MT5, она подсчитывает только отложенные ордера (не эквивалент OrdersTotal в MT4). Код в TradeOpen для OrderManager:

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?

 

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

У меня возникла серьезная проблема с пониманием "подсчета свечей" (Первая, вторая, третья = idx, idx++, ...) в следующем коде Mql Signal, который относится к классу SignalAC.

Может ли кто-нибудь помочь проникнуть в число idx при движении в кодах вниз?

Заранее спасибо.

//+------------------------------------------------------------------+
//| "Голосуем", что цена будет расти.|
//+------------------------------------------------------------------+
int CSignalAC::LongCondition(void)
  {
   int result=0;
   int idx   =StartIndex();
//--- если первый анализируемый бар "красный", не "голосуйте" за покупку
   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);
  }