smart-lab.ru | Софт / Программирование

ABC Easy/power language

14 ноября 2016  Источник / http://smart-lab.ru/profile/Hummel/

Пару лет назад, на одном иностранном сайте (ABC какойт-то там), я наткнулся на подборку неплохих уроков по easy/power language. После перевода с помощью гугл транслейт, они очень помогли мне освоить этот язык. Пожалуй выложу их здесь. Думаю кому нибудь пригодится
Урок 1. Первые шаги к пониманию языка EasyLanguge/PowerLanguage

Отлично, вот вы приступили к первому шагу на пути освоения программы Multicharts и Tradestation. Я очень рад отправиться вместе с вами в это увлекательное приключение.

В этом уроке я покажу вам основы работы с PowerLanguage и PowerLanguage Editor. Я много думал над тем как лучше сделать эти занятия. С одной стороны, мы бы могли сразу погрузиться в программирование, а теорию я бы объяснял попутно. С другой стороны, мне кажется что лучше, сначала рассказать об основах, и затем строить практику на этом фундаменте. И когда мы будем делать что-то на следующих уроках, у вас уже будет представление о том, что мы будем делать. И эта информация поможет вам в изучении.

Последний подход, по моему мнению, подойдет лучше для нашей учебы.


В этом уроке мы начнем знакомиться с PowerLanguage Editor. Вы увидите, какая разница между inputs (вводными) и variables (переменными). Как объявлять и включать их (и конечно, вы узнаете, что означают эти два слова). В конце этого урока вы узнаете о правилах хорошего кода, которые существенно облегчат вашу жизнь, в качестве программиста.

Имейте в виду, что я так же учусь преподавать, вместе с вами. Я постараюсь не загружать уроки техническими подробностями, но тем не менее кое что там будет. Если у вас есть идеи, как улучшить обучение и любые другие предложения, я буду очень рад.

Итак, достаточно разговоров, давайте начнем путешествие. Начнем с того, что компьютер не разговаривает на нашем языке. Он получает инструкции от машинного кода или промежуточного языка. Хотя мы можем программировать в этих языках, гораздо удобнее использовать специальный язык программирования. Например, PowerLanguage, который ближе к человеческому языку. Так же вам нужна программа, которая скомпилирует ваш код в то, что компьютер способен понять.

Давайте посмотрим на редактор Power Language, где и осуществляется кодирование и компиляция. Если редактор Power Language еще не запущен, то запустите его. Скорее всего, вы увидите подобную картину:

ABC Easy/power language


Главное окно пусто. Если у вас открыто studies, то оно должно отобразиться в этом окне. Окно navigator справа, позволяет вам быстро получить доступ к вашим studies, и словарю.

Словарь содержит все ключевые слова языка программирования. В сочетании с вводными и переменными, мы будем использовать эти ключевые слова, в нашем коде.

Нижнее окно отображает три различные вкладки:
Build передает сообщения от компилятора. Например, если есть проблема с кодом, то эта информация поможет вам найти ошибку.
Output показывает информацию, поступающую из ваших studies. Вы можете добавить код в ваши studies, который будет показывать значение переменных в окне output. Это так же будет полезно для проверки корректности работы вашего study.
Окно Help отображает информацию из файла справки. Вы можете выделить ключевое слово, и нажать на клавишу F1 и редактор Power Language покажет вам справочную информацию для этого ключевого слова. Это может пригодиться, когда вам нужно подробнее узнать о том, как работает, то или иное ключевое слово.

Давайте создадим новый индикатор, нажав File > New в редакторе PowerLanguage. Это откроет диалоговое окно. Поставьте переключатель в значение Indicator, и нажмите “OK”.

ABC Easy/power language


ABC Easy/power language


Придумайте название для нашего индикатора. Единственное ограничение заключается в том, что это имя не должно использоваться в другом studies.

Например, вы можете назвать индикатор “ABC_PowerLanguage Lesson 01”. Это имя будет отображаться на графике, и поможет вам быстро сориентироваться, так как оно отображает цель исследования. Мне нравится использовать префикс ABC_ для обозначения study, которые я разработал для себя или для этого сайта. Для других работ я буду использовать другие названия, чтобы было легче найти то, что мне нужно.

Каждое study может иметь inputs (вводную), которым можно назначить значение по умолчанию. Например, вы можете использовать вводную для того чтобы задать значение длины скользящего среднего. Значения вводных для индикаторов и систем могут меняться после того как вы наложили их на график. Так что имеет смысл сделать несколько вводных, чтобы study сделать более удобными.

Когда вы объявляете вводную, дав ей имя и присвоив значение по умолчанию, вам необходимо определить тип вводной. Всего может быть три различных типа:

Числовой
Текстовый
Логический (true/false)

Чтобы объявить вводные, нужно использовать ключевое слово “Inputs” (или “Input”), затем “:”, а потом имя и значение по умолчанию в скобках. Вы можете объявить несколько вводных и отделять их запятыми.

Вот как должны выглядеть три различных вводных:

ABC Easy/power language


Попробуйте сделать это сами. Введите три Input, и когда закончите, нажмите Compile (или F3).

ABC Easy/power language


Вкладка Build в нижнем окне должна отображать что-то вроде этого:

ABC Easy/power language


Это окно показывает имя study, время начала и время окончания процесса компиляции. Сообщение указывает на то, что вы только что успешно создали свой первый индикатор в Power Language для Multicharts. Поздравляю!

Если вы получили сообщение об ошибке, значит что-то не так с вашим кодом. Сравните ваш код с кодом на скриншоте, и проверьте, есть ли какие-нибудь различия. Причина может оказаться в простой ошибке, например в пропущенной запятой или в незакрытой скобке.

Вы можете изменить значение вводной в ручную, но его нельзя поменять при помощи кода, и тогда в игру вступают variables (переменные).

Variables(Переменные) используются для хранения числовых, текстовых и логических (истина/ложь) значений. Значение, сохраненное в переменной можно найти в любом месте скрипта по имени переменной и изменить при помощи кода в любое время. Переменные должны быть объявлены перед использованием.

