返回执行策略。 - 页 2

 
Vladimir Karputov:

CTrade交易类的例子。首先是检查"SYMBOL_FILLING_FOK",然后是"SYMBOL_FILLING_IOC"。


该检查是通过使用"AND位操作"来进行的。

位和操作

二进制表示x和y的比特和操作。表达式的值在x和y都包含非零的所有位中包含1(TRUE);在所有其他位中包含0(FALSE)。


例子。


更多关于位操作 的信息。

所以根据这段代码,执行策略要么是ioc,要么是fok,要么都不是,所以事实证明,不可能同时有两个?还是我又误解了?
 
毕竟不能有两个同时存在吗? 函数要返回什么才能有两个同时存在?
 
我一定是误解了你的回答。你指的是一般情况下,而不是与一个交易账户有关。谢谢你的帮助。
 
Ivan_Invanov:
毕竟不能有两个同时存在吗? 要有两个同时存在,函数应该返回什么?
它可以是2,那么函数将返回3。BUT¡¡¡¡¡,这是一个非典型的情况。鉴于只有3个选项,它可能是1、2或1+2的总和。它是总和,而不是第三个选项。因此,用位操作 进行检查只能回答一个问题:能否应用这个或那个填充策略。
 
Ivan_Invanov:
毕竟不能有两个同时存在吗? 要有两个同时存在,函数应该返回什么?

对MetaQuotes-Demo服务器上的两个字符进行检查的例子。

2020.07.19 07:35:07.922 Info_FILLING (USDRUB,H1)        MetaQuotes-Demo
2020.07.19 07:35:07.922 Info_FILLING (USDRUB,H1)        Fill or Kill, SYMBOL_FILLING_FOK: false
2020.07.19 07:35:07.922 Info_FILLING (USDRUB,H1)        Immediate or Cancel, SYMBOL_FILLING_IOC: true
2020.07.19 07:35:07.922 Info_FILLING (USDRUB,H1)        Return: true
2020.07.19 07:35:07.922 Info_FILLING (USDRUB,H1)        Flags of allowed order filling modes: SYMBOL_TRADE_EXECUTION_INSTANT
2020.07.19 07:35:07.922 Info_FILLING (USDRUB,H1)        
2020.07.19 07:35:45.291 Info_FILLING (EURUSD,H1)        MetaQuotes-Demo
2020.07.19 07:35:45.291 Info_FILLING (EURUSD,H1)        Fill or Kill, SYMBOL_FILLING_FOK: true
2020.07.19 07:35:45.291 Info_FILLING (EURUSD,H1)        Immediate or Cancel, SYMBOL_FILLING_IOC: false
2020.07.19 07:35:45.291 Info_FILLING (EURUSD,H1)        Return: true
2020.07.19 07:35:45.291 Info_FILLING (EURUSD,H1)        Flags of allowed order filling modes: SYMBOL_TRADE_EXECUTION_INSTANT

参见这些符号的规格(填入)。



这里有一个更常见的变体:当一个符号的所有填充物都可用时

2020.07.19 07:40:22.818 Info_FILLING (NZDUSD,H1)        MetaQuotes-Demo
2020.07.19 07:40:22.818 Info_FILLING (NZDUSD,H1)        Fill or Kill, SYMBOL_FILLING_FOK: true
2020.07.19 07:40:22.818 Info_FILLING (NZDUSD,H1)        Immediate or Cancel, SYMBOL_FILLING_IOC: true
2020.07.19 07:40:22.818 Info_FILLING (NZDUSD,H1)        Return: true
2020.07.19 07:40:22.818 Info_FILLING (NZDUSD,H1)        Flags of allowed order filling modes: SYMBOL_TRADE_EXECUTION_INSTANT

和规格


 
谢谢你。
 
Alexey Viktorov:
它可能是2,那么该函数将返回3。BUT¡¡¡¡¡,这是一个非典型的情况。鉴于只有3个选项,它可能是1、2或1+2的总和。它是总和,而不是第三个选项。因此,用位操作 进行检查只能回答一个问题:能否应用这个或那个填充策略。
仍然不明白一个变量如何能返回两个项。而如果它返回一个3的值作为一个成员,那么位操作就不会工作。我决定只选择EXECUTION_INSTANT 模式,我将永远有一个FOK策略
 
Ivan_Invanov:
我还是不明白一个变量如何能返回两个成员。而如果它返回的一个项是3,那么按位法运算就不能工作。我决定只选择EXECUTION_INSTANT 模式,我将永远有一个FOK策略

要理解这一点,你需要了解什么是旗帜。

一个标志的每一个下一个值是前一个的值乘以2。即:1,2,4,8,16,32......... 所以如果数值是33,意味着这个数值只包含1和32。同样,如果数值是18,它只能由16和2组成。而数值3只能由1和2组成。

所以位操作 只是检查被检查的值是否存在于标志符之和中。如果你检查一个任意的数字是否包含在18中,你会得到假的,除了检查值2和16。

 
Alexey Viktorov:

要理解这一点,你需要了解什么是旗帜。

一个标志的每一个下一个值是前一个的值乘以2。即:1,2,4,8,16,32......... 所以如果数值是33,意味着这个数值只包含1和32。同样,如果数值是18,它只能由16和2组成。而数值3只能由1和2组成。

所以位操作 只是检查被检查的值是否存在于标志符之和中。如果你检查一个任意的数字是否包含在18中,除了检查值2和16之外,你会得到假的。

是的,我明白如何与二进制数字打交道。

   uint filling=(uint)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
   if((filling&SYMBOL_FILLING_FOK)==SYMBOL_FILLING_FOK)
     {
      m_type_filling=ORDER_FILLING_FOK;

例如,从这段代码来看,该函数返回3。

(11&1)==1 ; 11==01 不,那是假的,它没有工作。

我刚刚写到这里,觉得可能是我误解了这些操作。

& 这意味着我将十进制值转换为二进制,并进行比特连接。

==当第一项等于第二项时为真。这是否正确?

 
啊哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,终于到了。如果一个数字中有一个值,它就是一个真标志,三联体把这个值放在两个数字中。只是,为什么这段代码能发挥作用呢?