程序库: MT4Orders - 页 52 1...454647484950515253545556575859...95 新评论 Amanda Griet 2020.08.29 01:09 #511 traveller00: 以防万一,我想说的是,在我的记忆中,ZIP 压缩文件已经修复。但现在又乱套了,那里有一个旧版本,你必须按文件更新。 fxsaber 2020.08.29 03:36 #512 // 更改列表: // 29.08.2020 // 修复:加快了交易历史记录的处理速度。 fxsaber 2020.08.29 03:45 #513 关于交易、自动交易系统和测试交易策略的论坛 库: MT4Orders fxsaber, 2020.08.29 00:03 2020.08.29 00:57:38.561 HistoryDealsTotal() = 9435 2020.08.29 00:57:38.813 2046.04.30 00:13:20 2020.08.29 00:57:38.813 Time[Bench(LastTimeMQL4)] = 252274 2020.08.29 00:57:38.820 2046.04.30 00:13:20 2020.08.29 00:57:38.820 Time[Bench(LastTimeMQL5)] = 7162 在这项任务中,纯 MQL5 快了 40 倍。学习 MQL5! 更新后。 HistoryDealsTotal() = 9435 2046.04.30 00:13:20 Time[Bench(LastTimeMQL4)] = 16984 2046.04.30 00:13:20 Time[Bench(LastTimeMQL5)] = 4194 这项任务的速度提高了 15 倍。在研究 HistorySelect 函数的特殊性后,并没有做出明显的操作。 fxsaber 2020.08.29 04:17 #514 从 MT4Orders 到 MQL5+SB 的可耻损失。 // 脚本会计算所有平仓头寸的总持续时间。 #include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006 // 返回所有关闭位置的总持续时间。 int SumPositionsLengthMQL4( void ) { int Res = 0; for (int i = OrdersHistoryTotal() - 1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL)) Res += (int)(OrderCloseTime() - OrderOpenTime()); return(Res); } #include <Generic\HashMap.mqh> // 返回所有关闭位置的总持续时间。 int SumPositionsLengthMQL5( void ) { int Res = 0; if (HistorySelect(0, INT_MAX)) { CHashMap<ulong, ulong> DealsIn; // 按位置 ID 返回 DealIn。 const int TotalDeals = HistoryDealsTotal(); for (int i = 0; i < TotalDeals; i++) { const ulong TicketDeal = HistoryDealGetTicket(i); if (HistoryDealGetInteger(TicketDeal, DEAL_ENTRY) == DEAL_ENTRY_IN) DealsIn.Add(HistoryDealGetInteger(TicketDeal, DEAL_POSITION_ID), TicketDeal); else if (HistoryDealGetInteger(TicketDeal, DEAL_TYPE) <= DEAL_TYPE_SELL) { ulong TicketDealIn; if (DealsIn.TryGetValue(HistoryDealGetInteger(TicketDeal, DEAL_POSITION_ID), TicketDealIn)) Res += (int)(HistoryDealGetInteger(TicketDeal, DEAL_TIME) - HistoryDealGetInteger(TicketDealIn, DEAL_TIME)); } } } return(Res); } typedef int (*SumPositionsLength)( void ); void Bench( SumPositionsLength GetSumPositionsLength, const int Amount = 100 ) { long Tmp = 0; for (int i = 0; !IsStopped() && (i < Amount); i++) Tmp += GetSumPositionsLength(); Print(Tmp); } #define BENCH(A) \ { \ const ulong StartTime = GetMicrosecondCount(); \ A; \ Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \ } #define PRINT(A) Print(#A + " = " + (string)(A)) void OnStart() { if (HistorySelect(0, INT_MAX)) PRINT(HistoryDealsTotal()); BENCH(Bench(SumPositionsLengthMQL4)) BENCH(Bench(SumPositionsLengthMQL5)) }结果。 HistoryDealsTotal() = 9435 3132754100 Time[Bench(SumPositionsLengthMQL4)] = 871406 3132754100 Time[Bench(SumPositionsLengthMQL5)] = 109411性能提高 9 倍。学习 MQL5。 Igor Makanu 2020.08.29 08:11 #515 fxsaber:结果 如果不太麻烦,请显示 4k 和 MT5(终端)执行此测试的时间差 fxsaber: MQL5+SB 之前 MT4Orders 的可耻损失。 一切都相对.... 5 行代码和 MT5 的十几行代码 - 如果您测试这个想法,那么 5-stock 是更好的选择,如果您优化,那么肯定是第二种选择。 fxsaber 2020.08.29 08:36 #516 Igor Makanu:如果不难的话,4 和 MT5(终端)之间的差异会显示该测试的执行时间 MT4: OrdersHistoryTotal() = 10291 Time[Bench(SumPositionsLengthMQL4)] = 56548 OrdersHistoryTotal() = 32020 Time[Bench(SumPositionsLengthMQL4)] = 186761 OrdersHistoryTotal() = 41815 Time[Bench(SumPositionsLengthMQL4)] = 249371 在平仓 数量相同的情况下,MT4x32 比 MT5x64 快四倍多。 ZЫ 也许,如果您忘记在 MT4Orders 中保存内存,将历史记录保存到内部数组中,那么您也可以战胜 MT4。也许应该这样做。 Igor Makanu 2020.08.29 09:01 #517 fxsaber:在平仓 数量相同的情况下,MT4x32 比 MT5x64 快四倍多。 谢谢,我认为这是 MK 的缺陷,但他们对 MT5 的生产用途有自己的看法。 fxsaber: ZЫ 也许,如果我们忘记 MT4Orders 中的内存保存,将历史保存到内部数组中,那么我们就可以战胜 MT4。也许应该这样做。 您肯定可以通过禁用选项做到这一点,至少您的代码一直都有这样的功能。 SZY:我测试了杀死终端的字符串大小,MT5 是杀不死的 - 它总是能分配内存,我认为只有在多个内核的测试仪中,当分配大量内存时才会出现故障.....。一般来说,你需要测试 SZYZY:从来没有检查过包含交易历史数据的结构数组能占用多少内存? 好吧,让结构重 200 字节,交易历史记录 100K - 结果是 20 Mb...在我看来,如果不是因为复杂的任务导致终端死机,这根本不是问题......一般来说,测试都是一样的 - 这样就清楚了 fxsaber 2020.08.29 09:29 #518 Igor Makanu:ZYZY:没查过,包含交易历史数据的结构数组能占用多少内存? sizeof(MT4_ORDER) = 280 Igor Makanu 2020.08.29 11:24 #519 夏日过后,我似乎无法恢复体形... fxsaber:MT4:在平仓 数量相同的情况下,MT4x32 比 MT5x64 快四倍多。 @fxsaber 能否在虚拟环境中检查一下这个测试?( Virtual.mqh 库 ) fxsaber 2020.08.29 12:09 #520 Igor Makanu:@fxsaber 你能在虚拟环境中检查一下这个测试吗?( Virtual.mqh 库 ) #include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006 #include <fxsaber\Virtual\Virtual.mqh> // 返回所有关闭位置的总持续时间。 int SumPositionsLengthMQL4( void ) { int Res = 0; for (int i = OrdersHistoryTotal() - 1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL)) Res += (int)(OrderCloseTime() - OrderOpenTime()); return(Res); } typedef int (*SumPositionsLength)( void ); void Bench( SumPositionsLength GetSumPositionsLength, const int Amount = 100 ) { long Tmp = 0; for (int i = 0; !IsStopped() && (i < Amount); i++) Tmp += GetSumPositionsLength(); Print(Tmp); } #define BENCH(A) \ { \ const ulong StartTime = GetMicrosecondCount(); \ A; \ Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \ } #define PRINT(A) Print(#A + " = " + (string)(A)) bool CreateHistory( const int Amount = 10000 ) { const bool Res = VIRTUAL::GetHandle(); if (Res) { MqlTick Tick; _V(0, SymbolInfoTick(_Symbol, Tick)); VIRTUAL::NewTick(Tick); for (int i = 0; i < Amount; i++) { const TICKET_TYPE Ticket = OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0); Tick.time_msc += 1000; VIRTUAL::NewTick(Tick); OrderClose(Ticket, 1, Tick.bid, 0); } } return(Res); } void OnStart() { PRINT(OrdersHistoryTotal()); BENCH(Bench(SumPositionsLengthMQL4)) VIRTUAL::SelectByHandle(VIRTUAL::Create()); if (CreateHistory()) { PRINT(OrdersHistoryTotal()); BENCH(Bench(SumPositionsLengthMQL4)) } } 结果 // MT4 // Real: VIRTUAL::VirtualOrdersHistoryTotal() = 10291 Time[Bench(SumPositionsLengthMQL4)] = 63774 // 虚拟 VIRTUAL::VirtualOrdersHistoryTotal() = 10001 Time[Bench(SumPositionsLengthMQL4)] = 158218 // MT5 // 虚拟 VIRTUAL::VirtualOrdersHistoryTotal() = 10001 Time[Bench(SumPositionsLengthMQL4)] = 43343 您可以清楚地看到 MT4 历史记录比 MT4 中的虚拟环境快三倍。同时,在 MT5 中,同样的虚拟环境比 MT4 快四倍。 也就是说,MT5 中的虚拟环境比 MT4 中的真实环境快。 1...454647484950515253545556575859...95 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
以防万一,我想说的是,在我的记忆中,ZIP 压缩文件已经修复。但现在又乱套了,那里有一个旧版本,你必须按文件更新。
关于交易、自动交易系统和测试交易策略的论坛
库: MT4Orders
fxsaber, 2020.08.29 00:03
在这项任务中,纯 MQL5 快了 40 倍。学习 MQL5!
更新后。
这项任务的速度提高了 15 倍。在研究 HistorySelect 函数的特殊性后,并没有做出明显的操作。
结果。
性能提高 9 倍。学习 MQL5。
结果
如果不太麻烦,请显示 4k 和 MT5(终端)执行此测试的时间差
MQL5+SB 之前 MT4Orders 的可耻损失。
一切都相对.... 5 行代码和 MT5 的十几行代码 - 如果您测试这个想法,那么 5-stock 是更好的选择,如果您优化,那么肯定是第二种选择。
如果不难的话,4 和 MT5(终端)之间的差异会显示该测试的执行时间
MT4:
在平仓 数量相同的情况下,MT4x32 比 MT5x64 快四倍多。
ZЫ 也许,如果您忘记在 MT4Orders 中保存内存,将历史记录保存到内部数组中,那么您也可以战胜 MT4。也许应该这样做。
在平仓 数量相同的情况下,MT4x32 比 MT5x64 快四倍多。
谢谢,我认为这是 MK 的缺陷,但他们对 MT5 的生产用途有自己的看法。
ZЫ 也许,如果我们忘记 MT4Orders 中的内存保存,将历史保存到内部数组中,那么我们就可以战胜 MT4。也许应该这样做。
您肯定可以通过禁用选项做到这一点,至少您的代码一直都有这样的功能。
SZY:我测试了杀死终端的字符串大小,MT5 是杀不死的 - 它总是能分配内存,我认为只有在多个内核的测试仪中,当分配大量内存时才会出现故障.....。一般来说,你需要测试
SZYZY:从来没有检查过包含交易历史数据的结构数组能占用多少内存? 好吧,让结构重 200 字节,交易历史记录 100K - 结果是 20 Mb...在我看来,如果不是因为复杂的任务导致终端死机,这根本不是问题......一般来说,测试都是一样的 - 这样就清楚了
ZYZY:没查过,包含交易历史数据的结构数组能占用多少内存?
夏日过后,我似乎无法恢复体形...
MT4:
在平仓 数量相同的情况下,MT4x32 比 MT5x64 快四倍多。
@fxsaber 能否在虚拟环境中检查一下这个测试?( Virtual.mqh 库 )
@fxsaber 你能在虚拟环境中检查一下这个测试吗?( Virtual.mqh 库 )
结果
您可以清楚地看到 MT4 历史记录比 MT4 中的虚拟环境快三倍。同时,在 MT5 中,同样的虚拟环境比 MT4 快四倍。
也就是说,MT5 中的虚拟环境比 MT4 中的真实环境快。