Ваш код может использовать переменные, для работы с данными. Они используются для хранения значений, и как следует из названия, эти значения могут меняться. Значения переменных могут меняться, когда ваше study запущенно. Так же значение переменных может быть цифровым, текстовым или логическим.

Так же как и вводные, переменные в Power Language могут быть трех типов:
Числовые переменные,
Текстовые переменные,
Логические переменные (Истина-ложь).

Вы так же задаете тип переменной, и задаете значение по умолчанию. Так же вы можете указать, когда следует ей следует обновляться (во время бара или в конце бара) и номер передачи данных. Про это я расскажу подробно в следующем уроке.

Давайте добавим переменные в код. На скриншоте вы видите три разных вида переменных. После того как вы их объявили нажмите Compile (или F3).

ABC Easy/power language


Но, это не работает, как ожидалось. Что не так с этим кодом? Посмотрите на окно отладки. Оно даст вам ответ.

ABC Easy/power language


«Это слово уже определенно». Это относится ко второму названию переменной “A_Boolean_input”. Вы можете использовать только одно такое же имя внутри одного study. В Power Language нет зависимости от регистра.

Таким образом, для него нет разницы между “VariableName” и “VARIABLENAME”.

Измените имя переменной как на скриншоте ниже. Компиляция должна пройти без проблем.

ABC Easy/power language


Пока мы изучаем переменные и вводные, давайте рассмотрим некоторые тонкости в их наименовании.

Кроме зарезервированных ключевых слов, вы абсолютно свободны в выборе названия для переменных и вводных (за исключением специальных знаков, таких как %, & или $). Это означает, что вы можете назвать переменную var1 или WeightedAverage. Обе они могут хранить ту же самую величину. Тем не менее, последнее название дает представление о назначении переменной. Вы можете значительно облегчить вашу жизнь, когда вы будете использовать понятные имена для переменных и вводных.

Это пригодиться, когда вы бы будете просматривать свой код в поисках ошибки.

Var1 = Var2 + Var3 * (Var4 – Var2);

ExponentialAverage = Average1BarAgo + WeightingFactor * (PriceValue — Average1BarAgo);

Улучшите читаемость вашего кода.

Я считаю, что крайне полезно иметь определенную структуру кода. Это можно сделать при помощи пробелов. Отступы и пустые строки после блоков кода, облегчат вам жизнь, когда вы будете работать с кодом. Никто не запрещает вам написать весь код в одну строку. Однако, в таком коде гораздо труднее разобраться. Пробелы никак не скажутся на производительности вашего кода в Power Language редакторе, так как компилятор уберет их при компиляции кода, с которым будет работать MultiCharts.

Объявление наших переменных и вводных может выглядеть по-другому, но это не повлияет на результат. Но это будет гораздо труднее читать.

ABC Easy/power language


Мало того, что переменные и вводные имеют непонятные имена, но я так же поставил слишком большой пробел между строками, а там где он был действительно нужен, не поставил вовсе.

Я хочу завершить мой первый урок на комментариях и выскажу свое мнение о комментариях в коде. Вы можете добавить в код строки, которые будут игнорироваться компилятором. Это может оказать существенную помощь для программиста, для облегчения понимания кода. Комментарии никак не связанны с кодом, они предназначены только для вас и других программистов.

Существуют два типа комментариев:
Комментарии, от начала и до конца строки.
Комментарии, без ограничений по размеру.

Первый тип комментария начинается с «//», это означает, что вся строка будет отведена под комментарий.

Второй тип комментария будет начинаться с открывающей фигурной скобки «{» и заканчиваться закрывающей фигурной скобкой « }».

ABC Easy/power language


Эти комментарии нужны для того чтобы давать пояснения к вашему коду. Конечно, не нужно добавлять комментарии к каждой строке. Добавлять комментарии нужно в ключевых местах. В добавлении комментариев нет никаких четких правил. На мой взгляд, все, что помогает сделать код легче, для чтения и понимания полезно применять. Но оставьте писать романы для писателей, и не позволяйте комментариям чрезмерно разрастаться.

Иногда кусок кода понятен без дополнительных комментариев. В других случаях вам потребуется несколько строк, чтобы объяснить что-то. Не бойтесь писать слишком много комментариев, ведь хуже не использовать комментарии вовсе.

Понимание кода, без комментариев, без понятных имен переменных может занять очень много времени. Вместо этого я бы предпочел читать код, в котором слишком много комментариев.

Почему я должен использовать комментарии, значимые имена и пробелы, если я единственный, кто работает с кодом?


Даже если вы пишете код только себе, имеет смысл использовать методы приведенные выше. В то время как вы пишете код, как правило, все совершенно ясно. У вас есть хорошее представление о том, почему вы делаете то, что вы делаете. Когда же вы возвращаетесь к этому коду через несколько недель или месяцев, то порой от этой ясности не остается и следа. Вы сэкономите много времени, если вы сразу воспитаете хорошие привычки в программировании. Это поможет вам в поисках ошибок. Поиск проблем составляет огромную часть в программировании, и все что сокращает время поиска проблем, полезно.

Вот и все для этого урока. Я надеюсь, что урок получился не слишком сухим, и я надеюсь, что он послужил хорошей отправной точкой. В следующем уроке будет больше практики.

В этом уроке вы познакомились с редактором PowerLanguage, и узнали, как подготовить study. Так же вы узнали, как объявить и инициализировать вводные и переменные трех типов. Затем во второй части вы узнали, как хорошие привычки кодирования улучшают читаемость кода. Использование пробелов, осмысленных имен и комментариев сделает вашу жизнь проще, так как это помогает сэкономить много времени в долгосрочной перспективе

Урок 2. Скользящее среднее.Создаем первый индикатор

После того как вы познакомились с редактором Power Language, на предыдущем уроке, мы продолжим углублять наши знания. Если вы не читали предыдущий урок, то я бы предложил вам сделать это, это поможет вам в понимании того о чем будет говориться на этом уроке. Что ж, давайте начнем новый урок.

Откройте редактор Power Language, и создайте новый индикатор. Я назову его ABC_PowerLanguage Lesson 02 – Moving Average, чтобы затем я бы мог легко найти его в редакторе. Вы можете выбрать название по своему вкусу, и изменить его позже. Последняя часть названия индикатора говорит о том, что сегодня мы будем делать скользящую среднюю. Возможно, вы видели скользящие средние на графиках или помните этот термин из математики. Скользящие средние используются как фильтр для сглаживания данных.

