Ошибки, баги, вопросы - страница 1742

 

В справке сказано:

В режимах исполнения "По рынку" и "Биржевой" политика заполнения "Вернуть" всегда разрешена для всех типов ордеров. Разрешенность остальных типов проверяется при помощи свойств SYMBOL_FILLING_FOK и SYMBOL_FILLING_IOC. 

 Однако не всегда. Так на счетах в Robo "Вернуть" не работает, ни на счетах Pro, ни на счетах ECN.

 
Andrey Dik:

В справке сказано:

В режимах исполнения "По рынку" и "Биржевой" политика заполнения "Вернуть" всегда разрешена для всех типов ордеров. Разрешенность остальных типов проверяется при помощи свойств SYMBOL_FILLING_FOK и SYMBOL_FILLING_IOC. 

 Однако не всегда. Так на счетах в Robo "Вернуть" не работает, ни на счетах Pro, ни на счетах ECN.

Как раз на робо столкнулся

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2016.10.20 08:24

СБ на всех торговых серверах
//+------------------------------------------------------------------+
//| Get the property value "ORDER_TYPE_FILLING"                      |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING COrderInfo::TypeFilling(void) const
  {
   return((ENUM_ORDER_TYPE_FILLING)OrderGetInteger(ORDER_TYPE_FILLING));
  }

ВСЕГДА в тестере возвращает ENUM_ORDER_TYPE_FILLING::ORDER_FILLING_RETURN.

Поэтому если в OrderModify filling задать через COrderInfo::TypeFilling(), то на том же RoboForexEU-MetaTrader 5 будет логичная ошибка [Unsupported filling mode]. Однако, на MetaQuotes-Demo этой ошибки не возникает - криво настроен сервер разработчиков?



 
Andrey Dik:

В справке сказано:

В режимах исполнения "По рынку" и "Биржевой" политика заполнения "Вернуть" всегда разрешена для всех типов ордеров. Разрешенность остальных типов проверяется при помощи свойств SYMBOL_FILLING_FOK и SYMBOL_FILLING_IOC. 

 Однако не всегда. Так на счетах в Robo "Вернуть" не работает, ни на счетах Pro, ни на счетах ECN.

Есть подозрение что настройка заливки "Вернуть" вообще у всех торговых серверов стоит по-умолчанию (по крайней мере в FxPro так и ответили

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Режимы заполнения на серверах

Karputov Vladimir, 2016.10.14 19:18

Режим заполнения "Return":

Вернуть

Идентификатор отсутствует

 

Данный режим используется для рыночных (Buy и Sell), лимитных и стоп-лимитных ордеров и только в режимах "Исполнение по рынку" и "Биржевое исполнение". В случае частичного исполнения рыночный или лимитный ордер с остаточным объемом не снимается, а продолжает действовать.

А вот и ответ от торговой организации, касательно режима заполнения "Return" 

Our MT5 expert has confirmed with Metaquotes, that return is using by default, and its applied when you choose nothing on filling.

Другими словами - это какая-то заглушка.
 
Karputov Vladimir:

Есть подозрение что настройка заливки "Вернуть" вообще у всех торговых серверов стоит по-умолчанию (по крайней мере в FxPro так и ответили

Другими словами - это какая-то заглушка.

В некоторых конторах (в частности недавно запустивших МТ5) необходимо явно указывать тип заливки - если не указывать будет ошибка.

Хотя, в том же Robo сервер возвращает true на проверку заполнения "Вернуть", но по факту этот тип заливки не работает. Короче полная путаница с этими заливками. 

 
Комментарии, не относящиеся к этой теме, были перенесены в "CHART_SHOW_OHLC для 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;
}
Правильно ли понимаю, что если virtual в потомке переопределен, то до базового virtual никогда не достучаться? Т.е. нельзя никак из b вызвать A::f.
 
fxsaber:
Правильно ли понимаю, что если virtual в потомке переопределен, то до базового virtual никогда не достучаться? Т.е. нельзя никак из b вызвать A::f.

Почти. В С++ разрешена следующая запись:

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

Но здесь так нельзя. Поэтому только и исключительно костылем:

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

Почти. В С++ разрешена следующая запись:

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

Тогда не понимаю, почему в C++ это работает. Ведь переопределенный virtual в таблице виртуальный методов полностью переопределиться должен. И от базового и следа там не должно быть.

Но здесь так нельзя. Поэтому только и исключительно костылем:

class B : public A
{
public:
  virtual int f()
  {
    Print(__FUNCSIG__);
    
    return(0);
  }
  
  int f1()
  {
    return A::f();
  }
};
Тогда A* b = new B; не подойдет.
 
fxsaber:

Ведь переопределенный virtual в таблице виртуальный методов полностью переопределиться должен. И от базового и следа там не должно быть.

Если явно указан тип, метод вызывается напрямую, без использования таблицы виртуальных функций.

Так можно вызвать даже чисто виртуальную функцию, если у нее есть тело.

fxsaber:
Тогда A* b = new B; не подойдет.

Для такого случая надо другой костыль -- перенести в базовом классе внутренности функции в невиртуальный метод и вызывать его внутри виртуального. Тогда можно будет явно вызвать невиртуальный метод у базового класса и у наследника. 

 
Комбинатор:

Если явно указан тип, метод вызывается напрямую, без использования таблицы виртуальных функций.

Так можно вызвать даже чисто виртуальную функцию, если у нее есть тело.

Для такого случая надо другой костыль -- перенести в базовом классе внутренности функции в невиртуальный метод и вызывать его внутри виртуального. Тогда можно будет явно вызвать невиртуальный метод у базового класса и у наследника. 

Понял, Спасибо!
Причина обращения: