Mql5自定义品种 中国金融产品: A股票、期货、债券、数字货币的应用(6) ----指标及EA 应用

 

8、基于A股的MQL5 指标应用

为了展现基于C++在MetsTrader5的IDE系统处理中国金融证券的无法比拟的优势,简单列举一些常规Python难以处理的指标应用过程。Python语言和Quantopian框架模式中国大部分应用用户的概念都是所谓“量化”,一类量化应用是将证券基本面信息参数做不同组合形成指标进行交易,另一类是将公域指标 例如Boll、Rsi+Obv..等形成不同指标组合策略应用交易,类似MetsTrader生成EA模式。因篇幅所限本文简要展现MetsTrader5的IDE平台如何便捷快速应用专业复杂数学模型指标组合做金融证券交易的趋势判断、交易定价预测、波段周期识别、做个展现,算法均来自MQL5.community的文献,用户可以自行研读。

趋势判断 使用“方差回归”算法:https://www.mql5.com/en/code/352; 在时间序列分析中趋势判断,特别是趋势折点判断是最为重点的领域,任何基于MA即均线算法对于趋势转折的分析都是滞后效应,如果不通过MA均线类算法进行趋势特别是转折分析目前比较有效的是利用非线性回归与方差,关于均线与回归算法特性比较可参考MetsTrader社区爱好者的实践对比:https://www.mql5.com/en/forum/216586

交易定价预测 使用“傅里叶”预测算法:https://www.mql5.com/en/forum/1304,价格预测是目前AI机器学习算法应用的重要方向,但是往往AI预测结果要么是价格概率区间要么就钝化堪比均线。作为价格预测快速傅里叶变换比较具备实际应用价值。

波段周期识别 使用“EMD-HHT 黄锷”经验模态分解算法:https://www.mql5.com/zh/articles/439,为什么波段识别是任何证券金融交易分析的基础?以均线策略举例均线趋势策略在非趋势明确阶段会出现大幅亏损回撤,对于具备初步算法交易实践掌握算法趋势判定不难,难在于交易全时段,特别是非趋势阶段 有人称之为“震荡”阶段是提高交易策略确保趋势交易盈利的基础。希尔伯特——黄锷算法应用在大气物理学近几年被引入金融工程领域作为交易波段周期识别非常高效。


如果形成高效全时域的量化算法、机器高频EA交易策略其中 30%是指标分析、30%是交易效率、30%对冲保护。而指标分析的三个过程波段周期识别 趋势判断 定价预测是 交易效率和交易保护对冲策略的基础。没有量化算法、机器高频EA交易的证券市场是原始的交易市场其资产定价及交易规模都极大的瓶颈。特别是中国资本市场的流动性危机的解决必须通过量化算法、机器高频EA交易来提升解决。

图例如下:

600886.SH指标应用



9、基于A股的Mql5 EA系统的实例及中国A股程序化交易展望

      量化分析脚本、指标最终要形成EA,程序化交易 高频交易是EA追求的目标。基于Mql5建立A股EA机器交易系统是本文的目标。但是由于MetaTrader策略回测是基于Ticks分笔数据,而tushare目前还不能提供这类高频数据,日线Bar数据的ticks数据Bid、Ask常有异常值导致EA回测错误。因此要用1min分钟Bar线做策略回测。其中m1\m5\m15\H1均可以顺畅回测。

      本文只是对中国A股的EA系统演示,并不是精研EA程序交易算法的内容,因此选取社区的典型 双均线+MACD的经典普里亚(Puria)方法 参见:https://www.mql5.com/zh/code/23250

      在使用Mql5回测策略之前要对自定义A股数据的交易特性进行定义,需要在新建自定义品类或者EA过程中使用CustomSymbolSetInteger()函数将交易品种属性定义。交易品种属性详见https://www.mql5.com/zh/docs/constants/environment_state/marketinfoconstants;建议实际调试过程不使得EA代码繁杂本文将定义交易品种属性植入读取日线和分钟线代码中;其交易品种定义函数如下:

