错误、漏洞、问题 - 页 1742

 

该帮助指出。

在 "按市场 "和 "交易所 "的执行模式中,所有订单类型 允许使用 "返回 "的填充策略。使用SYMBOL_FILLING_FOK和SYMBOL_FILLING_IOC属性检查是否允许其他类型。

但并不总是如此。所以在机器人账户上 "返回 "不起作用,在专业账户和ECN账户上都不起作用。

 
Andrey Dik:

该帮助指出。

在 "按市场 "和 "交易所 "的执行模式中,所有订单类型 允许使用 "返回 "的填充策略。使用SYMBOL_FILLING_FOK和SYMBOL_FILLING_IOC属性检查是否允许其他类型。

但并不总是如此。因此,在机器人账户上,"回报 "不起作用,在专业账户和ECN账户上也是如此。

刚刚遇到了一个机器人

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

虫子,虫子,问题

fxsaber, 2016.10.20 08:24

所有交易服务器上的SB
//+------------------------------------------------------------------+
//| Get the property value "ORDER_TYPE_FILLING"                      |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING COrderInfo::TypeFilling(void) const
  {
   return((ENUM_ORDER_TYPE_FILLING)OrderGetInteger(ORDER_TYPE_FILLING));
  }

ALWAYS在测试者返回ENUM_ORDER_TYPE_FILLING::ORDER_FILLING_RETURN

这就是为什么如果您在OrderModify中通过COrderInfo::TypeFilling()设置填充,那么在同一个RoboForexEU-MetaTrader 5中会出现一个逻辑错误[Unsupported filling mode]。然而,这个错误在MetaQuotes-Demo中并没有发生--开发商的服务器配置错误?



 
Andrey Dik:

该帮助指出。

在 "按市场 "和 "交易所 "的执行模式中,所有订单类型 允许使用 "返回 "的填充策略。使用SYMBOL_FILLING_FOK和SYMBOL_FILLING_IOC属性检查是否允许其他类型。

但并不总是如此。例如,"回报 "在机器人账户上不起作用,在专业账户和ECN账户上都不起作用。

我怀疑 "返回 "设置是所有贸易服务器的默认设置(至少FxPro这样回答。

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

服务器上的填充模式

Karputov Vladimir, 2016.10.14 19:18

填充模式 "返回"。

返回

没有身份证

这种模式用于市场(买入和卖出)、限价和止损订单,并且只在 "市场执行 "和 "交易所执行 "模式下使用。在部分执行的情况下,有剩余交易量的市价单或限价单不会被删除,而是仍然有效。

以下是经纪公司关于"返回 "模式 的答复

我们的MT5专家已经与Metaquotes确认,默认情况下使用回报,当你在填充时不选择任何东西时,它就会应用。

)

换句话说--它是某种存根。
 
Karputov Vladimir:

有一种怀疑,"返回 "填充设置是所有交易服务器的默认值(至少,FxPro是这样回答的)。

换句话说--它是某种存根。

在一些公司(特别是最近推出的MT5),有必要清楚地指定填充物的类型 - 如果你不指定,将出现错误。

虽然,在Robo中,服务器对 "返回 "的检查返回为真,但事实上,这种类型的填充并不工作。简而言之,这些填充物完全是个烂摊子。

 
与本主题无关的评论已被移至 "CHART_SHOW_OHLC for OBJ_CHART"。
 
很明显,我很慢。
class A
{
public:
  virtual int f()
  {
    Print(__FUNCSIG__);
    
    return(0);
  }
};

class B : public A
{
public:
  virtual int f()
  {
    Print(__FUNCSIG__);
    
    return(0);
  }
};

void OnStart()
{
//  A* b = new B;
  B* b = new B;
  
  ((A*)b).f();

  delete b;
}
我的理解是否正确,如果子代中的虚拟被覆盖,那么基代虚拟就永远无法到达?也就是说,没有办法从b中调用A::f。
 
fxsaber:
我的理解是否正确,如果子代中的虚拟被覆盖,那么基代虚拟就永远无法到达?也就是说,没有办法从b中调用A::f。

几乎。在C++中,允许有以下条目。

B* b = new B;
b.A::f();

但你不能在这里这样做。因此,只能完全靠拐杖。

class B : public A
{
public:
  virtual int f()
  {
    Print(__FUNCSIG__);
    
    return(0);
  }
  
  int f1()
  {
    return A::f();
  }
};
 
Комбинатор:

几乎。在C++中,允许有以下条目。

B* b = new B;
b.A::f();

那我就不明白为什么它在C++中可以工作。毕竟,在虚拟方法表中,一个被重写的虚拟应该是完全重写的。而且不应该有基地的痕迹。

但在这里不可能这样做。这就是为什么它只能靠拐杖。

class B : public A
{
public:
  virtual int f()
  {
    Print(__FUNCSIG__);
    
    return(0);
  }
  
  int f1()
  {
    return A::f();
  }
};
那么A* b = new B;将无法工作。
 
fxsaber:

毕竟,虚拟方法表中的overridden virtual应该是完全重写的。而且不应该有任何基础方法的痕迹。

如果明确指定了类型,则直接调用该方法,而不使用虚拟函数 表。

这样一来,即使是一个纯虚函数,如果它有一个主体,也可以被调用。

fxsaber:
Then A* b = new B; will not work.

在这种情况下,你需要另一个拐杖--将基类中的函数内部转移到一个非虚拟的方法中,并在虚拟的方法中调用它。然后我们可以明确地从基类和继承者那里调用非虚拟方法。

 
Комбинатор:

如果明确指定了类型,则直接调用该方法,而不使用虚拟函数 表。

即使是一个纯粹的虚拟函数,如果它有一个主体,也可以用这种方式调用。

在这种情况下,我们需要另一个拐杖,那就是把函数的内部结构移到基类中的一个非虚拟方法中,然后在虚拟方法中调用它。然后,你可以明确地从基体和子体中调用非虚拟方法。

明白了,谢谢!