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.
Это другой случай. В моем примере, повторный вызов приведет к отправке транзакции с другим id на 1 больше так как id увеличивается в следующем операторе после транзакции.
и еще поясню. У вас на демо сервере сделки идут не чаще 1 раз в секунду. если бы эта сделка была бы на следующем цикле, то время сделок отличалось бы на секунду а там близнецы -сестры.
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 лет что только вы не написали в квике. -------------------- Возможно врач забыл скальпель в желудке пациента . И так бывает.
Владимир написал: nikolz, Всё никак не уймётесь, лапуль? Говно этот Ваш индикатор, ИДЕОЛОГИЧЕСКОЕ говно. И Вы абсолютный чайник, сподобившийся тут ликбезы проводить. Шли бы Вы из программистов, лапуль, куда-нибудь, где Вы ХОТЬ ЧТО-ТО соображаете.
говно у Вас в голове и поэтому словесный понос на форуме.
Посоветуйте как правильно передавать данные?, доступ в квик стороннему программиста без права выставления реальных ордеров (для тестирования стратегии)
Илья написал: nikolz, Glukator, Старатель,спасибо за советы. Демо счет уже открыл и не демо тоже) Сейчас у меня получилось через DDE в Excel выгружать данные (по строчно) с интервалом раз в 1 минуту.
Еще раз, окончательный вопрос звучит так: Как из QUIK получать данные из стандарных столбцов приземляя их например в Python для дальнейшего анализа? Куда копать?
nikolz написал: по одной транзакции выставились две заявки близнецы.
Еще раз
Цитата
Sergey Gorokhov написал: Значит было две транзакции, а не одна. Найдите кто отправил вторую транзакцию
Не бывает по одной sendTransaction две заявки с разными номерами. Даже теоретически. Однозначно было две транзакции
Я Вам привел фрагмент кода и данные из лог файла. ID в коде меняется следом за посылкой транзакции. ================== Намекните, как в индикаторе можно отправить вторую заявку из другого места? в каком месте индикатора есть дополнительные потоки, исполняющиеся параллельно с этим фрагментом кода?
Добрый день, Всем В качестве ликбеза для буратин и чайников, привожу результаты тестирования скорости исполнения выставления и снятия заявки в роботе, который реализован в индикаторе. ------------- кратко в чем преимущество такой реализации относительно реализации в виде скриптов. ================ 1) нет надобности писать колбеки и разбираться в них. ---------------- 2) робот можно сделать одинаковым для любых инструментов Например робот автомат управления стопом. --------------------- 3) проще реализовать, так как нет надобности заморачиваться с фильтрацией инструментов. На какой график кинете этого робота, на том инструменте он и будет работать. ================= А теперь о скорости его работы. Тест, в котором выставляется заявка, когда она выставится, робот ее снимает. при этом он проверяет таблицу стоп-заявок, заявок и депо. ================= На выставление заявки уходит примерно 0.006 сек На проверку активной заявки и выставление заявки на снятие уходит примерно выставление заявки на снятие уходит примерно 0.004 сек -------------------------- время в мкс:
Не понятно, что значит забивает присутствием. Поставьте вывод занятой памяти перед ней и после нее. ------------------------- что колбек , что не колбек - на память не влияет.
Тестирую в демо версии выставление заявок фрагмент кода такой:
Код
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 одинаковыми параметрами и в одно и тоже время. ------------------------ Что не так?
Дмитрий написал: quik 9.7.1 простой код, за несколько минут занимаемая память разбухает до более 10 Мб, запускается в lua 5.4.1
Код
function main ()
while true do
sleep ( 1000 )
end
end
function OnQuote (class, sec)
if ((class = = "SPBFUT" ) and (sec = = "SiU2" )) then
local ql2 = getQuoteLevel2 (class, sec)
-- что-то делаем
end
end
попробуйте тоже на другой версии. возможно так задумано уже давно?
Посоветуйте как правильно передавать данные?, доступ в квик стороннему программиста без права выставления реальных ордеров (для тестирования стратегии)
Glukator написал: Может, я чего-то не понимаю, но нахрен такие сложности? Откройте демо-счет с квиком у любого брокера и отлаживайте свои скрипты, покуда терпения хватит.
Вы вопрос читали? Тогда отвечайте на вопрос, а не рассказывайте очевидные вещи. открыть демо счет или у другого брокера - это ответ для дебилов, которые совсем уж ничего не знают, но это не ответ на вопрос. ------------------ Если предложить по существу вопроса не можете так зачем выпендриваться?
Алексей написал: Об этом я в курсе. Задумка была такая, в эту таблицу я загоняю интересующие меня инструменты, а уже из нее я скриптом считываю только их и ничего больше. Может есть другой путь? Сама таблица "Текущие торги" меня вообще не интересует, принципиально я могу скриптом создать таблицу, но как в нее загнать интересующие меня инструменты? Понятно что скриптом без проблем, но принцип должен быть тот же, что и с таблицей "Текущие торги". Т.е. по сути, таблица должна указывать скрипту с чем работать, а инструменты добавляю и удаляю я сам из рабочего пространства Quik.
Алексей написал: Всем доброго времени суток. Есть такой вопрос. В терминале Quik есть таблица "Текущие торги #2". Создана прямо из оболочки Создать таблицу -> Текущие торги. В этой таблице находится весь список инструментов меня интересующих. Задача. Могу ли я получить из этой таблицы как минимум class_code и sec_code по каждому инструменту из этой таблицы? Или это в принципе невозможно? Зная идентификатор таблицы я думаю можно без проблем проделать такой фокус, но я его не знаю и понятия не имею где его достать.
непосредственно из таблице нет, но все инструменты и классы разрешенные Вам в терминале , т е то, что Вы можете выбрать в эту таблицу вы можете получить функциями из библиотеки QLua. Все есть в документации на эту библиотеку. см раздел Функции для обращения к строкам произвольных таблиц QUIK если каких то параметров не хватает то можно дозаказать см раздел Функции для заказа параметров Таблицы текущих торгов
Евгений Васильевич, но возможно, что вы не учли комиссионные сборы брокера и биржи и в итоге получите среднюю 96,66 -------------------- К сожалению, а этим показателем вообще не заморачиваюсь. поэтому не удержался от "погадать" ================ Мой совет, оцениваете успешность сделок по количеству денег на счете.
Евгений Васильевич, waprice - транслируется биржей и это цена на бирже всех сделок. ------------------ В вашем случае, средняя цена Вашей покупки 96,59, говорит, что вы купили ниже средней по рынку 96,66. С чем Вас и поздравляю.
Евгений Васильевич, И на вашей улице будет праздник. если использовать правило, "когда все сломал, то читай инструкцию", то Вот что пишет для Вас биржа: ======================================== Ценовые показатели на Фондовом рынке Московской Биржи
Особенности порядка расчета ценовых показателей
Особенности расчета ценовых показателей для инструментов, сделки с которыми могут заключаться в разных валютах
Если сделки с ценными бумагами заключаются в нескольких валютах, то осуществляется пересчет в рубли по курсу Банка России на дату заключения сделки.
Для облигаций цена сделок выражается в % от номинальной стоимости облигации
Попробуйте пересчитать цену Ваших облигаций и затем средневзвешенную. ------------------ Как говориться в Уставе КА: "О выполнении доложить"
Евгений Васильевич написал: nikolz, ------------------------ Я прав или нет? ------------------------ Да, прав, прав. Расчет тут абсолютно верен. Давайте больше формулу расчета средневзвешенного значения не обсуждать. Мы говорим об одном и том же. =) Проблема в том, что не сходятся эти расчеты со значениями в QUIK. Я всё про свой пример. Две облигации по 96,4 и одна по 96,98 (96,4*2 + 96,98)/3 = 96,59, но не 96,66 (которые рассчитал мне QUIK). Вот в чем вопрос. И вот еще: "если по итогам торгового дня Средневзвешенная цена не была рассчитана, она не приравнивается к Средневзвешенной цене предыдущего торгового дня" Это еще как понимать? Вчера я купил акции и рассчитал Средневзвешенную цену, а сегодня не покупал и уже не могу оперировать вчерашним значением ...
Судя по документу, средневзвешенная цена рассчитывается на торговый день. --------------------------- Если Вы хотите учитывать предыдущие расчеты, то делайте это своими руками. Очевидно это связано с тем, что биржа не хранит историю Ваших сделок. Поэтому у биржи нет возможности пересчитать цену с учетом истории. --------------------------------------------- Но разработчики квика могут это допилить при желании. -------------------- Про покупку Вами облигаций сказать ничего невозможно , так как надо видеть реальные данные сделок, а не то, что "вчера коза сказала". ------------------------ Телепатии не обучен, а гадать нет желания.
nikolz написал: средневзвешенная цена - это средняя цена, рассчитанная как арифметическое среднее. ------------ т е складываете все цены всех сделок и делите на число сделок. ------------------ Так как Вы считает не все сразу а по частям, то ранее рассчитанное вы снова восстанавливаете и снова все считаете для этого каждый раз все пересчитываете к новому количеству. ----------------- Но суть результата - сумму всех цен сделок делите на число сделок. ------------------------ Знаний в объеме ЦПШ или 4 классов начальной школы достаточно. --------------------------- Надо знать всего две арифметические операции -сложить и поделить (любимые операции финансистов) операции - отнять и приумножить (любимые фискальщиков) знать не обязательно.
.
Спасибо за ответ, но если честно, всю жизнь думал что среднее арифметическое и средневзвешенное это немного разные вещи. Zoya Skvorcova привела формулу для средневзвешенного и это не среднее арифметическое. Я полностью с ней согласен. Отличия лучше всего показать на примере. Одна акция по 100 рублей и 10 акций по 10 рублей дают среднее арифметическое в 55 рублей за акцию. В то же время, одна акция по 100 рублей и 10 акций по 10 рублей дают средневзвешенное примерно в 18,18 рублей за акцию. В этом примере дешевых акций больше и вес их в среднем больше. Вот и требуется средневзвешенное. Это на уровне моей ЦПШ. Если в чем-то не прав, уважаемый nikolz, поправьте. =)
nikolz написал: средневзвешенная цена - это средняя цена, рассчитанная как арифметическое среднее. ------------ т е складываете все цены всех сделок и делите на число сделок. ------------------ Так как Вы считает не все сразу а по частям, то ранее рассчитанное вы снова восстанавливаете и снова все считаете для этого каждый раз все пересчитываете к новому количеству. ----------------- Но суть результата - сумму всех цен сделок делите на число сделок. ------------------------ Знаний в объеме ЦПШ или 4 классов начальной школы достаточно. --------------------------- Надо знать всего две арифметические операции -сложить и поделить (любимые операции финансистов) операции - отнять и приумножить (любимые фискальщиков) знать не обязательно.
.
Спасибо за ответ, но если честно, всю жизнь думал что среднее арифметическое и средневзвешенное это немного разные вещи. Zoya Skvorcova привела формулу для средневзвешенного и это не среднее арифметическое. Я полностью с ней согласен. Отличия лучше всего показать на примере. Одна акция по 100 рублей и 10 акций по 10 рублей дают среднее арифметическое в 55 рублей за акцию. В то же время, одна акция по 100 рублей и 10 акций по 10 рублей дают средневзвешенное примерно в 18,18 рублей за акцию. В этом примере дешевых акций больше и вес их в среднем больше. Вот и требуется средневзвешенное. Это на уровне моей ЦПШ. Если в чем-то не прав, уважаемый nikolz, поправьте. =)
чтобы понять , кто прав рассмотрим следующий пример: Совершено 3 сделки: 3 акции по 1 руб , 3 акции по 3 руб , и 6 акций по 4 руб по моему мнению средневзвешенная цена считается так: (1*3+3*3+4*6)/(3+3+6)=3 рубля. ------------------------ Я прав или нет? Ответ на этот вопрос очень простой. В таких случаях я говорю буратинам и чайникам - Читайте документацию. ----------------- Читаем? Угу. ---------------- Вот выдержка из документов биржи по этому вопросу:
Аркадий написал: Здесь в сообщении просто не скопировалась. Причем, если переменной Z присвоить конкретное значение - то работает. А через функцию - нет
возможно у вас неправильное число десятичных знаков в цене получается после вычитания
средневзвешенная цена - это средняя цена, рассчитанная как арифметическое среднее. ------------ т е складываете все цены всех сделок и делите на число сделок. ------------------ Так как Вы считает не все сразу а по частям, то ранее рассчитанное вы снова восстанавливаете и снова все считаете для этого каждый раз все пересчитываете к новому количеству. ----------------- Но суть результата - сумму всех цен сделок делите на число сделок. ------------------------ Знаний в объеме ЦПШ или 4 классов начальной школы достаточно. --------------------------- Надо знать всего две арифметические операции -сложить и поделить (любимые операции финансистов) операции - отнять и приумножить (любимые фискальщиков) знать не обязательно.
Посоветуйте как правильно передавать данные?, доступ в квик стороннему программиста без права выставления реальных ордеров (для тестирования стратегии)
Посоветуйте как правильно передавать данные?, доступ в квик стороннему программиста без права выставления реальных ордеров (для тестирования стратегии)
nikolz написал: вам надо создать сервер доступный из интернет. далее используя socket транслируете данные на сервер.
И заплатить ещё программисту за создание этого сервера.
Цитата
Илья написал: Задача дать стороннему (!) программисту данные о торгах по акциям в реальном времени (ну или хотя бы минутными свечами) желательно без права выставления ордеров
У некоторых брокеров можно запросить ещё один аккаунт для квика, иногда за доп. плату. Спросите своего брокера о возможности предоставления вам "просмотрового" аккаунта.
Если я правильно понял автора, он хочет данные передать в реальном времени разработчику робота. Не знаю, доступно ли программирование в луа при просмотровом аккаунте.
вариант решения может быть такой: Например, написал dll, которая подгружает DDE сервер в КВИК. Это позволяет получить в lua любую таблицу КВИК, в том числе доску опционов.
Посоветуйте как правильно передавать данные?, доступ в квик стороннему программиста без права выставления реальных ордеров (для тестирования стратегии)
Посоветуйте как правильно передавать данные?, доступ в квик стороннему программиста без права выставления реальных ордеров (для тестирования стратегии)
Илья написал: nikolz, Какая будет при этом скорость обмена? (для моих задач достаточно настраиваемой в QUIK от 1 сек до 1 минуты устроит).
такая же как у вас сейчас с брокером. можете сделать еще быстрее для этого Вам надо поставить сервер на компе с квиком и затем сделать к нему доступ из интернета.
Boris написал: Есть исправно работающий обработчик стаканов. Хочется прикрутить вывод информации из Quik в сторонние приложения по средством организации передачи данных через socket сервер. Постоянно запускающаяся зацикленная функция вызываемая из main производит обработку и складирование данных в массив. Socket сервер - должен периодически выдавать эту информацию по запросу подключившегося клиента.
Для запуска в Quik сервера используется библиотека luasocket (под lua 5.4.1). Запуск ожидания коннекта ServerRun() - так же запускается из main. При этом после выполнения server:accept() - выполнение какого либо кода прекращается. Прекращается до тех пор пока на сервер не поступит запрос - он не выдаст ответ и только тогда функция table.load(var, 1000) будет запущена повторно. И тоже застопорится до поступления следующего запроса от socket клиента. client:settimeout(2) - должен вроде как прерывать ожидание коннекта и закрывать коннект - что поспособствовало бы продолжению выполнения иного кода, но этого не происходит. Пробовал многое - но ничего не помогло. Где бы в коде не запускалась server:accept() - она останавливает выполнение любых других функций. Как организовать запуск table.load(var, 1000) и ServerRun() - в раздельных потоках - так чтобы выполнение одной функции не останавливалось на период работы другой ? Код для примера (сильно сокращён)
Код
socket = require ( "socket" )
IPAddr = "127.0.0.1" --IP Адрес
IPPort = 3585 --IP Port
client = nil
function main ()
while is_run do
table.load (var, 1000 )
end
ServerRun()
end
function ServerRun ()
while is_run do
client = server:accept()
client:settimeout( 2 )
local line, err = client:receive()
local result = evalString(line)
if not err then client:send(result .. "\n") end
client:close()
end
end
function OnInit (quik_path)
server = assert( socket.bind ( "127.0.0.1" , IPPort))
end
У вас сервер запускает когда main завершает работу. Т е если main работает то сервер не запускается Вы должны его вставить в цикл main
Settings = {
Name = 'ParamRequest' ,
line = {
{ Name = 'ParamRequest' }
}
}
function Init ()
return # Settings.line
end
local class_code, sec_code
function OnChangeSettings ()
OnDestroy()
local DSI = getDataSourceInfo ()
class_code = DSI.class_code
sec_code = DSI.sec_code
PrintDbgStr (tostring(sec_code))
ParamRequest(class_code, sec_code, 'LAST' )
end
function OnCalculate (index)
if index = = 1 then
ParamRequest(class_code, sec_code, 'LAST' )
end
return nil
end
function OnDestroy ()
if sec_code then
CancelParamRequest(class_code, sec_code, 'LAST' )
end
end
При добавлении / удалении индикатора возникают ошибки:
Цитата
Function OnChangeSettings: ACCESS VIOLATION at address 000007FC524B89CC ACCESS VIOLATION at address 000007FC524B89CC
Что не так?
Предположу, что функция getDataSourceInfo вернула nil. Все дальнейшие действия привели к попытке обратится к несуществующему адресу памяти.
Скорее всего эта ошибка связана с функцией PrintDbgStr
Посоветуйте как правильно передавать данные?, доступ в квик стороннему программиста без права выставления реальных ордеров (для тестирования стратегии)
Подскажите пожалуйста как правильно дать доступ к данным и в каком формате?
Задача дать стороннему (!) программисту данные о торгах по акциям в реальном времени (ну или хотя бы минутными свечами) желательно без права выставления ордеров
Исходные данные находятся в настраиваемых колонках квика на примере Акций - Торговля (Код инструмента — Цена открытия — Количество сделок и тп) Для решении задачи сторонние API не подходят и нужен именно квик.
Интересует название самой технологии и примерный порядок действий.
Саму ТС уже придумал но нужно тестировать на реальных потоковых данных. Обратный тест на истории не подходит так как там есть только цена и временные интервалы.
Буду благодарен тому кто скажет в какую сторону "копать". Спасибо.
если сторонний пользователь удаленный, то вам надо создать сервер доступный из интернет. далее используя socket транслируете данные на сервер. сторонний подключается к серверу и получает от него данные. можно использовать технологию MQTT. Примерно так.
для тех кому лень читать (из документации Lua5.3):
/* @@ LUA_INT_TYPE defines the type for Lua integers. @@ LUA_FLOAT_TYPE defines the type for Lua floats. ** Lua should work fine with any mix of these options (if supported ** by your C compiler). The usual configurations are 64-bit integers ** and 'double' (the default), 32-bit integers and 'float' (for ** restricted platforms), and 'long'/'double' (for C compilers not ** compliant with C99, which may not have support for 'long long'). */
Владимир, Вы хотя бы иногда читали документацию на Lua 5.3 б прежде, чем написать эту чушь: -------------------- " Но народные Lua-умельцы тип integer вообще отменили, заменив его на дурацкий тип number" ------------- На форуме бывают дети, они же вам верят.
На самом деле, если Вы знаете до торгов какими конкретно инструментами будете торговать и Ваш робот работает по свечам на таймах не менее минуты, то колбеки вообще не нужны. ---------------------- При таких условиях , робота проще написать как индикатор, т е скрипты Вам тоже нафиг. ------------------------------------ В итоге у Вас получится универсальный робот, который без переделки можно запускать для любого конкретного инструмента. ----------------- Рекомендую всем, особенно буратинам и чайникам.
Glukator написал: Спасибо за ответ. Ваш подход мне понятен, и я с ним в большинстве согласен. В моем случае уход от любых асинхронных вызовов обусловлен дрянной связью (YOTA), которая имеет привычку отваливаться в любую секунду и восстанавливаться, когда ей вздумается. Отправив заявку, можно OnTrade и не дождаться. А через 10-15 минут, когда QUIK соизволит восстановить подключение после серии ошибок "вы уже работаете в системе", все равно придется разбираться с числом позиций, чтобы понять, что же за это время изменилось. В таких условиях работать на коротких таймфреймах невозможно, и надо в первую очередь обходить различные глюки связи.
Нули в trans_id мне пока не прилетали, возьму на заметку.
В вашем случае надо либо интернет настроить , либо установить квик на виртуальный сервер. Цена вопроса рублей 300 в месяц.
Юрий написал: Вот из-за того что первая сделка на разных инструментах приходит не всегда в одно и тоже время, у меня и получается вынос... Потому что один из инструментов в этот момент получается равен 0. Просто для spred это не критично, а для max/low - получается изкажение...
я это учел в своем варианте. если свечи нет, то результат не должен изменяться
Юрий написал: Хм. Попробую, но мне кажется было логично что их три. Ведь те по которым расчитывается spred вообще на другом графике... Я даже практиковал там другой таймфрейм, и всё работало (если не перезагружать основной график).
свечи формируются по времени , поэтому если тайм одинаковый то момент начала свечи будет синхронизирован при получении первой сделки после начала текущего кванта. ----------------------- Например , время 100000 и свеча будет создана при появлении первой сделки. -------------------- Если сделка не появилась, то свеча не создана. ----------------- Поэтому нет никакой разницы на каком графике инструмент.
function OnCalculate(index)
-- Получение свечей инструментов
C1=С(index);
C2=getCandleByTimeCode(Settings.tag2,timeCode).close
if C2 then
spr =C1-C2 -- Вычисление спреда
if index==1 then max=spr; min=spr - Settings.a;
-- Вычисление максимума минимума среднего для спреда
elseif spr>max_p then max = spr; min = spr - Settings.a;
elseif spr<min_p then min = spr; max = spr + Settings.a; end
med = (max+min)/2;
end
return spr,med,max,min
end
function OnCalculate(index)
-- Получение свечей инструментов
C1=С(index);
C2=getCandleByTimeCode(Settings.tag2,timeCode).close
if c2 then
spr =C1-C2 -- Вычисление спреда
if index==1 then max=spr; min=spr - Settings.a;
-- Вычисление максимума минимума среднего для спреда
elseif spr>max_p then max = spr; min = spr - Settings.a;
elseif spr<min_p then min = spr; max = spr + Settings.a; end
med = (max+min)/2;
end
return spr,med,max,min
end