Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Да, поддерживаю, ассоциативно понятнее.
Ну насчёт применения, выше уже более менее расписали.
Лучше всего объяснить на каком нибудь примере.
Возьмём для примера ордера. Например нам надо в конце тестирования советника распечатать какие то статистические данные по всем ордерам.
И мы по какой то причине не хотим обращаться к базовым функциям, не важно по каким причинам.
Мы можем создать свой массив структур и записывать туда всю инфу по ордерам, в конце тестирования просто отправить этот массив структур на печать.
У ордеров есть куча разных свойств, время открытия, направление, тип(отложенный стоп, лимит, по рынку), открытый, закрытый, удалённый(не сработавший) и т.д
Допустим нас интересует время выставления ордера, цена по которой выставлялся ордер и направление. Структура будет выглядеть примерно так.
По мере появления ордеров, советник увеличивает размер массива и записывает в него нужные данные.
В конце тестирования вызываем
ArrayPrint(m_Ord);
И всё у нас красиво распечатается в лог)
Любой пример с пользовательской структурой вызывает вопрос: А зачем это всё заполнять, если и так всё можно получить и использовать. Но вот пример на функции которая заполняет структуру или даже массив структур более нагляден.
Например структура тиков
Альтернативный вариант
Это хорошо, если нужна только одна цена, или Bid или Ask, но если нужны обе цены, то во втором случае надо вызывать две функции.
И таких примеров масса. Вот к примеру ещё структура
За один вызов одной функции можно получить огромный массив содержащий OHLC баров в истории.
Раз я уже упоминал кусок этого шедевра здесь, позвольте мне поделиться источником болевых ощущений в заднем проходе.
Все пишут примеры использования структур. Вот пример их НЕ использования:
Обратите внимание на тело TOOCOnComment() и на то, как, где и сколько раз она вызывается. Это просто треш. За 7 лет я ничего ужаснее не видел.
Интересно было бы посчитать количество вызовов OrderSelect() за 1 тик, когда в рынке 5 ордеров.
Советник написан в октябре 2019 года...
Я больше не хочу модифицировать чужие разработки...
Раз я уже упоминал кусок этого шедевра здесь, позвольте мне поделиться источником болевых ощущений в заднем проходе.
Все пишут примеры использования структур. Вот пример их НЕ использования:
Обратите внимание на тело TOOCOnComment() и на то, как, где и сколько раз она вызывается. Это просто треш. За 7 лет я ничего ужаснее не видел.
Интересно было бы посчитать количество вызовов OrderSelect() за 1 тик, когда в рынке 5 ордеров.
Советник написан в октябре 2019 года...
Я больше не хочу модифицировать чужие разработки...
там же для разных условий
другой через switch бы оформил.
Раз я уже упоминал кусок этого шедевра здесь, позвольте мне поделиться источником болевых ощущений в заднем проходе.
Все пишут примеры использования структур. Вот пример их НЕ использования:
Обратите внимание на тело TOOCOnComment() и на то, как, где и сколько раз она вызывается. Это просто треш. За 7 лет я ничего ужаснее не видел.
Интересно было бы посчитать количество вызовов OrderSelect() за 1 тик, когда в рынке 5 ордеров.
Советник написан в октябре 2019 года...
Я больше не хочу модифицировать чужие разработки...
обработка идет где? в списке терминала или сервера?
идите назад в школу, сэр.
там же для разных условий
другой через switch бы оформил.
обработка идет где? в списке терминала или сервера?
идите назад в школу, сэр.
В рынке сетка из 5ти ордеров. В таком случае эта гениальная функция (выделил красным) вызывается 9 раз только за одну итерацию цикла. Внутри каждого вызова, как минимум 5 OrderSelect(). 45 вызовов OrderSelect() за одну итерацию цикла, когда 5 ордеров в рынке. Цикла, который перед каждой итерацией делает что?.. Делает OrderSelect()
По вашему здесь все нормально? Даже не говоря о рациональности и производительности, код масштабируемый и его можно дополнять новыми возможностями? Я вас правильно понимаю?
В какой школе отучат думать, что это одноразовая неподдерживаемая портянка, которая непригодна к модификации?
P.S. Это кусок, который добавляет ордера сетки. Есть еще ему подобные, которые модифицируют и закрывают ордера. И все они расположены внутри отдельного цикла по ордерам:
Суть в том, что в цикле перебора ордеров 15 раз вызывается функция, которая опять же перебирает ордера в цикле!
кто-то в цикле обрабатывает на каждом тике(очевидно новичок), у меня через индикатор шпион.
бывало и такое, что в индикатор шпионе проходил цикл по всем символам), статься №648 известный автор, это было уже давно.
--
add
работа mql сильно подросла, можно и в цикле на каждом тике обрабатывать схемы, главное что-бы работала.
В рынке сетка из 5ти ордеров. В таком случае эта гениальная функция (выделил красным) вызывается 9 раз только за одну итерацию цикла. Внутри каждого вызова, как минимум 5 OrderSelect(). 45 вызовов OrderSelect() за одну итерацию цикла, когда 5 ордеров в рынке. Цикла, который перед каждой итерацией делает что?.. Делает OrderSelect()
По вашему здесь все нормально? Даже не говоря о рациональности и производительности, код масштабируемый и его можно дополнять новыми возможностями? Я вас правильно понимаю?
В какой школе отучат думать, что это одноразовая неподдерживаемая портянка, которая непригодна к модификации?
P.S. Это кусок, который добавляет ордера сетки. Есть еще ему подобные, которые модифицируют и закрывают ордера. И все они расположены внутри отдельного цикла по ордерам:
При каждом выполнении OnTick() нужна информация об открытых в данный момент ордерах. Так помести ее в структуру.
Какой-нибудь такой шаблон для начала:
Дальше думаешь, какая именно нужна будет информация об открытых сейчас ордерах. Например, для открытия новых ордеров сетки нужна верхняя и нижняя цены открытия ордеров, номер последнего шага и (как в том примере) признак наличия существования сигнального ордера. Добавляешь нужные переменные в структуру:
Один раз проходишь в цикле по всем ордерам и заполняешь эту структуру. Это ведь реализуемо, правда? Все. Дальше просто пихаешь уже подготовленные данные в условия для открытия новых ордеров сетки.
Для любых блоков программы информация по рыночным ордерам подготовлена и аккуратно упакована в удобном, читаемом виде. Не нужно делать миллион циклов и огромную вложенность.
Открываем первый ордер по сигналу индикатора? Пожалуйста:
Можно даже сделать еще более явно:
Добавляем закрытие и модификацию (тут я уже вставил немного упрощенный пример из реального кода):
Что касается history и exitSignal - это тоже заранее подготовленные, аккуратно упакованные в структуры данные.
Я все это пишу к тому, что использование новичками структур приучает их наперед разрабатывать архитектуру программы, разделять программу на логически обособленные блоки кода и продумывать взаимодействие между этими блоками. До того, как человек напишет свое первое
превратив код в одноразовую портянку.
А пример кода, который подорвал мне сраку, я привел для демонстрации того, к чему приводит подход "начни писать, дальше разберешься"/"аппетит приходит во время еды"