Удваиваются заявки. Версия 9.7.1.10.

Страницы: 1
RSS
Удваиваются заявки. Версия 9.7.1.10., Вопрос разработчикам QUIK
 
Тестирую в демо версии выставление заявок
фрагмент кода такой:
Код
t1.PRICE=tostring(price);
t1.QUANTITY=tostring(Q);
t1.TRANS_ID=tostring(id+1);    -- Уникальный идентификационный номер заявки,  от «1» до «2 147 483 647»
local str=sendTransaction(t1); --отправить транзакцию
Log:write("сообщение"..str.."\n");   Log:flush()  -- вывод сообщения в файл
if str=="" then  id=id+1; ji=ji+1; ti[ji]={id,0}; ti[0]=ji;
   Log:write("заявка id"..tostring(id)..",ji="..tostring(ji).."\n");   Log:flush()
end ---если  сообщение пустое то в файл выводится id транзакции
Поясняю.
Разработчикам просьба внимательно читать пояснения.
Все тщательно разжую.
================
Выполняется:
str=sendTransaction(t1)  
строка str выводится в файл
если сообщения  нет , то  id  увеличивается на 1 и становится равным id транзакции
и выводится в файл
=====================
ВНИМАНИЕ!!!
Таким образом, исключается передача транзакции с одинаковым id
и контролируется количество переданных транзакций.
===================
В лог файле при выполнении транзакции получаем:
Код
сообщение
заявка id31,ji=1
Т. е. ожидаем одну заявку с id=31
----------------
ВНИМАНИЕ!!!
смотрим в таблицу заявок:

 
Однако,
наблюдаем по две заявки с одинаковыми id
одинаковыми параметрами
и в одно и тоже время.
------------------------
Что не так?
 
Цитата
nikolz написал:
одинаковыми параметрами
Это не верно
Посмотрите сами, номер заявок разный
Значит было две транзакции, а не одна.
Найдите кто отправил вторую транзакцию
 
Цитата
nikolz написал:
Таким образом, исключается передача транзакции с одинаковым idи контролируется количество переданных транзакций.
Думаю что это не правильный подход, id транзакции может быть одинаковым на все заявки это вобще ни на что не влияет
                       
 
Цитата
Евгений написал:
Цитата
nikolz написал:
Таким образом, исключается передача транзакции с одинаковым idи контролируется количество переданных транзакций.
Думаю что это не правильный подход, id транзакции может быть одинаковым на все заявки это вобще ни на что не влияет
вы не поняли вопроса. Суть не в том что id одинаковый, а в том, что по одной транзакции выставились две заявки близнецы.
 
Цитата
nikolz написал:
по одной транзакции выставились две заявки близнецы.

Еще раз
Цитата
Sergey Gorokhov написал:
Значит было две транзакции, а не одна.
Найдите кто отправил вторую транзакцию

Не бывает по одной sendTransaction две заявки с разными номерами. Даже теоретически.
Однозначно было две транзакции
 
Цитата
Sergey Gorokhov написал:
Цитата
nikolz написал:
по одной транзакции выставились две заявки близнецы.

Еще раз
Цитата
Sergey Gorokhov написал:
Значит было две транзакции, а не одна.
Найдите кто отправил вторую транзакцию

Не бывает по одной sendTransaction две заявки с разными номерами. Даже теоретически.
Однозначно было две транзакции
Я Вам привел фрагмент кода и данные из лог файла.
ID в коде меняется следом за посылкой транзакции.
==================
Намекните,
как в индикаторе можно отправить вторую заявку из другого места?
в каком месте индикатора есть дополнительные потоки, исполняющиеся параллельно с этим фрагментом кода?
 
Цитата
nikolz написал:
как в индикаторе можно отправить вторую заявку из другого места?

При чем тут индикаторы?
Вы наверное считаете что раз пишите индикатор, то все на форуме в курсе про это?
Ну допустим. Если речь про индикаторы то OnCalculate может сработать несколько раз, смотрите в эту сторону
Или может у Вас несколько разных индикаторов с одним алгоритмом, кто знает

И еще раз, а то вдруг не понятно
Цитата
Sergey Gorokhov написал:
Не бывает по одной sendTransaction две заявки с разными номерами. Даже теоретически.
 