void SetSpecifications(string name)
   {  
//---整数属性-------------------------------------
   CustomSymbolSetInteger(name,SYMBOL_CUSTOM,true);                       // 布尔值表示此品种是自定义的
   CustomSymbolSetInteger(name,SYMBOL_BACKGROUND_COLOR,clrGreen);         // 在市场观察中此品种所用的背景颜色
   CustomSymbolSetInteger(name,SYMBOL_SELECT,true);                       // 布尔值表示在市场观察中选择了此品种
   CustomSymbolSetInteger(name,SYMBOL_VISIBLE,true);                      // 布尔值表示此品种已在市场观察中显示
   CustomSymbolSetInteger(name,SYMBOL_CHART_MODE,SYMBOL_CHART_MODE_LAST); //柱形图以最后价为基础//SYMBOL_CHART_MODE_BID//SYMBOL_CHART_MODE_LAST
   
   
   CustomSymbolSetInteger(name,SYMBOL_TRADE_MODE,SYMBOL_TRADE_MODE_FULL);//交易方式:没有限制 
   CustomSymbolSetInteger(name,SYMBOL_TRADE_CALC_MODE,SYMBOL_CALC_MODE_EXCH_STOCKS_MOEX);//交易所股票模式(MOEX) – 为在MOEX交易证券计算预付款和盈利
   
   
   
// 其它整数属性
   CustomSymbolSetInteger(name,SYMBOL_DIGITS,2);                          // 小数位
   CustomSymbolSetInteger(name,SYMBOL_SPREAD,2);                          // 点差的点数
   CustomSymbolSetInteger(name,SYMBOL_SPREAD_FLOAT,false);                // 布尔值表示浮动点差
//---双精度属性 ---------------------------------------------------   
//   CustomSymbolSetDouble(Name,SYMBOL_BID,0);                            // 竞买价,出售品种的最佳价格 
   //CustomSymbolSetDouble(name,SYMBOL_BIDHIGH,0);                          // 每日最高的竞买价
   //CustomSymbolSetDouble(name,SYMBOL_BIDLOW,0);                           // 每日最低的竞买价
   
   CustomSymbolSetDouble(name,SYMBOL_POINT,0.01);                         // 点数
   CustomSymbolSetDouble(name,SYMBOL_TRADE_TICK_SIZE,0.01);                   // 最小价格变化
   
   CustomSymbolSetDouble(name,SYMBOL_VOLUME_MIN,1);                       // 一笔成交最小交易量
   CustomSymbolSetDouble(name,SYMBOL_VOLUME_MAX,1000);                       // 一笔成交最大交易量
   CustomSymbolSetDouble(name,SYMBOL_VOLUME_STEP,0.01);                      // 最小交易量变化增量
   
   
   CustomSymbolSetDouble(name,SYMBOL_TRADE_CONTRACT_SIZE,1);              //合约大小
     
// 其它双精度属性
//---字符串属性-----------------------------------------------+
//   CustomSymbolSetString(Name,SYMBOL_BASIS,"");                           // 自定义品种的基准资产名称
//   CustomSymbolSetString(Name,SYMBOL_CURRENCY_BASE,"");                   // 品种的基准货币
//   CustomSymbolSetString(Name,SYMBOL_CURRENCY_PROFIT,"");                 // 盈利货币
// 其它字符串属性

}

调用过程在创建自定义品种之后 截取部分代码:

                      MqlRates Rates[];
                      
                      Tushare_CharArrayToStruct(result,Rates);     //---将HTTP POST返回char数组拆分到MQL自定义品种结构中--
                      
                      Adj_Process(Token,stockName,Adj,Rates);      //------除权、复权过程-----
                      
                      CustomSymbolCreate(stockName, "\\Astock");   //----自定义Astock品类目录----
                      
                      SetSpecifications(stockName);                //----定义自定义品类交易属性  

                      
                      int reg=CustomRatesReplace(stockName,tBegin,tEnd,Rates,WHOLE_ARRAY );//----将MqlRates数组数据建立并导入自定义品类目录下的产品中
                      //int reg_t=CustomTicksDelete(stockName,Ts,Te);//----清空所有Ticks数据
                         
                      MessageBox(stockName+" "+"Downloaded"+" "+Freq+" "+"OK!" );

