Ошибки, баги, вопросы - страница 1742
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
В справке сказано:
В режимах исполнения "По рынку" и "Биржевой" политика заполнения "Вернуть" всегда разрешена для всех типов ордеров. Разрешенность остальных типов проверяется при помощи свойств SYMBOL_FILLING_FOK и SYMBOL_FILLING_IOC.
Однако не всегда. Так на счетах в Robo "Вернуть" не работает, ни на счетах Pro, ни на счетах ECN.
В справке сказано:
В режимах исполнения "По рынку" и "Биржевой" политика заполнения "Вернуть" всегда разрешена для всех типов ордеров. Разрешенность остальных типов проверяется при помощи свойств 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 этой ошибки не возникает - криво настроен сервер разработчиков?
В справке сказано:
В режимах исполнения "По рынку" и "Биржевой" политика заполнения "Вернуть" всегда разрешена для всех типов ордеров. Разрешенность остальных типов проверяется при помощи свойств 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.
)
Другими словами - это какая-то заглушка.Есть подозрение что настройка заливки "Вернуть" вообще у всех торговых серверов стоит по-умолчанию (по крайней мере в FxPro так и ответили
Другими словами - это какая-то заглушка.В некоторых конторах (в частности недавно запустивших МТ5) необходимо явно указывать тип заливки - если не указывать будет ошибка.
Хотя, в том же Robo сервер возвращает true на проверку заполнения "Вернуть", но по факту этот тип заливки не работает. Короче полная путаница с этими заливками.
{
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.
Почти. В С++ разрешена следующая запись:
b.A::f();
Но здесь так нельзя. Поэтому только и исключительно костылем:
{
public:
virtual int f()
{
Print(__FUNCSIG__);
return(0);
}
int f1()
{
return A::f();
}
};
Почти. В С++ разрешена следующая запись:
b.A::f();
Тогда не понимаю, почему в C++ это работает. Ведь переопределенный virtual в таблице виртуальный методов полностью переопределиться должен. И от базового и следа там не должно быть.
Но здесь так нельзя. Поэтому только и исключительно костылем:
{
public:
virtual int f()
{
Print(__FUNCSIG__);
return(0);
}
int f1()
{
return A::f();
}
};
Ведь переопределенный virtual в таблице виртуальный методов полностью переопределиться должен. И от базового и следа там не должно быть.
Если явно указан тип, метод вызывается напрямую, без использования таблицы виртуальных функций.
Так можно вызвать даже чисто виртуальную функцию, если у нее есть тело.
Тогда A* b = new B; не подойдет.
Для такого случая надо другой костыль -- перенести в базовом классе внутренности функции в невиртуальный метод и вызывать его внутри виртуального. Тогда можно будет явно вызвать невиртуальный метод у базового класса и у наследника.
Если явно указан тип, метод вызывается напрямую, без использования таблицы виртуальных функций.
Так можно вызвать даже чисто виртуальную функцию, если у нее есть тело.
Для такого случая надо другой костыль -- перенести в базовом классе внутренности функции в невиртуальный метод и вызывать его внутри виртуального. Тогда можно будет явно вызвать невиртуальный метод у базового класса и у наследника.