nikolz, Хоспидя, через какую жопу можно простейшие действия выполнять... Да в код глядеть тошно, не говоря уже про читать "тщательно разжёванное".
s=sendTransaction(A);
if s~="" then F:write("Result="..s.."\n");end;
Всё остальное на помойку, не читая.
 
Цитата
Sergey Gorokhov написал:
Цитата
nikolz написал:
как в индикаторе можно отправить вторую заявку из другого места?

При чем тут индикаторы?
Вы наверное считаете что раз пишите индикатор, то все на форуме в курсе про это?
Ну допустим. Если речь про индикаторы то OnCalculate может сработать несколько раз, смотрите в эту сторону
Или может у Вас несколько разных индикаторов с одним алгоритмом, кто знает

И еще раз, а то вдруг не понятно
Цитата
Sergey Gorokhov написал:
Не бывает по одной sendTransaction две заявки с разными номерами.  Даже теоретически.  
Хорошо, уточняю.
Это индикатор, который делает тест на демо сервере - выставляет  заявку по этой транзакции и когда она выставиться снимет ее по KILL
------------------  
Еще раз медленно объясняю
==========================
Oncalculate выглядит так:
Код
function OnCalculate(i)
--------------------
Order("orders",0);  --снять заявку, если она есть 
------------------
if conX("orders")==0 then  
buy_sel(1,1,-1); --выставить заявку на покупку 1 лота, если ее нет
end
---------------
end

Индикатор демо загружен один на одном графике
и по имени этого инструмента создается лог файл.
--------------------  
СЛЕДИТЕ ВНИМАТЕЛЬНО за объяснением
------------------
В приведенном выше фрагменте
написано
=============  
t1.TRANS_ID=tostring(id+1);    --  присваиваем транзакции уникальный id
======================
local str=sendTransaction(t1); --отправить транзакцию
=============
if str=="" then  id=id+1;...  -- здесь этот id увеличивается на 1
=========================
Таким образом, в следующем цикле id будет на 1 больше
=================
Вторая транзакция с таким же номером должна быть отослана на сервер
между этими  двумя операторами.
================  
Вы видите там вторую транзакцию?
Ау , где вторая транзакция, кто тут ее посылает?
===============
Так как это индикатор, а не скрипт , то нет никаких параллельных потоков.
================  
Но сильно не напрягайтесь,
так и скажите,
что понятия не имеете почему так происходит.
За более чем 20 лет что только вы не написали в квике.
--------------------
Возможно врач забыл скальпель в желудке  пациента .
И так бывает.
 
 
и еще поясню.
У вас на демо сервере сделки идут не чаще 1 раз в секунду.
если бы эта сделка была бы на следующем цикле, то время сделок отличалось бы на секунду
а там близнецы -сестры.  
 
nikolz, Лапуль, инкрементируйте айдишку КАЖДЫЙ раз. Если верно Ваше бредовое утверждение про близнецов, они ВСЁ РАВНО будут удваиваться в таблице. Квику НАСРАТЬ на эту айдишку, она формируется пользователем. А на Ваш говнокод реально глядеть тошно.
 
Цитата
nikolz написал:
Вы видите там вторую транзакцию?Ау , где вторая транзакция, кто тут ее посылает?

Если Вы не видите, это не значит что ее нет.
Жаль то приходятся в пятый раз повторять:
Цитата
Sergey Gorokhov написал:
Не бывает по одной sendTransaction две заявки с разными номерами. Даже теоретически.
Надо принять это как незыблемую аксиому. И пока Вы этого не сделаете, разобрать вообще никак не получится.

Цитата
nikolz написал:
Возможно врач забыл скальпель в желудке  пациента .

Посмотрите как сделано в документации, глава описания функции CandleExist
там не зря указано обнуление переменных при indx == 1
Возможно у Вас та же история, попробуйте обнулять переменные при первом индексе
 
Цитата
Sergey Gorokhov написал:
Цитата
nikolz написал:
Вы видите там вторую транзакцию?Ау , где вторая транзакция, кто тут ее посылает?

Если Вы не видите, это не значит что ее нет.
Жаль то приходятся в пятый раз повторять:
Цитата
Sergey Gorokhov написал:
Не бывает по одной sendTransaction две заявки с разными номерами. Даже теоретически.
Надо принять это как незыблемую аксиому. И пока Вы этого не сделаете, разобрать вообще никак не получится.

