Теоретическая разница получения данных CreateDataSource+SetUpdateCallback или getNumCandles()+getCandlesByIndex(), В чем разница получения данных 1 способом и 2 способом
Николай Камынин написал: CreateDataSource+SetUpdateCallback - получаем данный в момент прихода их с сервера,
Т.е если таймфрейм установлен в 3 минуты - то получение данных ~ 1 раз в 3 минуты, т.е. объективную информацию по последней свечке(текущей) мы не знаем, знаем только по предпоследней?
нет не так. Будут приходить тики, которые отображаются как close не закрытой свечи. Т е фактически вне зависимости от тайма Вы будете получать тики.
Теоретическая разница получения данных CreateDataSource+SetUpdateCallback или getNumCandles()+getCandlesByIndex(), В чем разница получения данных 1 способом и 2 способом
Разница в следующем: ------------------------------------ CreateDataSource+SetUpdateCallback - получаем данный в момент прихода их с сервера, т е до помещения в хранилище в терминале. т е один раз, в момент поступления в терминал. ------------------------------------------ getNumCandles()+getCandlesByIndex() - читаем данные из хранилища. Сколько угодно раз после поступления в хранилище терминала.
В системах реального времени используется Watchdog. Это таймер, который необходимо перезапускать через время, меньшее, чем его срабатывание. Если его не перезапустили, то он вызывает прерывание и начинает посылает сообщения об ошибке. Если его вовремя кормят, то он молчит. Можете применить такой же способ.
Тогда при таком требовании, Вы должны отдавать себе отчет в том, что когда программа выжрет всю оперативку (а при наличии на машине ее меньше 4Г это случится очень быстро) вся система просто встанет колом.
...
А если оперативки 8 ГБ, есть ли разница? Quik же бывает только 32битный, т.е. не может использовать всю память? Т.е. вопрос: можно ли на нем развертывать большие проекты на клуа с сотней ботов?
Большой проект с сотней роботов невозможно развертывать в QLUA . По двум причинам - медленность VM LUA и медленная реакция QUIK. При сотнях роботов надо использовать многопоточность, API C for LUA, и выделенные сервера. При использовании API C нет проблем задействовать любой объем оперативной памяти.
Когда не было в квике луа решал эту задачу на avtoit. Сейчас это делается с помощью winAPI в LUA , используя модуль Alien. Если умеете писать на СИ, то с помощью API C for LUA. .
проблема в том, что на компе нет библиотек, которые есть на компе разработчика. проверьте свою dll на зависимости на компе разработчика и пользователя. Потом установите у пользователя недостающие библиотеки среды разработчика. обычно это делается через манифест. читайте у майкрософт.
помогите исправить ошибку attempt to index field(a nil value), при запуске скрипта если стакан не полный то вылезает ошибка attempt to index field(a nil value)
Роман написал: s_mike@rambler.ru - визжишь ты, сливая деньги на счете. Тебе написали что вопрос не в программирование, а в алгоритме запуска скрипта!
Вот так поедешь в отпуск, а на бирже очередной сбой, график косой, скрипт запрашивает Клоз, а его нет и программа падает и не запускается, а цена идёт против тебя. А ты жопу греешь на солнце не зная об этом. Если бы скрипт запустился следующий раз, то он пошел бы дальше работать оставив ошибку в логе, так как биржа бы исправила косяк.
Sergey Gorokhov - да, это же ваши косяки или косяки биржи - это ошибку вызывают.Как от вас избавишься? Или выпускайте продукт, что бы вообще не одной ошибки не было в нём. А то сидите и рассказываете задним числом как работать надо!
Посмотрите на проблему немного иначе. КВИК , по определению, это программа подачи поручений брокеру. Есть другие способы подачи таких поручений -телефон, бумажный носитель. -------------------------------------- Все , что есть в квике кроме возможности подачи поручений - это бесплатное приложение (Увы, но это юридически именно так). --------------------------------------- Поэтому получается, что никто ничего Вам не должен. --------------------------------------------- Полагаю, что не только Вам хочется, чтобы скрипт работал вечно и без вмешательства. Но увы, реалия такова, что если скрипт написан плохо, то КВИК то квик его закрывает. Так сделали разработчики и это их право. -------------------------------------- Хотите иначе - пишите пожелания, делайте проверки внутри скрипта, ставьте защиту от падения. Ваше право. ----------------------------- Успехов.
Sergey Gorokhov написал: Для решения проблемы не используйте относительные пути при доступе к сторонним файлам.
Там нет относительных путей! Понятно что скрипт доделывать нужно, но одно если он был запущен - то нужно и запускать каждый раз когда загружается квик, а не выключать загрузку скрипта при каком либо сиюминутном сбое! Там х.з. что может быть (биржа мутит как), мы же не можем прописать всё и вся сразу!
так как скрипт без ошибок надо запускать лишь один раз, то Полагаю,что у Вас следующая проблема: ------------------------- Когда Вы запускаете скрипт кнопкой, то в КВИКЕ уже загружены все данные, которые использует Ваш скрипт и он нормально запускается. ------------------------ Потом Вы выключаете КВИК. При следующем запуске КВИКА с включенным скриптом, скрипт начинает работу сразу же при запуске КВИКА, но информация с сервере еще не пришла. В результате Ваш скрипт натыкается на nil и завершает свою работу по ошибке. ------------------------- Вы полагаете, что скрипт был выключен при закрытии КВИКА, а он просто не может возобновить свою работу. ------------------------- В результате Вы опять вынуждены его запускать нажатием кнопки при новом запуске КВИКА. -------------- Верно ?
не совсем то, так как QLUA на основе Lua 5.1 в которой /* @@ LUAI_MAXCALLS limits the number of nested calls. ** CHANGE it if you need really deep recursive calls. This limit is ** arbitrary; its only purpose is to stop infinite recursion before ** exhausting memory. */ #define LUAI_MAXCALLS 20000 /* @@ LUAI_MAXCSTACK limits the number of Lua stack slots that a C function @* can use. ** CHANGE it if you need lots of (Lua) stack space for your C ** functions. This limit is arbitrary; its only purpose is to stop C ** functions to consume unlimited stack space. (must be smaller than ** -LUA_REGISTRYINDEX) */ #define LUAI_MAXCSTACK 8000
дополню предыдущий ответ. Полагаю, что такая ситуация не возникает, так как свечи рассчитывает сервер. Поэтому терминал принимает их пакетом . Пропуск внутри пакета невозможен, так как сервер рассчитал пакет свеча за свечой.
При открытии графика все свечки строятся сразу или возможна ситуация что данные по какой то свече не пришли а через пару тиков появились и эта свеча нарисовалась?
Должны всегда строиться сразу, согласно таблицы обезличенных сделок.
Вот слово должны немного смущает. Вопрос возник по следующей причине: В мт5 могут быть получены не все данные, но при появлении новых данных, в индикаторе, есть параметр: prev_calculated (рассчитанных баров ранее) который обнуляется и на следующем тике я проведу расчёт по более полной истории. Здесь у меня ничего подобного нет, поэтому и решил уточнить. В таком случае, если мне нужно в одном индикаторе для расчёта получать данные по разным бумагам, синхронизировав данные единожды, я больше к этому вопросы могу не возвращаться ? или с синхронизацией есть какие-то другие подводные камни ?
Это не так просто как кажется, так как могут быть интервалы в которых нет сделок в одном из инструментов.
Вызов в форме return functioncall называется концевым вызовом. Lua также поддерживает концевой вызов «себя» (или рекурсивный концевой вызов): в этом случае вызванная функция использует стек вызывающей функции. Поэтому количество вложенных концовых вызовов может быть любым. Заметим только, что концевой вызов стирает отладочную информацию о вызывающей функции.
А разве это не верно: Для получения размера стека используйте функцию lua_checkstack. Для вызова из Lua кода на C необходимо иметь в наличии свободной памяти по крайней мере на LUA_MINSTACK позиций стека. LUA_MINSTACK по умолчанию равно 20. Если размера стека не хватает, его можно увеличить функцией lua_checkstack.
Sergey Gorokhov написал: Проверьте настройки терминала меню Система - Настройки - Основные настройки в "Получение данных" установить галку "Исходя из настроек открытых пользователем таблиц" в "Сохранение данных" установить галку "Данные, отражающие текущее состояние и всю историю изменений" и "Получать пропущенные данные"
Спасибо, все появилось.
Цитата
Sergey Gorokhov написал: Все проще, достаточно установить колбек через SetUpdateCallback
Ок, я сделал так:
Код
ds = CreateDataSource ( "SPBOPT" , "RI95000BI6" , INTERVAL_M1, "theorprice" )
lastCandleIndex = ds: Size ()
ds: SetUpdateCallback (ddd)
function ddd (idx)
if idx > lastCandleIndex then
message ( 'Свеча закрылась. Ее цена закрытия Close = ' .. ds:C(idx))
lastCandleIndex = idx
end
end
Но чем предыдущий код отличается от этого:
Код
new = getParamEx ( "SPBOPT" , "RI95000BI6" , "theorprice" ).param_value + 0
if new ~ = last then
message ( "новое значение " .. new)
end
last = new
Выдают они в одно и то же время одно и то же значение. Или я опять в коде с CreateDataSource намудрил? Если посмотреть на график теоретической цены, то на нем нет горизонтальных линий. Лишь экстремумы, правда не с интервалом в 1 минуту.
Т.е. обновление теории на то же самое значение не бывает и я зря вас мучаю? Достаточно просто ждать актуального изменения и работать?
В первом случае Вы получаете все значения. Во втором лишь значения из срезов пришедших в ТТП. Т е во втором случае возможны пропуски.
помогите исправить ошибку attempt to index field(a nil value), при запуске скрипта если стакан не полный то вылезает ошибка attempt to index field(a nil value)
Алекс Лепс написал: Спасибо за вашу помощь, я попробую переделать.
В примере написано две проверки первый if проверяет существования стакана и очереди в нем Циклы делаются по фактической длине очереди У вас циклы делались на фиксированную длину очереди. Примерно так.
помогите исправить ошибку attempt to index field(a nil value), при запуске скрипта если стакан не полный то вылезает ошибка attempt to index field(a nil value)
mm=getQuoteLevel2("SPBFUT","NKZ6") if mm and mm.bit_count and mm.offer_count then ------------------------- local n=mm.bid_count; while n>0 do a0=mm.bid[n].quantity b0=mm.bid[n].price c0=math.ceil(b0*1000000) d0=tostring((c0/1000000)+1) n=n-1; end ------------------------ n=mm.bid_count; while n>0 do aa0=mm.offer[n].quantity bb0=mm.offer[n].price cc0=math.ceil(bb0*1000000) dd0=tostring((cc0/1000000)-1) n=n-1 end -------------------- end ----------------------------------- -примерно так
помогите исправить ошибку attempt to index field(a nil value), при запуске скрипта если стакан не полный то вылезает ошибка attempt to index field(a nil value)
mm=getQuoteLevel2("SPBFUT","NKZ6") if mm and mm.bit_count and mm.offer_count then a0=mm.bid[mm.bid_count-i].quantity <--------ОШИБКА ЗДЕСЬ b0=mm.bid[mm.bid_count-i].price c0=math.ceil(b0*1000000) d0=tostring((c0/1000000)+1) aa0=mm.offer[mm.offer_count-i].quantity bb0=mm.offer[mm.offer_count-i].price cc0=math.ceil(bb0*1000000) dd0=tostring((cc0/1000000)-1) end
А премию за выявленную ошибку? Вот сейчас работаю с SDK на чип , так фирма за каждую выявленную ошибку всем желающим выплачивает 2000$. Вам тоже не мешало бы перенять опыт передовиков.
Алексей Орешкин написал: 3. Правильно ли я понимаю что функцию main в роботе могу и не использовать, тогда скрипт выполнится 1 раз и всё, далее он будет завершён? А если я без этой функции просто поставлю цикл while что будет тогда, он будет там постоянно крутиться ?
александр михальцов написал: Хочешь сказать что я хочу купить пакет акций, на один квартал то мне нужно вломится в кабинет брокеру и сказать ему , там один на форуме посоветовал что только в письменном виде это возможно. Брокер скажет эй трейдер иди сюда я тебе покажу как это в терминале делается. А я сделаю вывод что 90% трейдеров это- мудаки
Попробую пояснить. КВИК - это способ подать заявку брокеру. Но это не единственный способ. Проблема КВИКА в том, что из него заявки, при наличии денег, уходят в торговую систему в текущие торги, либо исчезают в прошлом. И по-существу КВИК это система заявок на один день. ------------------------------------------ Если Вы хотите купить по какой-то цене, которая будет исполнена возможно в следующем году, то это делается просто - надо дать брокеру поручение в письменном(бумажном виде) до отмены. Т е приносите в офис поручение и вручаете брокеру. И все. ------------------------- Брокер обязан его принять и исполнить при возможности и сообщить Вам об исполнении. Если до исполнения передумаете, то принесете бумажку об отмене поручения.
Василий Арефьев написал: Спасибо, я нашел взаимосвязи между таблицами. Но в решении второго вопроса это не помогло.
Перефразирую, какое поле в таблице заявок или сделок ссылается на саму себя и указывает на заявку или сделку ранее открытую? Например, сделана заявка №100 на продажу, далее позиция закрыта заявкой №101 на покупку. Как узнать, что заявка №101 закрывает заявку №100? То же самое и по таблице сделок. Или эти две строки одной таблицы никак не связаны и связь между строками заключается в равенстве количества, большей дате и обратной операции (Покупка -> Продажа)?
Заявки ничего не открывают и не закрывают. Поэтому существует связь заявка - сделка. Т к биржа - это место совершения независимых сделок.
На самом деле индикатор Fractals не совсем рассчитывается. Ведь расчет это когда из одного значения получается другое, а Fractals выбирает максимумы и минимумы из того что есть. Алгоритм поиска описан в документации на терминал
РАССЧИТЫВАТЬ, рассчитать, рассчесть, распределять счетом; сделать рассчет. Рассчитай, по чем на брата придется. Рассчесть кого, рассчитав что ему следует за работу, за службу, расплатиться и уволить его. На умах не рассчитаешь, не разочтешь, а на счетах разочту. | Рассчитывать на кого, на что, считать, полагаться, надеяться, основаться. На чужую помощь не рассчитывай. -ся, страд., взаимн. по смыслу. Мы с тобой еще не рассчитались, не разочлись, не покончили счетов. Разочлись - как вода разлилась (оба ни при чем). Рассчитыванье, -читанье, расчёт, действие по гл.; счет, выкладка, числовой вывод, с показанием всех данных. Расчет постройки, смета. Расчет с рабочими, с подрядчиком, разделка, расплата по счетам. У всякого свой расчет, свои виды, цели, намеренья. Тут нет расчета, не из чего, не для чего. Он сделал это без расчета, спроста, без задней мысли, без особенной цели; или нерассудительно, опрометчиво. Жить с рассчетом, бережливо, не издерживая лишнего. Мы с ним в расчете, рассчитались, квиты, поверстались. Конец игре-расчет. У купца расчет, а у покупателя другой (свой). В своей семье какой (что за) расчет! Расчётная книга, счет с каждым верителем и должником. Расчетливый, - тистый человек, соблюдающий во всем расчет, осмотрительный, осторожный в делах, бережливый: неидущий на неверные обороты, но и неупускающий надежных. Расчетливость жен. свойство, качество, способность эта. Расчетчик, -чица, делающий какой-либо расчет. Толковый словарь Даля. В.И. Даль. 1863-1866. ------------------------------------------------------------------------------ рассчитывать — Разбирать, соображать, смекать. См. намереваться … Словарь синонимов ----------------------------- т е индикатор Fractals рассчитывается.
PFelix написал: И есть ли в этом разница для калбеков OnAllTrade? Спасибо.
Все очень просто. Приходит пакет от сервера брокера в терминал. терминал начинает его разбирать(парсить) вытаскивает обезличенные сделки строчка за строчкой. Потом вызывает колбек и передает ему эту строчку. При возврате из колбека запихивает эту строчку в ТВС. ------------------------------------ Теперь можете ответить на свои вопросы сами. все, что пришло попадет сначала в колбек. Если это пришло раньше и уже есть в ТВС, то снова это не придет и в колбек повторно не попадет. Т е если Вы прервали работу своего скрипта, то при новом запуске будете принимать в колбеке пропущенные терминалом ( т е если был разрыв связи с сервером), а не вашим скриптом, и новые.
yako-v написал: Интересует сохранение и перевыставление снятых по оконч. сессии заявок ( перенос их в карман похоже невозможен ?). Есть такой пункт в меню ПКМ : сохр-ть заяв. в файл . Выбираю , сохраняю , присваивая имя файлу txt . Вопрос : 1. Как и когда можно правильно извлечь эти сохраненные заявки 2. Как преобразовать эти снятые заявки в стоп-заявки с укладыванием их в карман (или просто как их уложить в карман без подключения к серверу) ?
Как варианты: 1) сделать DDE таблицы заявок в Excel. 2) Написать скрипт который конвертирует записи из таблицы заявок в их первозданный вид для кармана или еще для чего угодно.
WennY написал: Доброго времени суток. Увы, ордера, полученные посредством getItem("stop_orders", i) идут по порядку начиная с первого и до последнего. В итоге чтобы получить последний ордер мне нужно как-то получить все стопы, пересчитать их и только затем уже ловить последний из них. Какие-то более цивилизованные методы существуют? Возможно я просто проморгал что-то в ФАКе. Спасибо.
Есть как минимум два способа решения этой задачи. 1) Каждый раз делать полный перебор - поиск по таблице (это Вы написали) - самый простой и самый затратный способ. Самый затратный способ. Особенно, если стопы постоянно переставляются. -------------------------------- 2) Использование OnStopOrder. В этом случае Вы через OnStopOrder. получите новый стоп. Но если запустите свой скрипт повторно при наличии активных стопов, то придется применить способ 1, так как OnStopOrder уже не сработает на существующие и ранее принятые квиком стопы. ======================== В том случае, когда Вы не пользуете колбеки (например при создании робота в индикаторе) возможен лишь способ 1 из известных. ============================. Рассмотрим мой алгоритм решения данной задачи. Этот алгоритм я разработал еще до внедрения VM LUA в КВИК и использовал его в QLUA. Он в десятки и сотни раз повышает быстродействие роботов , работающих со следящими стопами на тиках. В некоторых случаях без этого алгоритма Ваш робот просто перестанет работать, так как загрузит процессор переборам тысяч мертвых стопов. ------------------------------- Пользуйтесь: --------------------------------- 3) Алгоритм Николая Камынина(kamnik@mail.ru): Полный перебор таблицы стопов делаем один раз при запуске скрипта. В процессе этого перебора мы запоминаем в таблице (назовем ее списком активных стопов) номера строк активных стопов из таблицы стопов. ---------------------------------------- Таким образом мы получаем список строк с активными стопами. Если у нас всегда лишь один активный стоп, то в списке будет лишь одна запись. -------------------------------- Теперь посмотрим, каким образом мы будем работать дальше. ----------------------------------- Чтобы проверить состояние последней стоп заявки мы всегда читаем из таблицы стопов строку по ее номеру в списке. ----------------------------------- Т е полный перебор мы делаем всего один раз при запуске. после этого нет никаких переборов вообще. ---------------------- Кроме того, необходимо решить задачу обнаружения выставления новой стоп заявки. --------------------------------------- Эта задача решается путем сравнения числа строк таблицы стоп-заявок на предыдущем тике и на текущем. Если выставлена новая заявка, например вместо снятой или передвинутой, то число строк в таблице стоп заявок увеличится и это есть признак что есть новая стоп заявка , а ее номер строки определяется через число строк таблицы. ------------------------ Если активных стопов много, то мы периодически проверяем по нашему списку их активность и удаляем из списка неактивные. ----------------------------------- Таким образом получаем следующее преимущество перед полным перебором: Как правило роботы со следящими стопами порождают тысячи стоп-заявок, которые все забивается в таблицу стоп-заявок. при полном переборе мы на каждом тике перебираем эти тысячи. В моем алгоритме такой перебор делается лишь при запуске робота. В результате данный алгоритм в десятки и сотни раз быстрее полного перебора. ------------------------------------------------ На этом лекция на тему: "Как создать умного робота, который никогда не умрет" завершена. -------------------------- Всем спасибо, все свободны.
Imersio Arrigo написал: Че вы гадаете :( В мануале на квик все написано:
[img]data:image/png;base64,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[/img] Я считал по этой формуле - все сходится. Не нужно изобретать двухколеное ТС.
Цитата
Николай Камынин написал: если обратитесь к литературе, то обнаружите, что EMA это простейший цифровой фильтр с бесконечной импульсной характеристикой. Так как фильтрацию делаем на конечном интервале, то вне 3000 значений мы как бы придумываем
Если вы обратитесь к этой литературе сами, то обнаружите что БИХ-фильтр - с бесконечной ХАРАКТЕРИСТИКОЙ, а не рядом входных значений. т.е. входное значение может быть одно, а отклик фильтра - бесконечным. Ну так, к сведению :)
Да, дремучий лес. отклик будет полубесконечным, т е начнется он лишь с первого отсчета из 3000 а до первого отсчета - Вы придумываете сами.
Как начинающему, советую начать с изучения языка луа на простых примерах. потом написать эти индикаторы самостоятельно по формулам инета. В результате размер кода будет раз в 10 меньше (получится примерно 5 строчек кода) и исполняться будет быстрее и у Вас будет понимание того, что делаете. -------------------------------------- Примечание: Если не обращать внимание на громкие и пустые фразы вокруг этих индикаторов, то реально индикаторы по сути самые примитивные фильтры первого порядка. Реально показывают лишь слабые знания математики и богатое воображение у их автора.