ABC Easy/power language


На скриншоте вы видите скользящую среднюю с 200 периодом, которая дает гладкую линию. Недостатком этого индикатора является достаточно большое отставание. Это означает, что средняя становится мало чувствительна к изменениям цены. Если вы посмотрите на следующий скриншот, то увидите, насколько иное поведение скользящей средней с 200 периодом по сравнению со средней скользящей равной 10 периоду (Зеленого цвета). Последняя средняя гораздо быстрее реагирует на изменение цены, но дает гораздо больше шума.

ABC Easy/power language


Существует множество различных типов средних, различия которых заключается в способе вычисления данных. Простая скользящая средняя с 200 периодом вычисляется путем суммирования последних 200 точек и делением полученного результата на 200. Значение точек оказывают одинаковое влияние на результат. Первый бар и последний бар имеют одинаковый вес в формировании результата.

Два типа других, часто используемых средних это Экспоненциальная скользящая средняя и Взвешенная скользящая средняя. Отличие от простого скользящего среднего заключается в том, что они имеют более высокие весовые коэффициенты для более поздних точек данных. У взвешенного скользящего среднего вес будет уменьшаться в арифметической прогрессии. Для экспоненциальной средней он будет уменьшаться в геометрической прогрессии. Если вы хотите узнать подробнее о средних вы можете начать со статьи в Википедии. Для дальнейшего понимания этого урока, вам не нужна дополнительная информация.

Давайте начнем программировать нашу среднюю скользящую. Наш индикатор должен не только рассчитывать среднее значение, но и должен выводить этот результат на график. У Easy Language есть зарезервированное слово для этого – “Plot”, и мы используем его, чтобы сделать это. Прежде чем начать программировать, всегда лучше подумать о том, что вы хотите сделать и как вы хотите это сделать.

Так как этот индикатор не очень сложный, обдумывание не займет много времени. Когда речь идет о более сложных индикаторах, то вы можете сэкономить много времени с помощью предварительного планирования.

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

Для средней нам нужно сложить значения за необходимый период. Нам не нужно писать код, для всех возможных периодов средней. Нам нужно чтобы код был способен вычислять все возможные периоды сам по себе. Как вы думаете, как это можно сделать?

Ответ заключается в том, что нам циклическое повторение, которое может выполнятся для каждого бара несколько раз подряд. (на протяжении периода средней). Это звучит сложно, но на практике это будет довольно просто. Мы будем использовать цикл “for loop” для этой задачи. Этот цикл повторяется один или несколько раз, столько сколько определит пользователь. Код в Easy Language выполняется сверху вниз, и как правило, слева на право. После того, как код строки выполнен, выполняется следующая строка и так далее. В случае, если строка кода является началом цикла, то код строки внутри цикла будет выполняться установленное количество раз. Только тогда, когда цикл завершился, выполняются строки, следующие за строкой цикла.

Цикл выглядит и работает следующим образом:

Числовая переменная будет увеличиваться (или уменьшаться) с каждым циклом от её начального значения до конечного.

На скриншоте изображен цикл для переменной счетчика (ii в данном случае), с начальным значением 0. Цикл будет повторяться десять раз пока счетчик не достигнет значения 9. Затем блок цикла выполнится последний раз и отключится. Вам не нужно увеличивать значение счетчика самостоятельно, код цикла сам сделает это. Текущее значение счетчика будет сохранено в переменной счетчика. Таким образом, вы можете получить доступ к счетчику в каждом цикле и использовать его значение для наших расчетов. Это пригодиться для расчета нашей средней.

ABC Easy/power language


Иногда может потребоваться уменьшать значение счетчика на единицу при каждом повторении. Начальное значение в этом примере 9, но цикл выполняется десять раз, пока не заканчивается. Счетчик просто уменьшается с каждым повторением на единицу, пока не становится равным 0.

ABC Easy/power language


В EasyLanguage вы можете ссылаться на данные предыдущих баров. Использование числа в квадратных скобках вместе с зарезервированным словом, вычислением или переменной возвращает значение для определенного бара. Номер бара растет с текущего бара (который обозначается [0]), с шагом в один. Если вы хотите сохранить значение закрытия предыдущего бара в переменной под названием PrevCloseValue вы можете сделать это следующим образом:

ABC Easy/power language


Нам нужно построить нашу среднюю при помощи цен закрытия для последних Х баров. Здесь Х представляет вводную, чтобы обеспечить большую гибкость. Вы наверное, уже поняли, что мы будем использовать цикл, а так же мы будем ссылаться на значения предыдущих баров. Этого должно быть достаточно, чтобы написать код для основной части нашего индикатора. Давайте создадим вводные и переменные. Как вы помните из прошлого урока, что называя переменные значимыми именами, вы можете избежать множества неприятностей в будущем.

Нам нужно объявить вводную, с помощью которой мы сможем менять период нашей средней. Кроме того, нам нужны переменные, в которых будет храниться результаты вычислений, одна для значений счетчика, другая для хранения среднего значения. Для того чтобы нарисовать линию средней на графике мы будем использовать зарезервированное слово “Plot”. В Multicharts, вы можете использовать до 999 графиков одновременно. Зарезервированное слово “Plot” может иметь несколько параметров, такие как цвет, размер графика и другие. Мы поступим просто, и зададим Plot1 всего два параметра – один для цифрового значения переменной, другой для названия. В итоге, код должен выглядеть примерно так:

ABC Easy/power language


После компиляции этого кода мы можем загрузить наш индикатор на график в Multicharts. Давайте посмотрим на свойства индикатора. Вы можете найти их в ) >Файл>Свойства (>File>Properties) или нажав на значок Свойства в меню (он должен быть слева от кнопки Компиляция). Во вкладке стиль можно изменить цвет, стиль и толщину линии созданной вами. Открыв вкладку Свойства вы увидите несколько вариантов стиля, но сейчас вам нужно убедиться, что переключатель “Same as symbol” включен. Когда включена такая опция, индикатор рисуется непосредственно на графике цены, а не в дополнительном окне.

