Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
Октября 07, 2024, 05:04:45 pm
Начало Помощь Поиск Войти Регистрация
Новости:

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


Просмотр профиля Email
« Ответ #30 : Января 30, 2013, 11:32:40 am »

Позиции в строке отсчитываются с нулевой. То есть:

strfind("abc", "a") == 0
strfind("abc", "b") == 1
strfind("abc", "x") == -1

Возврат -1 функцией поиска подстроки - стандартная практика в большинстве языков программирования (например, в C++ это strstr, в Python - str.find).

Правда, как выяснилось не так давно, в старых версиях strfind некорректно работает, в последней сборке уже должно быть это исправлено.
Записан
ddd323
Sr. Member
****
Сообщений: 257


Просмотр профиля Email
« Ответ #31 : Января 30, 2013, 03:48:24 pm »

Понятно. Ладно, от того, кто к результату добавит +1 - вы внутри или я в коде - скорость выполнения, думаю,не изменится.
Кстати, спасибо, Вы в 1.19 еще много новых текстовых полезностей добавили.
Записан
ddd323
Sr. Member
****
Сообщений: 257


Просмотр профиля Email
« Ответ #32 : Июня 18, 2013, 08:40:17 am »

Мне тут в прошлую пятницу чудовищно повезло. У меня стоп-сигнал возник на последнем тике/калке торговой сессии. Соответственно заявка (по рынку), которой я закрывал позицию не прошла. Но, к сожалению, никакого сообщения об ошибке я не получил, хотя у меня финамовская 1.18 (305.07 rev.51), где уже должна была быть реализована новая идеология работы с ошибками и сделано у меня как рекомендовано в сообщениях 19 и 22 этой темы. Торговал фьюч SBRF-9.13.
На всякий случай схематично мой код:
...
function onATFOrderErr(var str)
{
    file_ATFlog.writeLn(getFormattedDateTime(getServerTime())+" trades="+trades+" Ошибка выставления заявки: "+str);
}
...
function calc()
{
   ...
   if(условие стопа)
   {
       ...
       var OrdrHash = new_object("hash");
       OrdrHash["quantity"] = amount; OrdrHash["operation"] = OP_SELL; OrdrHash["brokerref"] = ROBOT_ID;
       var ordr_trnid = trade_action::transactMultiple(OrdrHash);
       if (not ordr_trnid) {onATFOrderErr(getLastErrorMessage());
       ...
       file_ATFlog.writeLn(getFormattedDateTime(getServerTime())+"; "+trades+"; Условие стопа выполнено. Подана заявка на закрытие позиции");
       ...
   }
}
...

Ну то есть сообщение в логе "23:50:03 14.06.13; 137; Условие стопа выполнено. Подана заявка на закрытие позиции" присутствует, а до него (а также и после него) никакого сообщения об ошибке от function onATFOrderErr(var str), даже пустого - нет, то есть эта функция не вызывалась. Т.е. ненулевой trnid получается был присвоен??? Но в окне заявок в терминале этой заявки нет. OnOrder тоже судя по логу вплоть до момента потери соединения с сервером брокера не вызывался. (В нем у меня тоже кстати стоит: if(order["message"]){onATFOrderErr(order["message"]);})
« Последнее редактирование: Июня 18, 2013, 08:58:39 am от ddd323 » Записан
bugem
Full Member
***
Сообщений: 105



Просмотр профиля Email
« Ответ #33 : Июня 18, 2013, 11:02:25 am »

2 ddd323
В похожей ситуации мне вернуло ошибку (10003) Сейчас эта сессия не идет.
Сообщение было получено из функции onStopOrder(var id) поле hStopOrder["message"]
Статус стоп-заявки SS_REJECTED.
Я НЕ использую onATFOrderErr(var str)
Цена на последних секундах перед вечерним клирингом дошла до sl_activationprice. В стоп-заявке используется sl_guardtime.
Версия Транзака и брокер те же.
Надеюсь, Вам поможет эта информация...

Записан
ddd323
Sr. Member
****
Сообщений: 257


Просмотр профиля Email
« Ответ #34 : Июня 18, 2013, 02:10:54 pm »

Спасибо, как практическая идея что стоп-заявки работают надежнее обычных - может и поможет. Но штатная onATFOrderErr в 1.18 уже не должна работать. А ошибку из поля message и мой код через самостоятельную передачу текста в onATFOtderErr должен был записать в лог. Но у меня onOrder в отличие от Вашего onStopOrder не вызвался. Вот я и призываю разработчиков и Heller'a в частности искать ошибки в коде или архитектуре или объяснить мне ЧЯДНТ.

bugem, у Вас какая версия клиента?
« Последнее редактирование: Июня 18, 2013, 02:13:56 pm от ddd323 » Записан
bugem
Full Member
***
Сообщений: 105



Просмотр профиля Email
« Ответ #35 : Июня 18, 2013, 02:22:33 pm »

bugem, у Вас какая версия клиента?

Ver. 5.05.305.07, rev.51, ATF 1.18
Записан
ddd323
Sr. Member
****
Сообщений: 257


Просмотр профиля Email
« Ответ #36 : Июня 18, 2013, 04:07:21 pm »

Кажется, начинаю догадываться.
Heller, trade_action в случае ошибки честный 0 возвращает или как сейчас в атф часто слелано NULL/полную пустоту?
Если пустоту, то все понятно. Любые логические операции над ней включая отрицание дают ложь, т.е. not ordr_trnid тоже ложь и поэтому onATFOrderErr не вызвался.
« Последнее редактирование: Июня 18, 2013, 08:26:13 pm от ddd323 » Записан
bugem
Full Member
***
Сообщений: 105



Просмотр профиля Email
« Ответ #37 : Июня 18, 2013, 04:19:17 pm »

ddd323, извините что за Heller'а отвечаю. Но вот это то:
Code: [Select]
if(order["message"])
{
   onATFOrderErr(order["message"]);
}
Вам должно было вернуть описание ошибки. Значит сервер не посчитал данную ситуацию ошибочной.
Записан
ddd323
Sr. Member
****
Сообщений: 257


Просмотр профиля Email
« Ответ #38 : Июня 18, 2013, 08:34:30 pm »

Так мне Heller никогда не ответит  ;)
Все правильно говорите, и у меня в коде даже есть точно такой же фрагмент. Но этот механизм информирования об ошибках работает, когда заявка уже обрела свой id и дошла до сервера (например, давно дошла, как в вашем случае со стоп-заявкой). Моя проблема лежит очевидно на другой фазе - на этапе попадания заявки на сервер. Т.к. у меня заявка до сервера не дошла и у меня onOrder (внутри которого и стоит приведенный Вами фрагмент кода) по ней не вызывался.
Т.е. у меня не сработал - другой механизм информирования об ошибках, а именно:
 if (not ordr_trnid) {onATFOrderErr(getLastErrorMessage());

Собственно, поэтому я и прошу Heller'a прокомментировать мою ситуацию, а теперь еще и мою гипотезу (что причина это возврат функцией  trade_action в случае ошибки, не нуля, а "NULL". А. к сожалению, вопреки ожиданиям сейчас в атф "not NULL" = FALSE)
« Последнее редактирование: Июня 18, 2013, 08:37:26 pm от ddd323 » Записан
bugem
Full Member
***
Сообщений: 105



Просмотр профиля Email
« Ответ #39 : Июня 18, 2013, 09:08:19 pm »

Подозреваю, что
Code: [Select]
var ordr_trnid = trade_action::transactMultiple(OrdrHash);ordr_trnid в таком варианте и должен возвращать NULL, т.к. заявка не дошла до сервера. В документации, в примере с описанием trnid код выглядит несколько иначе
Code: [Select]
var trnid = 0;

trnid = trade_action::transactMultiple(OrdrHash);

if(!trnid) {signal::outputMultiple(getLastErrorMessage());}
Как видите 0 присваивается не сервером, а непосредственно в коде.
Хотя, где то в форуме Heller объяснял что a = 0 = "" = NULL = false все однозначно должно в if(not a) возвращать ИСТИНА
Я trnid транзакций записываю в логи, как раз что бы потом можно было разобраться
Есть еще один нюанс. Условная заявка рождает лимитированную (по наступлению условия) и выставляется в стакан (если цена рыночная, то по цене противоположной планки). НО! если это произошло вне сессии, она в стакан не попадает, а отклоняется биржей. А вот возвращает ли биржа какое нибудь сообщение, сказать затрудняюсь, вообще по уму должна.

Записан
ddd323
Sr. Member
****
Сообщений: 257


Просмотр профиля Email
« Ответ #40 : Июня 19, 2013, 08:09:20 am »

Если бы if(not NULL) возвращало бы "истина", то у меня в записалась бы ошибка в лог, а в документацию было бы бессмысленным вставлять предварительное присваивание настоящего нуля: var trnid = 0;
(Странно, кстати, в этой концепции еще то, что настоящий ноль не затирается NULLом в случае ошибки в коде из документации)
Записан
bugem
Full Member
***
Сообщений: 105



Просмотр профиля Email
« Ответ #41 : Июня 19, 2013, 09:53:17 am »

А есть ли в ATF вообще значение NULL?! Это уже вопрос к Heller'у...
т.к. вот такой пример
Code: [Select]
    var a;
    var b = 1;

    if(!a)
    {
        var c;
        c = 1 + a;
        b = b * a;
        signal::outputMultiple("a = " + a + "; b = " + b + "; c = " + c);
    }
выдает нам
Quote
a = 0; b = 0; c = 1
a = 0; b = 0; c = 1
a = 0; b = 0; c = 1
a = 0; b = 0; c = 1
Записан
ddd323
Sr. Member
****
Сообщений: 257


Просмотр профиля Email
« Ответ #42 : Июня 19, 2013, 10:42:47 am »

некий "NULL"/пустая ссылка в атф точно есть. Экспериментальный факт. Просто в неинициализированных переменных с вероятностью 99% лежит обычный честный ноль (обычная ссылка на некую область памяти). Это тоже экспериментальный факт - Ваш пример тому подтверждение.
Записан
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #43 : Июня 19, 2013, 08:43:49 pm »

Мне сложно ответить почему не вывелось сообщение об ошибке - честно говоря не знаю. То что транзакция была принята сервером Transaq - это железный факт, иначе действительно не было бы возвращено trnid. Что могло случиться дальше не очень понятно - я попробую выяснить это у других разработчиков и если что-то станет ясно, то дам ответ (ATF лишь отдаёт сообщение об ошибке, полученное от внешнего интерфейса, поэтому я могу просто не знать какие-то детали этого механизма).

Что касается типа NULL, то да, оно есть, но фактически оно эквивалентно нулю или false или пустой строке. В таких частных случаях многое зависит от конкретной операции, которую выполняет пользователь над переменной - где-то они и отличаться, но дать конкретную жесткую классификацию тут сложно. Это такой пограничный случай, который логически во всех случаях по большому счету имеет один и тот же смысл, хотя, конечно, какие-то тонкие примеры на различия наверняка можно привести. Другое дело, что мне не может придти в голову практический смысл этого. На такие тонкие вещи я бы ни в коем случае не стал бы закладываться.

Торговые операции всегда возвращают число - если номер не присвоен, то это честный ноль.
Записан
ddd323
Sr. Member
****
Сообщений: 257


Просмотр профиля Email
« Ответ #44 : Июня 20, 2013, 12:04:22 pm »

 Heller, а что в моем посте #32 заставило Вас думать, что trnid был возвращен? Если он был возвращен, почему тогда onOrder по этой заявке не был вызван?
Записан
Страниц: 1 2 [3] 4 Печать 
Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Глюк с выставлением заявки по рынку « предыдущая тема следующая тема »
Перейти в:  


Войти

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