欢迎访问 外汇EA下载与MT4/MT5自动交易资源 - 聚合外汇EA、黄金EA、量化交易工具与自动化交易实战内容。
登录 注册

MathTicker - 数学模式下的报价生成器 - MetaTrader 5 库

author emer | 670 人阅读 | 0 人评论 |

MathTicker - tick generator in mathematical mode - library for MetaTrader 5

MathTicker - tick generator in mathematical mode - library for MetaTrader 5

MathTicker - tick generator in mathematical mode - library for MetaTrader 5

MathTicker - tick generator in mathematical mode - library for MetaTrader 5

EAToMath 库的替代方案https://www.mql5.com/en/code/61283

以真实报价模式记录报价并以数学模式读取它们,并使用每个记录的报价调用您的策略。

创建原因:MQ 测试器,每次优化器运行时将刻度数据文件写入每个代理。我有 36 个代理,每个代理为其中一种工具和测试期间写入 10GB - 在 480GB 驱动器上总共写入 360GB。每次优化前此过程大约需要 1 小时。典型 SSD 的使用寿命为 500-1000 次写入周期。每次重写360GB,资源很快就会耗尽。该库仅写入 1 个文件,然后所有 36 个代理将从该文件中读取数据。所有这些都是编写该库的原因:我们仅使用 1 个文件 + 节省 1 小时将数据写入每个代理 + 与 MQ 测试器甚至与真实蜱模式下的虚拟相比的加速。
与 fxsaber(EAToMath 的作者)同时研究了该问题,每个人都有自己的版本。我的代码对我来说更清晰,所以我使用它。

对于交易操作,使用 MT4Orders 库https://www.mql5.com/en/code/16006
对于虚拟交易,需要使用虚拟库https://www.mql5.com/en/code/22577
要查看交易结果,您可以使用 MT4Orders QuickReporthttps://www.mql5.com/en/code/47816或举报
压缩刻度 TickCompressorhttps://www.mql5.com/en/code/66201
删除可能不必要的刻度 Control_Trade_Sessions 库https://www.mql5.com/en/code/48059例如,如果报价时段大于交易时段,则已连接。如果使用了所有报价,即会话重合,也可以将其删除。

与 EAToMath 的区别:

BidAsk 变体的速度与 EAToMath 相当。其他变体速度较慢,因为它们包含更多数据或具有额外的 ZIP 压缩。

使用特点:

您无法使用标准功能象征(),数字() (=4),观点()(=0.0001) 在策略中,因为它们将产生默认值,与测试的交易品种无关。而不是他们使用_象征,_数字,_观点它们被从文件读取的值覆盖。另外,新常数_TickSize_TickValue添加了记录符号的值 - 它们对于正确计算存款货币的利润、佣金和掉期是必要的。

保存报价时选择的测试周期的工作顺序:

存档的工作顺序:

用于估计工作速度的最简单 EA 交易示例:

#财产测试仪无缓存
#包括// 以数学模式连接交易
输入 整数代表=0;//重复优化
输入 布尔值添加卷=真的;空白 初始化时(){}空白 勾选(){
  静止的 MQTick打钩;
  如果符号信息勾选_象征, 打钩)){
      #ifdef_数学标记_
        如果(MathTick.SaveTick(Tick)){返回; }//如果我们保存价格变动,则退出并且不进行交易。      #endif
      策略(勾选);
   }
}双倍的总和=0;整数tk=0;空白战略(MQTick& 打钩){// 最简单的策略 - 用于与 EAToMath 比较阅读速度   Sum += Tick.bid+Tick.ask+(AddVolumes?Tick.volume_real:0.0); tk++;
  //if(tk<100){Print(Tick.time," " ",Tick.ask," ",Tick.bid," ",Tick.last," ",Tick.volume_real," ",Tick.flags);}}乌龙开始时间 =获取微秒计数();双倍的 测试仪(){
  #ifdef_数学标记_// 使用 MathTick 运行 - 它使用刻度对文件中的符号参数进行计数。用于垫子模式下的测试      如果(MathTick.SaveTicksEnd()){返回 0;}// 记录刻度并退出后关闭文件      如果(MathTick.ReadSymbolVars()){
         MathTick.Ticker();// 在 mat 模式下会将所有价格变动提供给 Strategy(MqlTick &Tick)。      }
  #endif
  打印“勾选:”,tk);
  长的工作时间 = (长的)(获取微秒计数() - 开始时间)/1000;
  //返回(NormalizeDouble(work_time, 1)); // 获取工作速度  返回和;// 比较计算结果}

