Логотип Парус Инвестора
Парусник
Цена деления цифровой шкалы
Системы и стратегии

Учебник по языку программирования Easy Language
Понятие Функций Пользователя

Функция пользователя - определенный набор команд, на которые Вы ссылаетесь по имени, и возвращающие значение. Значение, возвращенное функцией, может быть числовым, true/false или текстовой строкой, и Вы можете использовать функции в любой части инструкции, где требуется это значение.

Например, в торговле принято вычислять диапазон (ранг) бара (максимум минус минимум). Каждый раз, когда пользователь EasyLanguage хочет вычислить диапазон бара, он не должны писать выражение (High - Low), потому что EasyLanguage снабжена функцией по имени Range. Всякий раз, когда Вы нуждаетесь в вычислении диапазона бара, Вы можете использовать пользовательскую функцию EasyLanguage Range вместо того, чтобы писать выражение. Range - одна из самых простых функций, доступных в EasyLanguage; есть сотни функций, доступных для вашего использования, плюс Вы может записать ваш собственные.

Другая концепция, которую Вы должны понять для работы с функциями - концепция параметров. Когда необходимо, функции пользователя написаны с параметрами (также именуемые как константы (inputs) или параметры). Параметры позволяют человеку, использующему функцию, изменять объем информации, которую функция должна использовать для своего вычисления.

Например, функция пользователя Average (Среднее) написана с параметром по имени Length (Длина). Поэтому, вместо того, чтобы иметь одну функцию для среднего с 10 барами, другую для среднего с 12 барами, и третью для среднего с 15 барами, и т.д., есть только одна Average функция пользователя, а пользователь может определить число баров, которые функция будет использовать, чтобы вычислить среднее.

Также пришлось бы создавать функцию для вычисления среднего цен закрытия, другую для среднего цен открытия, третью для среднего объема и т.д., что очень неудобно. Поэтому функция Average также имеет параметр по имени Price (Цена), который дает возможность пользователю определить цену или данные, которые будут усредняться этой функцией.

Следующая инструкция вычисляет среднее цен закрытия последних 10 баров и назначает результат на переменную Value1:

    Value1 = Average (Close, 10);

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


Использование Встроенных Функций

Для вашего удобства, EasyLanguage PowerEditor имеет Словарь EasyLanguage, который является инструментом, где перечислены все зарезервированные слова EasyLanguage и встроенные функции пользователя, сгруппированные по категориям. Словарь EasyLanguage позволяет Вам просматривать список слов и функций, и обеспечивает прямые ссылки к Интерактивному Пользовательскому Руководству.

Все программы TradeStation обеспечены обширной библиотекой встроенных функций пользователя, которые располагаются от обычно-используемых вычислений (например, автоматического обмена данными, интерфейса управления рабочей областью, CCI) к общим математическим и статистическим операциям (например, AbsValue, Sine (Синусу), Square (Квадрат)). Всякий раз, когда Вы должны выполнить вычисление, вместо того, чтобы писать вычисление самостоятельно, сначала используйте Словарь EasyLanguage, и ищите встроенную функцию, которая может выполнить вычисление. Вы можете также использовать встроенные функции как ссылки или инструмент самообучения при записи ваших собственных функций.

Если Вы не уверены, сделает ли функция точно то, что Вы хотите, выделите функцию в Словаре EasyLanguage и нажмите кнопку Define для получения описания функции пользователя и ее использования.

Словарь EasyLanguage - необходимая ссылка, которую Вы будете использовать часто, поскольку Вы работаете с EasyLanguage.


Ссылка на Предыдущие Значения Функций

Вы можете сослаться на значения функций на предыдущих барах. Например, следующая инструкция обращается к значению 10-барного среднего объема один бар назад:

Value1 = Average (Volume, 10) [1] ;

В вышеупомянутом примере смещается сама функция.


Использование Предыдущих Значений в качестве Параметров

