Обсуждение статьи "Адаптивные торговые системы и их использование в терминале MetaTrader 5" - страница 3

 
Quantum:

Уважаемый Форексистенс,

>>Дорогой

Вы ответили на свой вопрос :)

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

Вы правы, есть два пути, если вы хотите изменить торговые условия, с одной стороны мы можем добавить новые условия в стратегию CStrategyMA (но мы получим новую стратегию, отличную от первоначальной), другой путь - это создать новый класс (например, CStrategyMA34) и добавить туда дополнительные условия покупки/продажи.

Но, конечно, нужно включить файл с новой стратегией и добавить эти новые стратегии в функцию Expert_OnInit класса CAdaptiveStrategy:

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

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

Рынок поможет нам определить лучшую стратегию в списке стратегий, входящих в m_all_strategies.

>> Ок, суть я понял, как и предполагал.

Но вопрос теперь в другом... Я работаю над "вводом" советника с целью работы с оптимизациями.

То есть в примере я имею в виду куски кода вроде этого:

for(int i=0; i<RSIcicle; i++)
     {
      CStrategyRSI *t_StrategyRSI;
      t_StrategyRSI=new CStrategyRSI;
      if(t_StrategyRSI==NULL)
        {
         delete m_all_strategies;
         Print("Error of creation of object of the CStrategyRSI type");
         return(-1);
        }

      

       ////////////////////////// PLEASE LOOK AT THIS FOLLOWING PIECE OF CODE ///////////////////////
   //Установите период для каждой стратегии
    int period=Trsi+Drsi*i;
    
    ENUM_TIMEFRAMES RSItempoframe=RSItempoframe_in; // SET TIMEFRAME (enum), INPUT, FOR STRATEGY 
    ENUM_APPLIED_PRICE RSIappprice=RSIappprice_in;  // SET APPPLIED PRICE (enum), INPUT, FOR STRATEGY
    
    int RSIvarA_root=RSIvarA_in;
    int RSIvarB_root=RSIvarB_in;
    
      // инициализация стратегии
      t_StrategyRSI.Initialization(period,true,RSItempoframe,RSIappprice,RSIvarA_root,RSIvarB_root);
      /////////////////////////////////////////////////////////////////////////////////////////////


      // установите детали стратегии
      t_StrategyRSI.SetStrategyInfo(_Symbol,"[RSI_"+IntegerToString(period)+"]",period,"Relative Strenght Index "+IntegerToString(period));
      
      if(t_StrategyRSISet_Stops_ ==true) {
      t_StrategyRSI.Set_Stops(tSMSSone,tSMSStwo); //3500,1000);
      }

where (declarations) :

//+------------------------------------------------------------------+
//|                                            CAdaptiveStrategy.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"

#include <Arrays\ArrayObj.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <CStrategyMA.mqh>
#include <CStrategyMAinv.mqh>
#include <CStrategyStoch.mqh>

#include <CStrategyRSI.mqh>   // ДОБАВЛЕНА СТРАТЕГИЯ

/*
......
*/

input int Trsi=0, Drsi=10, RSIcicle=10;

input ENUM_TIMEFRAMES RSItempoframe_in= PERIOD_CURRENT;
input ENUM_APPLIED_PRICE RSIappprice_in= PRICE_CLOSE;

input int RSIvarA_in=60, RSIvarB_in=40;




input int tSMSSone=3500, tSMSStwo=1000;


input bool t_StrategyRSISet_Stops_=false;

/*
...
*/

//+------------------------------------------------------------------+
//| Class CAdaptiveStrategy                                          |

/*
...
*/

, а где переменные:

RSItempoframe, RSIappprice, RSIvarA_root, RSIvarB_root

работать в сотрудничестве с

//+------------------------------------------------------------------+
//|                                                  CStrategyMA.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#include <CSampleStrategy.mqh>

input int mval=0, mval1=1, mval2=2, mval3=3, mval4=4, mvalVar=0, mvalFix=0,

          mvalVar2=0, mvalFix2=0;
          

//+------------------------------------------------------------------+
//| Class CStrategyMA for implementation of virtual trading          |
//| by the moving average strategy                                   |
//+------------------------------------------------------------------+
class CStrategyRSI : public CSampleStrategy
  {
protected:
   int               m_handle;     // ручка индикатора Moving Average (iMA)
   int               m_period;     // период индикатора Moving Average
   double            m_values[];   // массив для хранения значения индикатора





   int               RSIvarA, RSIvarB; 
   
   ENUM_TIMEFRAMES   m_timeframe;
   ENUM_APPLIED_PRICE m_appprice;



   
public:
   // инициализация стратегии // Уведомление о добавленных входах


   int               Initialization(int period,bool virtual_trade_flag,ENUM_TIMEFRAMES RSItempoframe,
                                    ENUM_APPLIED_PRICE RSIappprice,int RSIvarA_root, int RSIvarB_root);


   // деинициализация стратегии
   int               Deinitialization();
   // проверка торговых условий и открытие виртуальных позиций
   bool              CheckTradeConditions();
  };
//+------------------------------------------------------------------+
//| Method of initialization of the strategy                         |
//+------------------------------------------------------------------+



int CStrategyRSI::Initialization(int period,bool virtual_trade_flag,ENUM_TIMEFRAMES RSItempoframe,
                                 ENUM_APPLIED_PRICE RSIappprice,int RSIvarA_root, int RSIvarB_root)


  {
   //set period for the RSI     (was //set period for the moving average)
   m_period=period;
      
   m_timeframe=RSItempoframe;
   m_appprice=RSIappprice;
   
   RSIvarA=RSIvarA_root;
   RSIvarB=RSIvarB_root;

/*
...
*/

//создайте хэндл индикатора 
   
   m_handle=iRSI(_Symbol,m_timeframe,m_period,m_appprice);

/*
...
*/

//+------------------------------------------------------------------+
//| checking the trade conditions and opening the virtual positions  |
//+------------------------------------------------------------------+
bool CStrategyRSI::CheckTradeConditions()
  {
   RecalcPositionProperties(m_position);
  // double p_close;

/*
...
*/
   
     if(CopyRates(_Symbol,m_timeframe,0,3,m_rates)<0)

{
      Alert("Error of copying history data - error:",GetLastError(),"!!");
      return(false);
     }
// Копируем текущую цену закрытия предыдущего бара (это бар 1)
  // p_close=m_rates[1].close;  // close price of the previous bar          

   if(CopyBuffer(m_handle,0,0,3,m_values)<0)
     {
      Alert("Error of copying buffers of the Moving Average indicator - error number:",GetLastError());
      return(false);
     }

/*
...
*/

// Условие покупки 1: RSI повышается
   bool buy_condition_1=(m_values[mval]>m_values[mval1]) && (m_values[mval1]>m_values[mval2]);  // УКАЗАТЬ целые числа в переменной [] массива

// Условие покупки 2: цена предыдущего закрытия выше MA
 //  bool buy_condition_2=(p_close>m_values[1]);


     bool buy_condition_2=(m_values[mval+mvalVar+mvalFix]>RSIvarA);

/*
... и т.д.
*/


   

Мой вопрос заключается в следующем:

Можно ли модифицировать код, чтобы входная переменная была на уровне класса стратегии (включаемый файл, т.е. CStrategyRSI.mqh), или с соответствующими хиерархиями/связями/деревьями на уровне другого класса/включения (CAdaptiveStrategy.mqh)?

Другими словами, для воздействия на основную систему идеи советника, с добавлением некоторых входных параметров для тестирования оптимизаций,

я должен сделать что-то вроде этого: (входные переменные в CAdaptiveStrategy.mqh)

/*
...
*/

class CStrategyRSI : public CSampleStrategy
  {
protected:
   int               m_handle;     // handle of the Moving Average (iMA) indicator
   int               m_period;     // period of the Moving Average indicator
   double            m_values[];   // array for storing the value of indicator
   int               RSIvarA, RSIvarB;
   
   ENUM_TIMEFRAMES   m_timeframe;
   ENUM_APPLIED_PRICE m_appprice;
   
public:
   // initialization of strategy
   int               Initialization(int period,bool virtual_trade_flag,ENUM_TIMEFRAMES RSItempoframe,
                                    ENUM_APPLIED_PRICE RSIappprice,int RSIvarA_root, int RSIvarB_root);

/*
...
*/ 

//set period for the RSI     (was //set period for the moving average)
   m_period=period;
      
   m_timeframe=RSItempoframe;
   m_appprice=RSIappprice;
   
   RSIvarA=RSIvarA_root;
   RSIvarB=RSIvarB_root;

/*
...
*/

//создайте хэндл индикатора 
   
   m_handle=iRSI(_Symbol,m_timeframe,m_period,m_appprice);

/*
...
*/
 

или что-то вроде этого: (входные переменные в CSampleRSI.mqh)

/*
...
*/

input   int               RSIvarA_root, RSIvarB_root;
   
input  ENUM_TIMEFRAMES  RSItempoframe=PERIOD_M5;
input   ENUM_APPLIED_PRICE RSIappprice=PRICE_CLOSE;
   

class CStrategyRSI : public CSampleStrategy
  {
protected:
   int               m_handle;     // ручка индикатора Moving Average (iMA)
   int               m_period;     // период индикатора Moving Average
   double            m_values[];   // массив для хранения значения индикатора

  ENUM_TIMEFRAMES   m_timeframe;
  ENUM_APPLIED_PRICE m_appprice;

int               RSIvarA, RSIvarB;

public:
   // инициализация стратегии
   int               Initialization(int period,bool virtual_trade_flag);  // ОБРАТИТЕ ВНИМАНИЕ НА ОРИГИНАЛЬНЫЙ КОД

/*
...
*/ 

//set period for the RSI     (was //set period for the moving average)
   m_period=period;
      
   m_timeframe=RSItempoframe;
   m_appprice=RSIappprice;
   
   RSIvarA=RSIvarA_root;
   RSIvarB=RSIvarB_root;

/*
...
*/

//создайте хэндл индикатора 
   
   m_handle=iRSI(_Symbol,m_timeframe,m_period,m_appprice);

/*
...
*/

Другими словами, входные переменные должны быть использованы в файле включения стратегии, до объявления класса (пример2, только это выше здесь) или входные переменные должны

вытекать из циклы "for" в стратегии CAdaptive, и должны учитывать инициализацию всех классов и входные параметры? (я имею в виду для этого первого примера (чуть выше этого кода) :)

public:
// инициализация стратегии
int Initialization(int period,bool virtual_trade_flag,ENUM_TIMEFRAMES RSItempoframe,
ENUM_APPLIED_PRICE RSIappprice,int RSIvarA_root, int RSIvarB_root);

Как по-разному будет влиять на ядро системы, если использовать входные переменные в файле CStrategyRSI.mqh или в CAdaptiveStrategy.mqh?

Полагаю, что если речь идет только о тестировании, то можно использовать входные переменные в CStrategyRSI.mqh, если же я хочу и протестировать, и

повлиять на основную систему советника (адаптивную систему и симулятор торговли, виртуального трейдера), я должен объявить

входные переменные не в стратегическом include, а в адаптивном include файле, со всеми надлежащими связями и вызовом

ввода/вывода инициализации и объявления классов/функций?

Верно?

Надеюсь, вы поняли мою мысль.

Tnkx

 
forexistence:

....Но теперь вопрос в другом... Я работаю над "вводом" советника с целью работы с оптимизацией.....

Если вы хотите найти оптимальные параметры стратегии с помощью опции оптимизации в тестере стратегий, то лучше переписать советник с какой-то конкретной стратегией и поиграть с ней.

Концепция адаптивного советника и его структура не позволяют оптимизировать его параметры в Тестере стратегий напрямую, так как нет конкретной стратегии и параметров для оптимизации.

Когда мы используем адаптивный советник в торговле или тестируем его в Тестере стратегий, мы имеем торговую систему как набор сигналов от различных стратегий. Другими словами, тестер не имеет доступа к созданным нами виртуальным песочницам и ничего о них не знает.

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

 
Quantum:

Если вы хотите найти оптимальные параметры стратегии с помощью опции оптимизации в тестере стратегий, лучше переписать советник с какой-то конкретной стратегией и поиграть с ней.

>> Хорошо, я понял суть. Это будет нелегкая задача...

Концепция адаптивного советника и его структура не позволяют оптимизировать его параметры в тестере напрямую, потому что нет конкретной стратегии и параметров для оптимизации.

>> Да. Советник идеализирован для работы с еще не оптимизированнымипараметрами стратегий. Как я понял, он использует разные стратегии в зависимости от того, как/как реагирует рынок (или наоборот, с другой точки зрения...)

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

>> Я понял эту концепцию, но не до конца.

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

Моей единственной целью было модифицировать советник, чтобы использовать его с аддоном: цель использования этого советника также для оптимизации параметров, без переписывания другого советника, или переписывания всех стратегий, или тестирования каждой стратегии в отдельности. Моя идея была только для "комфорта", чтобы иметь возможность оптимизировать параметры, в рамках одного и того же советника, но эта оптимизация не предназначена для работы с виртуальной торговли / адаптивной системы. Речь идет только о том, чтобы иметь возможность оптимизировать параметры стратегий, используя одно и то же окно ввода советника, а не писать еще один советник для каждой стратегии, получать оптимизированные параметры и помещать их как фиксированные значения в систему адаптивных стратегий. Надеюсь, вы поняли мою мысль.

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

>> О каких файлах вы говорите? ( Если вы хотите использовать входные параметры для настройки параметров торговых стратегий для использования, лучше использовать файлы )

Вы говорите о том, чтобы использовать CStrategyXXX.mqh или о том, чтобы написать отдельный советник для каждой стратегии, оптимизировать его и скопировать параметры как фиксированные значения в CStrategyXXX.mqh?

 

Are you talking about to use CStrategyXXX.mqh or the fact to write another individual EA for each strategy, optimize it, and copy the parameters as fixed values in CStrategyXXX.mqh?

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

Например, в Adaptive_Expert.Expert_OnInit() может быть загружен файл с настройками адаптивного советника:

MA;3
MA;15
MA;25
Stoch;3;12;20
Stoch;3;15;30

Strategy1;Param1;Param2;
Strategy2;Param1;Param2;

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

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

Моей единственной целью было модифицировать советник, чтобы использовать его с аддоном: цель использования этого советника также для оптимизации параметров, без переписывания другого советника, или переписывания всех стратегий, или тестирования каждой стратегии в отдельности. Моя идея была только для "комфорта", чтобы иметь возможность оптимизировать параметры, в рамках одного и того же советника, но эта оптимизация не предназначена для работы с виртуальной торговли / адаптивной системы. Речь идет только о том, чтобы иметь возможность оптимизировать параметры стратегий, используя одно и то же окно ввода советника, а не писать еще один советник для каждой стратегии, получать оптимизированные параметры и помещать их как фиксированные значения в систему адаптивных стратегий. Надеюсь, вы поняли, к чему я клоню.

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

Предположим, мы хотим воспроизвести результаты, представленные на рис. 2 статьи.

Для этого нам понадобится отладочная версия адаптивного советника adaptive-systems-mql5-sources-debug-en.zip (она сообщает о песочницах) Далее компилируем и открываем Adaptive_Expert_Sample в Тестере стратегий, выбираем EURUSD H1 01.01.2010 - 20.08.2010 и начинаем тестирование. Песочницы и результаты адаптивной стратегии будут сохранены в файле tester\files\equity_res.txt Используя этот способ, очень легко воспроизвести все показатели.

Анализ виртуальных торговых акций/балансов позволит вам упростить оптимизацию.

 

Всем привет,

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

Однако я не уверен, куда включить функцию трейлинг-стопа в таком советнике.

Я думаю, что такую функцию можно добавить в часть CAdaptiveStrategy.mqh.

Может ли кто-нибудь из вас оказать мне помощь? Может быть, вы уже разработали такую функцию?

Заранее большое спасибо!

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

Патрик

 
Есть ли у кого-нибудь версия Adaptive Trading, которая будет работать с экспертами на основе OO Expert Class?
 
MQL5 открывает для нас огромные возможности - не многие из сообщества трейдеров еще могут оценит их - еще меньше использовать.
 
Спасибо за отличную статью, я размышлял над тем, как реализовать адаптивную систему, и это был один из подходов, который я придумал, но еще не успел отработать. Рассматривали ли вы возможность использования встроенных функций бэктестинга в сочетании с живыми данными?
 

Я не могу воспроизвести результаты, приведенные в статье.

Скачал исходные файлы, скомпилировал, запустил на том же таймфрейме (EURUSD H1, 04/01/2010 - 20/08/2010) и получил другой результат.

Я использовал отладочные файлы и проверил виртуальные торговые результаты ... графики виртуального капитала идентичны, однако реальные сделки не совпадают.

Без лог-файла фактических сделок трудно найти, почему мои сделки не совпадают со сделками в статье.

Есть идеи, почему у меня не совпадает?

 
Очень хорошая статья, отвлекает то, что люди пытаются воспроизвести результаты вместо того, чтобы взять и интегрировать предложенные функциональные возможности. Теперь вероятность создания полнофункционального и прибыльного автоматического и полуавтоматического торгового советника реализована. Тестирование индикаторов в широком масштабе, компиляция результатов и извлечение статистических данных индикаторов поверх конформационной статистики указанных данных, что позволяет советнику выбрать наилучшую торговую стратегию для реализации. Никогда еще фундаментальный и технический анализ не сочетался в советнике, пока не появился вспомогательный язык MQL5. Заглядывая в будущее, я вижу, как советники для реализации на всех рынках объединяются, чтобы предсказывать колебания рынка.