ABC Easy/power language


Теперь мы готовы применить наш индикатор к графику цены. Если у вас открыто окно с графиком цены в главном окне Multicharts, вы можете легко вставить в него индикатор.

ABC Easy/power language


Результат применения индикатора, должен быть похож на изображенный выше. Однако, как вы видите, он не выглядит правильным, так как не похож на привычную скользящую среднюю. Вы видите плоскую линию, которая растет от начала до конца графика. Это говорит о том, что мы где-то ошиблись. Как вы думайте, чего не хватает в коде? На самом деле мы забыли про маленькую, но крайне важную вещь. Нам нужно было кое-что добавить в первую часть цикла. Цикл просто складывает значения за предыдущие десять баров с каждым новым баром. Это нормально, но нам не нужно добавлять новые значения к старым значениям. Другими словами, вы должны убедиться, что CloseValueSum не содержит старые значения, когда начинается цикл. Добавив одну строку кода, мы получаем результат, который хотели достичь.

ABC Easy/power language


Мы так же можем изменить внешний вид индикатора на графике. С помощью вкладки стиль (style) под «Формат исследования» (Format study) мы можем изменить стиль, цвет и толщину линии. Во вкладке “Inputs” вы найдете вводные, которые мы создали, с настройками по умолчанию. Если вы загрузите второй экземпляр исследования и поменяете цвет и длину, вы сможете убедиться, что разные параметры дают разный результат.

ABC Easy/power language


Урок 3. Циклы с условиями.Как правильно использовать циклы в программировании

Добро пожаловать на новый урок, на пути освоения MultiCharts и PowerLanguage. Если вы не читали предыдущие уроки, то я бы предложил вам сделать это. Этот урок будет основан на понятиях изложенных в предыдущих уроках. На уроке 02 мы узнали, как можно построить скользящую среднюю на графике. Мы использовали цикл, чтобы просуммировать значения предыдущих баров, которые нужно привести к среднему. Сегодня вы изучите еще один тип цикла. Так же вы узнаете, как использовать редактор для вывода информации в окне отладки.

На первом уроке мы изучили главное окно в редакторе PowerLanguage. Когда вы откроете редактор, то вероятно увидите, что он разделен на три части. Если это не так, то скорее всего вы изменили внешний вид в меню «Вид» (View). Убедитесь, что «Окно отладки» (Output Bar) на месте, так как оно будет нужно нам на этом уроке.

ABC Easy/power language


Перейдите в вкладку Вывод (Output) в нижней части окна. В ней редактор показывает информацию, поступающую от кода. Давайте посмотрим, как это работает. Создайте новый индикатор, присвойте ему имя по своему вкусу. Я использую имя, удобное для меня, которое указывает на назначение индикатора, и которое легок найти в списке индикаторов. Нам нужно чтобы текст демонстрировался один раз. EasyLanguage предлагает специальное зарезервированное слово, для кода, который вы хотите выполнить только один раз.

ABC Easy/power language


Зарезервированное слово Print показывает текст в окне отладки. Если вы удалите зарезервированное слово Once, то текст будет печататься при каждом новом баре на графике или при каждом изменении цены в реальном времени.

ABC Easy/power language


В предыдущем уроке мы использовали цикл для того чтобы сделать скользящую среднюю. Мы могли бы достичь тех же самых результатов с другим типом цикла. Вы можете спросить – зачем нам нужны циклы другого типа? Каждый вид цикла имеет свои особенности, и в некоторых случаях один тип лучше подходит к определенным задачам, чем другой. Новый тип цикла называется “while loop”. Он повторяет код до той поры пока его условие верно. Цикл с условием может выглядеть следующим образом:

ABC Easy/power language


Из кода видно, что цикл будет исполняться, пока ii не достигнет значения десять. Когда ii = 9 операторы внутри цикла выполнятся последний раз и ii будет равен десяти. Когда код перейдет на начало и проверит условие ii<10, то оно будет не верным, так как ii = 10, и следовательно, цикл не будет выполнен снова.

Переменная ii изначально равна 0, и операторы внутри цикла будут выполняться пока ii < 10, следовательно мы можем ожидать что в окне отладки появятся десять предложений.

ABC Easy/power language


Как вы наверное помните, цикл автоматически увеличивает (или уменьшает) счетчик переменной и останавливается, когда достигается конечное значение счетчика. Вы должны сами установить переменную для счетчика самостоятельно. Если вы забудете поставить переменную или условие в первой строке цикла, то вы создадите так называемый «бесконечный цикл». Бесконечным он называется потому что он никогда не будет остановлен, и следовательно расчет кода никогда не будет закончено. Это может привести к зависанию MultiCharts, поэтому всегда проверяйте цикл с условием, чтобы избежать подобного. Давайте посмотрим на то, как выглядит бесконечный цикл, и как можно изменить код, чтобы избежать зависания программы. Следующие три примера объединяет то, что их условие никогда не будет верно, что создает бесконечный цикл. Поэтому я бы не рекомендовал выполнять этот код в MultiCharts, если вы не хотите чтобы программа зависла. Программа Tradestation по умолчанию имеет защиту от зацикливания. В этом случае она не зависнет, а продемонстрирует предупреждение и остановит расчет кода.

ABC Easy/power language


Давайте подробнее рассмотрим каждый пример чтобы понять, почему образуется бесконечный цикл. Первый цикл будет выполняться до тех пор, пока ii меньше чем десять. Сначала ii = 0, как это установлено по умолчанию. С каждым циклом ii уменьшается, т. е. с каждым разом из ii вычитается единица. После первого круга, значение ii становится = -1, после второго -2 и так далее. Как вы видите переменная никогда не достигнет значения 10.

Во втором примере цикл будет выполняться до тех пор, пока kk будет равен нулю. Значение kk не изменяется в течении цикла, и таким образом цикл не будет остановлен. В последнем примере используется логическое (истина/ложь) условие для остановки цикла. Пока “ThisСondition” остается верным, цикл будет повторяться. В этом примере “ThisCondition” никогда не примет значение ложь в конце цикла. Так что это приведет к еще одному бесконечному циклу и зависанию MultiCharts.