Вы можете также смещать значение, которое Вы назначаете как параметр. Например, Вы можете записать следующую инструкцию:

Value1 = Average (Volume[1], 10);

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

Например, предположим, что есть функция по имени OpenDiff, которая вычисляет разницу между открытием текущего бара и прошлым значением функции через параметр. Функция берет переданное значение и вычитает его из цены открытия текущего бара, используя следующую формулу: OpenDiff = Open - Price, где Open - цена открытия бара, и Price - параметр для функции. Предположим, что Вы записываете следующую инструкцию:

    Value1 = OpenDiff (Close)[1];

EasyLanguage получает значение функции на предыдущем баре. Возвращенное значение равно открытию на предыдущем баре минус закрытие предыдущего бара. Однако, предположим, что Вы записываете другую инструкцию вместо этой:

    Value1 = OpenDiff (Close[1]);

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


Использование Псевдонимов Данных

При применении торговой стратегии или методики анализа к ценовой диаграмме или таблице, процедура применяется к потоку данных. Это может быть поток данных на диаграмме, один из символов в окне Position Analysis или символе в окне RadarScreen.

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

Например, Вы можете применить индикатор к ценовой диаграмме OMGA и Dow 30 Index, который ссылается на оба символа. Или, Вы можете применить индикатор к основному активу в окне OptionStation Position Analysis, который обращается к ценам опционов, перечисленных в окне.

Чтобы обратиться к другому потоку данных, кроме того, к которому торговая стратегия или методика анализа применены на диаграмме, Вы добавляете псевдоданные dataN после функции. Например, следующая инструкция вычисляет 20-барное среднее цен закрытия второго символа в ценовой диаграмме даже притом, что индикатор применен к первому символу:

    Value1 = Average (Close, 20) of data2;

Например, когда индикатор применен к акции, которая представлена на графике как Data1, а второй поток данных - Dow 30, то индикатор может вычислить 10-дневный средний объем Dow 30 и включить это вычисление в анализ акции. Инструкция была бы написана следующим образом:

    Value1 = Average( Volume, 20) of data2;

Повторяем, когда никаких псевдоданных не определено, EasyLanguage предполагает, что функция предназначена для вычислений на потоке данных, к которому процедура применена. Так, если индикатор применен к ценовой диаграмме, которая имеет три акции, и следующая инструкция используются в индикаторе:

    Value1 = Average (Volume, 20);

... то среднее объема будет рассчитано на основании данных символа, к которому индикатор применен.

Обратите внимание: При форматировании индикатора на ценовой диаграмме, на вкладке Properties есть опция для выбора символа, к которому применен индикатор. Этот выбор отображает поток данных, к которому индикатор в настоящее время применен.



В RadarScreen и в OptionStation, когда никакие псевдоданные не определены, символ, к которому индикатор применен - заданный по умолчанию поток данных. Для информации относительно того, как обратиться к другим потокам данных в RadarScreen и OptionStation, читайте главу EasyLanguage, соответствующую используемому приложению.

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

    Value1 = Average (Volume of data2, 10);

В вышеупомянутой инструкции псевдоданные используются в параметре функции.

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

Например, давайте используем функцию, для который мы ранее обсуждали смещение бара, а именно OpenDiff. Эта функция вычисляет разницу с ценой открытия бара, и значение передается к функции. Функция вычитает значение текущей цены из цены открытия текущего бара: OpenDiff = Open - Price. Предположим, что мы записываем следующую инструкцию:

    Value1 = OpenDiff (Close) of data2;

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

    Value1 = OpenDiff (Close of data2);

Функция основана на первом потоке данных, но вычислит OpenDifffunction с использованием открытия текущего бара data1 и закрытием текущего бара data2. Возвращенное значение было бы значением открытия первого потока данных минус закрытие второго потока данных.


Запись Функций пользователя

