Обсуждение статьи "Создание мульти-экспертов на основе торговых моделей" - страница 4

 

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

Единственное, что пришлось поправить в коде - слегка модернизировать функцию GetMyPosition(), чтобы она считала объем только по символу, переданному в качестве параметра. В противном случае модель, работающая по связке двух и более пар при вызове GetMyPosition() получает совокупный объем по нескольким парам вместо необходимого отдельного объема по каждой. Ну и еще добавил метод в класс CTableOrders для получения символа ордера.

string            OrderSymbol(){return(m_symbol);}


Еще раз спасибо!

 

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

З.Ы. метод double GetMyPosition() лучше перегрузить соответствующим образом:  double GetMyPosition(string Symbol). Это придаст больше гибкости и универсальности.

Бесспорно,  со временем код будет совершенствоваться и изменяться, ведь учесть сразу все возможные области его применения невозможно.

Еще раз спасибо, и с наступающим Новым 2011 годом! Счастья и удачи!

 
Огромное спасибо автору за статью, обязательно возьму себе на вооружение.
 

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

Василий - как вы отладили этот код без отладчика в тестере ? Мне очень сложно работать без отладчика в тестере - ведь сигналы бывают разные и по разным условиям.

Поделитесь опытом отладки. 

 
После последних обновлений терминала модель перестала работать. Может кто ни будь  объяснить, что случилось? 
 
YYURIYY:
После последних обновлений терминала модель перестала работать. Может кто ни будь  объяснить, что случилось? 


Аналогично. Уже неделю разбираю по запятым код. Стратегия выставляет ордера на продажу, но функция GetNumberOrders() возвращает всего ордеров на продажу = 0, а вот на покупку = 1.

Просьба к Василию, как разработчику данного кода, помочь. Я пока не могу выловить в чем причина.

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 
YYURIYY:
После последних обновлений терминала модель перестала работать. Может кто ни будь  объяснить, что случилось? 

Кажеться разобрался. В коде необходимо изменить :

#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"

#include <Trade\_OrderInfo.mqh>
#include <Trade\_HistoryOrderInfo.mqh>
#include <Arrays\List.mqh>
class CTableOrders : CObject
{
private:
   ulong             m_magic;       // Магик эксперта выставившего ордер
   ulong             m_ticket;      // Тикет  основного ордера
   ulong             m_ticket_sl;    // Тикет ордера выкупа сделки, совершенной на основании основного ордера (Stop Loss)
   ulong             m_ticket_tp;    // Тикет ордера выкупа сделки, совершенной на основании основного ордера (Take Profit)
   ENUM_ORDER_TYPE   m_type;         // Тип основного ордера
   datetime          m_time_setup;  // Время установки ордера
   double            m_price;       // Цена ордера
   double            m_sl;          // Цена предполагаемого Stop Loss
   double            m_tp;          // Цена предполагаемого Take Profit
   double            m_volume_initial;      // Объем ордера
public:
                     CTableOrders();
   bool              Add(COrderInfo &order_info, double stop_loss, double take_profit);
   bool              Add(CHistoryOrderInfo &history_order_info, double stop_loss, double take_profit);
   double            StopLoss(void){return(m_sl);}
   double            TakeProfit(void){return(m_tp);}
   ulong             Magic(){return(m_magic);}
   ulong             Ticket(){return(m_ticket);}
   int               Type() const;
   datetime          TimeSetup(){return(m_time_setup);}
   double            Price(){return(m_price);}
   double            VolumeInitial(){return(m_volume_initial);}
};

CTableOrders::CTableOrders(void)
{
   m_magic=0;
   m_ticket=0;
   m_type=0;
   m_time_setup=0;
   m_price=0.0;
   m_volume_initial=0.0;
}

bool CTableOrders::Add(CHistoryOrderInfo &history_order_info, double stop_loss, double take_profit)
{
   if(HistoryOrderSelect(history_order_info.Ticket())){
      m_magic=history_order_info.Magic();
      m_ticket=history_order_info.Ticket();
       m_type=history_order_info.OrderType();
      m_time_setup=history_order_info.TimeSetup();
      m_volume_initial=history_order_info.VolumeInitial();
      m_price=history_order_info.PriceOpen();
      m_sl=stop_loss;
      m_tp=take_profit;
      return(true);
   }
   else return(false);
}

bool CTableOrders::Add(COrderInfo &order_info, double stop_loss, double take_profit)
{
   if(OrderSelect(order_info.Ticket())){
      m_magic=order_info.Magic();
      m_ticket=order_info.Ticket();
      m_type=order_info.OrderType();
      m_time_setup=order_info.TimeSetup();
      m_volume_initial=order_info.VolumeInitial();
      m_price=order_info.PriceOpen();
      m_sl=stop_loss;
      m_tp=take_profit;
      return(true);
   }
   else return(false);
}

int   CTableOrders::Type() const
{
   return((ENUM_ORDER_TYPE)m_type);
}
 

MetaTrader 5 Client Terminal build 381

...

MQL5: Обновлена стандартная библиотека: методы Type() классов CDealInfo, CHistoryOrderInfo, COrderInfo и CPositionInfo переименованы соответственно в DealType(), OrderType() и PositionType().

... 


В виду того, что модель опирается на базовые торговые классы, любые, даже не значительные изменения в их интерфейсах, оказываются критичными. В данном случае, ошибку легко исправить, просто изменив метод Type(), на соответствующий OrderType() в файле TableOrders.mqh.