Для того чтобы избежать зависания MultiCharts от бесконечного цикла вам нужно убедиться, что условие остановки становится истинным в какой-то момент времени. Так же вы можете использовать дополнительный прием, чтобы остановить цикл. При помощи зарезервированного слова “break” можно моментально остановить цикл, после чего код продолжит исполняться. Его можно использовать вместе с переменной, которая подсчитывает количество циклов и останавливает их после определенного количества. Я часто использую этот способ, так как он предлагает дополнительную защиту от ошибки и зависания. Это так же помогает в отладке кода. На изображениях вы можете видеть как можно остановить цикл, установив логическое выражение в состояние ложно.

ABC Easy/power language


На этом скриншоте вы видите цикл, условием остановки которого является логическое условие = ложь, которое включается после 12 циклов. Так же, вместо того, чтобы ставить переменную “ThisCondition” в состояние “false”, можно использовать зарезервированное слово “break”, для быстрой остановки цикла.
При использовании “break” необходимо помнить то, что после выполнения этой команды, ни цикл не будет выполняться больше. Если вы установите значение “ThisCondition” на “false”, то цикл начнется заново. Если вы посмотрите на следующий пример, то увидите, что текст после команды “break” больше не показывается в окне отладки. Причина в том, что цикл не возобновляется после команды “break”.

ABC Easy/power language


Мы можем изменить наш первый бесконечный цикл, добавив команду “break”, вместо счетчика. Конечно, для практики лучше убедиться, что счетчик работает правильно, в том, что он получает приращение или наоборот уменьшается.

ABC Easy/power language


Это даст вам лучшее понимание того, как работает цикл с условием, и как правильно его использовать, без зависания MultiCharts, из-за бесконечного цикла. Теперь давайте изменим скользящую среднюю из урока 02, заменив обычный цикл на цикл с условием. Для лучшего усвоения знаний вы должны попробовать в практике, что-нибудь из этого урока. Скользящая средняя с обычным циклом и средняя построенная при помощи цикла с условием, должны быть полностью одинаковыми, при одинаковых параметрах. Так же я советую вам использовать окно отладки, если вы столкнетесь с какими-нибудь проблемами. На изображении вы видите переменную построенную с помощью обычного цикла (зеленая средняя) и переменную построенную при помощи цикла с условием (красная средняя).

ABC Easy/power language


Урок 4. Операторы и условия.Узнайте, как написать код с условиями

В сегодняшнем уроке вы узнаете, как менять направление выполнения вашего кода при соблюдении определенных условий. Это возможно при использовании операторов. Вы можете найти их в практически любом языке программирования, по своей сути они являются основой каждой программы. Например, операторы могут быть использованы для того чтобы менять цвет скользящей средней, в зависимости от ей размещения по отношению к цене закрытия бара. Если вы хотите закрыть все позиции по истечении определенного времени, то необходимо использовать операторы. Если вы хотите включить алерт, после выполнения определенного условия, так же необходим оператор. Этот список можно продолжать довольно долго, но я думаю, вы уже поняли, что утверждения не только очень полезны, но и крайне важны. Ни один учебник по программированию не может обойтись без операторов, и поэтому крайне важно хорошо разобраться в них, прежде, чем мы можем перейти к более сложным вещам.

If…then…

If…then… простейшая форма условного оператора. Сначала проверяется условие, и если он оказывается верным, то выполняется следующий код. Если же условие не выполняется, то следующий код оператора не будет исполнен. Когда я сказал тест пройден, я не имел ввиду, что вы ограничены только логическими условиями (истина/ложь). В примере приведенном ниже, ii вы видите три оператора, два логических MyCondition1 и MyCondition2 и один оператор с числовой переменной.

ABC Easy/power language


В первом случае код проверяет “MyCondition1 =False”. Если “MyCondition1” действительно окажется ложным то результат теста окажется фактически истинным (так как условие выполнено). Это может показаться немного запутанным на первый взгляд, но если помните, мы делали аналогичные проверки на прошлом уроке, с циклами. Вы можете вывести результат теста на окно отладки при помощи команды “print”.

ABC Easy/power language


Код, следующий после оператора “if…then… “ будет исполняться только после проверки выполнения условия. В случае если проверка показала не соответствие условия, то будет исполняться следующий после тела оператора код. Если вы хотите чтобы в случае если условие верно то выполнялся один код, а если не то другой. В этом случает можно использовать два оператора “if…then… “ или использовать другой тип оператора.

If…then…else…

“If…then…else…” выполняет один код если условие верно, и второй, если условие не верно. Например, мы можем изменить цвет в средней скользящей в зависимости от её положения по отношению к цене закрытия бара. Если цена закрытия выше средней, то средняя должна быть окрашена в зеленый цвет, если нет то в красный. При помощи оператора “If…then…else…” и зарезервированного слова “SetPlotColor” мы можем сделать это. “SetPlotColor” имеет два параметра: первый это номер линии, у которой вы хотите изменить цвет (это 1 для Plot1 и 5 для Plot5 и т.д.) и второй для выбора цвета.

ABC Easy/power language

ABC Easy/power language


По плану средняя должна менять свой цвет в соответствии с её положением относительно цены закрытия. В случае где средняя будет равняться цене закрытия она будет окрашена в красный цвет. Вы можете объединять операторы и создавать дополнительные уровни операторов. Мы можем немного изменить оператор “If…then…else…”, чтобы добавить третий цвет для средней, когда скользящая средняя равна цене закрытия.

ABC Easy/power language


Сначала идет оператор “If…then…”, затем идет “If…then…else…”. Обратите внимание, что в случае как одиночного применения оператора “If” так и группы операторов “If” в конце должны стоять точки с запятой.

ABC Easy/power language


If…then begin…end

Операторы “If…then” и “If…then…else…” отлично подходят, если у вас есть только одно выражение. Для больших блоков кодов вы должны использовать оператор “If…then begin…end”. Этот оператор похож на “If…then”, но он позволяет размещать несколько строк кода между “begin” и “end”. “Begin” и “End” являются постоянными элементами для этого оператора, они обозначают начало и конец тела оператора. По сравнению с обычными операторами “If…then” и “If…then…else…”, оператор “If…then begin…end”, то все строки кода между “begin” и “end” должны заканчиваться точкой с запятой.

