MT5和速度在行动 - 页 23

 
Renat Fatkhullin:

如果有人不明白,是fxsaber库在别人的代码中应用时造成了制动。

他没有明确指出这一点,而是开始玩起了关于平台刹车和滑倒自杀的例子。而当有机会找到真正的原因并使问题顺利解决时,他却没有把握住。

为了进行局部优化,它正在毒害主程序的历史缓存。

关于交易、自动交易系统和测试交易策略的论坛

MT5和速度在行动

fxsaber, 2020.09.02 00:02

有一个干净的MQL5代码,可以被很多人复制。按照时间顺序,先研究一下,而不是玩阴谋论,有人很需要你,以至于愿意把时间花在你身上,进行抹黑。

你的火鸡工作做得很好。这里没有专门讨论过任何图书馆,因为这不是建设性的。

重点是,如果有人冒险使用共享库,其中的from-input参数不一致,他们将得到刹车。文件中没有任何地方提到这一点。至少有关于它的东西是用钳子从你身上取出来的。而当它完成后,他们开始指责你作弊。


MQL的这个功能应该写在文档和功能分支中。在与创建日期相对应的构建中,运行该分支的干净MQL5脚本。显然,为了以防万一,盲目地进行了这么多的修复。

 
fxsaber:

作为一个独立的人,你的工作做得很好。这里没有特别提到图书馆,因为这不是建设性的。

因为你已经尽力 不吹嘘你的 图书馆了。在这些图书馆的存在下。随着 "我的更快 "的不断反对。因此,你巧妙地掩盖了自我射击,伸出了 "看它有多慢"。


问题是,如果有人敢于使用from-input参数不一样的共享库,就会出现滞后现象。文件中没有任何地方提到这一点。至少关于这个话题的东西是用钳子从你身上提取的。而当它完成后,他们开始指责你作弊。


MQL的这个功能应该写在文档和功能分支中。在与创建日期相对应的构建中,运行该分支的干净MQL5脚本。显然,为了以防万一,盲目地进行了这么多的修复。

HistorySelect的文件 明确指出。

HistorySelect()函数在mql5程序中创建了一个订单列表和一个交易列表,以便通过适当的函数进一步引用列表中的元素。交易列表的大小可以通过HistoryDealsTotal() 函数获得,而历史上的订单列表的大小可以通过HistoryOrdersTotal() 函数获得。枚举订单列表中的元素最好使用HistoryOrderGetTicket() 函数,对于交易列表的元素,使用HistoryDealGetTicket() 函数是合适的。

在使用HistoryOrderSelect() 函数后,如果按票据搜索订单的工作 已经成功完成,那么mql5-program可用的历史订单列表将被重置并重新填入订单。这同样适用于交易列表,这对mql5-程序来说是可用的--它通过HistoryDealSelect() 函数被重置,如果通过票号成功获得交易,则重新填充。


当你在处理巨大的交易量时(你在历史上显示了数千和数万的交易是有原因的),需要原子/快照访问,你需要了解它们的成本。

特别是我已经在这个主题中非常详细地解释了这些缓存的技术细节。


你有没有尝试过将每个样本随机化,并尽可能地在缓存中下毒?为了你的立场,任何自我射击都是有必要的?

 
Renat Fatkhullin:

因为你做了一切 可以让你的 图书馆保持安静。这就是为什么你巧妙地通过标榜 "看它有多慢 "来掩盖自作自受的错误。

99%的bug都是通过这种方式发现的。首先,奇怪的行为是在大代码中发现的。然后本地化找到原因。我更担心的是刹车。

交易功能。问题几乎无处不在。

KD      0       16:00:33.382    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 34: HistoryOrderSelect(0)] = 25 ms.
PE      0       16:00:44.913    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 24 ms.
DP      0       16:00:44.888    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 46 ms.
FI      0       16:00:49.579    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 28: HistoryDealSelect(0)] = 22 ms.
EE      0       16:01:03.287    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 33: HistoryOrderGetDouble(0,ORDER_PRICE_CURRENT)] = 1 ms.
KE      0       16:01:07.013    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 50: OrderGetDouble(ORDER_PRICE_CURRENT)] = 1 ms.
JM      0       16:01:12.189    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 44: TimeCurrent()] = 39 ms.
MD      0       16:01:13.067    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 81: ResourceFree(NULL)] = 1 ms.
RS      0       16:01:13.572    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 41: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 7 ms.
GL      0       16:01:27.816    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 79: GlobalVariableGet(NULL)] = 22 ms.
PD      0       16:01:33.892    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 58: PositionGetInteger(POSITION_MAGIC)] = 1 ms.
KP      0       16:01:39.864    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 67: OrderCheck(Request,CheckResult)] = 3 ms.
ML      0       16:01:39.970    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 62: AccountInfoInteger(ACCOUNT_MARGIN_MODE)] = 1 ms.
KM      0       16:01:41.045    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 55: PositionSelect(Symb)] = 2 ms.
NS      0       16:01:46.832    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 78: GlobalVariableCheck(NULL)] = 1 ms.
JP      0       16:01:49.211    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 75: SymbolName(0,true)] = 1 ms.
EL      0       16:01:59.101    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 32 ms.
IM      0       16:02:07.462    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 70: AccountInfoInteger(ACCOUNT_TRADE_EXPERT)] = 7 ms.
PJ      0       16:02:11.735    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 37: IsStopped()] = 4 ms.
OG      0       16:03:08.178    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 32: HistoryOrderGetInteger(0,ORDER_MAGIC)] = 14 ms.
JH      0       16:03:16.385    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 5 ms.
FM      0       16:03:16.601    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 59: PositionGetString(POSITION_SYMBOL)] = 1 ms.
GH      0       16:03:21.841    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 72: TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)] = 1 ms.
FJ      0       16:03:25.782    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 46: TimeTradeServer()] = 1 ms.
EO      0       16:03:26.772    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 45: TimeLocal()] = 10 ms.
HD      0       16:03:36.595    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 13: SymbolInfoTick(Symb,Tick)] = 13 ms.
...
这名男子决定提供帮助,并在他的机器上运行一个干净的MQL5代码。上面有一个小样本。阅读上面的函数名称。


