Фильтрация транзакций "своего" робота

Страницы: 1
RSS
Фильтрация транзакций "своего" робота
 
Добрый день.

Подскажите, если я хочу запустить несколько роботов, как можно обеспечить уникальность ID транзакций? Или каким образом сделать так, чтобы каждый робот мог отсеивать "свои" заявки в коллбэках при условии, что работает несколько роботов, часть из которых, возможно, сделана не мной?
Фильтрации по коду инструмента мне недостаточно, т.к. я хочу, чтобы разные роботы могли работать по одному инструменту (с разными настройками), при этом у них могут пересекаться идентификаторы транзакций.
 
Я сделал через комментарий http://pmntrade.ru/positions_history.html
Если нужно разделять одинаковые заявки внутри робота под одним комментарием использую ID.
 
Если есть доступ к скрипту.
где-то в самом начале до main() поставить
trans_id      = os.time();

перед выставлением заявки
function MyOpenPosition() -- Выставляет заявку на открытие позиции
     trans_id = trans_id + 1; -- Получает ID для следующей транзакции
     -- Заполняет структуру для отправки транзакции
     local Transaction={
     ACCOUNT   = ACCOUNT_CODE,         -- Код счета
      ------------------------
       -----------------------
     TRANS_ID  = tostring(trans_id)      -- ID транзакции
      };
      local Res = sendTransaction(Transaction); -- Отправляет транзакцию
end;
-- Функция вызывается терминалом, когда приходит новая информация таблицы заявок
function OnOrder(order)
  -- Если пришла информация по нашей транзакции
   if order.trans_id == trans_id then --именно наша заявка
       order_num = order.order_num; --номер заявки
       flag_OnOder = true;  --флаг именно наша заявка
   end;
end;
 
Если есть доступ к скриптам, то надёжней будет нечто вроде
global_trans_id = trans_id * 10 + robot_id
trans_id = trans_id + 1

Если роботов до 10 включительно - умножаем trans_id на 10, до 100 - на 100 и т.д.

Ну и разбирать обратно это проще простого, пришёл ответ на транзакцию с global_trans_id - берём остаток от деления на 10 (100, 1000, etc) и обрабатываем только если совпадает с текущим robot_id.
 
Цитата
Михаил Понамаренко написал:
Я сделал через комментарий  http://pmntrade.ru/positions_history.html

Спасибо. Подскажите, а как комментарий добавить при отправке транзакции и где его потом считывать?

Интересно, есть ли у роботов какой-нибудь уникальный идентификатор, который заранее доступен в системе и который можно было бы использовать в качестве уникального комментария?


Цитата
Максим написал:
Если есть доступ к скриптам, то надёжней будет нечто вроде
global_trans_id = trans_id * 10 + robot_id
trans_id = trans_id + 1

Да, тоже думал о таком подходе. Немного напрягает то, что надо нумеровать вручную роботов (лишние телодвижения для пользователя). И это не спасает в случае, когда в систему загружены посторонние роботы. Хотя на практике таких случаев будет скорее всего настолько мало, что ими можно будет пренебречь, упомянув в документации о необходимой осторожности.
 
Цитата
Максим написал:
Если есть доступ к скриптам, то надёжней будет нечто вроде
global_trans_id = trans_id * 10 + robot_id
trans_id = trans_id + 1

Если роботов до 10 включительно - умножаем trans_id на 10, до 100 - на 100 и т.д.

Ну и разбирать обратно это проще простого, пришёл ответ на транзакцию с global_trans_id - берём остаток от деления на 10 (100, 1000, etc) и обрабатываем только если совпадает с текущим robot_id.
Можно сделать так.
Перед формированием номера транзакции (trans_id) проверять его с существующими номерами в таблице заявок через getItem().
При совпадении изменять.  
 
Цитата
Илья написал:
И это не спасает в случае, когда в систему загружены посторонние роботы.
На сколько я понял ответы разработчиков, то чужие ID (не ваших роботов) Вы не увидите, так как вы работаете в терминале и вам доступны только ваши сделки (только ваши ID), чужие сделки вы не сможете никак перепутать со своими. Если конечно я правильно понял вашу мысль.
человек (не робот)
 
Предлагаю разработчикам Quik добавить в систему потокобезопасную функцию выделения новых идентификаторов транзакций.
Код
NUMBER AllocTransID()
...и таким образом закрыть этот вопрос раз и навсегда. Можно зарегистрировать это предложение?
 
