mql5语言的特点、微妙之处以及技巧 - 页 201

 
在调用宏时,你可以不指定任何参数(省略),有时你想特别允许宏在未指定的参数下工作。


对于这种情况,这里有一些辅助性的宏。

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
  }


 
fxsaber:

RannForex-Server 模拟账户上的以下代码可以通过运行该顾问立即重现这种情况。


结果。


顺便说一下,该脚本显示(并不总是第一次)同步OrderSend执行中的一个错误。

在OrderSend执行了几十/几百毫秒后,订单价格是旧的价格,而不是OrderSend成功下的价格。


回到相同门票的话题上,我们可以得出一些结论。

  1. 如果部分限价单被挂起,标签 "订单和交易 "将不显示生成的交易。
  2. 在套期保值中,一个订单可以产生多个不同价格的IN交易。其结果将是一个零星的(相对于点)开仓价格。
  3. 你可以关闭已生成的头寸,而不删除部分认沽。但如果在这之后,挂单被触发,那么交易将被打开,票据等于之前被关闭的仓位的票据。也就是说,可能会有这样一种情况,你用某张票平仓。然后,一个仓位重新出现在相同的股票上。
  4. 部分执行可能以不同的方式实施,这取决于经纪人的软件。以上是一个标准的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
POSITION_TICKET != POSITION_IDENTIFIER
  • 2018.02.12
  • www.mql5.com
зная id позиции можно ли без перебора узнать тикет позиции...
 
mktr8591:
在调用宏时,有可能省略一个参数(跳过它),有时你想特别允许宏对一个未指定的参数进行工作。
事实证明,任何宏中未指定的参数都会被编译器视为一个空字符串?
 
fxsaber:
因此,事实证明,任何宏中未指定的参数都被编译器视为空字符串?

在某种程度上,是的 ,尽管也许 "像一个空的空间 "是一个更好的词。难以清楚地表达 :-(.

但#p肯定会变成字符串==""

 
mktr8591:

在某种程度上,是的 ,尽管也许 "像一个空的空间 "是一个更好的词。难以清楚地表达 :-(.

但#p肯定会变成字符串==""

谢谢,有趣的细微差别。

 
Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2021.04.03
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
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。

从来没有遇到过票据和身份证不匹配的情况。

 
谢谢你。
 

关于交易、自动交易系统和策略测试的论坛

图书馆:使用情况

fxsaber, 2021.05.01 14:17

GetMicrosecondCount 可能会输出一个小于前一次调用的值(没有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上要少得多。

要小心。

 
与本主题无关的评论已被移至"来自MQL5 MT5 MetaTrader 5初学者的问题"。