Инструменты пользователя

Инструменты сайта


atf:цикл_жизни_скрипта

Цикл жизни скрипта ATF

В данном разделе поэтапно рассмотрен жизненный цикл индикаторов.

init()

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

  • setBounds(nline, begin, end) - задает границы отрисовки индикаторов. Параметры: nline — номер линии, begin — сдвиг относительно начала, end — сдвиг относительно конца

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

  • setInitCandles(n) - задает количество начальных свечей, для которых не нужно звать calc()

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

  • lackHistory() - эта функция останавливает расчет индикатора с сообщением о нехватке исторических данных

Так же в функции init() часто имеет смысл открывать и считывать данные из файлов, инициализировать объекты вроде массивов или хешей, xml-хранилища и подобные.

На этом этапе запрещен вызов торговых и сигнальных функций.

Расчет истории

После выполнения предварительных действий в функции init() (если не было вызова lackHistory()), для каждой свечки вызывается функция calc(). При этом значение «текущей свечки» (определяемое функцией setCurrentPosition() и актуальное для получения данных текущего значения и времени свечи) равняется номеру свечи, для которой вызвана функция calc().

Если в функции init() предварительно была вызвана функция setInitCandles(), то этот процесс начинается не с самой первой свечи, а лишь с той, которая была указана аргументом.

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

Выяснить, выполняется ли в данный момент расчет истории или функция calc() вызывается в реальном времени по рыночной сделке можно вызвав функцию isHistoryCalculated()

При окончании расчета исторических данных, вызывается событие onHistoryCalculated()

Выполнение в реальном времени

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

Для удобства открытия позиций применяется два вида функций - кратные, которые выполняются всегда (имеют суффикс Multiple), и «обычные», которые выполняются не чаще одного раза на свечку. Об этом смотрите следующий раздел.

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

Завершение работы индикаторов

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

  • E_PERIODCHANGE - Выполнение скрипта прекращено из-за смены пользователем периода (поскольку смена периода полностью меняет состав свечек, выполнение скрипта прерывается и начинается заново)
  • E_WNDDESTRUCTION - Выполнение скрипта прекращено из-за закрытия окна
  • E_NEWCANDLES - Выполнение скрипта прекращено из-за поступления исторических данных (из-за добавления данных в начало истории меняются очень многие параметры скрипта, что приводит к необходимости его перезапуска)
  • E_NEWPARAMS - Выполнение скрипта прекращено из-за установки пользователем новых параметров в диалоге свойств
  • E_SOURCECHANGED - Выполнение скрипта прекращено из-за изменения (или удаления) исходного кода скрипта
  • E_DELINDICATOR - Выполнение скрипта прекращено из-за удаления индикатора с графика через контекстное меню

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

Замечания

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

Проверить выполняется ли скрипт в контексте IndRef() на данный момент нельзя. Рекомендуется не вызывать IndRef для сложных скриптов во избежание ошибок и не очевидного поведения.

Проверить вызывается ли скрипт в режиме тестирования можно с помощью функции isTestingMode().

Все индикаторы вызываются последовательно. Когда приходит очередная порция данных от сервера, единый диспетчер последовательно оповещает об этих данных все объекты Transaq, в том числе и индикаторы. Прежде чем начинается обработка следующим объектом, должна завершится обработка предыдущим. Поэтому если в графке имеется два индикатора ATF, и оба они обрабатывают событиые onClientOrder() и calc(), то вначале один индикатор обработает событие onClinetOrder(), затем второй. Затем первый индикатор обработает событие calc(), затем второй. Однако закладываться на порядок срабатывания событий не следует, так как он может измениться в дальнейшем.

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

function onEnvEvent(var string)
{
  signal::output("envevent");
}
 
function onNewCandle()
{
  signal::output("candle1"); 
  signal::output("candle2");
}

Здесь вполне может получиться так, что будет вначале выведено «candle1», затем «envevent» и в конце «cande2», хоть вероятность этого и очень мала.

Список функций

  • IndRef(type, …) - ссылка на произвольный индикатор
  • init() - начала загрузки скрипта
  • isHistoryCalculated() - рассчитаны ли уже исторические данные
  • isTestingMode() - Проверяет работает ли скрипт в режиме тестирования стратегий или нет. (ver. 1.14)
  • isTradingAllowed() - Разрешены ли в данном окне сделки ATF
  • lackHistory() - прекращает выполнение индикатора с сообщением о недостатке исторических данных
  • MovAvg(type, period, data) - ссылка на скользяющую среднюю
  • new_object(type) - создать объект
  • onHistoryCalculated() - события начала расчета индикатора в реальном времени (окончание расчета истории)
  • onStartRobot() - событие запуска робота (нажание на «красного робота» внизу)
  • onStopIndicator(event) - Событие остановки выполнения скрипта ATF
  • onStopRobot() - событие остановки робота пользователем (нажатие на «зеленого робота» внизу)
  • setBounds(nline, begin, end) - задает границы отрисовки индикаторов. Параметры: nline — номер линии, begin — сдвиг относительно начала, end — сдвиг относительно конца
  • setInitCandles(n) - задает количество начальных свечей, для которых не нужно звать calc()
  • StdDev(type, period, data) - среднеквадратичное отклонение

См. также

atf/цикл_жизни_скрипта.txt · Последние изменения: 2012/10/17 13:27 (внешнее изменение)