Получение времени сервера
Несколько удивляет, но часто получаю вопрос - как вывести время сервера во внешнее приложение. Выложил простейший код портфеля на форуме quik, продублирую здесь.
Несколько удивляет, но часто получаю вопрос - как вывести время сервера во внешнее приложение. Выложил простейший код портфеля на форуме quik, продублирую здесь.
Еще одна постоянно используемая функция. Возвращает описание объекта (сделка, заявка, условная заявка и т.д.) по его номеру в торговой системе.
В языке QPILE отсутствуют функции получения кода символа и обратная - получение символа по его коду. Большинство задач, для которых создавался этот язык, действительно не нуждаются в этих функциях. Однако в некоторых случаях они все-таки требуются. Как правило, это уже довольно сложные алгоритмы, нуждающиеся в использовании методов хеширования или шифрации.
Служебная функция, написанная скорее из эстетических чувств. get_value() есть, set_value() тоже. Часто полем ассоциативного массива являются какие-либо счетчики. Приходится сначала получать из массива значение, увеличивать его, потом записывать назад. Текст портфеля распухает. Для уменьшения количества кликов по клавиатуре сохранил эту функцию.
Ранее был приведён текст функции Получение коллекции сделок по номеру заявки, произошедших на основании выставленного ордера. Сама по себе эта функция не имеет самостоятельного значения - она только собирает данные. Чтобы получить из этих данных информацию о себестоимости купленного/проданного, количестве, сумме я использую функцию Parse_Trades_Collection(). Она возвращает ассоциативный массив, содержащий рассчитанные данные по коллекции сделок.
Вы (скорее не Вы, а ваш робот) выставили заявку. Хочется узнать, что в результате ее исполнения получено. Например, среднюю себестоимость купленного/проданного и так далее. Первый шаг - получение всех сделок по этой заявке. Нужно пройтись по таблице сделок и отфильтровать те, источником которых была заявка с известным нам ордером.
Очень многие роботы, исходя из своего алгоритма, должны в какое-то время выполнять (или наоборот, перестать выполнять) некоторые из своих функций. Я обычно даю возможность пользователю такие промежутки времени задавать самому. Для этого в конфигурационном файле выделяется параметр со значением вида HH:MM:SS - HH:MM:SS, то есть начало и конец временного промежутка. Вот процедура, которая проверяет, попадает ли время (во внутреннем целочисленном формате QPILE) в этот промежуток.
Вот функция, которая переводит количество секунд, которое определяет интервал графика в "человекочитабельный" вид. Согласитесь, если в таблице, формируемой роботом на экране стоит число 7200 секунд, это одно, а если строка "2 часа" - совсем другая песня.
' Переводит таймфрейм в секундах в строковое представление. Возвращает строку с названием таймфрейма
' Максимальный таймфрейм - День
' При ошибке возвращается пустая строка
FUNC TimeFrame_Translate(result)
result = trim(substr(" 1 мин 2 мин 3 мин 4 мин 5 мин 6 мин 10 мин15 мин30 мин1 час 2 часа4 часаДень ",(1+Find_In_List("60,120,180,240,300,360,600,900,1800,3600,7200,14400,86400",result))*6,6))
END FUNC
или макросом (что гораздо удобнее и быстрее)
define(TimeFrame_Translate,trim(substr(" 1 мин 2 мин 3 мин 4 мин 5 мин 6 мин 10 мин15 мин30 мин1 час 2 часа4 часаДень ",(1+Find_In_List("60,120,180,240,300,360,600,900,1800,3600,7200,14400,86400",`$1'))*6,6))) Остаток от деления - наверное, самая частоупотребимая математическая функция в моих роботах. Работает с любыми делителями, не обязательно с целочисленными.