Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
Августа 10, 2022, 09:11:52 pm
Начало Помощь Поиск Войти Регистрация
Новости:

Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Стоп-заявки и onTrade() « предыдущая тема следующая тема »
Страниц: [1] 2 Печать
Автор Тема: Стоп-заявки и onTrade()  (Прочитано 12894 раз)
Олег
Hero Member
*****
Сообщений: 849



Просмотр профиля Email
« : Сентября 02, 2013, 01:25:37 pm »

Quote
Все заявки и сделки в Transaq имеют связанный с ними номер транзакции, обозначаемый в структурах как trnid. Этот номер trnid передается в функции onOrder, onStopOrder и onTrade, а так же используется для снятия заявок и получения их структур.

Чёта я туплю. Это правило для onTrade() распространяется только на рыночные и лимитированные заявки или на условные и стоп-заявки тоже?
В смысле, когда сделка проходит по лимитированной или рыночной заявке, то ее id передается в эту функцию, ну и т.д. Здесь вопросов нет.

А вот когда условная или стоп-заявка. Ведь тогда она до поры до времени хранится на сервере брокера, а при выполнении определенных условий отсылается на биржу, но уже с другим id, правильно я понимаю?
Значит в функции onTrade() "напрямую" отслеживать сделки по условным и стоп-заявкам нельзя? Надо сначала в функции onStopOrder() получить номер, с которым будет отправлена заявка на биржу, а уже потом отслеживать судьбу этой заявки с помощью onTrade() по этому номеру, правильно я понимаю?

И еще... Почему в документации в олдних местах эти функции приводятся с параметром id,  а в других с параметром trnid? Или это синонимы?
« Последнее редактирование: Сентября 02, 2013, 01:29:01 pm от Олег » Записан

Коллеги!
МТС фокусничает!
Будьте бдительны сами и предупредите всех своих хороших знакомых!
Я тоже на днях вляпался.
Схема "фокуса" описана вот здесь:
http://www.forum.sib.mts.ru/viewtopic.php?f=344&t=11381
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #1 : Сентября 02, 2013, 01:28:16 pm »

trnid - это всегда наш внутренний идентификатор транзакции на сервере Transaq, который не зависит от биржи. При выставлении заявки уже на биржу, ей присваивается orderno (причем не нами, а сервером биржи) - это совершенно другое значение, которое используется биржей, но не нами.
Записан
Олег
Hero Member
*****
Сообщений: 849



Просмотр профиля Email
« Ответ #2 : Сентября 02, 2013, 01:32:28 pm »

trnid - это всегда наш внутренний идентификатор транзакции на сервере Transaq, который не зависит от биржи. При выставлении заявки уже на биржу, ей присваивается orderno (причем не нами, а сервером биржи) - это совершенно другое значение, которое используется биржей, но не нами.

А почему в документации в одних местах эти функции приводятся с параметром id, а в других с параметром trnid? Или это синонимы?

И как все-таки отслеживать параметры сделок по стоп-заявкам? Как я описал выше, т.е. в 2 этапа?
Записан

Коллеги!
МТС фокусничает!
Будьте бдительны сами и предупредите всех своих хороших знакомых!
Я тоже на днях вляпался.
Схема "фокуса" описана вот здесь:
http://www.forum.sib.mts.ru/viewtopic.php?f=344&t=11381
Олег
Hero Member
*****
Сообщений: 849



Просмотр профиля Email
« Ответ #3 : Сентября 03, 2013, 08:38:42 am »

Heller, я, конечно, понимаю, что у вас там сейчас серьезная запарка, связанная с переходом на "Т+2", но вы хотя бы намекните, пожалуйста, в один этап можно/нужно считывать информацию о параметрах сделки, заключенной по стоп-заявке, или все-таки придется в 2 этапа это делать, в смысле, сначала надо получить номер заявки (1-й этап), а потом уже счтитывать нужную информацию, используя этот номер (2-й этап).

Вот так вот уже будет достачно или необходимы какие-то дополнительные шаги?

Code: [Select]
 function onTrade(var trnid)
{
if (trnid == StopOrderTransaqID)
{
var Trade = getTrade(trnid);
Price = Trade["price"];
}
}


function calc()
 {
  // ................................................................
  // ................................................................
  // ................................................................

var Stop = new_object("hash");
Stop["sl_quantity"] = 1;
Stop["operation"] = OP_BUY;
Stop["sl_activationprice"] = 5000;
StopOrderTransaqID = trade_action::transact(Stop);

  // ................................................................
  // ................................................................
  // ................................................................
}
« Последнее редактирование: Сентября 03, 2013, 08:42:10 am от Олег » Записан

