程序库: MT4Orders - 页 7 1234567891011121314...95 新评论 fxsaber 2016.11.11 00:28 #61 Maxim Dmitrievsky: 总的来说,我想明白了--服务器并不总是返回正确的值,因此会出现混杂的情况,而且没有办法解决,只能手动更改填充类型。论坛上已经有人遇到过类似的问题。感谢您发现错误!要解决这个问题,只要代码中有这两行。 if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE) Request.type_filling = ORDER_FILLING_RETURN;添加两行,使其看起来像这样 if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE) Request.type_filling = ORDER_FILLING_RETURN; else if ((::SymbolInfoInteger(Request.symbol,SYMBOL_FILLING_MODE) & SYMBOL_FILLING_IOC) == SYMBOL_FILLING_IOC) Request.type_filling = ORDER_FILLING_IOC; Maxim Dmitrievsky 2016.11.11 04:16 #62 fxsaber: 感谢您发现错误!要解决这个问题,请在代码中这两行的位置 if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE) Request.type_filling = ORDER_FILLING_RETURN;再添加两行,使其看起来像这样 if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE) Request.type_filling = ORDER_FILLING_RETURN; else if ((::SymbolInfoInteger(Request.symbol,SYMBOL_FILLING_MODE) & SYMBOL_FILLING_IOC) == SYMBOL_FILLING_IOC) Request.type_filling = ORDER_FILLING_IOC;那里的问题是不同的,在执行的侯爵填充 IOC:)和服务器返回 REQUEST 的请求,即在服务器问题的水平,它不是以任何方式跟踪,把只在设置的专家 独立更改的能力,如果它不工作虽然......它的工作原理...谢谢,但执行写 MARKET 在日志中,而不是 EXCHANGE,似乎一切都混在那里......或在我的头上)。 Stanislav Korotky 2016.11.11 10:41 #63 fxsaber: 在实际交易中缓存的意义何在?您在 MT4 中缓存过历史记录吗?在性能很重要的情况下需要加速 - 测试人员。现实生活中可能也需要性能。我们没有这样的专家,但这并不否认潜在的需求。我不明白的是,为什么有人说测试人员可以做缓存,而现实生活中却不可能。怎么会不可能 呢?算法应该是一样的,而且在测试版和实际版中都应该有效。 fxsaber 2016.11.11 10:54 #64 Stanislav Korotky:在现实世界中可能需要性能。虽然我们没有这样的专家,但这并不妨碍潜在的需求。我再也不明白为什么有人说测试人员可以做缓存,而现实中却不可能。怎么会不可能 呢?算法应该是一样的,而且在测试版和真实版中都能运行。因为现实中的缓存数据在某些时候可能不再与历史记录一致--经纪人会手动更正。但在测试器中,没有人会动自己的手。此外,即使没有经纪人的修正,真实市场中也会出现问题。因为你可以发送两个异步请求,并从第一个请求中得到响应--历史记录已被缓存,然后从第二个请求中得到响应,它将比前一个请求更早进入历史记录表--历史记录发生变化。这就是为什么缓存并不是真正的好东西。对于测试人员来说,缓存的制作非常简单,只是手还没有到。不过,以下工作已经完成(未发布)// 10.11.2016:// 添加:订单发送与交易环境(实时和历史)完全同步--与 MT4 相同。// 修复:正确设置填充标志。这意味着 OrderSend 可以保证在最短时间内与交易环境同步。论坛上有些人抱怨说,在 MT5-OrderSend BUY 之后,他们无法读取未结头寸的参数 - 交易环境滞后 ~1 毫秒。现在,如果您使用该库,就不会再有类似问题了。它可能是迄今为止唯一能做到这一点的公共库。例如 交易、自动交易系统和交易策略测试论坛 如何在 MT5 中使用 OrderSend 正常工作 fxsaber, 2016.11.10 10:00 AM 如何在不开仓的情况下知道该工具的佣金大小?fxsaber, 2016.11.08 20:30#include <MT4Orders.mqh>void OnStart(){ const int Ticket = OrderSend(_Symbol, OP_BUY, 1, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0, 0, 0); OrderClose(Ticket, 0.3, SymbolInfoDouble(_Symbol, SYMBOL_BID), 0, clrNONE); Sleep(1000); // 等待更新历史记录 if (OrderSelect(Ticket, SELECT_BY_TICKET)) Alert(OrderCommission());}可能,这样的例子只是说明性的。如果不做 Sleep,经常会出现这样的情况:在 OrderClose 之后,历史记录还来不及更新,OrderCommission 返回的值就好像没有进行 OrderClose。请注意,这是一个脚本,不可能有任何事件。唯一的出路就是愚蠢的 Sleep。如果用 SB 重写这个脚本,什么都不会改变。现在不会再有未定义延迟的愚蠢滑动了。同样的 SB 不知道如何做到这一点。当我为测试人员加速历史记录时,我将把它提交发表。 fxsaber 2016.11.14 13:33 #65 一经版主核实,即可更新// 13.11.2016:// 添加:订单发送、订单修改、订单关闭、订单删除与交易环境(实时和历史)完全同步--与 MT4 相同。// 最大同步时间可通过 MT4ORDERS::OrderSend_MaxPause 设置,单位为 µs。MT5 的平均同步时间为 ~1 ms。// 默认情况下,最大同步时间等于一秒。MT4ORDERS::OrderSend_MaxPause = 0 - 不同步。// 添加:由于 SlipPage 参数(OrderSend、OrderClose)仅在即时模式下影响市场订单的执行、// 现在可以设置余额的执行类型 - ENUM_ORDER_TYPE_FILLING:// ORDER_FILLING_FOK、ORDER_FILLING_IOC 或 ORDER_FILLING_RETURN。// 如果赋值错误或符号不支持指定的执行类型,将自动选择运行模式。// 示例:// OrderSend(Symb, Type, Lots, Price, ORDER_FILLING_FOK, SL, TP) - 发送执行类型为 ORDER_FILLING_FOK 的相应订单// OrderSend(Symb, Type, Lots, Price, ORDER_FILLING_IOC, SL, TP) - 发送执行类型为 ORDER_FILLING_IOC 的相应订单// OrderClose(Ticket, Lots, Price, ORDER_FILLING_RETURN) - 发送执行类型为 ORDER_FILLING_RETURN 的相应市场订单// 添加:OrdersHistoryTotal() 和 OrderSelect(Pos, SELECT_BY_POS, MODE_HISTORY) 被缓存--它们会尽可能快地运行。//程序库中已经没有慢速实现了 。 只剩两步即可完全完成,并明确优于 SB。// 没有实现的东西://CloseBy 时刻--我还没有时间这样做。也许将来需要的时候会有时间。// 确定平仓头寸的 TP 和 SL - 目前(版本 1470),MQL5 不知道如何做到这一点。//DEAL_ENTRY_INOUT 和 DEAL_ENTRY_OUT_BY 交易的会计处理。目前,MT4Orders 允许您在净额结算账户(证券交易所)上做任何事情,除了读取DEAL_ENTRY_INOUT 交易的 历史记录。在对冲账户上,除了 closeBy 时刻,您还可以进行其他所有操作。与 SB 相比的优势MQL4 语法。读写交易逻辑最快。快速传输 MT4 交易和统计代码。部分平仓的可能性。所有订单功能与交易环境同步。方便的 ORDER_FILLING_* 分配,保证交易订单中 Request.filling 字段分配的正确性。缓存交易历史 - 加快操作速度。不排除在相同的 MQL4 语法中添加异步订单函数(OrderSendAsync、OrderCloseAsync、OrderDeleteAsync 和 OrderModifyAsync)。 来自 MQL5 向导的预制专家交易系统运作于 MetaTrader 轻松快捷开发 MetaTrader 程序的函数库(第 二十一部分):交易类 Aleksey Vyazmikin 2016.11.14 15:43 #66 fxsaber:一经版主核实,即可更新你做得很好!期待更新!而且,真的希望在不久的将来能实现 CloseBy! fxsaber 2016.11.15 16:31 #67 fxsaber:一经版主核实,即可更新可用。与 SB 相比的优势所有订单功能与交易环境同步。 为了理解这一点的重要性,以下是一个代码示例,其在 MT5 上的执行现在将与 MT4完全一致。 交易、自动交易系统和交易策略测试论坛。 如何在 MT5 中使用 OrderSend 正常工作 fxsaber, 2016.11.15 14:14 尝试在您的 EA 中编写以下函数i = 0.在符号[i]上建仓。如果 i++ >= 5 - 退出。如果新仓位没有滑点,则返回第 2 步。 如果有滑点,则退出。// MQL4&5 代码#property strict#include <MT4Orders.mqh> //https://www.mql5.com/zh/code/16006void Func( const string &Symbols[] ){ const int Total = ArraySize(Symbols); for (int i = 0; i < Total; i++) { const double Price = SymbolInfoDouble(Symbols[i], SYMBOL_ASK); const int digits = (int)SymbolInfoInteger(Symbols[i], SYMBOL_DIGITS); if (!OrderSelect(OrderSend(Symbols[i], OP_BUY, 1, Price, 100, 0, 0, DoubleToString(Price, digits)), SELECT_BY_TICKET) || (NormalizeDouble(Price - OrderOpenPrice(), digits) != 0)) // 如果开仓失败或出现滑点 - 退出。 break; }}void OnStart() // OnTick{ const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDCAD", "USDJPY"}; Func(Symbols);}以 SB 或纯 MQL5 为例,在 MT5 上编写这样一个简单的交易逻辑是非常困难的。在 MT4 上总是能顺利完成的工作,在 MT5 上却很难顺利实现。该库允许您以与 MT4 相同的方式来实现。无需研究该库的语法及其功能 - 其行为与 MT4 相同,语法与 MQL4 相同。在此 熟悉一下将 MT4-advisors 移植到五种模式(通过 SB)下的结果可能会有所帮助,这样您就可以评估哪种模式更适合您实现相同的交易逻辑。 如何在MT5中正确使用OrderSend? 我如何正确地开立市场订单? How do I open ivanivan_11 2016.11.15 16:38 #68 当然,还有因果报应!)) Stanislav Korotky 2016.11.16 10:29 #69 在新文件中,由于某种原因,换行符只有一个 CR 字符(显然来自 Mac),这与其他来源的文件不同。 fxsaber 2016.11.16 11:00 #70 Stanislav Korotky: 在新文件中,由于某种原因换行时会出现一个 CR 字符(显然来自 Mac),这与其他来源的文件不同。我是个弱用户(而且只是 vinda 用户),所以我也不知道是怎么回事。我发现大多数字符串都 以两个字节 0x0D 结尾。还有 0x0D 0x0A。还有一个 - 0x0D。所有编辑器都能正常显示源代码,所以我认为这不会造成干扰。 1234567891011121314...95 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
总的来说,我想明白了--服务器并不总是返回正确的值,因此会出现混杂的情况,而且没有办法解决,只能手动更改填充类型。论坛上已经有人遇到过类似的问题。
感谢您发现错误!
要解决这个问题,只要代码中有这两行。
Request.type_filling = ORDER_FILLING_RETURN;
添加两行,使其看起来像这样
Request.type_filling = ORDER_FILLING_RETURN;
else if ((::SymbolInfoInteger(Request.symbol,SYMBOL_FILLING_MODE) & SYMBOL_FILLING_IOC) == SYMBOL_FILLING_IOC)
Request.type_filling = ORDER_FILLING_IOC;
感谢您发现错误!
要解决这个问题,请在代码中这两行的位置
Request.type_filling = ORDER_FILLING_RETURN;
再添加两行,使其看起来像这样
Request.type_filling = ORDER_FILLING_RETURN;
else if ((::SymbolInfoInteger(Request.symbol,SYMBOL_FILLING_MODE) & SYMBOL_FILLING_IOC) == SYMBOL_FILLING_IOC)
Request.type_filling = ORDER_FILLING_IOC;
那里的问题是不同的,在执行的侯爵填充 IOC:)和服务器返回 REQUEST 的请求,即在服务器问题的水平,它不是以任何方式跟踪,把只在设置的专家 独立更改的能力,如果它不工作
虽然......它的工作原理...谢谢,但执行写 MARKET 在日志中,而不是 EXCHANGE,似乎一切都混在那里......或在我的头上)。
在实际交易中缓存的意义何在?您在 MT4 中缓存过历史记录吗?在性能很重要的情况下需要加速 - 测试人员。
现实生活中可能也需要性能。我们没有这样的专家,但这并不否认潜在的需求。
我不明白的是,为什么有人说测试人员可以做缓存,而现实生活中却不可能。怎么会不可能 呢?算法应该是一样的,而且在测试版和实际版中都应该有效。
在现实世界中可能需要性能。虽然我们没有这样的专家,但这并不妨碍潜在的需求。
我再也不明白为什么有人说测试人员可以做缓存,而现实中却不可能。怎么会不可能 呢?算法应该是一样的,而且在测试版和真实版中都能运行。
因为现实中的缓存数据在某些时候可能不再与历史记录一致--经纪人会手动更正。但在测试器中,没有人会动自己的手。此外,即使没有经纪人的修正,真实市场中也会出现问题。因为你可以发送两个异步请求,并从第一个请求中得到响应--历史记录已被缓存,然后从第二个请求中得到响应,它将比前一个请求更早进入历史记录表--历史记录发生变化。这就是为什么缓存并不是真正的好东西。
对于测试人员来说,缓存的制作非常简单,只是手还没有到。不过,以下工作已经完成(未发布)
// 添加:订单发送与交易环境(实时和历史)完全同步--与 MT4 相同。
// 修复:正确设置填充标志。
这意味着 OrderSend 可以保证在最短时间内与交易环境同步。
论坛上有些人抱怨说,在 MT5-OrderSend BUY 之后,他们无法读取未结头寸的参数 - 交易环境滞后 ~1 毫秒。现在,如果您使用该库,就不会再有类似问题了。它可能是迄今为止唯一能做到这一点的公共库。
例如
交易、自动交易系统和交易策略测试论坛
如何在 MT5 中使用 OrderSend 正常工作
fxsaber, 2016.11.10 10:00 AM
如何在不开仓的情况下知道该工具的佣金大小?
fxsaber, 2016.11.08 20:30
void OnStart()
{
const int Ticket = OrderSend(_Symbol, OP_BUY, 1, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0, 0, 0);
OrderClose(Ticket, 0.3, SymbolInfoDouble(_Symbol, SYMBOL_BID), 0, clrNONE);
Sleep(1000); // 等待更新历史记录
if (OrderSelect(Ticket, SELECT_BY_TICKET))
Alert(OrderCommission());
}
可能,这样的例子只是说明性的。
如果不做 Sleep,经常会出现这样的情况:在 OrderClose 之后,历史记录还来不及更新,OrderCommission 返回的值就好像没有进行 OrderClose。
请注意,这是一个脚本,不可能有任何事件。唯一的出路就是愚蠢的 Sleep。
如果用 SB 重写这个脚本,什么都不会改变。
现在不会再有未定义延迟的愚蠢滑动了。同样的 SB 不知道如何做到这一点。
当我为测试人员加速历史记录时,我将把它提交发表。
一经版主核实,即可更新
// 添加:订单发送、订单修改、订单关闭、订单删除与交易环境(实时和历史)完全同步--与 MT4 相同。
// 最大同步时间可通过 MT4ORDERS::OrderSend_MaxPause 设置,单位为 µs。MT5 的平均同步时间为 ~1 ms。
// 默认情况下,最大同步时间等于一秒。MT4ORDERS::OrderSend_MaxPause = 0 - 不同步。
// 添加:由于 SlipPage 参数(OrderSend、OrderClose)仅在即时模式下影响市场订单的执行、
// 现在可以设置余额的执行类型 - ENUM_ORDER_TYPE_FILLING:
// ORDER_FILLING_FOK、ORDER_FILLING_IOC 或 ORDER_FILLING_RETURN。
// 如果赋值错误或符号不支持指定的执行类型,将自动选择运行模式。
// 示例:
// OrderSend(Symb, Type, Lots, Price, ORDER_FILLING_FOK, SL, TP) - 发送执行类型为 ORDER_FILLING_FOK 的相应订单
// OrderSend(Symb, Type, Lots, Price, ORDER_FILLING_IOC, SL, TP) - 发送执行类型为 ORDER_FILLING_IOC 的相应订单
// OrderClose(Ticket, Lots, Price, ORDER_FILLING_RETURN) - 发送执行类型为 ORDER_FILLING_RETURN 的相应市场订单
// 添加:OrdersHistoryTotal() 和 OrderSelect(Pos, SELECT_BY_POS, MODE_HISTORY) 被缓存--它们会尽可能快地运行。
//程序库中已经没有慢速实现了 。
只剩两步即可完全完成,并明确优于 SB。
//CloseBy 时刻--我还没有时间这样做。也许将来需要的时候会有时间。
// 确定平仓头寸的 TP 和 SL - 目前(版本 1470),MQL5 不知道如何做到这一点。
//DEAL_ENTRY_INOUT 和 DEAL_ENTRY_OUT_BY 交易的会计处理。
目前,MT4Orders 允许您在净额结算账户(证券交易所)上做任何事情,除了读取DEAL_ENTRY_INOUT 交易的 历史记录。在对冲账户上,除了 closeBy 时刻,您还可以进行其他所有操作。
与 SB 相比的优势
一经版主核实,即可更新
你做得很好!期待更新!
而且,真的希望在不久的将来能实现 CloseBy!
一经版主核实,即可更新
可用。
与 SB 相比的优势
交易、自动交易系统和交易策略测试论坛。
如何在 MT5 中使用 OrderSend 正常工作
fxsaber, 2016.11.15 14:14
尝试在您的 EA 中编写以下函数
#property strict
#include <MT4Orders.mqh> //https://www.mql5.com/zh/code/16006
void Func( const string &Symbols[] )
{
const int Total = ArraySize(Symbols);
for (int i = 0; i < Total; i++)
{
const double Price = SymbolInfoDouble(Symbols[i], SYMBOL_ASK);
const int digits = (int)SymbolInfoInteger(Symbols[i], SYMBOL_DIGITS);
if (!OrderSelect(OrderSend(Symbols[i], OP_BUY, 1, Price, 100, 0, 0, DoubleToString(Price, digits)), SELECT_BY_TICKET) ||
(NormalizeDouble(Price - OrderOpenPrice(), digits) != 0)) // 如果开仓失败或出现滑点 - 退出。
break;
}
}
void OnStart() // OnTick
{
const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDCAD", "USDJPY"};
Func(Symbols);
}
以 SB 或纯 MQL5 为例,在 MT5 上编写这样一个简单的交易逻辑是非常困难的。在 MT4 上总是能顺利完成的工作,在 MT5 上却很难顺利实现。该库允许您以与 MT4 相同的方式来实现。无需研究该库的语法及其功能 - 其行为与 MT4 相同,语法与 MQL4 相同。
在此 熟悉一下将 MT4-advisors 移植到五种模式(通过 SB)下的结果可能会有所帮助,这样您就可以评估哪种模式更适合您实现相同的交易逻辑。
在新文件中,由于某种原因换行时会出现一个 CR 字符(显然来自 Mac),这与其他来源的文件不同。
我是个弱用户(而且只是 vinda 用户),所以我也不知道是怎么回事。我发现大多数字符串都 以两个字节 0x0D 结尾。还有 0x0D 0x0A。还有一个 - 0x0D。
所有编辑器都能正常显示源代码,所以我认为这不会造成干扰。