私募

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz

期货量化软件——智能系统提示胜率

[复制链接]
发表于 2024-5-9 08:35:11 | 显示全部楼层 |阅读模式
关于品质因数5 R! D" i3 @$ E# L- g2 ~
为了能够显示 “OnTester result” 值,赫兹量化软件需要定义返回双精度值的 OnTester 函数。 就这么简单! 在此,使用下面的代码,我们得到如图例 3 所示的结果。; g" D, `' B* h5 I! u- C: T1 u2 i
图例 3: EA 针对 USDJPY,在 2023-01-01 至 2023-05-19 期间,OHLC 模式,H1 执行。1 V' |. S- m4 Z4 N& Y
以下代码应放在上一段代码的末尾。 在此,赫兹量化软件计算交易的平均风险回报率:该比率通常表示为获取的回报,因为假设风险是恒定的,等于 1。 故此,我们可以将风险回报率解释为 1:1.23 或简单的 1.23,另一个例子可能是 0.43。 在第一个例子中,我们所冒风险,每投入 1 美元,就会收获 1.23 美元;而在第二个例子中,我们所冒风险,每投入 1 美元,只能得到 0.43 美元,亏损了。 因此,当回报为 1 或接近它时,这意味着我们收支平衡,高于它意味着我们赚了。  j- F9 ^* |% S4 N3 v" V
由于统计数据并未提供平均收益或亏损额度,赫兹量化软件将取总数值除以两侧(做多或做空)交易数量的常规值。 当返回已执行交易的数量时,要加 1。 这样的话,如果没有盈利交易或亏损交易,程序也不会在计算过程中因除零而终止。 此外,为了避免显示太多的小数位,如前面的图例 1 所示,其中小数位超过 5 位,我们调用 NormalizeDouble 仅显示结果的两位小数。- s- K, I$ m/ G5 T' g( o
double OnTester()  {//--- Average profit   double lucro_medio=TesterStatistics(STAT_GROSS_PROFIT)/(TesterStatistics(STAT_PROFIT_TRADES)+1);//--- Average loss   double prejuizo_medio=-TesterStatistics(STAT_GROSS_LOSS)/(TesterStatistics(STAT_LOSS_TRADES)+1); //--- Risk calculation: profitability to be returned   double rr_medio = lucro_medio / prejuizo_medio;//---   return NormalizeDouble(rr_medio, 2);  }
# @6 b, W- h. ]* G# R) bOnTester 函数必须存在于每个智能系统当中,以遍确保在报告中显示该数值。 为了尽量减少复制若干行代码的相关工作,赫兹量化软件将函数转移到一个单独的文件之中。 以这种方式,我们每次就只需要复制一行。 具体操作如下:2 t! N- `) z  s
#include "ARTICLE_METRICS.mq5"
4 G/ J4 B+ K/ M以这种方式,我们得到一段简洁的代码! 在指定的文件中,函数都已定义。 如果我们打算用 include 的话,这令我们能够轻松更改欲包含的函数名称,从而避免可能出现的 OnTester 函数重复定义错误。 如此,我们可以将当作一种机制,即优先使用直接插入到 EA 代码中的 OnTester。 如果我们打算由 include 来用它,我们简单地注释掉 EA 代码中的 OnTester 函数,并注释掉相应的宏定义即可。 我们稍后会回到这处。
' R- Y' q) O) l4 k( w: E' R起初,ARTICLE_METRICS.mq5 文件将如下所示:
+ V) D& F- S' F; v& Q//--- Risk calculation: average return on operationdouble rr_medio()  {//--- Average profit   double lucro_medio=TesterStatistics(STAT_GROSS_PROFIT)/(TesterStatistics(STAT_PROFIT_TRADES)+1);//--- Average loss   double prejuizo_medio=-TesterStatistics(STAT_GROSS_LOSS)/(TesterStatistics(STAT_LOSS_TRADES)+1); //--- Risk calculation: profitability to be returned   double rr_medio = lucro_medio / prejuizo_medio;//---   return NormalizeDouble(rr_medio, 2);  }//+------------------------------------------------------------------+//| OnTester                                                         |//+------------------------------------------------------------------+#ifndef SQN_TESTER_ON_TESTER#define SQN_TESTER_ON_TESTER OnTester#endifdouble SQN_TESTER_ON_TESTER()  {   return rr_medio();  }% O1 c! U5 O4 w3 g
请注意,正确的文件名必须具有扩展名 “mqh”。 不过,由于我计划将文件保存于 Experts 目录,故我特意保留了代码扩展名。 您这边可自行决定。
5 k1 \# F; D7 q) Q3 x+ f1 h第一版品质计算
# B; A) u, q* }6 A, Y赫兹量化软件第一个版本的品质计算是基于 Sunny Harris 创建的方法,名为 CPC 指数。 这种方式用到三个衡量度,它们互乘:风险:平均回报、成功率、和盈利率。 不过,我们要对其进行修改,令其不使用盈利因子 — 代之,取盈利因子和恢复因子两者间的最低值。 虽然,如果我们考虑两者之间的区别,我们应该选择恢复因子,但我更愿保持原样,因为它已经导致了计算的改进。
2 X3 ]- O1 b, ?. f/ l/ v( m下面的代码实现了上一段中提到的方式。 我们只需要在 OnTester 中调用它。 请注意,我们于此没有把交易数量加 1,因为提供的数值是通用的,我们预计至少会有 1 笔交易可评估。
- e* G' F4 w: a+ t1 \* `) T; L//--- Calculating CPC Index by Sunny Harrisdouble CPCIndex()  {   double taxa_acerto=TesterStatistics(STAT_PROFIT_TRADES)/TesterStatistics(STAT_TRADES);   double fator=MathMin(TesterStatistics(STAT_PROFIT_FACTOR), TesterStatistics(STAT_RECOVERY_FACTOR));   return NormalizeDouble(fator * taxa_acerto * rr_medio(), 5);  }
, z. `3 v8 b2 C( t: @5 f3 f$ K" ~4 F  C第二版品质计算+ h2 I: Z7 r7 x4 z9 l0 A; s3 I" \; I
赫兹量化软件将要探讨的第二版品质因数称为系统品质指数(SQN)。 它是由 Van Tharp 创造的。 我们将计算每个月执行的交易,并获取模拟的所有月份的简单平均值。 SQN 与上一章节中讲述的方式不同,因为它着重寻求的是交易系统的稳定性。
7 i4 `# |& \# kSQN 的一个重要特征就是它惩罚具有明显尖峰的系统。 因此,如果系统有一连串小笔交易和一笔大交易,则后者将受到惩罚。 这意味着,如果我们的系统有多笔小亏损和一笔大盈利,那么这笔盈利就会受到惩罚。 与其对比(小利大亏)也会受到惩罚。 后者对交易者来说是最糟糕的。0 X  r0 p. D" m: M6 N. R- ?8 A
请记住,交易是一场长期的竞赛,请始终留意追踪您的系统! 不要只盯住您在月底赚到的钱,因为它可能会有极大的波动。
# k9 n4 M7 H$ B3 n3 E* M//--- standard deviation of executed trades based on results in moneydouble dp_por_negocio(uint primeiro_negocio, uint ultimo_negocio,                      double media_dos_resultados, double quantidade_negocios)  {   ulong ticket=0;   double dp=0.0;   for(uint i=primeiro_negocio; i < ultimo_negocio; i++)     {      //--- try to get deals ticket      if((ticket=HistoryDealGetTicket(i))>0)        {         //--- get deals properties         double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);         //--- create price object         if(profit!=0)           {            dp += MathPow(profit - media_dos_resultados, 2.0);           }        }     }   return MathSqrt(dp / quantidade_negocios);  }//--- Calculation of System Quality Number, SQN, by Van Tharpdouble sqn(uint primeiro_negocio, uint ultimo_negocio,           double lucro_acumulado, double quantidade_negocios)  {   double lucro_medio = lucro_acumulado / quantidade_negocios;   double dp = dp_por_negocio(primeiro_negocio, ultimo_negocio,                              lucro_medio, quantidade_negocios);   if(dp == 0.0)     {      // Because the standard deviation returned a value of zero, which we didn't expect      // we change it to average_benefit, since there is no deviation, which      // brings the system closer to result 1.      dp = lucro_medio;     }//--- The number of trades here will be limited to 100, so that the result will not be//--- maximized due to the large number of trades.   double res = (lucro_medio / dp) * MathSqrt(MathMin(100, quantidade_negocios));   return NormalizeDouble(res, 2);  }//--- returns if a new month is foundbool eh_um_novo_mes(datetime timestamp, int &mes_anterior)  {   MqlDateTime mdt;   TimeToStruct(timestamp, mdt);   if(mes_anterior < 0)     {      mes_anterior=mdt.mon;     }   if(mes_anterior != mdt.mon)     {      mes_anterior = mdt.mon;      return true;     }   return false;
http://www.simu001.cn/x289459x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Archiver| ( 桂ICP备12001440号-3 )|网站地图

GMT+8, 2024-12-24 04:04 , Processed in 0.788006 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表