文章 "自适应交易系统以及它们在 MetaTrader 5 客户端中的运用" - 页 3

 
Quantum:

亲爱的 Forexistence

>>亲爱的

你已经回答了你的问题:)

>> 是的,也许我自己已经回答了我的部分问题,只是想得到确认或不同的意见。

你是对的,如果你想修改交易条件,有两种方法,一种是在策略 CStrategyMA 中添加新的条件(但我们将得到与初始策略不同的新策略),另一种方法是创建一个新类(例如,CStrategyMA34),并在其中添加额外的买入/卖出条件。

当然,您应该在新策略中包含文件,并将这些新策略添加到 CAdaptiveStrategy 类的 Expert_OnInit 函数中:

第二种方法更好,您可以添加许多策略及其变体。

没有必要删除 CStrategyMA 类实例(如果有的话),我们不会在它们的沙盒中查看它们的结果。

市场将帮助我们确定 m_all_strategies 中包含的策略列表中的最佳策略。

>> 好吧,我明白你的意思了。

但现在的问题是......我正在对 EA 进行 "输入化",以便进行优化。

举例来说,我指的是这样的代码片段:

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;     // 移动平均线 (iMA) 指标句柄
   int               m_period;     // 移动平均线指标的周期
   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);
  // 双 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)级别设置适当的连接/树?

换句话说,影响 EA 核心系统的想法,添加一些输入参数进行优化测试、

我应该这样做:(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;     // 移动平均线 (iMA) 指标句柄
   int               m_period;     // 移动平均线指标的周期
   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,就是上面这样),或者输入变量应

还是输入变量应源于 CAdaptive 策略中的 "for "代码,并考虑到所有类的初始化和输入参数?(我指的是第一个例子(就在上面这段代码的上方):)

公共:
// 初始化策略
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 文件中使用输入变量,如果我既想测试,又想

如果我既想测试又想影响 EA 的核心系统(自适应系统和交易模拟器,包括虚拟交易员),我应该声明

输入变量,而不是在策略包含文件中声明,而是在自适应包含文件中声明,并与所有适当的连接和调用

/ 函数声明的输入/输出

对吗?

希望你能明白我的意思。

Tnkx

 
forexistence:

....,但现在的问题是...我正在对 EA 进行 "输入化",目的是使用优化功能....。

如果您想使用策略测试器中 的优化选项找到策略的最佳参数,最好用某些特定策略重写 EA 并使用它。

自适应 EA 的概念及其结构不允许在 Strategy Tester 中直接优化其参数,因为没有任何特定的策略和参数需要优化。

当我们在交易中使用自适应 EA 或在策略测试器中测试自适应 EA 时,我们的交易系统就是一组来自不同策略的信号。换句话说,测试器无法访问我们创建的虚拟沙箱,对它们一无所知。

如果您想使用输入参数配置要使用的交易策略参数,最好使用文件,它将允许您配置参数和交易策略列表。

 
Quantum:

如果您想使用策略测试器中的优化选项找到策略的最佳参数,最好用某个特定的策略重写 EA,然后用它来玩。

>> 好的,我明白了。这不是一件容易的事。

自适应 EA 的概念及其结构不允许直接在策略测试器中优化其参数,因为没有任何特定的策略和参数需要优化。

>> 是的。EA 是理想化的,可以使用仍在优化的策略参数。我的理解是,它利用不同的策略来判断市场的反应(或者从另一个角度来看,反之亦然......)。

当我们在交易中使用自适应 EA 或在策略测试器中对其进行测试时,我们的交易系统就是一组来自不同策略的信号。换句话说,测试器无法访问我们创建的虚拟沙箱,对它们一无所知。

>> 理解这个概念,但不完全理解。

我知道测试人员与虚拟沙箱的互动毫无意义,没有交易逻辑意义。

我的唯一目标是修改 EA,以便与插件一起使用:使用此 EA 的目的也是为了优化参数,而无需重写另一个 EA,或重写所有策略,或单独测试每个策略。我的想法只是为了在同一个 EA 中 "舒适 "地优化参数,但这种优化并不打算与虚拟交易/自适应系统一起使用。我的想法只是为了 "舒适",可以在同一个 EA 输入窗口中优化策略参数,而不是为每个策略编写另一个 EA,获取优化参数,并将其作为固定值输入自适应策略系统。希望你明白我的意思。

