mql5语言的特点、微妙之处以及技巧 - 页 201 1...194195196197198199200201202203204205206207208...247 新评论 mktr8591 2021.04.21 15:06 #2001 在调用宏时,你可以不指定任何参数(省略),有时你想特别允许宏在未指定的参数下工作。 对于这种情况,这里有一些辅助性的宏。1.有时你想在你的宏中确定一个参数是否被设置。 IS_PARAMETER_SET(p)定义了一个表达式,如果p被设置,它将返回真(即使字符串变量==NULL)。 注意:该表达式是在编译时预处理后评估的!!!也就是说,它不能用来实现类似于#ifdef IS_PARAMETER_SET(p) #else的东西(这也适用于下面的其他宏)。2.如果你需要明确地将一个参数值转换为字符串,以避免在编译时出现 未指定参数的错误,你可以使用 __EVAL_STR(p)。 如果没有指定p或者明确定义了NULL字面,它将返回""。不适用于数组、结构和类。将参数明确转换为数字的方法是__EVAL_NON_STR(p)。如果p没有被设置,则返回0。 当p是一个字符串时,不工作!代码和使用实例。//Expression returns true if macro's parameter is specified. #define IS_PARAMETER_SET(p) ("" != #p || __hlp_macro_func(p)) bool __hlp_macro_func(const string p = NULL) {return "" == p;} template<typename T> bool __hlp_macro_func(T p) {return true;} template<typename T> bool __hlp_macro_func(T& p) {return true;} template<typename T> bool __hlp_macro_func(T& p[]) {return true;} //Expression returns parameter p; if parameter is not specified returns NULL; if p is string returns p //Error for arrays and objects #define __EVAL(p) (""==#p?NULL:p+NULL) //Explicit conversion to string. If parameter is not specified or is constant NULL returns "" //Error for arrays and objects #define __EVAL_STR(p) (""==#p || "NULL"==#p? "" :(string)(p+NULL)) //Explicit conversion to number. If parameter is not specified returns 0. Works incorrect if p is string! //Error for arrays and objects #define __EVAL_NON_STR(p) ("" == #p? 0 : p+0) struct S1 { int a; }; class C1 { int a; }; void OnStart() { //--- Print(IS_PARAMETER_SET()); //false Print(IS_PARAMETER_SET("")); //true Print(IS_PARAMETER_SET("test")); //true Print(IS_PARAMETER_SET(NULL)); //true Print(IS_PARAMETER_SET(0)); //true Print(IS_PARAMETER_SET(1)); //true string str; Print(IS_PARAMETER_SET(str)); //true int arr[1]; Print(IS_PARAMETER_SET(arr)); //true S1 _struct; Print(IS_PARAMETER_SET(_struct)); //true C1 _class; Print(IS_PARAMETER_SET(_class)); //true #define MACRO1_(a,b) (IS_PARAMETER_SET(b)?a:-a) Print(MACRO1_(1, 0)); //1 Print(MACRO1_(1,)); //-1 #define MACRO2_(a,b,c) Print(a," = ",b + c) #define MACRO3_(a,b,c) Print(__EVAL_STR(a)," = ",__EVAL_NON_STR(b) + __EVAL_NON_STR(c)) //MACRO2_(, 2,); // ',' - syntax error, parameter missed MACRO3_(, 2,); // = 2 MACRO3_("a", 2, 3); // a = 5 } mktr8591 2021.04.21 15:46 #2002 fxsaber:在RannForex-Server 模拟账户上的以下代码可以通过运行该顾问立即重现这种情况。结果。顺便说一下,该脚本显示(并不总是第一次)同步OrderSend执行中的一个错误。在OrderSend执行了几十/几百毫秒后,订单价格是旧的价格,而不是OrderSend成功下的价格。回到相同门票的话题上,我们可以得出一些结论。 如果部分限价单被挂起,标签 "订单和交易 "将不显示生成的交易。 在套期保值中,一个订单可以产生多个不同价格的IN交易。其结果将是一个零星的(相对于点)开仓价格。 你可以关闭已生成的头寸,而不删除部分认沽。但如果在这之后,挂单被触发,那么交易将被打开,票据等于之前被关闭的仓位的票据。也就是说,可能会有这样一种情况,你用某张票平仓。然后,一个仓位重新出现在相同的股票上。 部分执行可能以不同的方式实施,这取决于经纪人的软件。以上是一个标准的MT5实现。 如果有人设法在其他交易服务器上重现这个问题,请分享其名称。 搜索字符串:Oshibka 010。 又回到了部分执行的问题。1.请澄清第3点:"您可以在不删除部分执行的情况下关闭您已形成的头寸。但如果在这之后订单被触发,交易将打开,票据等于你之前关闭的位置的票据。也就是说,可能会有这样一种情况,你用某张票平仓。然后一个位置又出现了同一张票。" 在这种情况下,POSITION_IDENTIFIER 到底是不是 等于 POSITION_TICKET?2.早些时候在 "POSITION_TICKET != POSITION_IDENTIFIER "主题中,你展示了一个不同的MT5逻辑。 https://www.mql5.com/ru/forum/227423/page2#comment_6543129 fxsaber: 结论 如果我们假设这是MT5的正常行为,而不是经纪人黑客的特殊性,那么 ORDER_STATE_PARTIAL在历史订单中不存在。 被执行的订单总是具有ORDER_STATE_FILLED状态。 当一个订单被部分执行时,交易服务器会创建一个相应的新市场 订单(ORDER_REASON_CLIENT - 即使初始订单是自动下的(EXPERT))。 旧的实时订单(票据没有改变)仍然是待定的,但数量减少(ORDER_VOLUME_CURRENT)。 在这种情况下,旧的实时订单会得到ORDER_STATE_PARTIAL状态。实际上,这个标志是ORDER_VOLUME_CURRENT和ORDER_VOLUME_INITIAL的比较结果。 所有未结头寸都收到ID == OrderTicket。其中OrderTicket是由交易服务器生成的票据。 一个交易总是正好有一个历史订单,其状态是ORDER_STATE_FILLED。 每个被执行的历史订单正好有一个交易。 任何已执行的订单的ORDER_VOLUME_INITIAL等于它被执行的数量。也就是说,即使是被取消的初始订单,其ORDER_VOLUME_INITITAL也等于其产生的交易量。 初始订单(被部分执行)的时间不会改变,也不等于其交易的时间。 历史表是按订单时间(ORDER_TIME_SETUP)排序的,但不是按交易时间。因此,如果我们从DEAL_TIME做HistorySelect,我们不能把相应的订单弄到历史表中。 HistorySelectByPosition总是返回必要的交易/订单集。 你可以计算出任何交易的滑点。 根据您的经验,MT5在什么情况下/什么工作模式下使用,有没有什么一般的模式?3.最终,有没有出现过 "POSITION_TICKET != POSITION_IDENTIFIER "的真实情况? POSITION_TICKET != POSITION_IDENTIFIER 2018.02.12www.mql5.com зная id позиции можно ли без перебора узнать тикет позиции... fxsaber 2021.04.21 15:51 #2003 mktr8591: 在调用宏时,有可能省略一个参数(跳过它),有时你想特别允许宏对一个未指定的参数进行工作。 事实证明,任何宏中未指定的参数都会被编译器视为一个空字符串? mktr8591 2021.04.21 16:22 #2004 fxsaber: 因此,事实证明,任何宏中未指定的参数都被编译器视为空字符串? 在某种程度上,是的 ,尽管也许 "像一个空的空间 "是一个更好的词。难以清楚地表达 :-(. 但#p肯定会变成字符串=="" fxsaber 2021.04.21 16:32 #2005 mktr8591:在某种程度上,是的 ,尽管也许 "像一个空的空间 "是一个更好的词。难以清楚地表达 :-(.但#p肯定会变成字符串=="" 谢谢,有趣的细微差别。 mktr8591 2021.04.22 17:46 #2006 @fxsaber 请查一下这个问题:https://www.mql5.com/ru/forum/170952/page201#comment_21964923 Особенности языка mql5, тонкости и приёмы работы 2021.04.03www.mql5.com В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач... fxsaber 2021.04.22 20:38 #2007 mktr8591: 又回到了部分业绩的问题。1.请澄清第3点:"您可以在不移除部分认沽期权的情况下关闭已形成的头寸。但如果在这之后订单被触发,交易将打开,票据等于你之前关闭的位置的票据。也就是说,可能会有这样一种情况,你用某张票平仓。然后一个位置又出现了同一张票。" 在这种情况下,POSITION_IDENTIFIER 到底是不是 等于 POSITION_TICKET?2.先前在 "POSITION_TICKET != POSITION_IDENTIFIER "分支中,你展示了MT5的不同逻辑。 https://www.mql5.com/ru/forum/227423/page2#comment_6543129 在你的经验中,你是否显示出在哪些情况下/操作模式下适用MT5方案的一般模式?3.最终,有没有出现过 "POSITION_TICKET != POSITION_IDENTIFIER "的真实情况? 这两个链接都谈到了部分执行的不同实现。这是由经纪人的软件决定的,而不是MT5。 从来没有遇到过票据和身份证不匹配的情况。 mktr8591 2021.04.23 07:38 #2008 谢谢你。 fxsaber 2021.05.01 12:18 #2009 关于交易、自动交易系统和策略测试的论坛图书馆:使用情况fxsaber, 2021.05.01 14:17GetMicrosecondCount 可能会输出一个小于前一次调用的值(没有ULONG溢出)。这种情况的例子。 2021.04.29 06:43:31.915 Alert: NewValue = 296000074313, PrevValue = 296001329284 2021.04.29 06:43:32.149 Alert: NewValue = 296086250613, PrevValue = 296087264090 2021.04.29 06:43:31.868 Alert: NewValue = 295129291901, PrevValue = 295130576710 2021.04.29 06:43:32.180 Alert: NewValue = 295955613012, PrevValue = 295956589070 2021.04.29 06:43:32.180 Alert: NewValue = 295146223171, PrevValue = 295147199454 2021.04.29 06:43:32.149 Alert: NewValue = 295065995432, PrevValue = 295067005968 2021.04.29 06:43:32.149 Alert: NewValue = 295078776581, PrevValue = 295079787357每条线都是由不同的EA在三个MT4终端上获得的。而在MT5上,这种事情也会发生,但在MT4上要少得多。 要小心。 Artyom Trishkin 2021.05.09 10:24 #2010 与本主题无关的评论已被移至"来自MQL5 MT5 MetaTrader 5初学者的问题"。 1...194195196197198199200201202203204205206207208...247 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
对于这种情况,这里有一些辅助性的宏。
1.有时你想在你的宏中确定一个参数是否被设置。 IS_PARAMETER_SET(p)定义了一个表达式,如果p被设置,它将返回真(即使字符串变量==NULL)。
注意:该表达式是在编译时预处理后评估的!!!也就是说,它不能用来实现类似于#ifdef IS_PARAMETER_SET(p) #else的东西(这也适用于下面的其他宏)。
2.如果你需要明确地将一个参数值转换为字符串,以避免在编译时出现 未指定参数的错误,你可以使用 __EVAL_STR(p)。 如果没有指定p或者明确定义了NULL字面,它将返回""。不适用于数组、结构和类。
将参数明确转换为数字的方法是__EVAL_NON_STR(p)。如果p没有被设置,则返回0。 当p是一个字符串时,不工作!
代码和使用实例。
在RannForex-Server 模拟账户上的以下代码可以通过运行该顾问立即重现这种情况。
结果。
顺便说一下,该脚本显示(并不总是第一次)同步OrderSend执行中的一个错误。
在OrderSend执行了几十/几百毫秒后,订单价格是旧的价格,而不是OrderSend成功下的价格。
回到相同门票的话题上,我们可以得出一些结论。
如果有人设法在其他交易服务器上重现这个问题,请分享其名称。
搜索字符串:Oshibka 010。
又回到了部分执行的问题。
1.请澄清第3点:"您可以在不删除部分执行的情况下关闭您已形成的头寸。但如果在这之后订单被触发,交易将打开,票据等于你之前关闭的位置的票据。也就是说,可能会有这样一种情况,你用某张票平仓。然后一个位置又出现了同一张票。"
在这种情况下,POSITION_IDENTIFIER 到底是不是 等于 POSITION_TICKET?
2.早些时候在 "POSITION_TICKET != POSITION_IDENTIFIER "主题中,你展示了一个不同的MT5逻辑。
https://www.mql5.com/ru/forum/227423/page2#comment_6543129结论
如果我们假设这是MT5的正常行为,而不是经纪人黑客的特殊性,那么
根据您的经验,MT5在什么情况下/什么工作模式下使用,有没有什么一般的模式?
3.最终,有没有出现过 "POSITION_TICKET != POSITION_IDENTIFIER "的真实情况?
在调用宏时,有可能省略一个参数(跳过它),有时你想特别允许宏对一个未指定的参数进行工作。
因此,事实证明,任何宏中未指定的参数都被编译器视为空字符串?
在某种程度上,是的 ,尽管也许 "像一个空的空间 "是一个更好的词。难以清楚地表达 :-(.
但#p肯定会变成字符串==""
在某种程度上,是的 ,尽管也许 "像一个空的空间 "是一个更好的词。难以清楚地表达 :-(.
但#p肯定会变成字符串==""
谢谢,有趣的细微差别。
@fxsaber
请查一下这个问题:https://www.mql5.com/ru/forum/170952/page201#comment_21964923
又回到了部分业绩的问题。
1.请澄清第3点:"您可以在不移除部分认沽期权的情况下关闭已形成的头寸。但如果在这之后订单被触发,交易将打开,票据等于你之前关闭的位置的票据。也就是说,可能会有这样一种情况,你用某张票平仓。然后一个位置又出现了同一张票。"
在这种情况下,POSITION_IDENTIFIER 到底是不是 等于 POSITION_TICKET?
2.先前在 "POSITION_TICKET != POSITION_IDENTIFIER "分支中,你展示了MT5的不同逻辑。
https://www.mql5.com/ru/forum/227423/page2#comment_6543129在你的经验中,你是否显示出在哪些情况下/操作模式下适用MT5方案的一般模式?
3.最终,有没有出现过 "POSITION_TICKET != POSITION_IDENTIFIER "的真实情况?
这两个链接都谈到了部分执行的不同实现。这是由经纪人的软件决定的,而不是MT5。
从来没有遇到过票据和身份证不匹配的情况。
关于交易、自动交易系统和策略测试的论坛
图书馆:使用情况
fxsaber, 2021.05.01 14:17
GetMicrosecondCount 可能会输出一个小于前一次调用的值(没有ULONG溢出)。这种情况的例子。每条线都是由不同的EA在三个MT4终端上获得的。
而在MT5上,这种事情也会发生,但在MT4上要少得多。
要小心。