Самообучение языку MQL5 с полного нуля - страница 28

 
Vasiliy Sokolov:

Верно! Все пытаются обучатся программированию, используя неверные представления о программе, основанные на жизненном опыте. Например, что программа это вроде текста в книге, где есть оглавление, вступление, содержание и заключение. Т.е. что программа это некая последовательная схема от начала к концу. На первых этапах это представление работает, потом, с усложнением программы, начинаются трудности, и не удается сколько-нибудь нормально написать надежную рабочую программу. Наступает быстрое разочарование, и откладывание изучения программирования в долгий ящик.  И Ковалев в этом плане знатный делец по оказанию медвежьих услуг: он пытается объяснить читателю, используя его доступный понятийном аппарат, что программа это таже книга с такой-то и такой схемой. Но схем-то ни каких нет! Скрипт имеет принципиально другую "схему" чем эксперт, а эксперт иную схему чем индикатор.

Так как по твоему человек должен обучатся? Сразу с ООП философии? Невозможно.
 

Vasiliy Sokolov:

... 4) Самый странный блок, это блок "обработки ошибок". В него можно попасть, но выйти из него нельзя. Т.е. программа поймала ошибку и сидит в этом блоке (зависает наверное до полной перезагрузки, еще лучше сделать так что бы терминал намертво зависал, что бы точно больше ошибок не понаделать - вот эта мысль!) ...

Здравствуйте, Василий! Спасибо за подробное и высококвалифицированное разъяснение! Единственное с чем не могу согласиться, так это с пунктом 4. Дело в том, что стрелки идут, как к "Блоку обработки ошибок", так и от него. Линия соединяющая этот блок с другим, имет на своих концах стрелки, а из институтской программы обучения информатике ещё помню, что это означает двухсторонний процесс, т.е. туда и обратно. Поэтому в данной ситуации у меня не возникло сомнений. А в остальном из Вашего сообщения мне всё понятно .

С уважением, Владимир.

 
MrBrooklin:

Здравствуйте, Василий! Спасибо за подробное и высококвалифицированное разъяснение! Единственное с чем не могу согласиться, так это  с пунктом 4. Дело в том, что стрелки идут, как к "Блоку обработки ошибок", так и от него. Линия соединяющая этот блок с другим, имет на своих концах стрелки, а из институтской программы обучения информатике ещё помню, что это означает двухсторонний процесс, т.е. туда и обратно. Поэтому в данной ситуации у меня не возникло сомнений. А в остальном из Вашего сообщения мне всё понятно .

С уважением, Владимир.

вот прямо первый попался на удачу :-)

Используйте его экспа   в качестве шаблона в своих изысканиях - грамотный код!

тут и