如果你想使用输入参数配置交易策略参数,最好使用文件,这样可以配置参数和交易策略列表。

>> 如果您想使用输入参数配置交易策略参数,最好使用文件

您是指使用 CStrategyXXX.mqh 还是为每个策略编写另一个单独的 EA,对其进行优化,并将参数作为固定值复制到 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?

我的意思是,可以根据自适应 EA 的某些设置来填充策略容器。

例如,在 Adaptive_Expert.Expert_OnInit()中,它可以加载一个包含自适应 EA 设置的文件:

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

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

通过解析每一行,它可以识别需要包含的策略,并将其添加到指定的相应参数中。这是无需编译即可配置自适应 EA 的方法之一。为了简单起见,我在文章中没有考虑到这一点。

我知道测试人员与虚拟沙箱的交互没有意义,没有交易逻辑意义。

我的唯一目标是修改 EA,以便与插件一起使用:使用此 EA 的目的也是为了优化参数,而无需重写另一个 EA,或重写所有策略,或单独测试每个策略。我的想法只是为了在同一个 EA 中 "舒适 "地优化参数,但这种优化并不打算与虚拟交易/自适应系统一起使用。我的想法只是为了 "舒适",可以在同一个 EA 输入窗口中优化策略参数,而不是为每个策略编写另一个 EA,获取优化参数,并将其作为固定值输入自适应策略系统。希望你明白我的意思。

有一种方法可以查看沙箱。可以间接使用策略测试器。

假设我们想重现文章图 2 所示的结果。

我们需要调试版本的自适应 EAadaptive-systems-mql5-sources-debug-en.zip (它会报告沙箱)。接下来,在策略测试器中编译并打开 Adaptive_Expert_Sample,选择 EURUSD H1 01.01.2010 至 20.08.2010 并开始测试。沙箱和自适应策略结果将保存在 tester\files\equity_res.txt 中,通过这种方式可以很容易地重现所有数据。

通过对虚拟交易股票/余额的分析,可以简化优化工作。

 

大家好、

感谢这篇好文章,我现在只在做一个自适应 EA。

但是,我不知道在这种 EA 中应在哪里加入追踪止损 功能

我认为可以在 CAdaptiveStrategy.mqh 部分添加这样的功能。

你们中有人能帮我吗?也许你们已经开发了这样的功能?

非常感谢!

致以最崇高的敬意

Patrick

 
是否有人有基于 OO 专家类的自适应交易版本?
 
MQL5 为我们带来了巨大的机遇--现在还能欣赏到这些机遇的交易界人士并不多,能使用这些机遇的人就更少了。
 
感谢您的精彩文章,我一直在考虑如何实施自适应系统,这是我设计的一种方法,但还没有时间实施。你是否考虑过结合实时数据使用任何内置的回溯测试 功能?
 

我无法重现文章中的结果

我下载了源文件并进行了编译,然后在相同的时间范围内运行(欧元兑美元 H1,2010 年 1 月 4 日 - 2010 年 8 月 20 日),结果却不同。

我使用了调试文件并检查了 虚拟交易输出......虚拟资产图完全相同,但实际交易却不一致。

没有实际交易的日志文件,我很难找到为什么我的交易与文章中的不一致。

知道为什么不一致吗?

 
这篇文章写得很好,但令人分心的原因是人们试图复制这些结果,而不是借鉴和整合所提出的功能可能性。现在,创建一个功能齐全、有利可图的自动和半自动交易 EA 的可能性已经实现。对指标进行大范围测试,对结果进行汇编,在上述数据的符合性统计之上提取指标的统计数据,并允许 EA 选择最佳交易策略来实施。在 MQL5 语言的辅助下,基本面分析 和技术分析 从未在 EA 中结合过。展望未来,我认为所有市场中的 EA 都能共同预测市场波动。