HistorySelect文档 明确指出。

HistorySelect()函数在mql5程序中创建了一个订单列表和一个交易列表,以便通过相应的函数进一步引用列表中的项目。交易列表的大小可以通过HistoryDealsTotal() 函数获得,而历史上的订单列表的大小可以通过HistoryOrdersTotal() 函数获得。枚举订单列表中的元素最好使用HistoryOrderGetTicket() 函数,对于交易列表的元素,使用HistoryDealGetTicket() 函数是合适的。

在使用HistoryOrderSelect() 函数后,如果按票据搜索订单的工作 已经成功完成,那么mql5-program可用的历史订单列表将被重置并重新填入订单。这同样适用于交易列表,这对mql5-程序来说是可用的--它通过HistoryDealSelect() 函数被重置,如果通过票号成功获得交易,则重新填充。

我想知道是谁在这段文字的字里行间看到了什么?我个人认为(在这个分支之前),HistoryDealSelect和HistoryOrderSelect必须像这样写。

  static bool HistorySelectOrder( const ulong Ticket )
  {
    return((::HistoryOrderGetInteger(Ticket, ORDER_TICKET) == Ticket) || ::HistoryOrderSelect(Ticket));
  }

  static bool HistorySelectDeal( const ulong &Ticket )
  {
    return((::HistoryDealGetInteger(Ticket, DEAL_TICKET) == Ticket) || ::HistoryDealSelect(Ticket));
  }

否则,你肯定会遇到滞后的问题。

当你处理巨大的卷,需要原子/快照访问时,你需要了解其成本。

更何况我已经在这个主题中非常详细地解释了这些缓存的技术细节。

我一直在这个主题中收集必要的信息。

 
Renat Fatkhullin:

你有没有尝试过将每个样本随机化,并尽可能地在缓存中下毒?为了你的立场,任何自我射击都是有必要的?

你可以在这个主题中按时间顺序看到所有的东西。这个问题 最初 在没有任何随机的情况下显示的

这条线是一个很好的证明,说明你可以扭曲对手的话。所有的来源和它们的结果都保存在这里。

 

为什么终端不能在再次请求完整的历史记录时增加缓存,检索并缓存所缺的范围?这似乎可以解决这个问题。毕竟,在请求酒吧/门票时,缺失的数据包会被返回,所以有一个机制可以解决这个问题。

 
Aleksey Vyazmikin:

为什么终端不能在再次请求完整的历史记录时增加缓存,检索并缓存所缺的范围?

这一点已经做到了。

但是如果在HistorySelect( 0,INT_MAX) 之间调用HistorySelect( other_time, ...),缓存将从 other_time开始重建,下一次HistorySelect( 0,...) 请求将导致新的缓存建立(将更慢)

 
Andrey Khatimlianskii:

这一点已经做到了。

但是如果在调用HistorySelect( 0,INT_MAX)之间,我们调用HistorySelect( other_time, ...),缓存将从 other_time开始重建,下一个HistorySelect( 0, ...) 请求将导致新的缓存建立(会比较慢)

如果你已经做了,那就很好,那么唯一的问题是关于接收到的数据的工作的便利性,只要缓存建立起来。

我对交易操作理解得不是很深,但如果查询范围发生变化,那么就没有可能在不完全蛮干的情况下快速搜索历史内的数据了吗?

 
Aleksey Vyazmikin:

我对交易没有那么深的研究,但是如果查询的范围改变了,那么就没有办法在没有全面枚举的情况下快速搜索故事中的数据了?

如果你不使用这些知识,那么这些知识的意义何在?

没有实际问题=没有问题。

 
Renat Fatkhullin:

OrderExist和PositionExist是特殊的优化函数,可以避免愚蠢地在所有订单或头寸中循环,按符号、交易类型和medzhik搜索条目。

其结果是一系列的门票。


使用这些功能的程序可能会节省很多钱。特别是在大量调用未结头寸和订单时,不断地、反复地进行超限循环。

我们将在未来实施更有效的功能来获取大量的 贸易数据。

该语言也将得到极大的加强和简化,具有更强大的功能。

"OrderExist和PositionExist" - 在文档中没有找到,我在哪里可以读到它们?
 
HimOrik:
"OrderExist和PositionExist" - 在文档中没有找到,在哪里可以读到它们?

最有可能是在下一个发布版本之后(现在是测试版)。