Тестирую в демо версии выставление заявок фрагмент кода такой:
Код
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 написал: по одной транзакции выставились две заявки близнецы.
Еще раз
Цитата
Sergey Gorokhov написал: Значит было две транзакции, а не одна. Найдите кто отправил вторую транзакцию
Не бывает по одной sendTransaction две заявки с разными номерами. Даже теоретически. Однозначно было две транзакции
Я Вам привел фрагмент кода и данные из лог файла. ID в коде меняется следом за посылкой транзакции. ================== Намекните, как в индикаторе можно отправить вторую заявку из другого места? в каком месте индикатора есть дополнительные потоки, исполняющиеся параллельно с этим фрагментом кода?
nikolz написал: как в индикаторе можно отправить вторую заявку из другого места?
При чем тут индикаторы? Вы наверное считаете что раз пишите индикатор, то все на форуме в курсе про это? Ну допустим. Если речь про индикаторы то OnCalculate может сработать несколько раз, смотрите в эту сторону Или может у Вас несколько разных индикаторов с одним алгоритмом, кто знает
И еще раз, а то вдруг не понятно
Цитата
Sergey Gorokhov написал: Не бывает по одной sendTransaction две заявки с разными номерами. Даже теоретически.
nikolz, Хоспидя, через какую жопу можно простейшие действия выполнять... Да в код глядеть тошно, не говоря уже про читать "тщательно разжёванное". s=sendTransaction(A); if s~="" then F:write("Result="..s.."\n");end; Всё остальное на помойку, не читая.
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 Возможно у Вас та же история, попробуйте обнулять переменные при первом индексе
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, Лапуль, Вы можете-хоть 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); То есть айдишка НЕ увеличивается. И это ПЕРВОЕ ЖЕ, что тут написано. И смотреть дальше этот говнокод тупо не возникает ни малейшего желания.