Торгую фьючерсами на трех графиках - РТС, Газпром и Сбер и вот впервые за пару месяцев работы на одном и том же коде во дни высокой волатильности (9-10 августа 2011) получил странный глюк - не выставились несколько заявок по рынку. (До и после все работало как часы)
В onATFOrderErr() написали мне, что де попытка выставить заявку с нулевой ценой. В таблице заявок в терминале заявка не появилась.
Мой код схематично следующий:
static OrdrHash;
function init()
{
OrdrHash = new_object("hash");
}
function onATFOrderErr(var str)
{
file_ATFlog.writeLn(getFormattedDateTime(getServerTime())+" Ошибка выставления заявки: "+str);
}
function onNewCandle()
{
OrdrHash["quantity"] = 1; OrdrHash["operation"] = OP_BUY/OP_SELL; trade_action::transactMultiple(OrdrHash);
}
Т.е. использую единожны, глобально определенный хэш. Нигде в коде поле цены этого хэша не заполняется и вообще не используется (т.е. я использую только заявки по рынку). Т.е. оно (поле цены) должно вечно быть равно NULL и не не может превратиться в 0. Если только это не сделали внутретнности АТФ (например при некорректном приведении типов) или не моргнули биты в оперативке (или есть еще варианты связанные с глюками в управлении динамически выделенной памятью?).
В лог я получил соответственно следующие записи (все эти 3 заявки подавались из onNewCandle() ):
10:55:00 09.08.11 Ошибка выставления заявки: RTS-9.11 (r1): Некорректный ордер: Покупка RIU1 по цене 0
14:25:08 09.08.11 Ошибка выставления заявки: GAZR-9.11 (gazr1): Некорректный ордер: Покупка GZU1 по цене 0
19:09:57 10.08.11 Ошибка выставления заявки: SBRF-9.11 (sbrf1): Некорректный ордер: Покупка SRU1 по цене 0
Соответственно, возникают вопросы:
1. это мне биржа этой ошибкой ответила или терминал АТФ, т.е. запрос на биржу даже не ушел?
2. изменяют ли хоть в каких-либо ситуациях внутренности вашего движка ATF состояние хэшовых переменных при выставлении заявок по хэшу?
3. каков все-таки алгоритм формирования цены в заявке по фьючам, которая уходит на биржу при ее выставлении по рынку? (Это важно понимать с точки зрения исправления ситуации путем повторного направления заявки)
Эта тема немного поднималась:
http://www.transaq.ru/forum/index.php?topic=467.msg2569#msg2569 (сообщения 17-21). Тогда сказали, что терминал/сервер Транзак в этой ситуации "выставляет заявки по минимальной или максимальной допустимой цене на данный момент",
а эти макс/мин. цены определяются каким-то непонятным (Heller'у) образом сервером ФОРТС и возможно (по мнению daytrader'a) изменяются только во время клирингов, т.е. могут не меняться часами.
Типично из опыта - этот отступ мин/макс цен ставится от текущей цены на расстоянии 2%. Я раньше делал рыночные заявки сам - в trade_action::buy() добавлял отступ ~2.5% к текущей цене.
Так 2 или 3 раза на ~1000 попыток заявки не выставлялись и я получал в "окно вывода ATF" тексты а-ля "Некорректный ордер: Покупка RIU0 по цене 148500".
Потом появилась возможность выставлять заявки по рынку через хэш - я обрадовался - типа теперь мне сервер всегда правильную цену с правильным отступом будет подставлять. И тут на тебе - опять непонятный облом. Я почему про это вспомнил - во всех этих 3-х случаях невыставления по хэшу по причине нулевой цены,
рынок к моменту попыток поставить заявку уже успевах сходить на 4-5% от цены последнего клиринга, то есть выходил за эти пресловутые коридоры от сервера РТС. Соответственно, я опасаюсь, что
повторение высталения заявки по рынку через функцию trade_action::transactMultiple() выдаст ту же ошибку нулевой цены (чего-то мне не очень верится в моргание битов в оперативной памяти, испортившее мен хэши 3 раза за 2 дня),
а повторение высталения заявки по рынку старым способом выдаст старую ошибку "некорректный ордер" и как тогда с этим бороться непонятно. Есть еще идея послать на сервер условную заявку с заведомо истинным условием, предполагая, что сервер Транзак правильно сделает заявку по рынку.
Но эта идея имеет смысл, только если цену исходя из коридора в запрос подставляет терминал Транзак... Если этим занимается сервер и ошибку нулевой цены генерирует он - он и в случае заведомо истинной условной заявки не выставит заявку по рынку...
4. ну и вообще какие есть соображения о причинах этого глюка, появляющегося с вероятностью ~0.5% (на мой вкус неприемлемо много).
Версия 5.02.274 rev 48 ATF 1.8. Брокер - финам.
P.S. Воспроизведения этого глюка, буде у Вас такое желание Вам наверное тоже придется несколько месяцев ждать