Единственная инструкция, требуемая функции - та, которая определяет, какое значение функция возвратит. Эту инструкцию называют Функциональным Оператором присваивания Значения, и состоит она из имени функции, сопровождаемого знаком равенства (=) и выражения, представляющего значение функции.

Например, если есть функция по имени One, которая возвращает числовое значение 1, вся необходимая инструкция:

    One = 1;

Аналогично, функция по имени HigherHigh, которая возвращает значение истина, если максимум текущего бара больше чем максимум предыдущего бара, может быть написана, используя следующую инструкцию:

    HigherHigh = High > High[1];

Значение True или False назначены на функцию HigherHigh посредством Функционального Оператора присваивания Значения, и это значение возвращено как значение функции.

Или, функция по имени TenBarAvg, которая вычисляет 10-барное среднее объема, с использованием For loop, выглядела бы следующим образом:

    Value2 = 0;

    For Value1 = 0 To 9 Begin

Value2 = Value2 + Volume[Value1];

    End;

    TenBarAvg = Value2 / 10;

Функция может возвратить числовое, истинное/ложное, или текстовое строковое значение. Вы сами определяете, какое значение функция возвратит, когда Вы создаете функцию или форматируете ее свойства в EasyLanguage PowerEditor



Любой из компонентов EasyLanguage, рассмотренных в этой главе, например, инструкции IF-THEN, циклы, переменные, массивы, математика и операторы отношения, и другие функции EasyLanguage, могут использоваться, чтобы выполнить вычисления в пределах функции EasyLanguage, и как только Вы вычисляете окончательное значение, Вы назначаете это значение на имя функции, используя Функциональный Оператор присваивания Значения.


Понятие о Типах Функций: Простой и Серийной

Большинство функций - простые функции. Эти функции выполняют вычисление и возвращают значение. Однако, некоторые функции - серийные функции. Серийные функции ссылаются на предыдущие значения непосредственно самой функции, переменных и/или массивов в пределах функции. Когда функция включает счетчик или операцию накопления от бара к бару, она - также серийная функция.

Использование предыдущего значения функции в пределах самой функции - обычно используемая методика и, фактически, множество стандартных индикаторов - экспоненциальное среднее, ADX, MACD - используют эту методику, также Индикатор Распределения Накопления Лэрри Вилльямса накапливает значения от бара до бара. Давайте рассмотрим соображения, связанные с каждым типом функции.


Простые Функции

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

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

Функция по имени Summation, включенная в EasyLanguage PowerEditor и показанная ниже, является примером простой функции:

Inputs: Price(NumericSeries), Length(NumericSimple);

Variables: Counter(0), Sum(0);

Sum = 0;

For Counter = 0 To Length - 1 Begin

Sum = Sum + Price[Counter];

End;

Summation = Sum;

Даже притом, что функция ссылается на предыдущие значения параметра (Price), это - простая функция, потому что это она не ссылается на свои предыдущие значения или переменных/массивов.


Серийная Функции

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

Для иллюстрации, почему серийные функции выполняются на каждом баре, давайте рассмотрим функцию BarNumber, которая встроена в EasyLanguage PowerEditor. Эта функция подсчитывает количество баров, которые прошли с тех пор, как торговый сигнал или методика анализа запустили ее вычисление. Эта функция написана с использование только одной инструкции, следующим образом:

    BarNumber = BarNumber[1] + 1;

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

    If Close > Open Then

Plot1(BarNumber);

Ниже - таблица, которая показывает первые восемь баров диаграммы.



Функцию вызывают в течение баров один - пять (потому что закрытие больше чем открытие), в то же время условия, необходимые для вызова функцию ложны для баров шесть и семь. Если функция не была рассчитана на этих барах, то не могло бы увеличиться ее значение, чтобы сохранить точный счет числа бара. Кроме того, если бы на восьмом баре функция сослалась на BarNumber [1], то не было бы понятно, к какому значению функция обращается.

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

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

