Обсуждение статьи "Кроссплатформенный торговый советник: Классы CExpertAdvisor и CExpertAdvisors"
Привет, Энрико. Похоже, вы завершили свой проект. Я только что просмотрел вашу последнюю статью и заметил то, что, как мне кажется, может быть ошибкой:
bool CExpertAdvisorBase::Init(string symbol,int period,int magic,bool every_tick=true,bool one_trade_per_candle=true,bool position_reverse=true) { m_symbol_name=symbol; CSymbolInfo *instrument; if((instrument=new CSymbolInfo)==NULL) return false; if(symbol==NULL) symbol=Symbol(); if(!instrument.Name(symbol)) return false; instrument.Refresh(); m_symbol_man.Add(instrument); m_symbol_man.SetPrimary(m_symbol_name); m_period=(ENUM_TIMEFRAMES)period; m_every_tick=every_tick; m_order_man.Magic(magic); m_position_reverse=position_reverse; m_one_trade_per_candle=one_trade_per_candle; CCandle *candle=new CCandle(); candle.Init(instrument,m_period); m_candle_man.Add(candle); Magic(magic); return false; }
Я выделил оранжевым цветом выше. Я думаю, что в операторе возврата должно быть true, а не false. Я перезагружаю свой компьютер, подхватил очень страшный вирус, который испортил мне весь день, поэтому решил немного почитать. Ваша работа - одно из лучших чтений на форуме. Вы превзошли сами себя с этим проектом, молодец.
Моя идея похожа на вашу, и я почерпнул несколько действительно замечательных идей из вашей работы, спасибо. Когда я закончу, я найду время, чтобы поделиться ею здесь.
Привет, Энрико. Похоже, вы завершили свой проект. Я только что просмотрел вашу последнюю статью и заметил то, что, как мне кажется, может быть ошибкой:
Я выделил оранжевым цветом выше. Я думаю, что в операторе возврата должно быть true, а не false. Я перезагружаю свой компьютер, подхватил очень страшный вирус, который испортил мне весь день, поэтому решил немного почитать. Ваша работа - одно из лучших чтений на форуме. Вы превзошли сами себя с этим проектом, молодец.
Моя идея похожа на вашу, и я почерпнул несколько действительно замечательных идей из вашей работы, спасибо. Когда я закончу, я найду время, чтобы поделиться ею здесь.
Привет, Шеп,
Привет, Энрико. Похоже, вы завершили свой проект. Я только что просмотрел вашу последнюю статью и заметил то, что, как мне кажется, может быть ошибкой:
Я выделил оранжевым цветом выше. Я думаю, что в операторе возврата должно быть true, а не false. Я перезагружаю свой компьютер, подхватил очень страшный вирус, который испортил мне весь день, поэтому решил немного почитать. Ваша работа - одно из лучших чтений на форуме. Вы превзошли сами себя с этим проектом, молодец.
Моя идея похожа на вашу, и я почерпнул несколько действительно замечательных идей из вашей работы, спасибо. Когда я закончу, я найду время, чтобы поделиться ею здесь.
Жаль слышать о том, что произошло, но спасибо за ваш отзыв. Да, вы правы. Я не замечал этого до сих пор. Я исправлю это. Вызов метода Init() в примерах не проверяется, но часть моих будущих планов по развитию библиотеки - сделать вызовы функций и методов более формальными (как в стандартной библиотеке), а также шаблон EA для упрощения кодирования. Позже я выложу последнюю версию библиотеки на кодовую базу и сделаю репозиторий публичным. Ваши дальнейшие отзывы и запросы на исправление будут приветствоваться.
Всегда пожалуйста, и я с нетерпением жду, когда вы увидите вашу библиотеку.
Привет, Шеп,
Жаль слышать о случившемся, но спасибо за ваш отзыв. Да, вы правы. Я не замечал этого до сих пор. Я исправлю это. Вызов метода Init() в примерах не проверяется, но часть моих будущих планов по развитию библиотеки - сделать вызовы функций и методов более формальными (как в стандартной библиотеке), а также шаблон EA для упрощения кодирования. Позже я выложу последнюю версию библиотеки на кодовую базу и сделаю репозиторий публичным. Ваши дальнейшие отзывы и запросы на исправление будут приветствоваться.
Всегда пожалуйста, и я с нетерпением жду, когда вы увидите вашу библиотеку.
Привет, Энрико. Я наконец-то завершаю установку новой системы. Вчера вечером я несколько часов боролся, так как не мог получить контроль над своей системой, но теперь все почти готово. Использую свой планшет для просмотра и чтения. Ваша библиотека - это действительно отличная работа. Теперь, когда она завершена, я вижу всю логику - вау!
Моя идея заключается в следующем.
- Советник создает список роботов (как сущность AI) на основе комбинации Magic, Symbol и Timeframe (используя Watch Window).
- Затем AI-существо лезет в мешок с трюками (сигналами - MA, PSAR и т.д.) и определяет лучший сигнал или комбинацию сигналов. Лучший здесь основан на внутреннем механизме обратного тестирования, который позволяет ему сравнивать сигналы между собой.
- Затем ИИ добавляет сигнал/сигналы в список и торгует на основе этого, а также переобучается, если это необходимо.
- У каждого ИИ будут объекты Stop, Order и Position, которыми они управляют индивидуально, а также доступ к объекту-оптимизатору (GA) для обучения. Я думал использовать теорию полезности для принятия решений ИИ (подобно весовым коэффициентам, используемым в MQL5 EA System), но мне не понравился произвольный характер, поэтому я выбрал обучение через виртуальную торговлю, придав ИИ почти реальное поведение, подобное поведению человека.
Мне было трудно понять, как реализовать некоторые идеи, но чтение статей, подобных вашей, и многих других статей на форуме и книг привело меня к тому, что я вот-вот завершу действительно крутой проект - так мне кажется.
Одна из основных проблем, которую вы упомянули, - это сериализация. Из-за этого живой ордер или позиция не имеют всех атрибутов объекта, который их открыл, и сбой системы переводит AI в недействительное состояние, оставляя множество бесхозных сделок. Я подумал об использовании комментария к ордеру. Так, при отправке ордера создается комментарий с конкатенированными Timeframe, SignalName, SignalSettings. Вскоре я понял, что это очень быстро становится громоздким и чревато проблемами с реализацией. Поэтому запись в файл кажется единственным, что имеет смысл.
Если вам интересно, я расскажу вам о своих успехах. Но ваша работа действительно великолепна, спасибо за ваше время, потраченное на проект.
Шеп
Привет, Шеп,
Привет, Энрико. Я наконец-то завершаю установку новой системы. Вчера вечером я несколько часов боролся, так как не мог получить контроль над системой, но теперь все почти готово. Использую свой планшет для просмотра и чтения. Ваша библиотека - это действительно отличная работа. Теперь, когда она завершена, я вижу всю логику - вау!
Моя идея заключается в следующем.
- Советник создает список роботов (как сущность AI) на основе комбинации Magic, Symbol и Timeframe (используя Watch Window).
- Затем AI-существо лезет в мешок с трюками (сигналами - MA, PSAR и т.д.) и определяет лучший сигнал или комбинацию сигналов. Лучший здесь основан на внутреннем механизме обратного тестирования, который позволяет ему сравнивать сигналы между собой.
- Затем ИИ добавляет сигнал/сигналы в список и торгует на основе этого, а также переобучается, если это необходимо.
- У каждого ИИ будут объекты Stop, Order и Position, которыми они управляют индивидуально, а также доступ к объекту-оптимизатору (GA) для обучения. Я думал использовать теорию полезности для принятия решений ИИ (подобно весовым коэффициентам, используемым в MQL5 EA System), но мне не понравился произвольный характер, поэтому я выбрал обучение через виртуальную торговлю, придав ИИ почти реальное поведение, как у реального человека.
Мне было трудно понять, как реализовать некоторые идеи, и чтение таких статей, как ваша, и многих других статей на форуме и книг привело меня к тому, что я вот-вот завершу действительно крутой проект - так я думаю, во всяком случае.
Одна из основных проблем, которую вы упомянули, - это сериализация. Из-за этого живой ордер или позиция не имеют всех атрибутов объекта, который их открыл, и сбой системы переводит AI в недействительное состояние, оставляя множество бесхозных сделок. Я подумал об использовании комментария к ордеру. Так, при отправке ордера создается комментарий с конкатенированными Timeframe, SignalName, SignalSettings. Вскоре я понял, что это очень быстро становится громоздким и чревато проблемами с реализацией. Поэтому запись в файл кажется единственным, что имеет смысл.
Если вам интересно, я расскажу вам о своих успехах. Но ваша работа действительно великолепна, спасибо за ваше время, потраченное на проект.
Шеп
Это звучит как интересный проект. Однако, это выглядит как очень большой проект (возможно, более крупный и сложный, чем этот). Позвольте мне поделиться некоторыми своими соображениями, которые, как я полагаю, могут вам помочь:
Однажды я уже писал скрипт бэктестера. Мне удалось заставить его работать так, как я хотел, с виртуальными сделками, но его производительность была бы низкой, если бы он использовался в реальном советнике (не говоря уже о самооптимизирующемся!). Возможно, вы добьетесь большего успеха в своей работе, если сможете каким-то образом заставить другие ядра CPU (или даже GPU) также выполнять вычисления (т. е. с помощью DLL или OpenCL).
Список роботов работает, но у него есть существенный недостаток: они не выполняются параллельно. Это отставание нормально, если их количество составляет всего несколько штук, но если их больше, то те, кто находится в конце списка, будут обрабатываться последними. К тому же им придется конкурировать с ресурсами, необходимыми советнику для выполнения реальной работы.
Виртуальная торговля может создавать хорошие модели, но она не улавливает реальный шум на рынке (т. е. новости). Это я понял на собственном опыте.
Я разделяю с вами те же мысли относительно системы взвешивания, используемой в классе CSignal стандартной библиотеки. На мой взгляд, эта система очень склонна к перестройке, если ее поставить на оптимизатор. У меня есть бот-маркет-мейкер, который использует модель рыночного скоринга (LMSR, но я все еще работаю над улучшением инвентарного риска). Я считаю, что это очень хорошая альтернатива, так как вес сигналов на покупку и продажу (и даже отсутствие сигнала) может быть коллективно учтен, а выходные данные выражаются в вероятностях. И это гораздо менее ресурсоемко, чем глубокое обучение.
Сохранение в файл, вероятно, лучший вариант на данный момент для сохранения волатильных данных. Еще один вариант - использование GVs, но он может оказаться еще более запутанным, чем использование комментариев к ордерам. Кроме того, некоторые брокеры вставляют в комментарии к ордерам другие коды (например, для бинарных опционов), так что этот способ, на мой взгляд, тоже не самый лучший. Другой вариант - сохранить все данные в объекте-словаре, что избавит вас от необходимости писать строки кода, реализующие множество методов Load и Save, но при этом необходимо сохранять данные и на диск. Но здесь возникает серьезная проблема, когда пользователь хочет начать новую сессию с советником. Эту проблему приходится решать вручную (либо удалять файл сохранения, либо назначать новое имя файла сохранения).
При реализации файловых классов в этой библиотеке я нарушил несколько правил ООП. Я столкнулся с проблемой, когда файловый хэндл терял свое значение (становился INVALID_HANDLE) при передаче через методы и функции (даже с квалификатором const). Я не уверен, так ли это сейчас, но меня вполне устраивает текущее решение. Честно говоря, использование потомка CFile в библиотеке было не слишком элегантным, но это работает и дает гораздо меньше кода.
Всего наилучшего,
Энрико
Большое спасибо за ваш вклад. Я приветствую ваши идеи в любое время.
Да, вы правы, это будет большой проект, и, надеюсь, не больше вашего, это много работы и стресс при этом. Однако я люблю программирование, и, если подумать, я вообще-то финансовый аналитик. Я начал программировать по необходимости, потому что мне нужно было автоматизировать некоторые из более сложных финансовых моделей. У меня просто странная способность придумывать безумные, причудливые идеи. Если бы я только умел кодить так же хорошо, как вы!
В данный момент я рассматриваю словари и Lists<T>. List<T>, в частности, как более простое средство для совместного использования списков объектов, а также для связывания. А Dictionary - для хранения и сериализации. Я экспериментирую с несколькими идеями, чтобы облегчить свою кодовую базу, но при этом иметь быструю, легкую в обслуживании и буквально свободную от рук систему, как только она будет установлена на Chart. Ваше замечание по поводу списков действительно ценно, так что эта идея может оказаться не такой уж идеальной.
Вы правы в отношении обработки шлака, если я не использую параллельное выполнение - и даже тогда это происходит медленно. Это одна из проблем, которую я обнаружил в своих тестах. Последние объекты в списке опаздывают, особенно если рынок действительно волатилен, OnTick может быть вызван несколько раз, прежде чем будут вызваны первые объекты в списке. Как вы и советовали, я посмотрел на OpenCL как на возможное решение. Мне придется инвестировать в систему, сделанную на заказ.
Действительно, виртуальная торговля создает отличные модели, которые могут полностью уничтожить ваш счет на шумных рынках. Однажды я в панике наблюдал, как мой советник с трудом размещает и тем более закрывает сделки во время новостей. Это холодная суровая реальность торговли, но мы должны пытаться.
Да, я согласен с вами, что подход со скоринговой моделью лучше. LMSR определенно лучше, особенно учитывая, что бычьи и медвежьи движения очень отличаются для каждого инструмента. Взвешенный по вероятности подход определенно повышает точность.
Что касается самообучения, то да, оно будет довольно медленным. Оно будет использоваться только в начале, чтобы настроить агентов ИИ, снабдить их соответствующими сигналами, а затем через определенные промежутки времени, скажем, в конце дня для агентов на 5 минут и в пятницу для агентов на 1 час. Действительно, это наводит на мысль о виртуальном обучении, которое приносит миллиарды, только чтобы потерять все свои деньги в реальной торговле. Поэтому для меня важно найти простые и быстрые сигналы, чтобы не терять скорость. Я хочу, чтобы система скальпировала, скажем, на несколько пунктов после спреда и комиссии. Это означает, что сделки должны быть действительно высоковероятными, например, молот, который находится на самом низком из последних 20 баров, или что-то в этом роде.
Поскольку я хочу сосредоточиться на скальпинге, мне, возможно, не придется так много следить за сделками. Агенты будут просто проверять сетап, затем выставлять ордер со стопом и тейкпрофитом, который будет остановлен или закрыт в прибыль. Опять же, я все еще экспериментирую с этим.
У меня еще много работы, я экспериментирую с идеями вокруг сигналов. Когда я найду что-то с действительно хорошими результатами, я поделюсь с вами.
Вы нарушили несколько правил, но разве не в этом прелесть программирования! Удивительно, как можно придерживаться правил и при этом полностью застрять и чувствовать, что хоть на стену лезь. А иногда нарушение правил - это то, что нужно для прогресса. Ваша работа великолепна, и за это я вас очень уважаю. Энрико, программирование - это тяжелая работа. Приятно, когда все идет гладко, и очень больно, когда все работает не по плану.
Большое спасибо за ваш вклад. Я очень благодарен и обязательно буду держать вас в курсе.
Еще раз спасибо,
Шеп
Большое спасибо за ваш вклад. Я приветствую ваши идеи в любое время.
Да, вы правы, это будет большой проект, и, надеюсь, не больше вашего, это много работы и стресс при этом. Однако я люблю программирование, и, если подумать, я вообще-то финансовый аналитик. Я начал программировать по необходимости, потому что мне нужно было автоматизировать некоторые из более сложных финансовых моделей. У меня просто странная способность придумывать безумные, причудливые идеи. Если бы я только умел кодить так же хорошо, как вы!
В данный момент я рассматриваю словари и Lists<T>. List<T>, в частности, как более простое средство для совместного использования списков объектов, а также для связывания. А Dictionary - для хранения и сериализации. Я экспериментирую с несколькими идеями, чтобы облегчить свою кодовую базу, но при этом иметь быструю, легкую в обслуживании и буквально свободную от рук систему, как только она будет установлена на Chart. Ваше замечание по поводу списков действительно ценно, так что эта идея может оказаться не такой уж идеальной.
Вы правы в отношении обработки шлака, если я не использую параллельное выполнение - и даже тогда это происходит медленно. Это одна из проблем, которую я обнаружил в своих тестах. Последние объекты в списке опаздывают, особенно если рынок действительно волатилен, OnTick может быть вызван несколько раз, прежде чем будут вызваны первые объекты в списке. Как вы и советовали, я посмотрел на OpenCL как на возможное решение. Мне придется инвестировать в систему, сделанную на заказ.
Действительно, виртуальная торговля создает отличные модели, которые могут полностью уничтожить ваш счет на шумных рынках. Однажды я в панике наблюдал, как мой советник с трудом размещает и тем более закрывает сделки во время новостей. Это холодная суровая реальность торговли, но мы должны пытаться.
Да, я согласен с вами, что подход со скоринговой моделью лучше. LMSR определенно лучше, особенно учитывая, что бычьи и медвежьи движения очень отличаются для каждого инструмента. Взвешенный по вероятности подход определенно повышает точность.
Что касается самообучения, то да, оно будет довольно медленным. Оно будет использоваться только в начале, чтобы настроить агентов ИИ, снабдить их соответствующими сигналами, а затем через определенные промежутки времени, скажем, в конце дня для агентов на 5 минут и в пятницу для агентов на 1 час. Действительно, это наводит на мысль о виртуальном обучении, которое приносит миллиарды, только чтобы потерять все свои деньги в реальной торговле. Поэтому для меня важно найти простые и быстрые сигналы, чтобы не терять скорость. Я хочу, чтобы система скальпировала, скажем, на несколько пунктов после спреда и комиссии. Это означает, что сделки должны быть действительно высоковероятными, например, молот, который находится на самом низком из последних 20 баров, или что-то в этом роде.
Поскольку я хочу сосредоточиться на скальпинге, мне, возможно, не придется так много следить за сделками. Агенты будут просто проверять сетап, затем выставлять ордер со стопом и тейкпрофитом, который будет остановлен или закрыт в прибыль. Опять же, я все еще экспериментирую с этим.
У меня еще много работы, я экспериментирую с идеями вокруг сигналов. Когда я найду что-то с действительно хорошими результатами, я поделюсь с вами.
Вы нарушили несколько правил, но разве не в этом прелесть программирования! Удивительно, как можно придерживаться правил и при этом полностью застрять и чувствовать, что хоть на стену лезь. А иногда нарушение правил - это то, что нужно для прогресса. Ваша работа великолепна, и за это я вас очень уважаю. Энрико, программирование - это тяжелая работа. Приятно, когда все идет гладко, и очень больно, когда все работает не по плану.
Большое спасибо за ваш вклад. Я очень благодарен и обязательно буду держать вас в курсе.
Еще раз спасибо,
Шеп
Здравствуйте, Энрико,
Не подскажете, как я могу добавить к ордеру/позиции определенный комментарий в зависимости от сигнала, на который сработала сделка? Скажем, сработал сигнал 1 - комментарий "Сигнал А" и так далее.
Спасибо.
Мне нелегко следовать им, потому что я только начинаю, однако я благодарю всех, кто позволяет мне прогрессировать благодаря своим знаниям.
Опубликована статья Кроссплатформенный торговый советник: Классы CExpertAdvisor и CExpertAdvisors:
Автор: Enrico Lambino
Проделана большая работа.
Спасибо большое!
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Кроссплатформенный торговый советник: Классы CExpertAdvisor и CExpertAdvisors:
В заключительной статье серии о кроссплатформенном торговом советнике речь пойдет о классах CExpertAdvisor и CExpertAdvisors, которые служат контейнерами для всех ранее описанных компонентов эксперта. Также рассмотрена реализация отслеживания новых баров и сохранения данных.
Метод OnTick класса CExpertAdvisor чаще всего используется в этом классе. Именно он выполняет большую часть действий. Главная операция этого метода показана на диаграмме:
Автор: Enrico Lambino