Цитата
nikolz написал:
Возможно врач забыл скальпель в желудке  пациента .

Посмотрите как сделано в документации, глава описания функции CandleExist
там не зря указано обнуление переменных при indx == 1
Возможно у Вас та же история, попробуйте обнулять переменные при первом индексе
про обнуление при indx=1
вот вам фрагмент кода.
---------------
if i==1 then nkInit(); i_old=1; return end
-----------
а вот вам и обнуление
-------------
Код
local function initT(sec,clas,account,client)
   tS={};     tS[0]=0; for i=1,7 do tS[i]={0,0} end  --стоп заяки
   tO={};    tO[0]=0; for i=1,7 do tO[i]={0,0} end  -- заявки
   tOi={};tOi[0]=0; for i=1,7 do tOi[i]={0,0} end  --транзакции заявок
   tSi={};tSi[0]=0; for i=1,7 do tSi[i]={0,0} end  --транзакции стоп-заявок
   id,nOrder,nStop,obal,tbal,nto,nts=0,0,0,0,0,0,0; jD=-1;
   step,lot_size,scale=0,0,0;
--   Log:write("sec="..tostring(sec)..",clas="..tostring(clas)..",tS0="..tostring(tS[0])..",tO0="..tostring(tO[0]).."\n");   Log:flush()
-----------------
end
---------------
local function nkInit()
--   DelAllLabels(tag);
   tinfo=getDataSourceInfo();
   clas=tinfo.class_code;   sec=tinfo.sec_code;    tag=sec;    pname=tinfo.param;
   interval=tinfo.interval;
   Log=io.open(path_Log..name..sec..".log","w")
   client=Settings.client;
--   Log:write("sec="..tostring(sec)..",clas="..tostring(clas)..",client="..tostring(client).."\n");   Log:flush()
    t_acc={};
--- определяем торговый счет
   local N=getNumberOf("trade_accounts");
   for i=0,N-1 do  z=getItem("trade_accounts", i);
      if string.find(z.class_codes,clas,1,true) and z.status==0 then
         firmid=z.firmid;    account=z.trdaccid; break;
      end
   end
-----------------------------
end
У меня к Вам просьба.
в будущем, когда у Вас возникнет желание ответить на мои вопросы,
не надо мне рассказывать банальные вещи в программировании.
-------------------
Если не можете что-то подсказать дельное по существу вопроса,  то лучше молчите.
--------------------
Я профессионально разрабатывал и более крутые системы РВ  и ИИ.
-----------------
Если бы вы, как все серьезные разработчики выложили API к QUIK и описали ее работу,
то я бы Вас не спрашивал а сам разобрался бы( да и разберусь)
----------
Пока же Вы за более чем 20 лет нагородили большой "черный ящик",
теперь  засунули туда виртуальную машину которая потока не безопасная и работает в в окружении десятка потоков,
-----------------------
Поэтому спрашиваю Вас про Ваш "черный ящик", под названием QUIK.
 
Цитата
nikolz написал:
вот вам фрагмент кода.
Жаль что код приходится проверять построчно

Цитата
nikolz написал:
а вот вам и обнуление
И?

Цитата
nikolz написал:
У меня к Вам просьба.
Николай, у меня к Вам тоже просьба, давайте без эмоций.

Цитата
nikolz написал:
Я профессионально разрабатывал и более крутые системы РВ  и ИИ.
Рад за Вас


Цитата
nikolz написал:
Код

Ничего из кода относящегося к проблеме не видно. Не тот код?
Вы жалуетесь на переменную id, так и где она в nkInit?
 
Ставлю заявку, снимаю заявку.
В результате 2 заявки, ни одной снятой на скриншоте.
Где ошибка? Ответ очевиден.
 
Николз, нужен полный код. Для возможности анализа, повторения.
За фрагменты на любом форуме посылают лесом, порой в грубой форме.
Здесь напрасно нянькаются.
 