Коллеги!
МТС фокусничает!
Будьте бдительны сами и предупредите всех своих хороших знакомых!
Я тоже на днях вляпался.
Схема "фокуса" описана вот здесь:
http://www.forum.sib.mts.ru/viewtopic.php?f=344&t=11381
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #4 : Сентября 03, 2013, 09:05:19 am »

Я не уверен, что вполне понял про "два этапа", но вообще вроде этого не требуется. В структуре заявке имеются поля odrerno - это номер уже выставленной заявки на бирже, а так же trdno - это номер сделки, которая была совершена по этой заявке.

Термин id он слишком расплывчатый, в документации встречается по недосмотру конечно. Но видимо чаще всего он подразумевает именно номер транзакции, по крайней мере когда речь идет о заявках и сделках.
Записан
Олег
Hero Member
*****
Сообщений: 849



Просмотр профиля Email
« Ответ #5 : Сентября 03, 2013, 11:05:56 am »

Я не уверен, что вполне понял про "два этапа", но вообще вроде этого не требуется. В структуре заявке имеются поля odrerno - это номер уже выставленной заявки на бирже, а так же trdno - это номер сделки, которая была совершена по этой заявке.

Термин id он слишком расплывчатый, в документации встречается по недосмотру конечно. Но видимо чаще всего он подразумевает именно номер транзакции, по крайней мере когда речь идет о заявках и сделках.

Ну не ловится это событие в один этап!
Вот, посмотрите сами!
Это работающий пробный скрипт. Тестировался в Интре.

Code: [Select]
extern StopOrderActivationPrice;

static StopOrderTransaqID;
static Price;

function onTrade(var trnid)
{
if (trnid == StopOrderTransaqID)
{
var Trade = getTrade(trnid);
Price = Trade["price"];

signal::outputMultiple (Price);
}
}

function onHistoryCalculated()
{
var Stop = new_object("hash");
Stop["sl_quantity"] = 1;
Stop["operation"] = OP_BUY;
Stop["sl_activationprice"] = StopOrderActivationPrice;
StopOrderTransaqID = trade_action::transact(Stop);

}

function calc()
 {
  line [0] = close;
}

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

Code: [Select]
signal::outputMultiple (Price);
не сработал, а значит это событие не "поймалось".

Пробовал уже несколько раз, причем и с id,  и с trnid.

Кстати, и значение переменной Price в обоих случаях остается равным нулю.


Записан

Коллеги!
МТС фокусничает!
Будьте бдительны сами и предупредите всех своих хороших знакомых!
Я тоже на днях вляпался.
Схема "фокуса" описана вот здесь:
http://www.forum.sib.mts.ru/viewtopic.php?f=344&t=11381
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #6 : Сентября 04, 2013, 02:24:42 pm »

А, ну в этом случае да. Есть три вида номеров транзакций (trnid) - вначале для стоп-заявки, затем для самой заявки, а затем еще и для трейда - и это всё разные числа. Выражение "trnid == StopOrderTransaqID" по большому счету вообще не имеет смысла.

Code: [Select]
// номер заявки на бирже, порожденный стопом:
static orderno = 0;

function onStopOrder(var stopid)
{
  var stop = getStopOrder(stopid);
  orderno = stop["tradeno"];
}

function onOrder(var orderid)
{
  var order = getOrder(orderid);
  if (order["orderno"] == orderno) {
    // Заявка пораждена стопом
  }
}

function onTrade(var tradeid)
{
  var trade = getTrade(tradeid);
  if (trade["orderno"] == orderno) {
    // Сделка порождена заявкой, которая была порождена стопом
  }
}

Здесь правда тоже есть нюанс - нет никакой гарантии, что событие onTrade сработает после события onOrder, поэтому чтобы знать наверняка, надо в случае нулевого orderno при прохождении onTrade откладывать куда-то номер сделки и потом его отдельно анализировать уже при обновлении onOrder.

Аналогичная ситуация и с OnOrder - он может сработать до срабатывания стопа, а может и после. В любом случае в onStopOrder не факт, что отработает getOrderByNo(stop["orderno"]) - клиент может еще не знать состояния заявки, и аналогично onOrder может сработать до того как onStopOrder сработает с уже заполненным полем orderno.

Проще, я думаю, использовать поле brokerref.
Записан
Олег
Hero Member
*****
Сообщений: 849



Просмотр профиля Email
« Ответ #7 : Сентября 04, 2013, 03:44:41 pm »

А, ну в этом случае да. Есть три вида номеров транзакций (trnid) - вначале для стоп-заявки, затем для самой заявки, а затем еще и для трейда - и это всё разные числа. Выражение "trnid == StopOrderTransaqID" по большому счету вообще не имеет смысла.