В ближайшее время будет выполнена актуализация кодов прилагаемых к статье, для правильной работы на последних билдах компилятора и терминала. 

 

"Отдельно стоит описать переменную m_timing. В процессе работы эксперта требуется вызывать определенные события через определенные промежутки времени. Функция OnTimer() для этого не подходит, так как для разных моделей могут существовать разные временные интервалы.

Например, некоторые события нужно вызывать каждый новый бар. Для модели, торгующей на часовой графике, такие события должны вызываться каждый час, для модели, торгующей на дневной графике – каждый новый дневной бар. Ясно, что у этих моделей разные временные настройки и каждая должна храниться соответственно в своей модели. Структура t_period, включенная в класс CModel, позволяет хранить эти настройки отдельно, каждую в своей модели.

Вот как выглядит эта структура:

struct t_period
{
 большая структура 
};

Как видно, она включает в себя обычное перечисление таймфреймов. Для того чтобы узнать, наступил ли новый бар, нужно сравнить время последнего бара, с тем временем, что было записано в структуру t_period. Если время не совпадает, то наступил новый бар, время в структуре надо обновить на время текущего бара и вернуть положительный результат (true). Если время последнего бара и структуры совпадает, это означает, что новый бар еще не наступил и необходимо просто вернуть отрицательный результат (false). 

Вот функция, которая работает по описанному алгоритму:

bool timing(string symbol, ENUM_TIMEFRAMES tf, t_period &timeframes)
{
большой swich
} 

 

 

 Я , конечно, только начинающий программист,  но может возможно для определения наступления нового бара делать так(при этом переменную m_timing сделать просто datetime):

Если я ошибся с выводами, заранее извиняюсь, и прошу меня поправить. Если не ошибся - То спасибо этому сайту и в частности всем кто тут работает- статьи, документацию пишет - я начал в чем-то разбираться. 

bool timing(string symbol, ENUM_TIMEFRAMES tf, t_period &timeframes)
{
   int rez;
   MqlRates raters[1];
   rez=CopyRates(symbol, tf, 0, 1, raters);
   if(rez==0)
   {
      Print("Error timing");
      return(false);
   }
   if (TimeCurrent()-raters.time)>PeriodSeconds(tf) return(true); else return(false);
   
} 

 


P.S.:Кстати спасибо за отличную статью. 

 

Попробовал откломпилировать, получил ошибки

'MACD_MA model.mq5'     MACD_MA model.mq5       1       1
'Trade.mqh'     Trade.mqh       1       1
'Object.mqh'    Object.mqh      1       1
'StdLibErr.mqh' StdLibErr.mqh   1       1
'SymbolInfo.mqh'        SymbolInfo.mqh  1       1
'OrderInfo.mqh' OrderInfo.mqh   1       1
'HistoryOrderInfo.mqh'  HistoryOrderInfo.mqh    1       1
'PositionInfo.mqh'      PositionInfo.mqh        1       1
'DealInfo.mqh'  DealInfo.mqh    1       1
'AccountInfo.mqh'       AccountInfo.mqh 1       1
'model_macd.mqh'        model_macd.mqh  1       1
'Model.mqh'     Model.mqh       1       1
'List.mqh'      List.mqh        1       1
'TableOrders.mqh'       TableOrders.mqh 1       1
'Time.mqh'      Time.mqh        1       1
'mm.mqh'        mm.mqh  1       1
'stdlib.mqh'    stdlib.mqh      1       1
'model_ma.mqh'  model_ma.mqh    1       1
'model_bollinger.mqh'   model_bollinger.mqh     1       1
return value of 'OrderSelect' should be checked TableOrders.mqh 120     4
implicit enum conversion        TableOrders.mqh 50      44
'new_message' - conversion is not accessible because of inheritance access      Time.mqh        185     21
possible use of uninitialized variable 'lot_limit'      mm.mqh  129     10
't' - conversion is not accessible because of inheritance access        Model.mqh       252     27
declaration of 'trade' hides global variable    Model.mqh       282     16
   see previous declaration of 'trade'  MACD_MA model.mq5       18      8
declaration of 'i' hides local variable Model.mqh       310     15
   see previous declaration of 'i'      Model.mqh       307     12
possible loss of data due to type conversion    Model.mqh       428     47
possible loss of data due to type conversion    model_macd.mqh  86      11
possible loss of data due to type conversion    model_macd.mqh  90      14
possible loss of data due to type conversion    model_macd.mqh  91      14
possible loss of data due to type conversion    model_macd.mqh  92      16
expression not boolean  model_macd.mqh  228     11
expression not boolean  model_macd.mqh  254     11
possible loss of data due to type conversion    model_ma.mqh    85      11
possible loss of data due to type conversion    model_ma.mqh    89      8
possible loss of data due to type conversion    model_ma.mqh    90      19
expression not boolean  model_ma.mqh    219     11
expression not boolean  model_ma.mqh    242     11
declaration of 'k_ATR' hides global variable    model_bollinger.mqh     97      110
   see previous declaration of 'k_ATR'  MACD_MA model.mq5       25      16
possible loss of data due to type conversion    model_bollinger.mqh     99      22
possible loss of data due to type conversion    model_bollinger.mqh     104     22
possible loss of data due to type conversion    model_bollinger.mqh     107     22
variable 'rezult' not used      model_bollinger.mqh     170     9
variable 'rezult' not used      model_bollinger.mqh     195     9
expression not boolean  model_bollinger.mqh     238     11
expression not boolean  model_bollinger.mqh     263     11
2 errors, 25 warnings           3       26

Планируется исправить код?