MQL4 如何在更改账户期间检测状态(已完成历史交易下载)
MQL4 How To Detect Status During Change of Account (Completed Downloading of Historical Trades)
在MT4中,存在一个stage/state:当我们从AccountA切换到AccountB时,当Connection建立,init()和start()被MT4触发;但在 "blinnnggg"(声音)之前,当所有 historical/outstanding 交易都从服务器加载时。
切换账户>建立连接>触发 Init()/Start() 事件>开始下载 Outstanding/Historical 交易>完成下载(发出 "bliinng" 声音)。
我需要知道(在 MQL4 中)所有交易都已完成从 tradeServer 下载——要知道账户确实是空的——相对于——仍在从 tradeServer 下载历史记录。
任何指针将不胜感激。我探索了 IsTradeAllowed()
IsContextBusy()
和 IsConnected()
。所有这些都处于 "normal" 状态并且 init() 和 start() 事件都被触发了。但是我无法确定 history/outstanding 交易列表是否已完成下载。
观察
由于发布了问题,MT4-Terminal 似乎没有这种 "integrated" 方法。
IsTradeAllowed()
反映 account/access 对交易服务执行的管理状态 { IsTradeAllowed | !IsTradeAllowed }
IsConnected()
反映了在尝试 setup/maintain localhost <- 之间的在线连接时使用的可见性/登录凭据/连接的技术状态> 服务器 { IsConnected() | !IsConnected() }
init() {...}
是一站式设置工具,一旦 MT4 程序 { ExpertAdvisor | Script | TechnicalIndicator }
在本地主机。强烈建议该设施是非阻塞和不可重入的。从用户 account_A 到另一个用户 account_B 的更改通常是(通过 MT4 配置选项)停止执行先前加载的 MQL4 代码(无论是 EA / 脚本 /技术指标 ) )
start() {...}
是一个事件处理工具,它无休止地等待下一次出现的外汇市场事件(由Broker MT4-Server automation ) 通过已建立的连接向下发布到 MT4-Terminal 进程,在本地主机上 运行。
解决方法
据了解,问题可能会被间接检测和处理。
虽然MT4平台似乎没有直接的方法来区分{ current | historical }
交易列表的完整/不完整刷新,但我提出一种间接检测的方法。
尝试启动“信号”-交易(一个挂单,在 PriceDOMAIN 中放置在几何上远离当前 Ask/出价-水平).
一旦此交易被端到端注册(服务器端确认),本地端将确认 db.POOL
的有效状态
将此设为 localhost/MT4-Server 进程之间的 request/response 模式,本地主机 int init(){...}
/ int start(){...}
功能可能因此反映出双方具有同步状态的时刻db.POOL
中的记录
更新:我最终实施的最终解决方法是使用 OrdersHistoryTotal()
。显然,在下载订单历史记录期间,此数字将为零 (0)。而且它永远不会为零(由于初始存款)。所以,我最终将其用作 "flag".
在MT4中,存在一个stage/state:当我们从AccountA切换到AccountB时,当Connection建立,init()和start()被MT4触发;但在 "blinnnggg"(声音)之前,当所有 historical/outstanding 交易都从服务器加载时。
切换账户>建立连接>触发 Init()/Start() 事件>开始下载 Outstanding/Historical 交易>完成下载(发出 "bliinng" 声音)。
我需要知道(在 MQL4 中)所有交易都已完成从 tradeServer 下载——要知道账户确实是空的——相对于——仍在从 tradeServer 下载历史记录。
任何指针将不胜感激。我探索了 IsTradeAllowed()
IsContextBusy()
和 IsConnected()
。所有这些都处于 "normal" 状态并且 init() 和 start() 事件都被触发了。但是我无法确定 history/outstanding 交易列表是否已完成下载。
观察
由于发布了问题,MT4-Terminal 似乎没有这种 "integrated" 方法。
IsTradeAllowed()
反映 account/access 对交易服务执行的管理状态 { IsTradeAllowed | !IsTradeAllowed }
IsConnected()
反映了在尝试 setup/maintain localhost <- 之间的在线连接时使用的可见性/登录凭据/连接的技术状态> 服务器 { IsConnected() | !IsConnected() }
init() {...}
是一站式设置工具,一旦 MT4 程序 { ExpertAdvisor | Script | TechnicalIndicator }
在本地主机。强烈建议该设施是非阻塞和不可重入的。从用户 account_A 到另一个用户 account_B 的更改通常是(通过 MT4 配置选项)停止执行先前加载的 MQL4 代码(无论是 EA / 脚本 /技术指标 ) )
start() {...}
是一个事件处理工具,它无休止地等待下一次出现的外汇市场事件(由Broker MT4-Server automation ) 通过已建立的连接向下发布到 MT4-Terminal 进程,在本地主机上 运行。
解决方法
据了解,问题可能会被间接检测和处理。
虽然MT4平台似乎没有直接的方法来区分{ current | historical }
交易列表的完整/不完整刷新,但我提出一种间接检测的方法。
尝试启动“信号”-交易(一个挂单,在 PriceDOMAIN 中放置在几何上远离当前 Ask/出价-水平).
一旦此交易被端到端注册(服务器端确认),本地端将确认 db.POOL
将此设为 localhost/MT4-Server 进程之间的 request/response 模式,本地主机 int init(){...}
/ int start(){...}
功能可能因此反映出双方具有同步状态的时刻db.POOL
更新:我最终实施的最终解决方法是使用 OrdersHistoryTotal()
。显然,在下载订单历史记录期间,此数字将为零 (0)。而且它永远不会为零(由于初始存款)。所以,我最终将其用作 "flag".