Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
2018.08.0710:47:20.3402018.08.0100:00:00 instant buy 1.00 EURUSD at 1.16905 (1.16895 / 1.16905 / 1.16895)
2018.08.0710:47:20.3402018.08.0100:00:00 deal #2 buy 1.00 EURUSD at 1.16905 done (based on order #2)
2018.08.0710:47:20.3402018.08.0100:00:00 deal performed [#2 buy 1.00 EURUSD at 1.16905]
2018.08.0710:47:20.3402018.08.0100:00:00 order performed buy 1.00 at 1.16905 [#2 buy 1.00 EURUSD at 1.16905]
2018.08.0710:47:20.3472018.08.0100:00:00voidOnTick(), Line = 8: OrderSend(_Symbol,OP_BUY,1,Ask,100,0,0) = 22018.08.0710:47:20.3472018.08.0100:00:00voidOnTick(), Line = 8: OrderSelect(_P(OrderSend(_Symbol,OP_BUY,1,Ask,100,0,0)),SELECT_BY_TICKET) = true2018.08.0710:47:20.3472018.08.0100:00:00#22018.08.0100:00:00 buy 1.00 EURUSD 1.169050.000000.000001.168950.000.00 -10.0002018.08.0710:47:20.3472018.08.0100:00:00voidOnTick(), Line = 11: OrdersTotal() = 12018.08.0710:47:20.3472018.08.0100:00:00ExpertRemove() function called
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
对不起,我不会说俄语。
几天前,我发现了这个非常有趣的库。 但我有一个问题:我通过 OrderSend () 发送市场订单,并保存 OrderSend () 返回的票据。 一段时间后,止损被触及或获利。 然后,我尝试通过 OrderSelect(ticket,SELECT_BY_TICKET),用该票据选择订单。 在 MQL4 中,订单会在历史记录中找到。 但在 MQL5 中使用此库时,OrderSelect 将失败。
,我查看了一下 MT4orders.mqh 的代码。 MT4ORDERS::SelectByTicket()调用了SelectByExistingTicket(),后者失败,然后调用了SelectByHistoryTicket(),我预计后者会成功。 在 SelectByHistoryTicket() 中,HistoryDealSelect() 通常会返回 false(测试除外),因为票据是位置标识符,而不是交易票据。 HistoryOrderSelect()返回 true,因为票据与订单中的票据(和头寸标识符)相同(我在对冲模式下使用 MT5)。 但 MT4HISTORY::IsMT4Order(Ticket) 返回 false。 我希望它返回 true。 如果仓位 ID 为零,函数将返回 true。 但我发现在测试和实际票据中,项目 id 都不为零,而且等于订单中的订单位。
欢迎提供任何帮助。
几天前,我发现了这个非常有趣的库。 但我有一个问题:我通过 OrderSend () 发送市场订单,并保存 OrderSend () 返回的票据。 一段时间后,止损被触及或获利。 然后,我尝试通过 OrderSelect(ticket,SELECT_BY_TICKET),用该票据选择订单。 在 MQL4 中,订单可以在历史记录中找到。 但在 MQL5 中使用此库时,OrderSelect 将失败。
这是正确的。详情在此 说明。
您可以使PositionTicket= OrderSend(OP_BUY, 2 lots) 和 OrderClose(0.2 lots) + OrderClose(0.3 lots)。这样就会得到两个平仓 "头寸"(0.2/0.3 手)和一个持仓 "头寸"(1.5 手),其交易票等于PositionTicket。这是 MT5 的一个特点。因此,在 SELECT_BY_TICKET+MODE_HISTORY 模式下,通过交易历史 中的POSITION_ID 选择仓位是不正确的。
记住票据是一种不好的方式,尽管它很流行。正确的方法是,在每次事件中,交易机器人都会从头开始读取整个环境。
ZY 在这里您可以看到与上述大致相同的情况
交易、自动交易系统和交易策略测试论坛
库:MT4Orders
fxsaber, 2018.04.14 09:10 AM
示例
结果
结果显示,以 ticket == 2 开立了一个仓位。然后关闭了两次,从而在交易历史中创建了两个关闭的 "头寸"。它们的票据不同,但两个 "仓位 "的 OrderTicketOpen 都 == 2。也就是说,您应该意识到,如果在 MT5 中平仓,其历史订单与实时订单并不一致。
请注意,在 MT5 中,即使是关闭同一实时仓位时的注释也是不同的:"Hello World!"和"tp 1.23614"。
对不起,我不会说俄语。
几天前,我发现了这个非常有趣的库。 但我有一个问题:我通过 OrderSend () 发送市场订单,并保存 OrderSend () 返回的票据。 一段时间后,止损被触及或获利。 然后,我尝试通过 OrderSelect(ticket,SELECT_BY_TICKET),用该票据选择订单。 在 MQL4 中,订单可以在历史记录中找到。 但在 MQL5 中使用此库时,OrderSelect 将失败。
,我查看了一下 MT4orders.mqh 的代码。 MT4ORDERS::SelectByTicket()调用了SelectByExistingTicket(),后者失败了,然后调用了SelectByHistoryTicket(),我预计后者会成功。 在 SelectByHistoryTicket() 中,HistoryDealSelect() 通常会返回 false(测试除外),因为票据是位置标识符,而不是交易票据。 HistoryOrderSelect()返回 true,因为票据与订单中的票据(和头寸标识符)相同(我在对冲模式下使用 MT5)。 但 MT4HISTORY::IsMT4Order(Ticket) 返回 false。 我希望它返回 true。 如果仓位标识符为零,函数将返回 true。 但我看到在测试和实际票据中,项目 id 都不为零,而且等于订单中的订单位。
欢迎您提供帮助。
为了充分理解您的机器翻译,请附上英文文本。
几天前,我发现了这个非常有趣的库。但我有一个问题:我通过 OrderSend() 发送市场订单,并存储 OrderSend() 返回的票据。一段时间后,止损或止盈 被触及。然后,我尝试通过
OrderSelect(ticket, SELECT_BY_TICKET),用该票据选择订单。在 MQL4 中,订单可以在历史记录中找到。但在 MQL5 中使用此库时,OrderSelect 并不成功。
我查看了一下 MT4orders.mqh 的代码。MT4ORDERS::SelectByTicket()调用了SelectByExistingTicket(),后者失败,然后调用了SelectByHistoryTicket(),我希望后者能成功。在 SelectByHistoryTicket() 中,函数 HistoryDealSelect() 通常返回 false(测试器中可能除外),因为票据是头寸标识符,而不是交易票据。 ::HistoryOrderSelect() 返回 true,因为票据与订单中的票据相同(也是头寸标识符)(我在对冲模式下使用 MT5)。但 MT4HISTORY::IsMT4Order(Ticket) 返回 false。我希望它返回 true。如果仓位标识符为零,函数就会返回 true。但我在测试器和真实账户中都看到,仓位标识符不为零,而是等于内单的订单票据。
换句话说:我不明白为什么在 MT4HISTORY::IsMT4Order() 函数中会出现以下代码(如果仓位标识符为零,则返回 true):
下面附上我的测试代码:
PrintChangesOfMQL5OrderSystemState() 是一个简单直接的函数,每次检测到变化时都会打印 MQL5 订单系统的状态。
以下是测试代码的输出(在测试仪上运行):
可以看到,HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) 返回 2,而不是 0。这就是 MT4HISTORY::IsMT4Order() 返回 false 的原因。
如有任何帮助,不胜感激。换句话说:我不明白为什么在函数 MT4HISTORY::IsMT4Order() 中会出现以下代码(如果仓位 id 为 0 则返回 true):
下面是我的测试代码:
PrintChangesOfMQL5OrderSystemState() 是一个简单直接的函数,每次检测到变化时都会打印 MQL5 订单系统的状态。
以下是测试代码的输出(在测试仪上运行):
您可以看到,HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID)返回 2,而不是 0。这就是 MT4HISTORY::IsMT4Order() 返回 false 的原因。
您没有意识到 MT5 和 MT4 中的订单是不同的实体。
上面已经回答了 您的问题。
您不明白 MT5 和 MT4 中的订单是不同的实体。
我了解 MQL5 和 MQL4 的订单系统及其区别。
因此,在 SELECT_BY_TICKET+MODE_HISTORY 模式下,通过交易历史中的 POSITION_ID 选择仓位是不正确的。
是的,我知道 MQL5 函数HistoryOrderSelect() 希望使用票据而不是仓位标识符。
但我的测试代码是有效的 MQL4 代码(除了调用 MQL5 函数HistoryOrderSelect() 和HistoryDealSelect() 之外)。
而且在 MQL4 中,函数OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) 如预期一样返回 true。
据我所知,该库的目的是在 MQL5 上尽可能好地模拟 MQL4 订单系统。因此,我希望
函数OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) 也会返回 true。
我查看了代码,试图找出返回 false 的原因。
首先:由于我使用的是 MQL5 对冲系统,函数
ticket =OrderSend(Symbol(),OP_BUY,1.0, ask,10, bid -3*Point, bid +3*Point);
将等于 MQL5 对冲中(期货)头寸标识符的订单 ticket 赋值给变量 "ticket"。从代码中可以看到
函数 MT4OrderSend() 的代码中可以看到。返回结果如下:
在分析执行代码时库所做的工作时
我看到函数 SelectByHistoryTicket() 使用我存储在变量 "ticket "中的票据执行。
在该函数中,函数 HistoryOrderSelect(ticket) 被调用,调用的票据等于订单票据和位置标识符。
在我的 MQL4OrderSelect() 调用 中,我自己并不调用 HistoryOrderSelect(ticket) - 它在库中。
只有在我的测试代码中,我才直接调用HistoryOrderSelect(ticket) 和 HistoryDealSelect(ticket),以查看在库中发生了什么:
简而言之:根据OrderSelect(ticket,SELECT_BY_TICKET,MODE _ TRADES)的返回值,库并没有在 MQL4 上模拟 MQL4订单 系统。
MQL4 订单系统。
在 MQL4 中,函数OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) 如预期返回 true。
据我所知,该库的目的是在 MQL5 上尽可能好地模拟 MQL4 订单系统。因此,我希望
函数OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) 也会返回 true。
我查看了代码,试图找出返回 false 的原因。
您错了。在测试器中运行此智能交易系统
结果
是的,我知道在开仓后直接 调用OrderSelect() 会返回 true。
在这种情况下,我们有一个打开的 MQL5 仓位,库在调用OrderSelect() 时会找到该仓位。
这是在库的内部函数 SelectByExistingTicket() 中完成的。
但关键是,当 MQL5 仓位被止损或止盈 平仓时,OrderSelect(ticket) 返回 false。
请执行我的测试代码进行验证(如果您的经纪商不接受如此接近的 SL 和 TP,请将它们放宽,以避免 OrderSend() 被拒绝)。
但关键是,当 MQL5 头寸被止损或止盈 平仓时,OrderSelect(ticket) 返回 false。
再次阅读我的部分详细解答
关于交易、自动交易系统和测试交易策略的论坛。
库:MT4Orders
fxsaber, 2018.08.06 14:21
没错。这里 有详细说明。
您可以执行PositionTicket= OrderSend(OP_BUY, 2 lots) 和 OrderClose(0.2 lots) + OrderClose(0.3 lots)。这样就会得到两个平仓 "头寸"(0.2/0.3 手)和一个未平仓头寸(1.5 手),其交易票等于PositionTicket。这是 MT5 的一个特点。 因此,在 SELECT_BY_TICKET+MODE_HISTORY 模式下,通过交易历史 中的POSITION_ID 选择仓位是不正确的。
记住票据是一种不好的方式,尽管它很流行。正确的方法是,在每次事件中,交易机器人都会从头开始读取整个环境。
ZY 在这里,您可以看到与上述大致相同的情况
结果显示,开仓时 ticket == 2。然后它关闭了两次,从而在交易历史中创建了两个关闭的 "头寸"。它们的票据不同,但两个 "仓位 "的 OrderTicketOpen 都 == 2。也就是说,您应该意识到,如果在 MT5 中关闭头寸,其历史订单与实时订单并不一致。
请注意,在 MT5 中,即使是关闭同一实时仓位时的注释也是不同的:"Hello World!"和"tp 1.23614"。
在 MT5 中,无法通过 POSITION_ID 明确选择 MT4 平仓,因为可能同时存在多个 POSITION_ID 相同的 MT4 仓位。
谁使用 MT4Orders 中的mql4_to_mql5.mqh 文件进行 MT4 -> MT5 转换,请删除其中的这段代码。
关于交易、自动交易系统和测试交易策略的论坛
测试 "CopyTicks
fxsaber, 2016.10.19 07:59
// 它还设置了 MT4 的常用功能:iOpen、iHigh、iLow、iClose、iTime、iVolume。
#define DEFINE_TIMESERIE(NAME,FUNC,T) \
class CLASS##NAME \
{ \
public: \
static T Get( const string Symb, const int TimeFrame, const int iShift ) \
{ \
T tValue[]; \
\
return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
} \
\
T operator []( const int iPos ) const \
{ \
return(CLASS##NAME::Get(_Symbol, _Period, iPos)); \
} \
}; \
\
CLASS##NAME NAME; \
\
T i##NAME( const string Symb, const int TimeFrame, const int iShift ) \
{ \
return(CLASS##NAME::Get(Symb, TimeFrame, iShift)); \
}
DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)
正式与 MT5 内置 1860 这段代码无关。