nikolz, Лапуль, Вы можете-хоть 100500 лет разрабатывать свои крутые системы РВ и ИИ - это никак не влияет на тот медицинский факт, что Вы полуграмотный чайник, и в программировании не соображаете от слова совсем - у Вас это написано НА ЛБУ. Код - идиотский, гипотезы - идиотские, подтверждения этому бреду даже в результатах так называемых тестов и близко не просматривается, тон постингов близок к истерике, а это означает, что Вы и сами догадываетесь, что в программировании Вы никто и звать Вас никак.
 
Цитата
swerg написал:
Николз, нужен полный код. Для возможности анализа, повторения.
За фрагменты на любом форуме посылают лесом, порой в грубой форме.
Здесь напрасно нянькаются.
попробую сделать короткий вариант.
но прежде сделаю еще одну попытку объяснить.
Это тест-индикатор и запускается он на демо сервере.
в нет три функции
1- проверяет есть ли неисполненные транзакции
эта функция ничего не отсылает, а выдает лишь число активных транзакций
2- посылает транзакцию на выставление заявки если функция 1 выдала 0
3- проверяет есть ли активные заявки и если есть снимает их
---------------------
Таким образом , в on Calculate крутятся эти три функции
-----------------
В этих функциях есть два места вывода транзакций
в функции 3- в выставлении заявки
вот это место
---------------------------
Код
id=id+1; t1.TRANS_ID=tostring(id);    -- Уникальный идентификационный номер заявки,  от «1» до «2 147 483 647»
local str=sendTransaction(t1); --отправить транзакцию
Log:write("str="..tostring(str)..",id="..tostring(id).."\n");   Log:flush()
Обратите внимание на следующее:
id- идентификатор  всегда увеличивается на 1 перед записью в транзакцию
Сразу после отсылки транзакции выводится в лог сообщение транзакции и id
----------------
таким образом, если в этом месте будет выдано две транзакции
то они будут иметь разные id и в лог файле будет две записи
==========
второе место отсылки транзакции в функции 2
------------------
вот это место
Код
   id=id+1; t1.TRANS_ID=tostring(id);  -- Уникальный идентификационный номер заявки
   local str=sendTransaction(t1);   --отправить транзакцию
   Log:write("str2="..tostring(str)..",id2="..tostring(id).."\n");   Log:flush()
логика та же, что и выше.
==========================
смотрим лог файл:
Код
str=,id=2173
str2=,id2=2174
str2=,id2=2175

Есть одно сообщение о выставлении заявки с id=2173
и далее два сообщения (id=2174 и id=2175) о снятии двух заявок.
а это таблица заявок


 
 
таблица заявок:
 
 
nikolz, Как обычно, бред от начала до конца. Не бывает в природе неисполненных транзакций, бывают неисполненные заявки. Само определение транзакции говорит, что она может быть либо исполнена полностью либо не исполнена вообще, никаких промежуточных состояний у неё нет и быть не может - по крайней мере, видимых со стороны.

Какое собачье дело клиента, что там творится на сервере? Нормальные люди заводят стек активных заявок У СЕБЯ В СКРИПТЕ и ждут, когда информация о событиях, происходящих с ними, будет доставлена скрипту, а не лезут своими кривыми ручонками туда, где они только путаются под ногами.

И не надо брехать - в Вашем фрагменте так называемого кода чёрным по белому:
t1.TRANS_ID=tostring(id+1);
То есть айдишка НЕ увеличивается. И это ПЕРВОЕ ЖЕ, что тут написано. И смотреть дальше этот говнокод тупо не возникает ни малейшего желания.
 
Проблему решил.
Всем спасибо.
 
Цитата
nikolz написал:
по одной транзакции выставились две заявки близнецы.
Цитата
nikolz написал:
Проблему решил.

И в чём же проблема была? Каким образом решили проблему?
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:
Цитата
nikolz написал:
по одной транзакции выставились две заявки близнецы.
 
Цитата
nikolz написал:
Проблему решил.

И в чём же проблема была? Каким образом решили проблему?
хотите узнать, пишите в личку.
 
теперь все х'океу:
 
 
Цитата
nikolz написал:
хотите узнать, пишите в личку.
Да мне в общем-то без надобности. Я так-то считаю, что вы сами накосячили, а теперь вам стыдно признаться.
Надо делать так, как надо. А как не надо - делать не надо.
Страницы: 1
Читают тему
Наверх