Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
Июня 05, 2023, 02:06:02 pm
Начало Помощь Поиск Войти Регистрация
Новости:

Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Может ли функция onOrder потерять заявку? « предыдущая тема следующая тема »
Страниц: [1] Печать
Автор Тема: Может ли функция onOrder потерять заявку?  (Прочитано 4464 раз)
nxz
Full Member
***
Сообщений: 241


Просмотр профиля Email
« : Ноября 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)
    А почему не выставилась заявка на покупку?



Версия Transaq 5.08.336.04 ATF 1.20
« Последнее редактирование: Ноября 19, 2013, 06:46:44 pm от nxz » Записан
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #1 : Ноября 21, 2013, 03:13:14 pm »

Посмотрите что возвращает торговая функция, и если это какая-то ошибка, используйте getLastErrorMessage, чтобы понять в чем проблема. Возможно сервер по какой-то причине не принял заявку, getLastErrorMessage в этом случае скажем вам в чем была ошибка. Подробнее об этом тут.
Записан
nxz
Full Member
***
Сообщений: 241


Просмотр профиля Email
« Ответ #2 : Ноября 21, 2013, 07:26:57 pm »

Не найдено заявок, удовлетворяющих заданным критериям.
Записан
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #3 : Ноября 22, 2013, 03:53:18 pm »

Это сообщение, которое даёт функция снятия заявок и которая в данном примере не вызывается, насколько я понимаю. Проверьте где у вас снимаются заявки. У вас сама функция торговая возвращает какой-либо номер транзакции? Если да, то заявка должна появиться в списке заявок, если нет - то надо тогда сразу после проверки вызывать getLastErrorMessage.

Здесь явно, что сервер не принимает заявку вообще, но причина не понятна. Вызывайте getLastErrorMessage только в случае неудачи и сразу после этого - возможно, это прояснит ситуацию.
Записан
Игорь1603
Newbie
*
Сообщений: 17


Просмотр профиля Email
« Ответ #4 : Ноября 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 с Димурой, который говорил, что есть у нас и такие, кому позволяется заглянуть в самый разгар ажиотажа в очередь заявок на биржевом сервере, понять куда сейчас полетит рынок и поставить в самое начало очереди свою непроигрышную ставку.
Так что чудо невозможности снять уже снятую заявку, особенно после попытки выставить новую, вообще теряется на фоне настоящего чуда Димуровской гиперсупертрансзаявки.



Записан
nxz
Full Member
***
Сообщений: 241


Просмотр профиля Email
« Ответ #5 : Ноября 30, 2013, 01:51:33 pm »

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

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

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

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



to Heller: В описании нет ни слова про эту галочку "Ожидать снятия заявок при замене", расскажите для чего она и как работает?
« Последнее редактирование: Ноября 30, 2013, 01:57:58 pm от nxz » Записан
Страниц: [1] Печать 
Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Может ли функция onOrder потерять заявку? « предыдущая тема следующая тема »
Перейти в:  


Войти

Powered by MySQL Powered by PHP Powered by SMF 2.0.10 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS!