MathTicker - 数学模式下的报价生成器 - 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 文件的大小:

所有带 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
💡 精彩内容推荐
✍️ 楼主最新发布
- •
- •
- •
- •
- •
- •
🔗 您可能感兴趣
- •
- •
- •
- •
- •
- •
