-
- Функции
Время в ATF измеряется в секундах с 1 января 1970 года и хранится в обычном числовом виде.
Работать с этим числом непосредственно довольно сложно за исключением пары-тройки простых ситуаций, поэтому для получения времени в таком виде и работы с ним используется ряд функций.
Следующие функции дают отсчет от 1970-го года в секундах для специфического момента времени:
Все эти функции возвращают некоторое число, которое затем уже можно использовать как время. Например, мы хотим что-то сделать именно в самом начале следующего часа. Например, если скрипт запущен в 10:29:11, то у нас ровно в 11:00:00 должна быть выполнена функция f(). Код будет выглядеть следующим образом:
function f() { // Действия, которые надо выполнить // в начале следующего часа } function init() { var exec_time = getSystemTime(); exec_time -= fmod(exec_time, 60 * 60); exec_time += 60*60; setTimer("f", exec_time, TIMER_ONTIME); }
Здесь к переменной exec_time мы применяем обычные арифметические операции: вначале отнимаем остаток от деления на 60*60 (секунды в часе), и получаем начало текущего часа в секундах от 70-го года. Затем к полученному прибавляем еще час опять же в секундах, и задаем таймер.
Следующий пример показывает нам как определить разницу между системным временем и временем сервера Transaq:
diff = getSystemTime() - getServerTime();
Здесь опять же на самом деле используется обычная целочисленная арифметика над секундами.
Если нам надо выводить время, получить отдельные составляющие времени (например, день недели), или сохранить куда-либо время в удобочитаемом виде, работать напрямую с секундами нам бессмысленно. Здесь могут оказаться полезными следующие функции:
С помощью них можно значительно упросить многие операции со временем. Например, приведенный выше пример с установкой таймера в начале следующего часа можно было бы записать так:
function f() { // Действия, которые надо выполнить // в начале следующего часа } function init() { var t = getSystemTime(); t = getTimeObject(getHour(t) + 1, 0); setTimer("f", t, TIMER_ONTIME); }
Запись оказалась не многим короче, но гораздо более проста и исключила из себя арифметические операции над секундами.
Последнее, что следует отметить, это возможность поиска свечей по их времени. Для этого существует две функции:
Обе эти функции возвращают -1, если требуемая свеча на найдена. Под «требуемой свечей» подразумевается самая свежая свечка, время которой не больше заданного времени.
С помощью такого поиска можно довольно просто реализовать множество интересных стратегий. Стоит однако иметь ввиду, что поиск по массиву свечей осуществляется линейный, а стало быть он довольно затратен в плане трудоемкости. Поэтому если вам требуется проводить сравнение с каким-то фиксированным значением на графике, то лучше найти его один раз, например, в функции init(), а затем уже использовать это значение.
Если какие-то действия необходимо выполнить по таймеру, то его можно задать с помощью функции setTimer(). В качестве аргументов она принимает имя функции, которую необходимо будет вызвать, время, и режим срабатывания таймеров. Режим задается одной из трех констант:
В этом режиме выражение типа setTimer(«f», ms, TIMER_AFTERDELAY)
приведет к тому, что функция f() (которая не должна принимать параметров), будет вызвана через ms миллисекунд после непосредственно вызова setTimer(). Таймер сработает лишь единожды.
Обратите внимание, что время здесь задается в миллисекундах, поэтому если вас интересуют секунды, то задержку надо увеличивать на тысячу. Следующий пример установит таймер на 2.5 секунды:
setTimer("after25sec", 2500, TIMER_AFTERDELAY);
Аналогично, только время задается в абсолютной величине в секундах от начала 1970 года (смотрите предыдущий раздел). Например, чтобы выполнить функцию prepare() ровно 28 декабря 2012 года в полдень, можно записать функцию setTimer так:
setTimer("prepare", getTimeObject(12, 0, 28, 12, 2012), TIMER_ONTIME);
Функция так же будет выполнена лишь единожды.
Этот вид таймера будет срабатывать через заданное количество миллисекунд до тех пор пока не будет удален или пока не будет удален тем или иным способом сам индикатор.
Каждый вызов setTimer() регистрирует в системе таймер с некоторым идентификатором, который и возвращается функцией setTimer. Этот идентификатор затем можно передать функции delTimer(), чтобы отменить выполнение таймера. Например, следующий пример будет вызывать функцию f() через каждую минуту ровно пять раз, после чего отменит свое выполнение:
static count = 0; static timerID = 0; function f() { count += 1; if (count == 5) { delTimer(timerID); } } function init() { timerID = setTimer("f", 60000, TIMER_PERIODICALLY); }
При задании задержки таймера в миллисекундах надо помнить так же о том, что точностью таймера является лишь примерно 0.1 секунды, так что задавать таймер с задержкой с большей точностью не имеет смысла. Так же дополнительная погрешность в таймер может внести нагрузка на систему, если она будет очень большой.
Синхронизация системного времени со временем сервера через каждые несколько минут:
extern interval = 15; function synchronize() { setSystemTime(getServerTime()); } function init() { synchronize(); setTimer("synchronize", interval * 60000, TIMER_PERIODICALLY); }
Данный скрипт не содержит в себе каких-либо линий, поэтому может использоваться лишь в совокупности с каким-либо индикатором или роботом ATF.