Code: [Select]
// номер заявки на бирже, порожденный стопом:
static orderno = 0;

function onStopOrder(var stopid)
{
  var stop = getStopOrder(stopid);
  orderno = stop["tradeno"];
}

function onOrder(var orderid)
{
  var order = getOrder(orderid);
  if (order["orderno"] == orderno) {
    // Заявка пораждена стопом
  }
}

function onTrade(var tradeid)
{
  var trade = getTrade(tradeid);
  if (trade["orderno"] == orderno) {
    // Сделка порождена заявкой, которая была порождена стопом
  }
}

Здесь правда тоже есть нюанс - нет никакой гарантии, что событие onTrade сработает после события onOrder, поэтому чтобы знать наверняка, надо в случае нулевого orderno при прохождении onTrade откладывать куда-то номер сделки и потом его отдельно анализировать уже при обновлении onOrder.

Аналогичная ситуация и с OnOrder - он может сработать до срабатывания стопа, а может и после. В любом случае в onStopOrder не факт, что отработает getOrderByNo(stop["orderno"]) - клиент может еще не знать состояния заявки, и аналогично onOrder может сработать до того как onStopOrder сработает с уже заполненным полем orderno.

Да-а-а-а-а, дело ясное, что дело темное :)
Но все равно спасибо за разъяснения, на их основе попробую разобраться. Может быть еще какие-нибудь флаги придумаю использовать или таймеры для задержки, чтобы упорядочить очередность.
Вот как раз про эти "этапы" я и говорил :)


Проще, я думаю, использовать поле brokerref.

Иллюзия! :)
Штука в том, что это примечание не "передается по наследству", то есть, когда условия стопа выполняются, и по этому стопу выставляется уже "нормальная" заявка, эта заявка уже не имеет при себе того примечания, которое было при стоп-заявке. Это я уже давно заметил в экспортируемых в Эксель таблицах "Заявки" и "Стоп-заявки".
Точно так же как не наследуется id, точно также не наследуется и примечание :(



Записан

Коллеги!
МТС фокусничает!
Будьте бдительны сами и предупредите всех своих хороших знакомых!
Я тоже на днях вляпался.
Схема "фокуса" описана вот здесь:
http://www.forum.sib.mts.ru/viewtopic.php?f=344&t=11381
Олег
Hero Member
*****
Сообщений: 849



Просмотр профиля Email
« Ответ #8 : Сентября 07, 2013, 02:31:57 pm »

Проще, я думаю, использовать поле brokerref.

Иллюзия! :)
Штука в том, что это примечание не "передается по наследству", то есть, когда условия стопа выполняются, и по этому стопу выставляется уже "нормальная" заявка, эта заявка уже не имеет при себе того примечания, которое было при стоп-заявке. Это я уже давно заметил в экспортируемых в Эксель таблицах "Заявки" и "Стоп-заявки".
Точно так же как не наследуется id, точно также не наследуется и примечание :(

А кроме того, обкатывать скрипты с brokerref просто негде. Интра их не принимает, а тестовый сервер никогда не бывает доступен в удобное время.
Записан

Коллеги!
МТС фокусничает!
Будьте бдительны сами и предупредите всех своих хороших знакомых!
Я тоже на днях вляпался.
Схема "фокуса" описана вот здесь:
http://www.forum.sib.mts.ru/viewtopic.php?f=344&t=11381
Олег
Hero Member
*****
Сообщений: 849



Просмотр профиля Email
« Ответ #9 : Сентября 21, 2013, 11:29:47 am »

А, ну в этом случае да. Есть три вида номеров транзакций (trnid) - вначале для стоп-заявки, затем для самой заявки, а затем еще и для трейда - и это всё разные числа. Выражение "trnid == StopOrderTransaqID" по большому счету вообще не имеет смысла.

Code: [Select]
// номер заявки на бирже, порожденный стопом:
static orderno = 0;

function onStopOrder(var stopid)
{
  var stop = getStopOrder(stopid);
  orderno = stop["tradeno"];
}

function onOrder(var orderid)
{
  var order = getOrder(orderid);
  if (order["orderno"] == orderno) {
    // Заявка пораждена стопом
  }
}

function onTrade(var tradeid)
{
  var trade = getTrade(tradeid);
  if (trade["orderno"] == orderno) {
    // Сделка порождена заявкой, которая была порождена стопом
  }
}

Здесь правда тоже есть нюанс - нет никакой гарантии, что событие onTrade сработает после события onOrder, поэтому чтобы знать наверняка, надо в случае нулевого orderno при прохождении onTrade откладывать куда-то номер сделки и потом его отдельно анализировать уже при обновлении onOrder.

Аналогичная ситуация и с OnOrder - он может сработать до срабатывания стопа, а может и после. В любом случае в onStopOrder не факт, что отработает getOrderByNo(stop["orderno"]) - клиент может еще не знать состояния заявки, и аналогично onOrder может сработать до того как onStopOrder сработает с уже заполненным полем orderno.


Да-а-а-а-а, дело ясное, что дело темное :)