Цитата
Suntor написал:
NUMBER AllocTransID()
Здравствуйте!

Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
 
Цитата
Suntor написал:
Предлагаю разработчикам Quik добавить в систему потокобезопасную функцию выделения новых идентификаторов транзакций.
Код
  NUMBER AllocTransID()  
...и таким образом закрыть этот вопрос раз и навсегда. Можно зарегистрировать это предложение?
Просьба уточнить, как по вашему данная функция решит проблему и что именно она должна сделать?
 
Цитата
Egor Zaytsev написал:
Цитата
Suntor   написал:
Предлагаю разработчикам Quik добавить в систему потокобезопасную функцию выделения новых идентификаторов транзакций.
Код
    NUMBER AllocTransID()    
...и таким образом закрыть этот вопрос раз и навсегда. Можно зарегистрировать это предложение?
Просьба уточнить, как по вашему данная функция решит проблему и что именно она должна сделать?
Данная функция должна выделять уникальный числовой идентификатор транзакции в рамках одной запущенной копии рабочего места Quik.

Скрипт Lua получает вызовы OnTransReply (и других событий) на транзакции посланные из других скриптов Lua, и в целом идущие от:
• Lua
• Trans2quik.dll
• QPILE
• динамическая загрузка транзакции из файла

Если идентификатор транзакции в одном скрипте Lua совпадёт в таким же в другом скрипте Lua, то возникнет путаница, когда чужие ответы будут приняты за свои. Такого быть не должно.
Функция AllocTransID() должна гарантировать уникальность получаемого идентификатора между всеми типами клиентов Quik.
 
Цитата
Suntor написал:
Цитата
Egor Zaytsev   написал:
Цитата
Suntor   написал:
Предлагаю разработчикам Quik добавить в систему потокобезопасную функцию выделения новых идентификаторов транзакций.
Код
      NUMBER AllocTransID()      
...и таким образом закрыть этот вопрос раз и навсегда. Можно зарегистрировать это предложение?
Просьба уточнить, как по вашему данная функция решит проблему и что именно она должна сделать?
Данная функция должна выделять уникальный числовой идентификатор транзакции в рамках одной запущенной копии рабочего места Quik.

Скрипт Lua получает вызовы OnTransReply (и других событий) на транзакции посланные из других скриптов Lua, и в целом идущие от:
• Lua
• Trans2quik.dll
• QPILE
• динамическая загрузка транзакции из файла

Если идентификатор транзакции в одном скрипте Lua совпадёт в таким же в другом скрипте Lua, то возникнет путаница, когда чужие ответы будут приняты за свои. Такого быть не должно.
Функция AllocTransID() должна гарантировать уникальность получаемого идентификатора между всеми типами клиентов Quik.
Информацию приняли, спасибо.
 
Цитата
Suntor написал:
Предлагаю разработчикам Quik добавить в систему потокобезопасную функцию выделения новых идентификаторов транзакций.

Хорошее предложение. Такая функция решила бы сразу много проблем. Если, конечно, не будет слишком тормозной.
 
Добрый день.
Следует понимать, что такая функция будет доступна только скриптам. Возможно пересечение идентификаторов со скриптами которые такую функцию не используют, скриптами QPILE и внешними транзакциями.
Ну и рестарт терминала приведет к сбросу счетчика.
 
Чтобы при рестарте терминала счётчик не сбрасывался, я у себя реализовал такую схему:
1) для значений счётчика выделяется достаточно широкий диапазон чисел от a до b: [a, b);
2) периодически, скажем, раз в минуту, значение счётчика сохраняется на диск в файл;
3) при запросе номера транзакции в скрипте текущее значение счётчика увеличивается на 1 и, если оно становится равно b, то оно приравнивается a;
4) при старте скрипта значение счётчика считывается из файла и увеличивается достаточно большую на величину c и аналогичным образом приводится в диапазон [a, b), чтобы не было пересечений номеров транзакций, которые были посланы после того, как значение счётчика сохранялось в файл.

При такой схеме каждому скрипту выделяется свой диапазон номеров и исключаются повторения из-за сбоев и падений терминала.

Типичные значения в моих скриптах: a = 123 000 000, b = 124 000 000, c = 1000.

Поскольку сейчас планируется сделать номера глобальными для копии терминала, то описанная выше схема потребует выделения всего одного диапазона. Значение c и периодичность записи на диск имеет смысл вынести в конфигурационный файл.
Страницы: 1
Читают тему (гостей: 1)
Наверх