您可以切换 1 个设置:

//#define RestoreFlags // восстановить флаги тика из изменения 卖价、出价、成交量 - добавит 7% к времени генерации тиков 931 вместо 869 мс

生成蜱虫时,会显示有关蜱虫压缩的统计数据。
以下是报价生成的统计数据、交易量和时间的打印输出。

------------
MQ无卷测试仪
第 1 遍返回结果 4345830621850.3115230:00:08.232



带卷的 MQ 测试仪
第 1 遍返回结果 4345879117123.3564450:00:07.962

2023 年同年 .tcs 文件的大小:

MathTicker - tick generator in mathematical mode - library for MetaTrader 5

所有带 ZIP 的变体,甚至完全保存都更加紧凑(3.5 至 1.5 倍)。

虚拟交易和报告输出的 EA 交易示例:

#财产测试仪无缓存

#包括// https://www.mql5.com/en/code/16006
#包括// 以数学模式连接交易

#定义ORDER_CURRENCY_DIGITS2 // 放置在交易历史中时用于计算利润/佣金/掉期的数字设置。
#定义VIRTUAL_LIMITS_TP_SLIPPAGE// 限制器和止盈价以第一个接受价格执行 - 正滑点
#定义订单佣金 -0 // 佣金分配 = 手数 * ORDER_COMMISSION。
#包括// https://www.mql5.com/en/code/22577

#定义报告测试仪            // 测试仪会自动记录报告
#定义REPORT_BROWSER            // 在浏览器启动时创建报告 - 需要 DLL 权限。
#定义USE_highcharts//- 您可以免费下载并试用所有 Highcharts 产品。一旦您的项目/产品准备好启动,请购买商业许可证。 https://shop.highcharts.com/
#包括//

枚举VirtTyp {MQ_Tester=0,虚拟1=1,虚拟2=2};输入VirtTyp 测试仪1=1;//测试者1
输入VirtTyp 测试仪2=2;//测试者2

输入 整数代表=0;//重复优化

