Поэтому и не понятно. Значит на хеджинговом счете например цена дошла до Тейк
Профита - а сервер в ответ FIFO ?
Как и где посмотреть эту очередь FIFO?
На бирже я знаю как, а на форекс не представляю.
MQL5: Добавлена поддержка закрытия позиций по правилу FIFO.
В перечисление ENUM_ACCOUNT_INFO_INTEGER
добавлено значение ACCOUNT_FIFO_CLOSE — признак того, что позиции можно закрывать только по правилу FIFO. Если значение свойства равно true, то
позиции по каждому символу разрешается закрывать только в том порядке, в котором они были открыты — сначала самую старую, затем более
новую и т.д. При попытке закрыть позиции в ином порядке будет получена ошибка. Для счетов без хеджингового учета позиций
(ACCOUNT_MARGIN_MODE!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) свойство всегда равно false.
Добавлен новый код возврата сервера TRADE_RETCODE_FIFO_CLOSE
— запрос отклонен, так как для торгового счета установлено правило "Разрешено закрывать существующие позиции только по правилу FIFO".
Закрытие позиций может осуществляться тремя основными способами:
Закрытие через клиентский терминал — это закрытие позиций трейдером вручную, при помощи торгового робота, через сервис "Сигналы" и т.д.
При попытке закрыть позиции не по правилу FIFO трейдер получит соответствующую ошибку.
Закрытие при срабатывании Стоп Лосса или Тейк Профита — эти ордера обрабатываются на стороне сервера, соответственно и закрытие позиций в
таком случае инициируется не трейдером (терминалом), а самим сервером. Если для позиции сработал Стоп Лосс или Тейк профит, и эта
позиция не соответствует правилу FIFO (по тому же инструменту есть более ранние позиции), то она не будет закрыта.
Закрытие при срабатывании Стоп аута — такие операции также обрабатываются на стороне сервера. В обычном режиме, когда закрытие по правилу
FIFO отключено, при наступлении Стоп аута позиции закрываются, начиная с самой убыточной. При включении этой опции у закрываемых
убыточных позиции будет дополнительно проверяться время их открытия. Сервер определяет убыточные позиции по каждому символу,
находит для каждого символа наиболее старую позицию, а затем из найденных позиций закрывает ту, что дает наибольший убыток.
Где-то с прошлого месяца в MQL запретили размещать шаблоны внутри функций:
template<typename T>
void func(T arg)
{
struct internal
{
template<typename TT> // template declarations are not allowed in local classesstaticvoid f(TT) { }
staticvoid f(double) { }
};
internal::f(arg);
};
Не
очень понятно, с какой целью это было сделано, кому это мешало? Зачем урезать и без того ограниченный функционал MQL?
Данная возможность была одной из немногих палочек-выручалочек, дающих хоть какой-то комфорт при работе с шаблонным кодом в MQL, прежде
всего в макросах:
#define SWAP(a, b) { \
struct internal { \
template<typename T> \
staticvoid swap(T &a, T &b) { T temp=a; a=b; b=temp; } \
};\
internal::swap(a, b); \
}
void Main()
{
int i, j;
SWAP(i, j);
}
Зачем
оборачивать это в макрос - спросят некоторые? А затем, что необходима проверка валидности типов, передаваемых в шаблон. В
данном случае - это наличие доступного конструктора и оператора копирования. Если их нет, то будем иметь ошибку ПО МЕСТУ ВЫЗОВА
макроса:
class A { public: A(int); };
void Main()
{
A a(1), b(2);
SWAP(a, b); // 'A' - wrong parameters count
}
Если же использовать голый шаблон, то потом придётся искать место в коде, откуда он был вызван. Скудные возможности Метаэдитора никак не
помогут с этим.
template<typename T> \
void Swap(T &a, T &b) { T temp=a; a=b; b=temp; } // 'A' - wrong parameters count // Откуда вызван этот шаблон?
В С++ для этих целей используют sfinae-проверки, кучей всевозможных способов, например так:
template<typename T,int dummy=sizeof(T(T&))>void Swap(T& a, T& b) { T temp=a; a=b; b=temp; }
Короче, в C++ (и в C#) имеются штатные возможности для нормальной удобной работы в шаблонами. Поэтому там не нужны ни макросы, ни внутренние
шаблоны в функциях, ни прочие костыли. В MQL же, за неимением лучшего, приходится спасаться тем, что есть. Но когда и эти
возможности вдруг обрезают, не пойми зачем...
Недавно кстати был разговор по поводу другого ограничения, связанного с перегрузкой
методов, которое также не имело рационального смысла. Уж не знаю, какая муха кусает разработчиков, что они стали
закручивать гайки на ровном месте, сокращая и без того небогатые возможности (в сравнению со взрослыми языками).
2019.09.2309:02:32.966 Core 4 pass 22 tested with error "critical runtime error 502 in OnTick function (array out of range, module Experts\TZ_Sky_and_Ground_V_04_test.ex5, file Catboost.mqh, line 175, col 26)" in 0:00:03.986
А при одиночном проходе её нет.
В чем разница, если агент на локальном компьютере? Как отловить ошибку?
Входные переменные типа bool превращаются после теста/оптимизации рандомно в 1 и 0, при нажатии на них true и false появляется опять - раздражает -
или так или так уж.
Artyom Trishkin: MQL5: Добавлена поддержка
закрытия позиций по правилу FIFO.
В перечисление ENUM_ACCOUNT_INFO_INTEGER
добавлено значение ACCOUNT_FIFO_CLOSE — признак того, что позиции можно закрывать только по правилу FIFO. Если значение свойства равно
true, то позиции по каждому символу разрешается закрывать только в том порядке, в котором они были открыты — сначала самую старую,
затем более новую и т.д. При попытке закрыть позиции в ином порядке будет получена ошибка. Для счетов без хеджингового учета
позиций (ACCOUNT_MARGIN_MODE!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) свойство всегда равно false.
Добавлен новый код возврата сервера TRADE_RETCODE_FIFO_CLOSE
— запрос отклонен, так как для торгового счета установлено правило "Разрешено закрывать существующие позиции только по правилу
FIFO".
Закрытие позиций может осуществляться тремя основными способами:
Закрытие через клиентский терминал — это закрытие позиций трейдером вручную, при помощи торгового робота, через сервис "Сигналы" и
т.д. При попытке закрыть позиции не по правилу FIFO трейдер получит соответствующую ошибку.
Закрытие при срабатывании Стоп Лосса или Тейк Профита — эти ордера обрабатываются на стороне сервера, соответственно и закрытие
позиций в таком случае инициируется не трейдером (терминалом), а самим сервером. Если для позиции сработал Стоп Лосс или Тейк
профит, и эта позиция не соответствует правилу FIFO (по тому же инструменту есть более ранние позиции), то она не будет закрыта.
Закрытие при срабатывании Стоп аута — такие операции также обрабатываются на стороне сервера. В обычном режиме, когда закрытие по
правилу FIFO отключено, при наступлении Стоп аута позиции закрываются, начиная с самой убыточной. При включении этой опции у
закрываемых убыточных позиции будет дополнительно проверяться время их открытия. Сервер определяет убыточные позиции по
каждому символу, находит для каждого символа наиболее старую позицию, а затем из найденных позиций закрывает ту, что дает
наибольший убыток.
Артем, зачем вы скопировали еще раз это?
Вам всё понятно? Объясните тогда.
Если на одном символе запущено несколько разных советников, или в одном советнике несколько стратегий, как контролировать эту FIFO?
Или открыто несколько позиций с одинаковым для всех уровнем ТP и SL, некоторые сработают а некоторые будут отклонены?
Или предлагаете не торговать у брокеров через МТ5 с включенной функцией контроля FIFO?
p.s. Вы будете учитывать
нововведение в вашей библиотеке и статьях?
Если на одном символе запущено несколько разных советников, или в одном советнике несколько стратегий, как контролировать эту FIFO?
Или открыто несколько позиций с одинаковым для всех уровнем ТP и SL, некоторые сработают а некоторые будут отклонены?
Или предлагаете не торговать у брокеров через МТ5 с включенной функцией контроля FIFO?
p.s. Вы будете учитывать
нововведение в вашей библиотеке и статьях?
Потому, что здесь всё написано
Каждый советник должен уметь отличать свои позиции от чужих, а значит - он видит все позиции, и найти свою самую позднюю не составляет
труда.
Вот это нужно бы проверить.
Нет, не предлагаю.
ЗЫ. Уже внёс новые параметры в объекты символа и аккаунта. Да, конечно будет метод закрытия позиций по правилу "первый пришёл - первым
ушёл", причём такое закрытие уже давно прописано в планах библиотеки, и ничего нового в планах не появилось (кроме уже добавленных
новых свойств)
Надеюсь на это.
Я знаю что такое FIFO.
Поэтому и не понятно. Значит на хеджинговом счете например цена дошла до Тейк Профита - а сервер в ответ FIFO ?
Как и где посмотреть эту очередь FIFO?
На бирже я знаю как, а на форекс не представляю.
Закрытие позиций может осуществляться тремя основными способами:
Где-то с прошлого месяца в MQL запретили размещать шаблоны внутри функций:
Данная возможность была одной из немногих палочек-выручалочек, дающих хоть какой-то комфорт при работе с шаблонным кодом в MQL, прежде всего в макросах:
Если же использовать голый шаблон, то потом придётся искать место в коде, откуда он был вызван. Скудные возможности Метаэдитора никак не помогут с этим.
В С++ для этих целей используют sfinae-проверки, кучей всевозможных способов, например так:
Короче, в C++ (и в C#) имеются штатные возможности для нормальной удобной работы в шаблонами. Поэтому там не нужны ни макросы, ни внутренние шаблоны в функциях, ни прочие костыли. В MQL же, за неимением лучшего, приходится спасаться тем, что есть. Но когда и эти возможности вдруг обрезают, не пойми зачем...
MetaQuotes Software Corp.:
8. MQL5: Ускорен доступ к данным таймсерий при помощи функций iTime, iOpen, iHigh, iLow, iClose, iVolume, iTickVolume, iSpread.
проверил, по моему ничего не изменилось, тест в топике https://www.mql5.com/ru/forum/318901/page14#comment_13296824
функции iTime, iOpen, iHigh, iLow, iClose так и работают ровно в 2 раза медленнее чем CopyXXXX() функции
Странная работа тестера стратегий - при оптимизации получаю ошибку
А при одиночном проходе её нет.
В чем разница, если агент на локальном компьютере? Как отловить ошибку?
Билд 2155
MQL5: Добавлена поддержка закрытия позиций по правилу FIFO.
Закрытие позиций может осуществляться тремя основными способами:
Артем, зачем вы скопировали еще раз это?
Вам всё понятно? Объясните тогда.
Если на одном символе запущено несколько разных советников, или в одном советнике несколько стратегий, как контролировать эту FIFO?
Или открыто несколько позиций с одинаковым для всех уровнем ТP и SL, некоторые сработают а некоторые будут отклонены?
Или предлагаете не торговать у брокеров через МТ5 с включенной функцией контроля FIFO?
p.s. Вы будете учитывать нововведение в вашей библиотеке и статьях?Как отловить ошибку?
Сделайте проверку на все ArrayResize и ArrayCopy: если завершилась неудачно - TesterStop c подробными записями в Common-папку.
Артем, зачем вы скопировали еще раз это?
Вам всё понятно? Объясните тогда.
Если на одном символе запущено несколько разных советников, или в одном советнике несколько стратегий, как контролировать эту FIFO?
Или открыто несколько позиций с одинаковым для всех уровнем ТP и SL, некоторые сработают а некоторые будут отклонены?
Или предлагаете не торговать у брокеров через МТ5 с включенной функцией контроля FIFO?
p.s. Вы будете учитывать нововведение в вашей библиотеке и статьях?Проблемы будут только если первой пришла сделка от другого советника. А закрыть сейчас нужно сделку от второго :)
Как эти придумки отразятся на трейдерах?
Никак не отразятся. Просто сейчас стало возможным узнать о наличии/отсутствии FIFO через MQL.
Например, ставите в Маркет-продукте в OnInit эту проверку. Если true - INIT_FAILED.