MyValue1 = MySeriesFunction(Close, 25);

MyValue2 = MySeriesFunction(Close, 25);

MyValue3 = 10;

If Condition1 Then

Value1 = XAverage(Close, MyValue3);

MyValue3 = 20;

If Condition2 Then

Value1 = XAverage(Close, MyValue3);

Первые две строки вызывают одну и ту же самую серийную функцию, и они не используют переменные или массивы как параметры; поэтому функция MySeriesFunction рассчитывается только один раз, и полученное значение назначается и на MyValue1 и на MyValue2.

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

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

Совет: Сокращение Времени Вычисления

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


Понятие о Параметрах и Типах Параметров

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

Есть три типа параметров: числовой, истинный/ложный и текстовая строка:

  • Numeric - Числовой - Когда параметр определен как числовой, пользователь функции может передать любое число (например, 5, 10, или 100) или числовое выражение как параметр в функцию. Этот параметр будет использоваться в пределах функции как числовое выражение.
  • True/false - Истинный/ложный - Когда параметр определен как истинный/ложный, пользователь функции может передать любое выражение true/false (или Истина или Ложь) как параметр в функцию. Эти параметры могут использоваться в пределах функции как выражение true/false.
  • Text string - Текстовые строковые параметры позволяют пользователю функции передавать любое текстовое строковое значение (например, "ABC") или текстовое строковое выражение как параметр в функцию. Эти параметры могут использоваться в пределах функции как текстовое строковое выражение.

    Подобно функции, параметр может быть следующих подтипов: простой или серийный, или может иметь подтип ссылки. Каждый подтип описан затем.


    Простые Параметры

    Простые параметры - постоянные значения, которые установлены в торговом сигнале или методике анализа, которая вызывает функцию. Простые параметры требуют меньшего количества памяти и увеличивают скорость. Они сохраняют свои значения в пределах функции; простые параметры не могут иметь значений, назначаемых на них в пределах тела функции.

    Когда пользователь желает использовать число, например (то есть, 10, 15, или 20), то должен определить параметр как числовой простой. Например, функция Average использует параметр по имени Length, который дает возможность Вам определить количество баров, используемых при вычислении среднего. Так как это количество не изменяется от бара к бару (это - постоянное число типа 9, 18, или 50), то нет необходимости хранить предыдущие значения параметра. Поэтому, чтобы увеличить скорость и улучшить использование памяти функции, Length определен как числовой простой параметр.

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


    Серийные Параметры

    Подобно простым параметрам, параметры ряда - постоянные значения, которые установлены в торговом сигнале или методике анализа, которая вызывает функцию. Однако когда функция обращается к предыдущим значениям значения, используемым как параметр (например, Value1, Condition1, или Close), тогда этот параметр должен быть определен как серийный параметр.

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

    Например, функция Average использует параметр по имени Price, который дает Вам возможность определить, какая величина будет усредняться. Чтобы вычислять 10-барное среднее цен закрытия, функция должна будет обратиться к 10 последним ценам закрытия символа; поэтому, параметр Price определен как числовой серийный параметр.

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


    Параметры Ссылки

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

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

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

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

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

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

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



    The MyBands function is shown next. This function defines the upper band as the highest high of the last 10 bars, and the lower band as the lowest low of the last 10 bars.

    Inputs: UpperBand(NumericRef), LowerBand(NumericRef); UpperBand = Highest(High, 10);
    
    LowerBand = Lowest(Low, 10);
    
    MyBands = 1;
    

    Обратите внимание, что функция назначает значение 1 MyBands. Это - необходимая инструкция, и в индикаторе значение (1) назначено на переменную Value1. Помните, что каждая функция должна содержать оператор присваивания, и возвращать назначенное значение. Однако цель функции в примере состоит в том, чтобы вычислить и назначить значения на UpperBand и LowerBand переменные, и эти значения используются индикатором.

    Учитывая, что значения переменных и массивов сохраняются от бара к бару, параметры ссылки позволяют обращаться к предыдущим значениям, используя смещения бара.

    Первая строка в вышеупомянутой функции - инструкция Input Declaration, которая определяет параметры, которые должны быть определены пользователем при использовании функции. Следующий раздел охватывает вопросы, как объявить параметры при записи функции.


    Определение Параметров

    Как было сказано в предыдущем разделе, параметры могут быть следующих типов: числовой, true/false или строковый, и они могут быть следующих подтипов: простой, серийный или ссылка.

    При записи функции Вы должны определить, какие параметры функция будет требовать от пользователя функции. Чтобы сделать это, Вы используете инструкцию Input Declaration. Вы можете объявить множество параметров (одного или различных типов) с использованием одной инструкции Input Declaration. Например:

    Input: MyNumber(NumericSimple);
    

    Вышеупомянутая инструкция Input Declaration объявляет числовой простой параметр. Чтобы определять числовой серийный параметр, Вы используете:

    Input: MyNumber(NumericSeries); 
    

    Чтобы определять числовой параметр ссылки, Вы используете:

    Input: MyNumber(NumericRef);
    

    Префикс определяет тип: Числовой, True/False, или Строка, а суффикс определяет подтип, Простой, Ряд, или Ссылка. Например, чтобы определить два параметра true/false, один ряд и одну ссылку, Вы использовали бы следующую инструкцию Input Declaration:

    Inputs: MyValue(TrueFalseSeries), MyValue1(TrueFalseRef);
    

    Или, чтобы определить строковый простой параметр:

    Input: MyString(StringSimple);
    

    Обратите внимание: Вы можете определить параметр как Числовой, True/False, или Строку, не определяя подтип. В этом случае EasyLanguage автоматически определяет подтип параметра - простой или ряд (однако, если параметр - подтипа ссылка, Вы должны явно это определить).


    Работа с Массивами

    Объявление параметра как массива немного отличается. Чтобы объявить массив, Вы должны определить, является ли он числовым, true/false или строковым; указать, что это - массив, и действительно ли имеет подтип ссылки.


    Синтаксис:

    Input: MyArray[M] (Input Type);
    

    MyArray - имя вашего массива, [М] - выражение, представляющее размер и измерение массива, и Input Type - параметр одного из подтипов массива:

  • NumericArray
  • NumericArrayRef
  • TrueFalseArray
  • TrueFalseArrayRef
  • StringArray
  • StringArrayRef

    Обратите внимание: суффикс Ref' используется, когда Вы передаете массив ссылкой.

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

        Input: MyNumericArray [X,Y,Z] (NumericArray);
    

    Когда массив посылают от торгового сигнала или методики анализа к функции, эти символы (в вышеупомянутом примере символы X, Y, Z) принимают числовые значения, соответствующие размеру массива, и Вы можете использовать слова в пределах тела функции, чтобы работать с массивом. Например, если функция принимает одномерный массив true/false, следующие инструкции могут использоваться, чтобы пересечь массив, использующий For loop:

    Input: MyArray [M] (TrueFalseArray);
    
    Value2 = 0;
    
    For Value1 = 0 To M Begin
    
    Value2 = Value2 + MyArray[Value1];
    
    End;
    

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

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

    Input: MyArray [M] (NumericArray);
    
    If MyArray[0][10] > High Then
    
    {EasyLanguage instruction};
    

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

    Например, следующие инструкции составляют функцию по имени MaxValArray, которая находит максимальное значение, сохраненное в массиве (но не изменяет значения любого из элементов в пределах массива):

    Input: MyNumericArray [M] (NumericArray);
    
    Variable: Result(0);
    
    Result = MyNumericArray[0];
    
    For Value1 = 1 To M Begin
    
    If MyNumericArray [Value1] > Result Then
    
        Result = MyNumericArray [Value1];
    
    End;
    
    MaxValArray = Result;
    

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

    Например, следующие инструкции составляют функцию по имени SortMyArray, которая принимает массив и сортирует его с использованием методики "пузырьковая сортировка" (то есть, пропускает значение в последнем элементе массива, заполняет каждый элемент значением в предыдущем элементе, и помещает последнее значение в первый элемент):

    Input: MyArray [N] (NumericArrayRef);
    
    Variables: Done (False), Counter(0);
    
    Done = False;
    
    While Done = False Begin
    
    Done = True;
    
    For Counter = 0 To N-1 Begin
    
        If MyArray [Counter] > MyArray [Counter+1] Then Begin
    
            Value1 = MyArray [Counter] ;
    
            MyArray[Counter] = MyArray[Counter+1];
    
            MyArray[Counter + 1] = Value1;
    
            Done = False;
    
                    End;
    
                End;
    
    End;
    
    SortMyArray = 1;
    

    Обратите внимание, что макет инструкции включен в вышеупомянутую функцию (подсвечено в полутоне). Функция возвращает значение 1; однако, в этом примере, истинная цель функции - манипулирование массивом, который Вы передаете ссылкой. Этот массив изменяется функцией, и изменение отражается в торговом сигнале или методике анализа, которые вызвали функцию, независимо от значения, возвращаемого функцией.

    Следующая инструкция вызывает функцию из вышеупомянутого примера.

        Value1 = SortMyArray(MyArray[12]) ;
    

    Эта инструкция может быть включена в любой торговый сигнал или методику анализа. В этом случае, значение, сохраненное в Value1 не важно. Однако, как только функцию вызывают, массив MyArray изменяется (в этом случае значение добавляется к массиву и сортируется по "пузырьковой" методике).




  • Содержание (Contents)
    ГЛАВА 1: Введение
    Что такое EasyLanguage?
    Что Вы можете Создать?
    Дополнительные Ресурсы
    ГЛАВА 2: Основные Элементы EasyLanguage
    Как работает EasyLanguage
    О Языке
    Ссылка на Ценовые Данные
    Выражения и Операторы
    Ссылка на Предыдущие Значения
    Управление Датами и Временем
    Использование Переменных
    Использование Констант
    Управляющие структуры EasyLanguage
    Запись Предупреждений
    Понятие Массивов
    Понятие Функций Пользователя
    Методы Вывода
    Текстовый Объект на Ценовых Диаграммах
    Trendlines на Ценовых Диаграммах
    Понятие Полей Данных
    Мультимедиа и EasyLanguage
    ГЛАВА 3: EasyLanguage для TradeStation
    Запись Торговых Сигналов
    Механизм Тестирования Торговой Стратегии
    Торговые Приказы
    Понятие Встроенных Стопов
    Запись Индикаторов и Изучений
    Запись ShowMe и PaintBar
    Запись ProbabilityMap
    Запись ActivityBar
    ГЛАВА 4: EasyLanguage для RadarScreen
    Запись Индикаторов RadarScreen
    Запись Индикаторов для Супердиаграмм SE
    Определение Доступности Индикаторов
    ГЛАВА 5: EasyLanguage для OptionStation
    Анализ данных OptionStation
    Чтение Данных OptionStation
    Запись Индикаторов OptionStation
    Запись Индикаторов для Супердиаграмм SE
    Запись Поиска Стратегий
    Запись Моделей OptionStation
    Глобальные переменные OptionStation
    ГЛАВА 6: EasyLanguage и Другие Языки
    Определение Функции DLL
    Использование Функций DLLs
    Дополнительно О EasyLanguage DLL Extension Kit
    ПРИЛОЖЕНИЕ 1. Синтаксические ошибки EasyLanguage
    61 - 223
    224 - 307
    308 - 569
    ПРИЛОЖЕНИЕ 2. Цвета, Размеры и Коды EasyLanguage




    На правах рекламы:
    услуги дачного переезда тут