Добрый день, есть рабочий код для вывода метки на график, но он работает только с 10 утра, если запускается до 10 утра то выдает ошибку в пункте 2 - attempt to concatenate a nil value (local 'm')
1. local h,m,t = string.match(getInfoParam("SERVERTIME"),"(%d%d)%p(%d%d)%p(%d%d)") 2. local time_pos = h..m..t
Не подскажете как поправить вывод, если это реально? Спасибо.
Верно понимаем, что скрипты индикаторов были загружены с нашего сайта ( https://arqatech.com/upload/iblock/398/INDICATORS.zip )? Выберите версию Lua 5.3.5 для скриптов-индикаторов , удалите из окна графика ранее добавленные Lua-индикаторы, затем добавьте нужный индикатор повторно.
Нет, я ваши не нашел, скачал такую же папку с гитхаба, они там ссылались на эту ветку форума. Поставил вашу папку - все завелось сразу. Сравнил файлы MA.lua, есть различие примерно в 400 байт, ваш файл больше по размеру и работает. Спасибо за помощь.
Добрый день, понадобился для Quik индикатор WMA, скопировал всю папку с индикаторами в Quik, при выборе MA индикатора программа подвисает на некоторое время с ошибкой.
...\LuaIndicators\MA.lua:234: attempt to index a nil value (global 'arg')
в чем может быть дело? Штатные индикаторы MA нормально работают.
Вроде как нашел некий вариант в виде таблицы. Почти на финишной прямой :)) Код выгружает в таблицу номера баров быстрее чем таймфрейм 1М, визуально наблюдаю заполнение таблицы в реальном времени. И тут очередной тупик, не могу взять данные из ячейки для дальнейшего сравнения. Даже смог посчитать количество строк и столбцов. В документации одна строка про GetCell без примеров, перерыл пол интернета, попадались примеры но по аналогии у меня ничего не выходит. Вообще есть смысл использовать эту таблицу или просто кинуть данные эти в массив и дальше уже обычными методами?
Что-то счетчика тиков в чистоте я не обнаружил, в виде одной формулы (а я уж губы раскатал ) только готовые индикаторы видел где уменьшается время до закрытия свечи. Тики похоже надо получать и сравнивать. Вы хотите сказать, что часть блока тиков например из 500 штук на одной секунде времени может переходить на следующую секунду уже следующей минуты? Если так и есть, то видимо сравнивание тиков это то что нужно, посмотрю на днях, спасибо за наводку.
nikolz написал: Так все же просто в этом случае .Время свечи содержит счетчик тиков. Если счетчик меньше предыдущего то это открытие новой свечи. А предыдущая это последняя закрытая.
Нашел код где выводит время бара, время изменяется при открытии нового бара. Выдает в таком виде, это оно? sTime --1681312260
Станислав написал: Если использовать источником данных DataSource, то использовать SetUpdateCallback для получения информации о том, что появилась новая свеча можно.
При появлении новой свечи в OnDataSourceUpdate изменится index и время свечи, пример:
-- Функция вызывается при изменении свечки в таблице data_source -- OnDataSourceUpdate(TABLE data_source, STRING class_code, STRING sec_code, NUMBER interval, STRING param, NUMBER index) function OnDataSourceUpdate(ds, class_code, sec_code, interval, param, index) ... local datetime = ds:T(index)
end
...
local ds, error = CreateDataSource(class_code, sec_code, interval, param) if ds ~= nil then ds:SetUpdateCallback(function (...) OnDataSourceUpdate(ds, class_code, sec_code, interval, param, ...) end) end
Пробую прикрутить Ваш вариант, но чет не выходит, я уже и свой сократил, номера баров сыпет, время нет. Если раскомментирую --local datetime = ds:T(ndex) то квик дает ошибку.
stopped = false function OnStop() stopped = true return 3000 end
Денис написал: Погуглив немного нашел кое-что похожее для определения нового бара. Подправил, сейчас переменная first_candle_index обновляет свой индекс как только появляется новая свеча. Но как это прикрутить для дальнейших вычислений, пока не допер. Тут на форуме нашел вот что, цитирую : SetUpdateCallback при смене индекса даст вам как раз момент открытия новой свечи. Вот как ее прикрутить к функции поиска индекса ниже? Или может есть другие методы какие?
function newbar() ds, error_desc = CreateDataSource("SPBFUT", "SiM3", INTERVAL_M1) local try_count = 0 while ds:Size() == 0 and try_count < 1000 do sleep(100) try_count = try_count + 1 end if error_desc ~= nil and error_desc ~= "" then message("Ошибка получения таблицы свечей:" .. error_desc) return 0 end
local today_day = tonumber(os.date("%m")) local current_candle = ds:Size() local max_candles = math.min(20, ds:Size()) local first_candle_index = nil
while first_candle_index == nil and current_candle > ds:Size() - max_candles do if tonumber(ds:T(current_candle).day) ~= today_day then
first_candle_index = current_candle - 1 end end
return first_candle_index end
Рекомендую начать написание своего робота не в виде скрипта а в виде индикатора. Если будете торговать каким-то конкретным инструментом, то этого вполне достаточно, будет проще сделать работающий. ----------------- Кроме того, рекомендую писать не торговый робот, а торговый советник. Так будет меньше шансов слить свой счет. ----------------- Потом перепишите советник в робота, а затем если захотите большего -возьметесь за скрипты. -------------------- В итоге напишите все быстрее и качественнее.
Так я, если честно, qLua в глаза второй раз вижу, я больше на питоне, амиброкер,... хотел работающего бота перевести на qLua на срочный рынок для попробовать, почти все перевел, уперся в этот блин новый бар (получить его закрытие/открытие, так как расчет баров ведется после закрытия текущего). Собственно qLua - это вопрос разового применения. Хотел из питона сразу в Квик - но увидев что там еще больше прокладок между кодом и биржей - забил на это дело.
Погуглив немного нашел кое-что похожее для определения нового бара. Подправил, сейчас переменная first_candle_index обновляет свой индекс как только появляется новая свеча. Но как это прикрутить для дальнейших вычислений, пока не допер. Тут на форуме нашел вот что, цитирую : SetUpdateCallback при смене индекса даст вам как раз момент открытия новой свечи. Вот как ее прикрутить к функции поиска индекса ниже? Или может есть другие методы какие?
function newbar() ds, error_desc = CreateDataSource("SPBFUT", "SiM3", INTERVAL_M1) local try_count = 0 while ds:Size() == 0 and try_count < 1000 do sleep(100) try_count = try_count + 1 end if error_desc ~= nil and error_desc ~= "" then message("Ошибка получения таблицы свечей:" .. error_desc) return 0 end
local today_day = tonumber(os.date("%m")) local current_candle = ds:Size() local max_candles = math.min(20, ds:Size()) local first_candle_index = nil
while first_candle_index == nil and current_candle > ds:Size() - max_candles do if tonumber(ds:T(current_candle).day) ~= today_day then
Похоже не просто будет мне получить информацию о том, что текущая свеча закрылась. Из ответов выше кроме костылей с обработкой времени баров других вариантов нет? В питоне есть candle_close = true or false, в Амиброкере тоже есть свой костыль. Попробовал что-то изобразить, но сессия закончилась. У меня вроде стандартная задача - начинать расчет баров (обычное сравнение Bar-1 и Bar-2), но только когда текущая свеча закрылась. То что после закрытия текущей те бары сдвинуться на 1 - это понятно. Может есть какие варианты с меньшим количеством костылей? Спасибо.
openbuys - Активные на покупку opense[[s - Активные на продажу
Эти переменные содержат число, а не логическую переменную В них либо ноль либо не ноль, а не TRUE и FALSE -------------------------- Но запускать заново скрипт или main нет надобности в вашем случае.
Тут сорян, я не все написал видимо, то что переменные сравниваются с цифрами это так, я просто потом новую ввожу если ~=0 то запоминаю как TRUE, что есть активная лимитка. По поводу возвращаемых данных есть смысл писать в функции Return? или в LUA в коде можно сразу писать например -- If Buy_Active_Limit == true и т.д.?
function check_active_position () for i = 0,getNumberOf("FUTURES_CLIENT_HOLDING") - 1 do if getItem("FUTURES_CLIENT_HOLDING",i).sec_code == instrument then if getItem("FUTURES_CLIENT_HOLDING",i).openbuys ~= 0 then Buy_Active_Limit = true;
Может быть можно перезапустить как-то функцию main()? Как выйти из нее это понятно, но есть ли перезапуск?
Поясните подробнее, что и зачем хотите сделать, возможно объясню как это реализовать.
Если коротко, то первый запуск кода в цикле - все хорошо, но потом, после снятия лимитного ордера, у меня почему-то не сбрасывается переменная openbuys из "FUTURES_CLIENT_HOLDING" , хотя если лимитка на покупку еще не выставлена, то openbuys = False, вроде все хорошо, но после снятия лимитки - openbuys = True все равно. Но я снимаю лимитку без Order_Key, универсальным методом, поиском всех активных и снятием. Вот и думаю где собака зарыта. Cтруктура кода примерно такая :
stopped = false function OnStop() stopped = true return 5000 end ...................................... всякие разные функции ............................ function main() тут при первом запуске снимаем все что можно снять (лимитки, стоп-ордера, закрытие открытых позиций) - работает ...................... while stopped == false do
Основная часть кода (получение баров с графика,расчеты и прочее )
Wealth Lab 4 dev + Quik2Wld.dll = все шикарно, есть вопрос по адаптации коннектора для WL4 + криптобиржа, Вопрос по коннектору Quik2Wld.dll версия 4.0.0.8
Спасибо, ценная инфа. Я ранее закинул удочки разным программерам, думаю скрины пригодятся. Также нашел исходники похожего адаптера в сети (для WL4), как говорится пусть будет, посмотрел, приуныл (( , я же не программер :))
Wealth Lab 4 dev + Quik2Wld.dll = все шикарно, есть вопрос по адаптации коннектора для WL4 + криптобиржа, Вопрос по коннектору Quik2Wld.dll версия 4.0.0.8
Денис написал: перелопатил весь интернет и никаких исходных данных для создания адаптера к WL4 не нашел
Неудивительно, после перехода велса на шарп эту инфу зачистили. Буду ближе к своим архивам, пороюсь там, но это через пару-тройку недель и не обещаю найти. Вкратце - там ком-интерфейсы довольно простые, может кто вспомнит тему и поделится пораньше.
Да, подожду, спасибо большое, я также слышал что люди все же что-то делали на исходных данных, значит они где-то есть.))
Wealth Lab 4 dev + Quik2Wld.dll = все шикарно, есть вопрос по адаптации коннектора для WL4 + криптобиржа, Вопрос по коннектору Quik2Wld.dll версия 4.0.0.8
Мы не можем раскрывать информацию подобного рода. Все, что можем порекомендовать, это обратиться к разработчикам Wealth Lab и попробовать поинтересоваться у них, как сделать адаптер к их ПО.
Все понял, попытка не пытка, но может скажете просто была ли использована исходная информация от WL4 при разработке или нет, чтобы понять искать ее или нет дальше. Многие уже интересовались по WL4, но они отсылают к покупке WL6 и т.д. :)), хотя сами поурезали все велсы после WL4...
Wealth Lab 4 dev + Quik2Wld.dll = все шикарно, есть вопрос по адаптации коннектора для WL4 + криптобиржа, Вопрос по коннектору Quik2Wld.dll версия 4.0.0.8
благодаря реалтайм коннектору настроил вывод котировок в WL4, все работает на ура, правда транзакции отправляю через TRI файл, тоже работает как положено. Переходить на WL6 и выше нет планов, так как в WL4 имею очень много готовых ботов, а они не хотят переводиться ))
Вопрос такой, я хотел прикрутить котировки с криптобиржы к WL4 основываясь на Quik2Wld адаптере (он же шикарно работает), поэтому хотел узнать на чем основан и в какой программе был сделан данный Quik2Wld.dll адаптер, хочу попытаться сам сделать такой адаптер, но для криптобиржы. Так как перелопатил весь интернет и никаких исходных данных для создания адаптера к WL4 не нашел, то одна надежда на вас ребята.
Если поделитесь инфой какие данные и софт с библиотеками использовались для создания Quik2Wld.dll был бы очень благодарен. Может быть были ли использованы какие материалы от WL4 или в этом нет необходимости.