布尔值是优化 =错误的, isTester=错误的;双倍的巴尔初始化=0;
VIRTUAL_POINTER 虚拟[10];空白 初始化时(){
   虚拟的[0] =0;// 0 - 真实交易环境   虚拟的[1] = VIRTUAL::Create(AccountBalance());// 创建虚拟化 1。   虚拟的[2] = VIRTUAL::Create(AccountBalance());// 创建虚拟化 2。  //虚拟[tester1].Select();   是优化 =MQLInfo整数MQL_优化);
   是测试者 =MQLInfo整数MQL_测试仪);
   balInit=账户余额();
}空白 勾选(){
  //虚拟[0].Select();   虚拟::NewTick();// 将tick发送到当前虚拟机  静止的 MQTick打钩;
  如果符号信息勾选_象征, 打钩)){
      #ifdef_数学标记_
        如果(MathTick.SaveTick(Tick)){返回; }//当写入价格变动时将退出函数,Strategy()将不会被调用      #endif
      策略(勾选);//贸易   }
}空白战略(MQTick& 打钩){// 最简单的策略 - 用于与 EAToMath 比较阅读速度  如果(打勾.问==0||勾号.出价==0){返回;}//MQ 测试器在失败的报价上进行交易,而虚拟则不会。也禁止 MQ  如果(测试员1>0){虚拟[tester1].Select();虚拟::NewTick(Tick);}//选择虚拟化1并发送一个勾号  如果(测试员2>0){虚拟[tester2].Select();虚拟::NewTick(Tick);}//选择虚拟化2并发送一个勾号  如果(isNewHour(Tick.time)){//每小时的第一个刻度      如果(GetHour0(Tick.time) %2==0){// 在测试器 1 中偶数时间购买         Virtual[tester1].Select();//选择虚拟化1        订单发送_象征, OP_购买,1, 勾选.询问,0, 勾选.询问 -100*_观点, 勾选.询问 +100*_观点); 
      }别的{// 在测试器 2 中在奇数时间出售         Virtual[tester2].Select();//选择虚拟化2        订单发送_象征, OP_SELL,1, 勾号. 出价,0, 勾号. 出价 +100*_观点, 勾号. 出价 -100*_观点);   
      } 
   }
}双倍的 测试仪(){
  #ifdef_数学标记_// 使用 MathTick 运行 - 它将从刻度文件中读取交易品种参数。用于垫子模式下的测试      如果(MathTick.SaveTicksEnd()){返回 0;}//保存蜱虫后返回      如果(MathTick.isMath && MathTick.ReadSymbolVars()){
        如果(测试者1==0){警报"   >>>>>>>>>   虚拟测试仪 1=MQ。在数学模式下只能使用虚拟测试仪。   <<<<<<<<");返回 0;}
        如果(测试者2==0){警报"   >>>>>>>>>   虚拟测试仪 1=MQ。在数学模式下只能使用虚拟测试仪。   <<<<<<<<");返回 0;}

         SYMBOL_BASE sb;某人.观点=_观点;某人.数字=_数字;某人.象征=_象征; sb.SymbolID=0; sb.TickSize=_TickSize; sb.TickValue=_TickValue / _TickSize;//this.TickValue_ /= this.TickSize_; //如 \fxsaber\Virtual\Symbol_Base.mqh 中的 SetSymbol() 所示         虚拟的[1]。选择();虚拟::SetSymbolBase(sb);虚拟的[2]。选择();虚拟::SetSymbolBase(sb);
        //minFreezeLevel = _minFreezeLevel*_Point; minStopLevel = _minStopLevel*_Point;         Virtual[tester1].Select();
         MathTick.Ticker();// 在 mat 模式下会将所有价格变动提供给 Strategy(MqlTick &Tick)。      }
  #endif

  双倍的ret_val=0;
  为了整数v =0; v <= 虚拟::总计(); v++){
    如果(虚拟[v].Select()){
      如果(五>0){
         虚拟::停止();
        #ifdef_数学标记_// 使用 MathTick 运行 - 它将从刻度文件中读取交易品种参数。用于垫子模式下的测试            如果(MathTick.isMath){ VIRTUAL::CalcSwaps( MathTick.swapShort, MathTick.swapLong,0, MathTick.swap3days ); }//从刻度文件中交换            别的{虚拟::计算交换(_象征,0);}
        #别的
          虚拟::计算交换(_象征,0);//计算掉期 - 所有交易都有一个掉期,即如果有 2 个以上不同的工具,它们都将具有主要交易品种的掉期。        #endif
      }// 以最后一次价格变动的价格关闭未完成的交易,如测试器中所示      如果( !isOptimization){QuickReport(“报告_”+(细绳)v,真的, v,错误的,真的);}
      打印((细绳)v+“账户余额=”,账户余额(),"   账户净值 = ",AccountEquity());
      双倍的prib=AccountBalance()-balInit;
      ret_val += prib;//  }}
  返回ret_val;// 比较计算结果}布尔值是新时间(日期时间&t){静止的 整数下一个_h=-1;如果(t < next_h){返回 错误的; }别的{ next_h = (GetHour0(t)+1)*3600;返回 真的;}}整数获取时间0    (日期时间&t){返回((整数)( t /3600));}//1971 年 1 月 1 日起的当前时间

此示例创建 2 个具有不同交易的虚拟机。一名测试员在偶数时间买入,另一名测试员在奇数时间卖出。

这是一个有 2 名测试人员的复杂示例,如果您需要与 1 名测试人员一起工作,则可以简化。

您还可以选择MQ测试器并将其与虚拟测试器的结果进行比较,以控制计算的正确性。只是委托可能不一致,因为有许多不同的委托,并且在虚拟测试器中只编程了一种变体。

带有 6 个智能过滤器的专业平仓面板。按类型、按代码或按损益全部平仓。实时盈亏显示。非常适合紧急出口和风险管理。包括安全确认。

该函数计算未平仓头寸的手数大小。交易的开盘价格、止损水平的价格以及每笔交易的风险(占保证金的百分比)作为参数传递

Andrey F. Zelinsky 的想法,基于 William Blau 的指标

设置三个交叉并监控从给定时间(也可以设置)开始的每日百分比表现。


附件下载

📎 Control_Trade_Sessions.mqh (13.48 KB)

📎 TickCompressor.mqh (39.54 KB)

📎 MathTicker.mqh (31.16 KB)

📎 MathTickerTest.mq5 (13.48 KB)

Source: MQL5 #65821

🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录