пятница, 28 января 2011 г.

Модуль для сравнения локального и серверного времени

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

Что делает модуль TimeDelay?


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

Вычисление разницы между значениями времени происходит раз в секунду.

Вот так выглядит форма модуля:

На графике представлена статистика, накопленная мной за 40 минут на демо-сервере Quik. Что можно сказать, посмотрев на картинку? Я запустила сбор статистики одновременно с запуском Quik. И в самом начале видно, что сервер подтормаживал (по сравнению с выравнявшимся в дальнейшем коридором). Это можно объяснить тем, что он скачивал архивные данные о сделках (с 3-х ночи).

Если у вас дополнительно будет запущено еще несколько задач, будете вести логи и т.д., "коридор" будет смещаться выше и выше, что вполне логично (даже несмотря на то, что у вас супер-мега-компьютер).

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

Как запустить модуль в приводе QuikOrdersDOM?


Для начала вам надо его скачать, положить в папку QuikOrdersDOM/lib (или другое удобное место). А потом добавить его в поле "Библиотека автотрейдинга" на вкладке "Настройки".

Если у вас уже запущен менеджер задач (TaskManager.dll), то добавьте библиотеку к списку запускаемых модулей:

пятница, 21 января 2011 г.

Локальное и серверное время Quik: на что следует обратить внимание при разработке роботов на QuikOrdersDOM SDK

Сегодня речь пойдет о времени. Не о том, что его постоянно не хватает :), а о том, как правильно работать с временем при разработке своих автоматических торговых систем с помощью QuikOrdersDOM SDK (qSDK).

Для чего может понадобиться время? Например, в случае, если вы выставляете задержку между заявками (можно, конечно, в циклах, но в миллисекундах как-то красивее, на мой взгляд). Или для "отсрочки" запуска задачи. Или для остановки задачи на время клирингов.

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

В QuikOrdersDOM SDK есть 2 функции работы со временем:

fATLibGetServerDate : TATLibGetServerDT; – функция получения текущей даты
fATLibGetServerTime : TATLibGetServerDT; – функция получения текущего времени


Пишем небольшую процедурку для определения текущего времени из Quik:

function GetServerDT(aInitRec : TLibInitialRecord; var aNow : TDateTime) : Cardinal;
var
dDT, tDT :TDateTime;
begin
Result := 1;
if aInitRec.fATLibIsOnline <> 1 then exit;
if (aInitRec.fATLibGetServerDate(dDT) = 0) and (aInitRec.fATLibGetServerTime(tDT) = 0) then
begin
aNow := dDT + tDT;
Result := 0;
end;
end;

После этого, не забывая проверять возвращаемое значение, время вычисляем так:

// время последней сделки
if GetServerDT(R, aNow) = 0 then
aHedgerTask.LastOrderTick := aNow
else
aHedgerTask.LastOrderTick := Now;

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

среда, 19 января 2011 г.

Как перевести деньги на счет в банке без комиссии?

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

Надо было перевести деньги на брокерский счет в "Уралсибе". Посмотрела тарифы в нескольких местах:
- непосредственно "Уралсиб" — 1,3%
- "Банк Москвы" — 1,5%
- "ВТБ24" — 1,5%
- "АМТ" — не помню точно, но максимум размер комиссии 1000 руб. (мне надо было перевести 100 тысяч, так что для меня в пересчете выходил 1%) - в этом банке у меня зарплатная карта, но онлайн-банком я не пользуюсь почему-то, не сложилось.
- "МАСТЕР-банк" — 1%

А из ситуации вышла так: открыла счет и завела карту в "Связном банке". Это молодой банк и пока они набирают клиентскую базу за счет оооочень выгодных условий (0% комиссии с платежей, частичный возврат потраченных сумм на карту в виде бонусов, безпроцентное снятие денег с карты в любом банкомате(!!!)).

Счет (и карта) привязываются к телефону.

Завела вчера карту, положила деньги — и сегодня они уже на моем брокерском счету. Очень удобно!

Для кого вопрос актуален — пользуйтесь возможностью, пока они процент не установили (сейчас там 2% — если переводите в банке через оператора и 0% — если через интернет-банк). О пользовании этой картой как кредитной речь, конечно, не идет (гы-гы, там плата за кредит — 48%... может, это для кого-то нормально, но я кредитными картами никогда не пользовалась и пользоваться не собираюсь).

суббота, 15 января 2011 г.

Срочка на демке не фурычит

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

Конечно, мое безделье чисто условное. Ведь кроме программирования торговых роботов у меня в жизни еще много всяких важных дел :)) Вчера завела себе аккаунт на Livejournal.com. Встречайте — Программиздка ;) Что-то поперло меня на социализацию. Заодним и имена себе мажорные застолбила и здесь, и на ЖЖ — тематические, инструментальные ;) Буду там собирать друзей, а писать, наверное, все-таки здесь (что ни говори, платформа Blogger-а мне как-то больше по душе). Буду рада знакомствам, добавляйтесь во френды!

четверг, 13 января 2011 г.

Проверка возвращаемых результатов функций QuikOrdersDOM SDK

При написании своих торговых роботов с помощью QuikOrdersDOM SDK никогда не забывайте проверять результат, возвращаемый функциями! Будьте предельно внимательны, не повторяйте моих ошибок! %D

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

Приведу пример. Вот, допустим, функция нахождения лучшей цены спроса:


function GetBestSellPrice(aInitRec : TLibInitialRecord; aSecInfo : PSecInfo) : double;
var
cnt : integer;
tmpQuotes : PAtQuoteArray;
tmpPBestBuy,
tmpPBestSell : PATQuote;
begin
Result := -1;
cnt:=aInitRec.fATLibGetQuotesCount(aSecInfo^.Idx);
GetMem (tmpQuotes,cnt*sizeOf(TATQuote));
if aInitRec.fATLibGetQuotes(aSecInfo^.Idx,cnt,
tmpPBestBuy,tmpPBestSell,tmpQuotes)<>0 then exit;

if (tmpPBestSell<>nil) then Result := tmpPBestSell.Price;

FreeMem (tmpQuotes,cnt*sizeOf(TATQuote));
end;


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

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

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