如何读取另一种货币对的实际价格,不能直接在 [策略测试器] - 多货币策略中使用?

How to read an actual price of another currency pair, not available directly in a [ Strategy Tester ] - for a Multi-Currency Strategy?

在互联网上,很多版块都可以看到MarketInfo()无法使用Strategy Tester[=]中的功能。这是平台的限制。

我还没有在网上找到任何解决方法。然而,由于需求是发明之母,我的需求是根据 [=12 的状态使用 EA 做出 USDJPY 市场决策=] market 我找到了解决方法(这对我来说已经足够好了)。我使用 iMA(),周期为 1,分辨率为 M1

iMA( "EURUSD", PERIOD_M1, 1, 0, MODE_SMA, PRICE_MEDIAN, i )

问题是:
因为 MetaTrader 能够计算另一种货币的移动平均线(肯定是基于对的实际价格!),
Q1: 为什么不能直接访问当前值?

一个后续问题:
Q2:有没有此限制的其他(更准确)解决方法?

原因:这个问题的原因是因为"Tick"。由于一种货币的 "tick" 独立于另一种货币的 "tick" 发生,因此无法根据一种货币的当前 "Tick" 准确确定另一种货币的价格。 iMA 是使用 M1 蜡烛的 OHLC 计算的,而不是实际的 "Tick"(与 "Tick" 数据不同)。

换句话说:假设我们使用美元兑日元,并且这个 "tick" 发生在 12:00:00.210(12 点半夜第 210 毫秒)。当 "tick" 发生时,会触发 start() 事件。在该函数中,我们寻找 EURUSD 的出价。但是,当时 EURUSD 没有 "Tick"(USDJPY 和 EURUSD 不会同时 "tick"),因此无法确定当时 EURUSD 的确切价格-时间点。

没有解决方法,因为无法确定 "Tick" 级别的价格,因为 MQL4 的 datetime 变量是一个 integer 且仅精确到秒,而 HistoryCenter >出口仅限 OHLC。

你的 iMA() 已经很好了。

Q1: @JosephLee 服务很好 + 还有 还有一个选项(参考下面)
Q2:值得一句话:


是的,有一个解决方法。

虽然 MetaTrader Terminal 4 有很多弱点,不值得花时间在这里,但也可以用它做一些不错的事情。

大约五年前,有一个项目需要为MT4集成分布式处理,以规避它的弱点。

那件事发生了。通过这种方式,您可以从分布式处理框架中受益,并且 可以随意 nanoseconds (延迟方面)所有工具的确切价格 (基于远程QUOTE-流处理) 独立于你的本地主机MT4.graph _Symbol

不要犹豫,多问
&
欢迎来到
MQL4 世界


New-MQL4.56789 具有 iClose() 多货币功能

Returns Close price value for the bar of specified symbol with timeframe and shift.

double  iClose(     string           symbol,          // symbol 
                    int              timeframe,       // timeframe 
                    int              shift            // shift 
                    );

Parameters

symbol
[in] Symbol name. NULL means the current symbol.

timeframe
[in] Timeframe. It can be any of ENUM_TIMEFRAMES enumeration values. 0 means the current chart timeframe.

shift
[in] Index of the value taken from the indicator buffer (shift relative to the current bar the given amount of periods ago).

Returned value
Close price value for the bar of specified symbol with timeframe and shift. If local history is empty (not loaded), function returns 0. To check errors, one has to call the GetLastError() function.

StrategyTester 中使用它时要谨慎,并适当注意错误处理历史数据的情况不在本地数据库中,需要提供从服务器远程检索的补救处理程序。

Print( "A first date in the history for the EURUSD on the [MT4SERVER] = ",
       (datetime) SeriesInfoInteger( "EURUSD", 0, SERIES_SERVER_FIRSTDATE )
       );

对于远程服务器不在线/市场关闭出现上述需求ERR_HISTORY_WILL_UPDATED同样需要提供一些措施ERR_MARKET_CLOSED/要求的日期已经在SERIES_SERVER_FIRSTDATE

之前

在极端情况下,总是有可能创建一个特殊设置,逐步更新本地 CCY_PAIRREMOTE_CCY_PAIR 完全独立于代理端设备状态.

所有这些都是 MQL4 新功能的重要方面。