Я сейчас поразмыслил и пришел к выводу, что событие onTrade вообще можно было бы отправить на свалку истории (уж коль скоро с ним так неудобно работать), если бы внутри событий OnOrder и onStopOrder можно было бы определять итоговую цену, по которой была заключена сделка, инициированная соответствующими заявками. Можно так сделать или это очень сложно?

Ведь даже в их нынешнем виде оба эти события (с помощью соответствующих функци get...) уже умеют возвращать практически любую нужную информацию по соответствующим заявкам кроме итоговой цены сделок, правильно я понимаю?

Как известно, сделок без заявок не бывает. И если можно будет научить эти два события возвращать полную информацию по инициированным ими сделкам, то можно будет полностью отказаться от использования события onTrade, и тогда не будет такой умопомрачительной сложности.
« Последнее редактирование: Сентября 21, 2013, 11:44:49 am от Олег » Записан

Коллеги!
МТС фокусничает!
Будьте бдительны сами и предупредите всех своих хороших знакомых!
Я тоже на днях вляпался.
Схема "фокуса" описана вот здесь:
http://www.forum.sib.mts.ru/viewtopic.php?f=344&t=11381
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #10 : Сентября 23, 2013, 10:21:17 am »

Сделать так не получится, поскольку для каждой заявки может произойти сразу несколько сделок, если она будет удовлетворена в несколько заходов.

Вообще brokerref должен работать нормально - то что он не срабатывает, это явный баг.
Записан
Олег
Hero Member
*****
Сообщений: 849



Просмотр профиля Email
« Ответ #11 : Сентября 23, 2013, 10:32:25 am »

Вообще brokerref должен работать нормально - то что он не срабатывает, это явный баг.

Ну так все-таки есть этот баг или нет? Или это я что-то делаю неправильно? У меня получается, что примечание стоп-заявки не передается дальше по следующим этапам (стоп-заявка - выставленная по ней заявка - сделка). То есть выставленная на биржу заявка не "наследует" примечание от порождающей ее стоп-заявки. Ну Вы там сами-то поэкспериментируйте с какими-нибудь простенькими скриптами на эту тему и если это баг, то так и скажите, что это баг. А если это я что-то делаю не так, то подскажите, пожалуйста, что именно я делаю не правильно и как это следует делать.
Записан

Коллеги!
МТС фокусничает!
Будьте бдительны сами и предупредите всех своих хороших знакомых!
Я тоже на днях вляпался.
Схема "фокуса" описана вот здесь:
http://www.forum.sib.mts.ru/viewtopic.php?f=344&t=11381
Олег
Hero Member
*****
Сообщений: 849



Просмотр профиля Email
« Ответ #12 : Октября 17, 2013, 08:54:54 pm »

Вопрос остается в силе.
Записан

Коллеги!
МТС фокусничает!
Будьте бдительны сами и предупредите всех своих хороших знакомых!
Я тоже на днях вляпался.
Схема "фокуса" описана вот здесь:
http://www.forum.sib.mts.ru/viewtopic.php?f=344&t=11381
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #13 : Октября 18, 2013, 11:00:24 am »

Нами ошибка уже исправлена, но ваш брокер еще судя по всему не обновил сервер.
Записан
Олег
Hero Member
*****
Сообщений: 849



Просмотр профиля Email
« Ответ #14 : Октября 18, 2013, 12:20:27 pm »

Нами ошибка уже исправлена, но ваш брокер еще судя по всему не обновил сервер.
Ну вы там подскажите ему как-нибудь, чтобы он уже обновил наконец :)
А то получается как у Жванецкого. Кто-то за пуговицы отвечает, кто-то за рукава, а в результате костюмчик плохо сидит. "К пуговицам претензии есть?" :)
« Последнее редактирование: Октября 18, 2013, 12:49:54 pm от Олег » Записан

Коллеги!
МТС фокусничает!
Будьте бдительны сами и предупредите всех своих хороших знакомых!
Я тоже на днях вляпался.
Схема "фокуса" описана вот здесь:
http://www.forum.sib.mts.ru/viewtopic.php?f=344&t=11381
Страниц: [1] 2 Печать 
Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Стоп-заявки и onTrade() « предыдущая тема следующая тема »
Перейти в:  


Войти

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