Давайте добавим простой блок в код нашей средней, который ставит крестики (для этого нужно изменить стиль линии в настройках) и дает сигнал, когда бар оказывается полностью ниже средней.

ABC Easy/power language

ABC Easy/power language


If…then begin…end else begin…end

Так же вы можете использовать оператор If…then begin…end else begin…end, если хотите использовать сразу несколько операторов кода после “else”. В использовании этого оператора есть одна особенность: после первого “end” не нужно ставить точку с запятой, только последний “end” закрывается точкой с запятой. Вы так же можете использовать два оператора If…then begin…end, чтобы выделить бары выше средней скользящей.

ABC Easy/power language

ABC Easy/power language


Once…begin…end

На этом уроке я бы хотел рассмотреть еще два оператора. Мы уже использовали один из них. Как вы, возможно, догадались это “Once…begin…end”, Мы использовали его в начале этого урока, но без условия. Специфика этого оператора заключается в том, что после того как только логическое выражение становиться истинным один раз, оно больше не выполняется. После того как он был выполнен один раз, то в дальнейшем код в теле этого оператора пропускается. Это может пригодиться чтобы инициализировать переменные или сделать расчеты, которые необходимо сделать только один раз. Оператор “Once” выглядит следующим образом:

ABC Easy/power language


Логическое выражение следующее за “once” необязательно, и без него можно обойтись,. В случае, если у вам нужен лишь один оператор который необходимо исполнить только один раз, вы так же можете не ставить “begin” и “end”. На изображении ниже вы можете увидеть три примера того как можно использовать оператор “once”. В первом примере, оператор удаляет всю информацию в окне отладки. Во втором случае код делает тоже самое, предварительно проверив “If CurrentBar = 1” и эта проверка осуществляется при каждом выполнении кода. С “once” код в теле оператора выполняется только один раз, после чего не проверяется. На втором примере вы видите, как вычислить тик и десятую долю символа, с последующим сохранением результата в двух переменных. В последнем примере код проверяет день недели, и если текущий день оказывается понедельником, то код очищает окно отладки, и пишет в нем новый текст.

ABC Easy/power language


Switch/case

Switch/case – это последние операторы, которые мы рассмотрим сегодня. Операторы switch и case крайне полезны при создании разветвленного и сложного кода. Вместо того, чтобы создавать код на основе множества вложенных “If…else” операторов, его можно сделать на основе оператора switch. Это звучит сложнее, чем есть на самом деле. Давайте рассмотрим простой пример кода, в котором используются операторы switch и case. Создайте индикатор, приведенный ниже, и загрузите его на график. Затем попробуйте поменять параметры, и посмотрите на результат, который отобразиться в окне отладки. Текст разделяется на две строки для удобства чтения. Обычно я делаю их в одну строку, если они не слишком длинные.

Код передает “Number” с помощью switch(переключателя) в первый case и выполняет следующий оператор. Если нужное case найдено, значит сначала выполняются код внутри оператора switch/case, а затем выполняется код следующий за оператором switch/case. Вот почему код для оператора для case от 2 до 5 никогда не будет исполнен, так как он входит в case «от 2 до 10». Поменяйте местами позиции для двух case и посмотрите как они будут выполняться в зависимости от вводной Number. Оператор “default” не является обязательным, вы можете использовать его, чтобы убедиться, что операторы выполняются, даже если условия не выполнены. Вы можете использовать несколько различных операторов, в каждом конкретном “case” или использовать один оператор печати для каждого “case” в этом примере.

ABC Easy/power language


Для операторов, которые мы рассмотрели в этом уроке характерно то, что их можно объединить в группы для создания более сложной логики. Иногда вам придется применять все свои творческие способности, чтобы добиться того, что вы хотите. Именно поэтому так важен хороший план. Потратьте немного времени, прежде чем начать писать код, чтобы сделать блок схему или логическую схему. В конце концов это поможет вам сэкономить много времени. Я говорил это раньше, и повторюсь снова, так как это важно. Научиться новому гораздо проще, чем отучиться от дурной привычки. Если вы начали изучать языки EasyLanguage или PowerLanguage, то привейте привычку планировать, прежде чем начать программирование.

Урок 5 ABC Easy/power language

Цель данного урока — попрактиковаться в программировании, и создать индикатор, который отслеживает дневные экстремумы. Если вы не читали предыдущие уроки, то я советую вам начать с 1 урока, так в этом уроке будут использованы приемы, описанные в предыдущих уроках.

Как я уже сказал, целью данного урока является создание индикатора, который отслеживает, дневные экстремумы и показывает их на графике. Мы хотим иметь возможность видеть экстремумы текущего дня, а так же показать экстремумы вчерашнего дня на сегодняшних данных. Давайте посмотрим, что нам нужно для этого индикатора, и решим, как лучше сделать этот индикатор:
Нам нужно найти самый высокий максимум, и самый низкий минимум для каждого дня.
Индикатор должен рисовать линии для обозначения вчерашних экстремумов.
Мы хотим менять вид индикатора при помощи переключателей.
Индикатор должен показывать текст, для обозначения линий.

Вот что в общих чертах мы хотим. Помимо того что мы получим полезный индикатор, который можно будет использовать в будущих системах, мы научимся рисовать линии и текст.

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

Программная логика.

Итак, у нас есть описание того, что мы хотим получить. Теперь создадим небольшой список, состоящий из шагов, которые нам необходимо сделать:
Записывать текущий минимум и максимум в переменную, в течении дня.
При наступлении нового дня переписывать значения экстремумов вчерашнего дня в другие переменные, и сбрасывать значения переменных текущего дня.
Обозначить предыдущие экстремумы при помощи линий и текста, на сегодняшних данных, с обновлением на каждом новом баре.
Добавить ввод для того чтобы было удобно менять внешний вид текста и линий (цвет, размер и т.д.).

Как видно, работы не очень много. Давайте создадим новый индикатор в PowerLanguage редакторе. Дадим, ему запоминающееся имея, чтобы мы смогли легко найти его позже. Я начну с кода для линий и текста, и я постараюсь сделать так, чтобы этот код работал как на Multicharts, так и на Tradestation. Это означает, что я не буду включать некоторые зарезервированные слова, которые используются в Multicharts, и вы убедитесь, что это никак не повлияет на результат. Теперь давайте взглянем на код для создания текста и линий.