"
  • советник можно оптимизировать по рабочему таймфрейму ('Working timeframe')
  • На баре может быть только одна сделка 'вход в рынок' (это внутренний параметр, он не вынесен во входные параметры и это не имеет отношения к параметру 'Only one positions')
  • При работе в режиме 'внутри бара' ('Search signals, in seconds' больше или равно '10') текущий бар - бар #0, при работе в режиме 'только в момент рождения нового бара' ('Search signals, in seconds' меньше, чем '10') текущий бар - бар #1
  • Параметр 'Trade mode: ' - ограничение в какую сторону торговать. Может принимать значения 'Allowed only BUY positions', 'Allowed only SELL positions' и 'Allowed BUY and SELL positions'
  • Параметр 'Use time control' - временной интервал поиска торговых сигналов от 'Start Hour'::'Start Minute' до 'End Hour'::'End Minute'. Временной диапазон можно задавать как внутри дня, так и с переходом через сутки
  • Параметр 'Pips Or Points: ' задаёт стандарт расчёта Стоп лосс, Тейк профит и Трейлинга

  • и 

    реверс и прочие фишки и подключение стандартных библиотек в коде в начале для упрощенного написания ф-ии открытия позиций - ИЗУЧАЙТЕ И НЕ ПАРЬТЕСЬ, кроме этого привыкайте сразу к стандартному написанию кода - там отступы и все остальное

    Флаг 'Positions: Only one' выставленный в 'true' разрешает советнику иметь в рынке не более одной позиции. За переворот сигналов отвечает флаг 'Positions: Reverse'. Интересный флаг 'Positions: Close opposite' - при выставлении его в 'true' перед открытием позиции гарантированно удаляет противоположные позиции. 'Print log' выводит расширенное логирование всех операций. Параметр 'Freeze and StopsLevels Coefficient' задаёт коэффициент для уровней стопов и заморозки для случаев, когда эти уровни для символа равны нулю. Рекомендуется применять значение '3'.

    iFractals iAMA
    iFractals iAMA
    • www.mql5.com
    Получать сигнала на откате (по iFractals (Fractals) ), а тренд определять по iAMA (Adaptive Moving Average, AMA). По индикатору iAMA (Adaptive Moving Average, AMA) определяется тренд. Условия тренда: на текущем баре и на двух предшествующих индикатор равномерно растёт (тренд вверх) или равномерно падает (тренд вниз). При этом цена (High или...
     

    Я напишу принципы, которые я крайне рекомендую автору для осознания того, что такое программа. В отличии от листовок Ковалева, где часть материала верна, часть содержит грубые ошибки, часть является общим домыслом с читателем, эти принципы верные ВСЕГДА и на 100%, что бы Вы не писали на MQL: эксперты, скрипты или советники:

    Первый принцип. Любая программа на MQL обрабатывает события. Событие это некое уведомление, которое содержит информацию о чем-то, как правило о том, что что-то поменялось. Например поступил новый тик, или исполнился наш отложенный ордер. Есть события которые никакой информации не содержат, а просто происходят. Например, событие "таймер", может вызвать пользовательскую функцию с заданной периодичностью. Оно не уведомляет пользователя о том, что что-то изменилось. Оно просто вызывает пользовательский код, поэтому ему не требуется какая-то дополнительная информация. Из определения события, следует несколько нетривиальных методов:

    • Первое следствие: как только мы получили событие, мы должны его как можно скорее обработать. Событий может быть много, события могут накапливаться в очереди. Обрабатывает события MeteTrader (не наша программа). Для этого он использует специальный ресурс, называемый потоком. Ресурс этот очень ценен и ограничен. Поток, принадлежащий МетаТрейдер, великодушно исполняет наш грубый, неоптимальный и медленный код, написанный в скрипте на центральном процессоре нашего ПК. Если обработка события затормозит поток в нашем коде, то в некоторых случаях другие программы запущенные в метатрейдере не смогут исполнятся нормально. Они будут ждать пока мы освободим поток, от наших бесполезных вычислений, у уже на этом же освободившемся потоке исполнят свой код.
    • Событий много. Мы можем обрабатывать многие из доступных событий, а можем только одно. Когда мы делаем скрипт, он обрабатывает только одно событие, OnStart, которое происходит один раз. Когда мы пишем эксперт он может обрабатывать сразу несколько событий. Это значит, что бесполезно, запихивать свою программу в парадигму "программа эта книга". Вместо этого, надо просто понять, что программа, это обработчик тех или иных событий. Они могут вызываться в произвольном порядке, могут не вызываться вовсе. События не зависимы друг от друга. Значит и части программы которые обрабатывают эти события друг от друга не зависят. Они нелинейны и не последовательны

    (пока на этом все, будет желание - продолжу).
    Документация по MQL5: Основы языка / Функции / Функции обработки событий
    Документация по MQL5: Основы языка / Функции / Функции обработки событий
    • www.mql5.com
    В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
     
    Roman Shiredchenko:

    вот прямо первый попался на удачу :-)

    Используйте его экспа   в качестве шаблона в своих изысканиях - грамотный код!

    тут и


    "
  • советник можно оптимизировать по рабочему таймфрейму ('Working timeframe')
  • На баре может быть только одна сделка 'вход в рынок' (это внутренний параметр, он не вынесен во входные параметры и это не имеет отношения к параметру 'Only one positions')
  • При работе в режиме 'внутри бара' ('Search signals, in seconds' больше или равно '10') текущий бар - бар #0, при работе в режиме 'только в момент рождения нового бара' ('Search signals, in seconds' меньше, чем '10') текущий бар - бар #1
  • Параметр 'Trade mode: ' - ограничение в какую сторону торговать. Может принимать значения 'Allowed only BUY positions', 'Allowed only SELL positions' и 'Allowed BUY and SELL positions'
  • Параметр 'Use time control' - временной интервал поиска торговых сигналов от 'Start Hour'::'Start Minute' до 'End Hour'::'End Minute'. Временной диапазон можно задавать как внутри дня, так и с переходом через сутки
  • Параметр 'Pips Or Points: ' задаёт стандарт расчёта Стоп лосс, Тейк профит и Трейлинга

  • и 

    реверс и прочие фишки и подключение стандартных библиотек в коде в начале для упрощенного написания ф-ии открытия позиций - ИЗУЧАЙТЕ И НЕ ПАРЬТЕСЬ, кроме этого привыкайте сразу к стандартному написанию кода - там отступы и все остальное

    Флаг 'Positions: Only one' выставленный в 'true' разрешает советнику иметь в рынке не более одной позиции. За переворот сигналов отвечает флаг 'Positions: Reverse'. Интересный флаг 'Positions: Close opposite' - при выставлении его в 'true' перед открытием позиции гарантированно удаляет противоположные позиции. 'Print log' выводит расширенное логирование всех операций. Параметр 'Freeze and StopsLevels Coefficient' задаёт коэффициент для уровней стопов и заморозки для случаев, когда эти уровни для символа равны нулю. Рекомендуется применять значение '3'.

    Здравствуйте, Роман! Спасибо за пример. Много раз пытался разобраться в кодах, которые пишет Владимир Карпутов, но пока, для меня это ещё не досягаемый уровень. Чуть по-позже, когда в голове уже будет больше информации, вполне вероятно, что вернусь к его кодам. Но за совет отдельное спасибо!

    С уважением, Владимир.

     
    Vasiliy Sokolov:

    Я напишу принципы, которые я крайне рекомендую автору для осознания того, что такое программа. В отличии от листовок Ковалева, где часть материала верна, часть содержит грубые ошибки, часть является общим домыслом с читателем, эти принципы верные ВСЕГДА и на 100%, что бы Вы не писали на MQL: эксперты, скрипты или советники:

    Первый принцип. Любая программа на MQL обрабатывает события. Событие это некое уведомление, которое содержит информацию о чем-то, как правило о том, что что-то поменялось. Например поступил новый тик, или исполнился наш отложенный ордер. Есть события которые никакой информации, а просто происходят. Например, событие "таймер", может вызвать пользовательскую функцию с заданной периодичностью. Оно не уведомляет пользователя о том, что что-то изменилось. Оно просто вызывает пользовательский код, поэтому ему не требется какая-то дополнительная информация. Из определения события, следует несколько нетривиальных методов:

    • Первое следствие: как только мы получили событие, мы должны его как можно скорее обработать. Событий может быть много, события могут накапливаться в очереди. Обрабатывает события MeteTrader (не наша программа). Для этого он использует специальный ресурс, называемый потоком. Ресурс этот очень ценен и ограничен. Поток, принадлежащий МетаТрейдер, великодушно исполняет наш грубый, неоптимальный и медленный код, написанный в скрипте на центральном процессоре нашего ПК. Если обработка события затормозит поток в нашем коде, то в некоторых случаях другие программы запущенные в метатрейдере не смогут исполнятся нормально. Они будут ждать пока мы освободим поток, от наших бесполезных вычислений, у уже на этом же освободившемся потоке исполнят свой код.
    • Событий много. Мы можем обрабатывать многие из доступных событий, а можем только одно. Когда мы делаем скрипт, он обрабатывает только одно событие, OnStart, которое происходит один раз. Когда мы пишем эксперт он может обрабатывать сразу несколько событий. Это значит, что бесполезно, запихивать свою программу в парадигму "программа эта книга". Вместо этого, надо просто понять, что программа, это обработчик тех или иных событий. Они могут вызываться в произвольном порядке, могут не вызываться вовсе. События не зависимы друг от друга. Значит и части программы которые обрабатывают эти события друг от друга не зависят. Они нелинейны и не последовательны

    (пока на этом все, будет желание - продолжу).

    Отлично Василий, жду продолжения, если Вам не трудно будет его написать! Всё, что Вы сообщили - лаконично и доходчиво для меня!

    С уважением, Владимир.

     
    MrBrooklin:

    Отлично Василий, жду продолжения, если Вам не трудно будет его написать! Всё, что Вы сообщили - лаконично и доходчиво для меня!

    С уважением, Владимир.

    Да, интересные суждения. 

    1. Любая программа, структурно представляет из себя иерархию функциональных блоков и является системой связанных и зависимых друг от друга параметров. 

    2. Событие - результат взаимодействия программы с внешней программной средой, либо внутренних изменений. Среда "сообщает" о событии, вызывая программу (OnTick, OnChartEvent...). 

    4. Среда (терминал) нейтрален к программе, но может на нее влиять.

    5. Программа получает информацию о своем окружении в терминале и на рынке с помощью спец.функций и может использовать в своей логике.

    6. Программа может  получать информацию о себе или своих обьектах с помощью спец.запросов и может использовать ее в своей логике.

    7. События описываются в операторах if().

    8. На событиях вызываются обработчики осуществляющие реакцию на произошедшие изменения.

    9. Реакцией могут быть изменения состояний обьекта(ов)- (массовая смена значений их параметров), либо какая то вычислительная работа.

    10. Обработчики событий группируются в иерархические структуры (событийные модели).

    11. Программные обьекты могут "подписываться" на различные события и быть в списке адресатов-получателей. 

    ... и много чего еще... :)

    П.С. Василий опишет лучше и яснее.
     

    Продолжаем:

    • Раз событий много, то много и обработчиков событий. Раз события вызываются непоследовательно, то и их обработчики вызываются непоследовательно. Раз существует непоследовательность вызова, обработчики событий не могут зависть друг от друга, и от данных друг друга они тоже зависеть не могут. Единственной конструкцией, которая удовлетворяет этим жестким требованиям является функция.
    • Функции не зависят друг от друга. Если одна функция возвращает сумму a+b, а вторая возвращает произведение a*b, то результат у этих двух функций не будет зависеть от последовательности из вызова. Мы можем вызвать первую функцию с аргументами 3 и 5 и получить 8. Затем вторую функцию с этими же аргументами и получить 24. Затем поменять местами их вызов. Результаты будут теме жи. Функция сложения всегда будет возвращать 8 при ее аргументах 3 и 5. Функция умножения всегда будет возвращать 24 при этих же аргументах. 
    • Именно из сказанного выше, становится понятно, что обработчиком событий может быть только функция. Если произошло событие новый тик - то его обрабатывает специальная для этого функция OnTick. Если произошло событие Start (единоразовый запуск скрипта) - то его обрабатывает специальная для этого функция OnStart.
    • Функция универсальна. Она может обрабатывать не только события. Функция может возвращать что-то полезное, например текущее время. Функция может делать сложные вычисления с переданными ею аргументами и возвращать конечный результат этих вычислений в виде одного единственного значения. Наконец функция может быть провайдером данных: Вы вызываете функцию и получаете из нее нужные Вам данные, например котировки. 
    • MetaTrader изнутри состоит из тысяч разных функций, примерно 1500 тысячи из которых любезно предоставлены пользователям. Это очень полезные функции. Они позволяют узнать системное время, через них можно получить данные по нужному инструменту. Через функции происходит отправка торговых приказов. Вы можете открыть справочник МКЛ и убедится что он весь состоит из функций и аргументов к ним. Т.е. MetaTrader с точки зрения пользовательских программ - это один большой набор функций.
    • Универсальных функций не хватает. Сколько бы новых функций не появлялось в системе, всегда будет их дефицит. Происходит это, по той причине, что потребности у всех разные. Нет универсальной функции на все случае жизни. Самые общие и универсальные функции уже включены в МетаТрейдер и любезно предоставлены нам. Однако пользовательские потребности бесконечны. MetaQuotes не может удовлетворить индивидуальные потребности 100 000 пользователей их терминала. Вместо этого они поступили более гибко: дали возможность пользователям создавать нужные им функции самим. Пользователи от этого только в выигрыше. Вместо того что бы использовать не совсем подходящую им системную функцию, они могут написать свою собственную функцию, идеально решающую именно их задачу. Ни одна системная функция не идеальна в силу ее универсальности. 
    • То на сколько хорошо умеет пользователь писать свои функции и понимает суть их работы и говорит о том, на сколько программист квалифицированный. Если он понимает, что программа - это разрозненный набор обработчиков (в виде функций) которые не последовательно обрабатывают поступающие события - это хорошо. Если он умеет писать свои функции - еще один плюсик. Если он может объединять работу нескольких функций (как своих так и системных) в общий алгоритм - это еще один плюс ему. 
    • Если понять что В МетаТрейдер (и четвертом и пятом) все так или иначе связано на функциях, основано на функция, работает на функциях - то вдруг все становится ясно. Справка представляется уже не как толстый талмуд с набором разрозненных отрывков кодов, а как справочник по доступным функциями и тому что они делают. Все остальное вроде типов данных, массивов, структур, классов - не важно. Все это для поддержки функций, что бы они могли что-то возвращать и что-то принимать.

    (пока все)
     
    Закидали новичка бесполезной для него информацией.)) 
     
    Реter Konow:
    Закидали новичка бесполезной для него информацией.)) 

    Это говорит о том, что не надо так афишировать свои желания. С таким-же успехом Владимир мог задавать вопросы конкретно о той или иной функции и получать полезные советы, а не бред «специалистов» типа учи С++ или учи ассемблер. Можно начать с изучения перфокарт.

    Причина обращения: