Transaq

СБО "Transaq" => Подсистема ATF => Topic started by: nxz on Ноября 18, 2013, 08:54:13 pm

Title: Может ли функция onOrder потерять заявку?
Post by: nxz on Ноября 18, 2013, 08:54:13 pm
1. В скрипте выполняется условие для выставления заявок на покупку и продажу (см. на рисунке 1)

   if (trend == 1 and op == 1 and bal > 0 and bal < limit and st == 1 and stz == 11) {

      trade_action::buyMultiple(lot, ::lots, pr-lo*((bal/lot)*ks+1-ks));
         signal::notifyMultiple("Заявка на покупку " + lot + " контракта по " + (pr-lo*((bal/lot)*ks+1-ks)));
      trade_action::sellMultiple(lot, ::lots, pr+hi);
         signal::notifyMultiple("Заявка на продажу " + lot + " контракта по " + (pr+hi));

   st = 0;
}

2. onOrder - отрабатывает первый раз нормально  (см. на рисунке 2)

function onOrder(var id) {
   x = getOrder(id);
   stz = x["status"];      // Запоминаем статус заявки
   signal::notifyMultiple("Заявка № " + x["trnid"] + " статус " + x["status"] +
            " напр " + x["operation"] + " по цене " + x["price"] + " лот = " + x["quantity"]);

}

3. Снова выполняется условие для выставления заявок на покупку и продажу  (см. на рисунке 3)

4. Но в реальности выставлется только одна заявка на продажу  (см. на рисунке 4)
    А почему не выставилась заявка на покупку?

(http://upload.akusherstvo.ru/thumbs/572460.jpg) (http://upload.akusherstvo.ru/image572460.jpg)

Версия Transaq 5.08.336.04 ATF 1.20
Title: Re: Может ли функция onOrder потерять заявку?
Post by: Heller on Ноября 21, 2013, 03:13:14 pm
Посмотрите что возвращает торговая функция, и если это какая-то ошибка, используйте getLastErrorMessage, чтобы понять в чем проблема. Возможно сервер по какой-то причине не принял заявку, getLastErrorMessage в этом случае скажем вам в чем была ошибка. Подробнее об этом тут (http://www.transaq.ru/dokuwiki/atf:%D0%B7%D0%B0%D1%8F%D0%B2%D0%BA%D0%B8_%D0%B8_%D1%81%D0%B4%D0%B5%D0%BB%D0%BA%D0%B8#%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B8_%D0%B8_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D0%B9_atf_118).
Title: Re: Может ли функция onOrder потерять заявку?
Post by: nxz on Ноября 21, 2013, 07:26:57 pm
Не найдено заявок, удовлетворяющих заданным критериям.
Title: Re: Может ли функция onOrder потерять заявку?
Post by: Heller on Ноября 22, 2013, 03:53:18 pm
Это сообщение, которое даёт функция снятия заявок и которая в данном примере не вызывается, насколько я понимаю. Проверьте где у вас снимаются заявки. У вас сама функция торговая возвращает какой-либо номер транзакции? Если да, то заявка должна появиться в списке заявок, если нет - то надо тогда сразу после проверки вызывать getLastErrorMessage.

Здесь явно, что сервер не принимает заявку вообще, но причина не понятна. Вызывайте getLastErrorMessage только в случае неудачи и сразу после этого - возможно, это прояснит ситуацию.
Title: Re: Может ли функция onOrder потерять заявку?
Post by: Игорь1603 on Ноября 30, 2013, 12:54:30 pm
Я столкнулся с этой проблемой, когда делал перемещение заявки нажатием клавиши.
Одно нажатие – и старая заявка снимается, а новая выставляется на определенном расстоянии от старой.
Но во время оживления в стакане и ощутимых рывков в таблице всех сделок, многочисленные, частые нажатия на горячую клавишу, с такой привязанной к ней функцией, приводили к снятию заявки без последующего выставления новой на новую котировку.

И что примечательно, возврат «Не найдено заявок, удовлетворяющих заданным критериям» приходит от getLastErrorMessage стоящей не после trade_action::cancelOrder, а стоящей после следующего за cancelOrder  trade_action::transactMultiple.

Поскольку от разработчиков внятного ответа получить не удалось, пришлось заняться шаманством и в результате получилась такая вот фигня:
function MakeTransaction()
{
var ReturningFromTrade = trade_action::transactMultiple(CurrentOrder);
   var ReturningStringLenth = strlen(as_string(ReturningFromTrade));
   var FirstCharacterIsNotDigital = false;
   var FirstCharacterOfReturn = "";
   if (ReturningStringLenth != 0){
      FirstCharacterOfReturn = chr2num(substr(as_string(ReturningFromTrade), 0, 1));
      FirstCharacterIsNotDigital = not((FirstCharacterOfReturn >= 48) and (FirstCharacterOfReturn <= 57));
   }
   if (FirstCharacterIsNotDigital or (ReturningStringLenth == 0) or (ReturningFromTrade == 0)){
                              trade_action::transactMultiple(CurrentOrder);
   }
}
Смысл тут в следующем. Функция trade_action::transactMultiple может вернуть много всякого разного, в том числе, как я предполагаю, и указатель, которого в ATF не существует как такового. Может я и ошибаюсь.
Но судите сами, если проверить возврат на:
- строку нулевой длины;
- на цифру 0;
- и на то, в чем, после приведения к строке, первым символом окажется не цифра, -
то в результате мы выявим ситуацию, когда где-то (то ли на сервере биржи, то ли между биржей  и транзаковским сервером, то ли между транзаковским сервером и клиентом на моем компе) произошел сбой и после серии многочисленных исключений, к нам свалилась несколько замороченная очевидность необходимости повтора нашей тривиальной transactMultiple.

И если не чаще пары раз в секунду, эта штука, вроде как, работает…

И еще, не знаю уж к месту ли, поставил галочку на Параметры/Ввод заявок/Ожидать снятия заявок при замене.
По семантике вроде соответствует ситуации, если принимать во внимание сообщение getLastErrorMessage .

Знаете, когда я парился с этой ерундой, мне попался ролик на Youtube с Димурой, который говорил, что есть у нас и такие, кому позволяется заглянуть в самый разгар ажиотажа в очередь заявок на биржевом сервере, понять куда сейчас полетит рынок и поставить в самое начало очереди свою непроигрышную ставку.
Так что чудо невозможности снять уже снятую заявку, особенно после попытки выставить новую, вообще теряется на фоне настоящего чуда Димуровской гиперсупертрансзаявки.



Title: Re: Может ли функция onOrder потерять заявку?
Post by: nxz on Ноября 30, 2013, 01:51:33 pm
Игорь1603: "И что примечательно, возврат «Не найдено заявок, удовлетворяющих заданным критериям» приходит от getLastErrorMessage стоящей не после trade_action::cancelOrder, а стоящей после следующего за cancelOrder  trade_action::transactMultiple."

            У меня точно так же, у меня даже близко нет функции  trade_action::cancelOrder, а только trade_action::transactMultiple  и все равно прилетает это сообщение в тот момент когда начинается большая движуха на рынке.

Игорь1603: "И еще, не знаю уж к месту ли, поставил галочку на Параметры/Ввод заявок/Ожидать снятия заявок при замене."

           И как помогла галочка в решении проблемы?



to Heller: В описании нет ни слова про эту галочку "Ожидать снятия заявок при замене", расскажите для чего она и как работает?