Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
По идее, в объявления OpenLongParams, OpenShortParams, CheckOpenLong, CheckOpenShort нужно добавить ссылочный параметр volume, который на входе будет содержать максимально возможный рассчитанный объем позиции, а на выходе - реально требуемый сигналом. CExpert должен продолжать вызывать эти методы, если текущий объём позиции меньше, чем максимально возможный рассчитанный. Точно так же нужно изменить объявления CloseLongParams, CloseShortParams, CheckCloseLong, CheckCloseShort для возможности выхода лесенкой.
И нужно изменить логику снятия отложников. Сейчас они снимаются, если есть сигнал на закрытие позиции - это логически некорректно; многие стратегии, работающие на отложниках, с такой логикой сделать вообще невозможно. В CExpertSignal нужно добавить метод CheckDeleteOrder[Long|Short].
А можно обосновать ?
Не вижу смысла в препираниях со скучающими по жизни
Не вижу смысла в препираниях со скучающими по жизни
Что-то не понял...
Алексей, вопрос вроде как вполне разумный - почему CExpert убог от рождения ? Я вот, вижу его очень даже разумным и логичным. Для МТ5-Netting счетов, фактически, близким к идеальному шаблону системы.
Выбираем позицию, если не выбирается - запрашиваем сигнал на вход, и входим, если надо, а если позиция выбралась - то запрашиваем сопровождение.
Для МТ4 и МТ5-Hedge, где возможны разнонаправленные позиции он напрямую не годится - как раз Владимир сейчас столкнулся с этими проблемами. Но сама суть "каркаса", к которому подключаются модули сигналов, ММ и трейлинга - почему она "убогая" ?
Пока оставим за скобками функцию определения направления позиции/однонаправленности позиций и само направление позиции/позиций. Более важно, КУДА нужно вставлять код на проверку открытия новой позиции. Итак, для bool CExpert::Processing(void) предлагаю такой вариант:
//| Main function |
//+------------------------------------------------------------------+
bool CExpert::Processing(void)
{
//--- calculate signal direction once
m_signal.SetDirection();
//--- check if open positions
if(SelectPosition())
{
//--- open position is available
//--- check the possibility of opening a position/setting pending order
if(CheckOpen())
return(true);
//--- check the possibility of reverse the position
if(CheckReverse())
return(true);
//--- check the possibility of closing the position/delete pending orders
if(!CheckClose())
{
//--- check the possibility of modifying the position
if(CheckTrailingStop())
return(true);
//--- return without operations
return(false);
}
}
...
Пока оставим за скобками функцию определения направления позиции/однонаправленности позиций и само направление позиции/позиций. Более важно, КУДА нужно вставлять код на проверку открытия новой позиции. Итак, для bool CExpert::Processing(void) предлагаю такой вариант:
Боюсь, что "оставить за скобками" не выйдет. Владимир, я уже немало времени думаю над этой самой функцией процессинга - она логична, если позиция неттинговая. Однако, в случае разнонаправленного хеджирования - она никак не годится. Ни в том виде, в котором она была раньше (CheckOpen() - если нет позиции, и все остальные функции, если позиция есть), ни в предлагаемом виде.
Если не перерабатывать серьезно идеологию цикла процессинга в CExpert - то я бы оставил прежний вариант. Но, учитывая любовь народа к локированию - он не годится.
Сам я склоняюсь к очереди реквестов - то есть, сигналы - входной переворотный, закрытия, трейлинга - формируют один или больше реквестов на изменение позиции, которые последовательно выполняются классом CExpert. Соответственно, цикл процессинга превращается в простой последовательный вызов всех сигналов, а затем - последовательное выполнение всех полученных реквестов.
"За скобками" - значит поговорим об этом позже :). Просто явно нужна отдельная функция, которая должна делать:
ENUM_POSITION_TYPE m_positions_direction; // positions direction
и при инициализации класса присваивать ей значение "-1" - то есть "направление неизвестно".
//| Constructor |
//+------------------------------------------------------------------+
CExpertAveraging::CExpertAveraging(void) : m_positions_direction(-1)
{
}
На данный момент советник на базе класса CExpert позволяет держать ОДНУ позицию.
Тема заглохла? Или переместилась в другую ветку?
Был бы признателен, если бы кто-то смог дать ссылку на решение. Поиском находится только много вопросов и ни одного решения.
Тема заглохла? Или переместилась в другую ветку?
Был бы признателен, если бы кто-то смог дать ссылку на решение. Поиском находится только много вопросов и ни одного решения.
Модернизация CExpert заглохла - так как я перешел на свой алгоритм получения и обработки торговых сигналов в эксперте.
Модернизация CExpert заглохла - так как я перешел на свой алгоритм получения и обработки торговых сигналов в эксперте.