Линии.

Каждую линию, которую вы создадите с помощью кода, имеет специальный ID, который вы можете использовать для последующей модификации этой линии. Вам не нужно беспокоиться о создании этого ID, так как программа создает его сама. Единственное, что мы должны сделать, так это присвоить значение ID переменной, для того чтобы мы могли использовать его позже. Линия рисуется при помощи зарезервированного слова “TL_New”, после чего следуют шесть параметров в скобках. Когда мы хотим нарисовать линию в реальной жизни, или в программном коде, нам нужно иметь как минимум две точки – начальную точку и конечную точку. Однако вы можете не ограничиваться только этими двумя точками, вы можете добавлять справа и слева неограниченное количество точек. Почему у “TL_New” шесть параметров? Эти шесть параметров нужны для установки двух точек на графике. Когда вы посмотрите на график, то вы увидите, что расположение каждого значения можно описать тремя параметрами – дата, время и цена этого значения. А так как нам нужно указать две опорные точки, то “TL_New”, включает 6 параметров:

ABC Easy/power language


Вот как это выглядит на графике.

ABC Easy/power language


Переместитесь на начало графика, и найдите линию. Скорее всего, линия оранжевого цвета, так как это стандартный цвет, но не волнуйтесь если вы видите другой цвет.

При помощи пары дополнительных зарезервированных слов мы сможем изменить цвет, размер, и стиль нашей линии. Первый параметр зарезервированного слова, который меняет свойства линии – это всегда ID, иначе программа не будет знать, какую линию необходимо изменить. “TL_SetColor” устанавливает цвет линии, “TL_Setsize” устанавливает толщину линии от 0 до 6, TL_SetStyle устанавливает стиль линии, в соответствии со списком расположенным внизу. Хотя это не имеет значения, если вы используете зарезервированные слова, такие как “Tool_Solid”, “Tool_Dashed” и подобные меняющие стиль слова. Я буду использовать эти значения в течении всего урока.

ABC Easy/power language


Добавим зарезервированное слово, и параметры, для того чтобы изменить внешний вид линии.

ABC Easy/power language


Дополнительные строки кода привели к результату изображенному ниже. Но вы можете попробовать поменять цвет, размер и стиль этой линии. Так же попробуйте изменить начальную и конечную точки для того чтобы получить восходящие и нисходящие линии тренда.

ABC Easy/power language


Текст.

Так же как и для линий, для текста нужны опорные точки, но правда, только одна, в отличие от линии. Помимо трех параметров, таких как Date, Time и Price, у зарезервированного слова “Text_New” есть еще четвертый параметр для текстовой строки, которая должна быть создана на графике. Как и линия, каждый текстовый объект имеет свой ID, который вы можете использовать, чтобы изменить вид текста. Простейший код для создания текста в EasyLanguage выглядит так:

ABC Easy/power language


Давайте добавим, простой текст к линиям, которые мы создали раньше.

ABC Easy/power language


Вот как это должно выглядеть в итоге:

ABC Easy/power language


Результат выглядит не очень привлекательно, так как текст расположен на середине последнего бара и в конце нашей лини. При помощи зарезервированных слов, мы можем изменить результат, и улучшить внешний вид текста. Помимо того, что мы можем менять цвет и размер текста, мы можем поменять расположение текста относительно бара, и относительно цены. Это делается при помощи зарезервированного слова “Text_SetStyle”, который имеет три параметра – ID, размещение по вертикали и горизонтали. Горизонтальное размещение имеет три значения:
0 — Текст будет размещен справа от бара.
1 — Текст будет размещен слева от бара.
2 — Текст будет размещен в центре от бара.

Вертикальное размещение так же имеет три значения:
0 — Текст будет размещен под указанной ценой.
1 — Текст будет размещен над указанной ценой.
2 — Размещает текст посередине указной цены.

Добавление резервных слов позволяет изменять цвет, размер и стиль текста. Если вы работаете с TradeStation, то вы можете обнаружить, что “Text_SetSize” не работает. Тем не менее индикатор прекрасно работает без этого, так что просто не включайте его в ваш код.

ABC Easy/power language


Этот код выравнивает текст по правому краю линии, меняет цвет на красный, и делает его более заметным, увеличивая его размер.

ABC Easy/power language


Урок 6. Создание индикатора

Теперь, когда мы знаем, как форматировать линии и текст на графике, мы можем вернуться к созданию индикатора, который показывает дневные экстремумы. В соответствии с логикой описанной выше, нам нужно найти самый высокий максимум и самый низкий минимум на графике. Самый лучший способ сделать это – взять две переменные, которые будут обновляться по мере того, как график будет рисовать новые вершины и новые минимумы. Трудность заключается в том, чтобы по декларации сбросить и установить значение переменной “High” и “Low” из бара. Для того чтобы сбросить мы используем простую конструкцию “if…then begin…end”. Истинно это выражение будет, если дата в этом баре отличается от даты предыдущего бара. В этом случае это будет каждый первый бар, каждого дня.

ABC Easy/power language


Когда максимум нового бара будет выше значения “DayHigh”, переменной “DayHigh” будет дано новое значение. Таким образом, мы сможем легко отслеживать самый высокий максимум и самый высокий минимум, в течение дня. Добавление двух линий для значений двух переменных покажет, работает ли код.

ABC Easy/power language


Как мы видим на картинке, отслеживание дневных экстремумов работает хорошо. Теперь давайте удалим эти линии и вместо них создадим две новые, которые показывают максимум и минимум предыдущего дня на сегодняшних данных. Кроме того нам нужно создать два текстовых объекта и выровнять их должным образом на графике. Это достаточно легко сделать, и вам не всегда нужно писать новый код. Мы можем просто внести изменения в код, в котором мы создавали линии и текст. Помимо переменных, которые мы использовали до этого, я добавлю еще четыре переменных, для ID текста и линий. Две переменные под названиями “PrevDayHigh” и “PrevDayLow”, в которые будут записываться значения дневных экстремумов предыдущего дня, перед тем как обновиться. Имена, которые я использую, выбраны произвольно, вы можете дать переменным свои названия. Я назвал их так, потому что такие названия говорят о назначении той или иной переменной, и это делает код более понятным. Логическая переменная “HaveTextAndLines” нужна для проверки наличия текста и линий на графике. Она примет значение true, при изменении первой даты, и это будет начальной точкой для создания текста и линии.