本文将A股交易品种属性定义过程植入日线和分钟线代码中,如需要对指数进行仿真回测请自行嵌入相应函数。

调试EA的A股普里亚(Puria)交易策略结果如下:

MetaEditor 调试图1

MetaEditor调试和Pyhton的Tradingview的系统不同,可以更方便看到EA的每一笔交易及细节在指标和图表的真实反应。点击交易列表明显同步定位到回测图中的时点位置,这对于EA程序交易调试和优化是必要的。


MetaQuotes 回测图2


在MetaQuotes策略回测中可以看到交易回测的详实报告,并且可以跟随EA回测的过程跟踪账户净值曲线的变化。本文在回测案例中随机选取的000001.SZ平安银行的M15数据进行普里亚(Puria)交易策略回测,可以看到12月11日到12月18日普里亚(Puria)交易策略自动的判断波段的卖点买点,并且分多次优化平仓的时点。

MetaQuotes策略回测中还可以提供优化性能对比与专业报告,这对于高频交易与毫秒接口算法调试是不可或缺的功能。

总结:

目前中国金融工程及量化交易刚刚起步,大批量化爱好者通过Python语言结合Quantopian、Tradingview类系统进行初步的算法与指标研究学习,但是如果进一步将算法指标形成EA,需要在MQL5的专业程序机器交易系统下进行。MQL5社区对中国金融产品 A股 债券 期货 数字货币的讨论与需求非常迫切。就当前中国资本市场发展情况看2020年各大券商将推出程序算法交易接口。现在的技术准备将是为未来广阔的机器量化算法交易时代的基础。

本文通过Tushare开源金融数据将中国金融产品数据导入MQL5,并对几个数据核心处理过程做了初步的实现,并基于这些数据的指标应用和EA应用做了案例展示。本文只做了Tushare数据源的股票部分,期货 债券 数字货币应用雷同,大家可以阅读Tushare社区文档参考本文代码研习。文中所有指标和策略方法均来自Mql5社区的文献并没有使用私研算法,便于学习和交易。

作者将后续再另作关于指标算法和EA算法的专题研究发布。


附件:Astock_Stock.mq5是A股日线程序,Astock_index.mq5是A股指数程序,Astock_Stock_Min.mq5是A股分钟数据程序。

附加的文件:
 

1:Mql5自定义品种 A股(1)  ----个股列表数据处理过程

https://www.mql5.com/zh/forum/329854

2:Mql5自定义品种 A股(2)  ----个股日线“除权”数据处理过程

https://www.mql5.com/zh/forum/329945

3:Mql5自定义品种 A股(3)  ----个股日线“复权”数据处理过程

https://www.mql5.com/zh/forum/330159

4:Mql5自定义品种 A股(4)  ----A股指数数据处理过程

5:Mql5自定义品种 A股(5)  ----个股分钟线处理过程
6:Mql5自定义品种 A股(6)  ----指标及EA 应用
Mql5自定义品种 中国金融产品: A股票、期货、债券、数字货币的应用(1)
Mql5自定义品种 中国金融产品: A股票、期货、债券、数字货币的应用(1)
  • 2020.01.06
  • www.mql5.com
引言 Mql5自定义品种中国 A股票 期货 债券品种;使用Http 协议 通过Post模式,将Tushare金融开源数据,导入中国 A股票(除权、复权)期货 债券分钟、日线、周、月历史数据的应用。 交易是门古老而又现代的学科,是人类社会运转基础...
 
非常感谢楼主 非常棒!
 