ABC Easy/power language

ABC Easy/power language


После объявления вводных и переменных, мы можем начать с описания условия для сброса. Когда условие сброса станет истинным, на первом баре каждого дня, нам необходимо переместить значения переменных вчерашнего дня в переменные “PrevDayHigh” и “PrevDayLow”, чтобы потом использовать эти значения для построения линий. Код должен установить значение true, логической переменной “HaveTextAndLines” и создать две линии и два текстовых объекта. У каждого текстового объекта и линии есть свой собственный ID, который можно использовать в коде для изменения значений точек и расположения относительно текущего бара.

ABC Easy/power language

ABC Easy/power language


Финальная часть кода отслеживает, дневные экстремумы и обновляет расположение текста и линий. Изменение крайних точек линий выполняется с помощью “TL_SetEnd”. Это зарезервированное слово имеет четыре параметра: первый параметр – ID, линии которую вы хотите изменить, дальше идут дата, время и цена точки.

ABC Easy/power language


Новая точка для текста устанавливается с помощью “Text_SetLocation”. У этого зарезервированного слова так же четыре параметра. Первый параметр это индивидуальный ID текстового объекта. Остальные три это дата, время бара на которым вы хотите разместить текст и цена на которой текст должен быть расположен.

ABC Easy/power language


Мы будем использовать логическую переменную “HaveTextAndLines” для того, чтобы быть уверенными в том, что обновление может произойти, только когда уже есть один текстовый блок и линия. Попытка обновить несуществующие линии и текст могут создать проблемы, так что лучше обезопасится от этого.

ABC Easy/power language


Давайте проверим, работает ли код так, как мы хотели. Загрузите индикатор и проверьте. Вы должны видеть две линии на каждом дне (кроме первого дня), которые должны отображать данные предыдущего дня.

ABC Easy/power language


Заключение и домашнее задание.

По изображению, мы видим, что код делает то, что мы от него хотели. Есть две линии и текстовые линии на каждый день, и они отображают экстремумы предыдущего дня.

В конце этого урока посвященного линиям и тексту, я надеюсь, что вам понравилось, и вы нашили для себя что-нибудь полезное. В дополнении к этому уроку, в качестве упражнения вы можете изменить этот код так, чтобы текущие дневные экстремумы отображались вместе с текстом и линиями. Для этого можно использовать зарезервированное слово “TL_SetBegin”. Это работает так же как и “TL_SetEnd”, но только для начальной точки линии. Еще один совет который может вам пригодиться для того чтобы сохранить дату и время начала линии, текущего дня в переменные. Вы так же можете немного поменять код, для того чтобы значения для крайних точек линий и текстовых блоков, не задерживались на один бар. Результат изменений может выглядеть примерно так:

ABC Easy/power language


Итоговый код.

Inputs:
HighTLColor(darkgreen),
LowTLColor(red),
TLSize(1),  
TLStyle(1),
HighTextColor(darkgreen),
LowTextColor(red),
TextSize(10);

Variables:

VertTxtP1(1),
//0-below the specified price value
//1-above the specified price value
//2-centered on the specified price value

HorizTxtP1(1),
//0-to the right of the specified bar
//1-to the left of the specified bar
//2-centered on the specified bar  

HaveTextAndLines(false),
DayHigh(High),
DayLow(Low),
PrevDayHigh(0),
PrevDayLow(0),
HiTxt(-1),
Lotxt(-1),
HiTL(-1),
LoTL(-1);

//reset on a date change
if Date <> Date[1] then
begin
//save previous day`s extremes before resetting them
PrevDayHigh = DayHigh;
PrevDayLow  = DayLow;

//set the tracking variables to
//the high and low of the first bar
//of the day

DayHigh = High;
DayLow = Low;

//this boolean variable is used to make sure that the trenlines 
//drawing the trendline with the values for the current bar and
//update them with everynew bar later in the code

HaveTextAndLines = true;

//create new trendlines to display previous extremes we will start
//drawing the trendline with te values for current bar and
//update them with every new bar later in the code

HiTL = TL_New(Date,Time, PrevDayHigh, Date, Time, PrevDayHigh);
       TL_SetColor(HiTL, HighTLColor);
       TL_SetSize(HiTL,TLSize);
       TL_SetStyle(HiTL, TLStyle);
           
LoTL = TL_New(Date,Time, PrevDayLow, Date, Time, PrevDayLow);
       TL_SetColor(LoTL, LowTLColor);
       TL_SetSize(LoTL,TLSize);
       TL_SetStyle(LoTL, TLStyle);

HiTxt = Text_New(Date, Time, PrevDayHigh, "PrevHi");
        Text_SetColor(HiTxt, HighTextColor);
        Text_SetSize (HiTxt, TextSize);
        Text_SetStyle(HiTxt, HorizTxtP1, VertTxtP1);
        
LoTxt = Text_New (Date, Time, PrevDayLow, "PrevLo");
         Text_SetColor(LoTxt, LowTextColor);
         Text_SetSize(LOTxt, TextSize);
         Text_SetStyle(LoTxt, HorizTxtP1, VertTxtP1);
         
end;     

//to prevent errors we only update trendlines when we are sure that
//at least one set of trend lines exist
If HaveTextAndLines = true then
begin

//update the trendline endpoints
TL_SetEnd(HiTL, Date, Time, PrevDayHigh);
TL_SetEnd(LoTL, Date, Time, PrevDayLow);

//update text to new location
Text_setLocation(HiTxt, Date, Time, PrevDayHigh);
Text_SetLocation(LoTxt, Date, Time, PrevDayLow);

end;

//update the variable tracking the lowest low
if low < DayLow then
DayLow = Low;

if high > DayHigh then
DayHigh = High;
При полном или частичном использовании материалов - ссылка обязательна http://elitetrader.ru/index.php?newsid=315814. Об использовании информации.