感谢楼主,厉害了,找了很多MT5与A股结合的例子,这个是最全,最有可操作性的。

希望楼主能继续分享交流相关心得,带动活跃下论坛的中文版。

 

.

MT5用于A股 ,是个十分遥远的事情。

A股因为规则的T+1和单向交易,以及一字板的关门打狗和拒绝上车等限定,决定了A股的不活跃性。

既然总体属于非活跃性,那就只能耐着性子做长线,既然做长线,除开基本面,日、周、月周期的K线图,务必都要琢磨。

若非自动辅助性或纯自动交易,即手动交易根本不需要MT几了,若引用MT5逐渐向自动化交易靠近,那么,策略回测是第一位了。

然而,MT5回测时,

比如,明明有2001年起始的近二十年的历史数据-,可当你回测起始时间定为2016年时,即使你的策略需要判定周线月线趋势,但是,MT5回测时默认只是从2015/2014年调入数据,前面的数据不能自动调入,导致日线月线周线都是从2015/2014年开始,形成什么呢?

形成这个品种貌似 2015/2014年才上市,即导致趋势严重误判。那么如果用到月线周线趋势,以及需要多年的日K数据来计算分析的变量,都是错误的,可以说回测到2019年都是不具备参考意义的。

既然如此, 这个回测还有什么价值? 不知道,有无同仁有此同感。


反对意见,请指点,本人虚心接受并致以谢意!

 
目前已实现MT5交易国内股票与期货,有兴趣的可发信息加我好友交流。
 
Yuying #:

.

MT5用于A股 ,是个十分遥远的事情。

A股因为规则的T+1和单向交易,以及一字板的关门打狗和拒绝上车等限定,决定了A股的不活跃性。

既然总体属于非活跃性,那就只能耐着性子做长线,既然做长线,除开基本面,日、周、月周期的K线图,务必都要琢磨。

若非自动辅助性或纯自动交易,即手动交易根本不需要MT几了,若引用MT5逐渐向自动化交易靠近,那么,策略回测是第一位了。

然而,MT5回测时,

比如,明明有2001年起始的近二十年的历史数据-,可当你回测起始时间定为2016年时,即使你的策略需要判定周线月线趋势,但是,MT5回测时默认只是从2015/2014年调入数据,前面的数据不能自动调入,导致日线月线周线都是从2015/2014年开始,形成什么呢?

形成这个品种貌似 2015/2014年才上市,即导致趋势严重误判。那么如果用到月线周线趋势,以及需要多年的日K数据来计算分析的变量,都是错误的,可以说回测到2019年都是不具备参考意义的。

既然如此, 这个回测还有什么价值? 不知道,有无同仁有此同感。


反对意见,请指点,本人虚心接受并致以谢意!

深有同感......
 
新手,这个应该怎么安装呢?并在MT5中启用?相关的.mq5文件应该放在什么位置
 

别说用于国内 ,就是用于美股,其K线时间划分的僵化性,已经决定了它的不实用性。

美股、A股,都是基于当地时间的N点30分开盘,且每日的交易中途,有休息时间段,然而,该软件在这些方面都貌似没有考虑到。其H2/H3/H4的K线都是千遍一律从服务器的0点开始划分,这样很容易就出现:股盘明明刚开盘半个小时,可软件已经给你画出了一根H4的K线!  

无论是肉眼量化还是用程序量化 , 因为最最基本的东西——K线的开盘价、最高价、最低价、收盘价,是错位的, 终将导致趋势结论是错误的,这是交易中最基本的,也是十分关键的错误!

错误的趋势结论,能带来长期稳定的盈利???!

要想能交易汇率、商品、指数、股票等各类品种,务必做到:K线时间的划分,能顺应各类品种的开盘时间的多样性。

否则,就是严重局限了它所能使用的交易品种! 从而只能适用于:开盘时间与软件服务器时间刚好吻合的品种。

 
.
 
优秀的探讨
原因: