Денис (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Преобразование времени в число
 
Цитата
Ziveleos написал:
Денис, добрый день.
Вот рабочий код:

Код
     local  t  =   string.gsub ( getInfoParam ( "SERVERTIME" ),"%:",  "" )
   local  time_pos  =   string.format ( "%06d" , tonumber(t))

  

nikolz, до 10 утра время сервера передается без начального нуля,  одной  цифрой.
Попробовал этот вариант тоже, метки выводит на текущем баре как и нужно.

Спасибо всем за помощь.
Преобразование времени в число
 
Цитата
nikolz написал:
Цитата
Денис написал:
getInfoParam("SERVERTIME")
local x=getInfoParam("SERVERTIME");
local time_pos =string.sub (x,1,2)..string.sub (x,4,5)..string.sub (x,7,8);
Попробовал этот вариант сейчас, метки выводит, но на баре 23:49 прошлого торгового дня.
Преобразование времени в число
 
Добрый день,
есть рабочий код для вывода метки на график, но он работает только с 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

Не подскажете как поправить вывод, если это реально?
Спасибо.
Все индикаторы на Lua
 
Цитата
Anton Belonogov написал:
Денис,

Верно понимаем, что скрипты индикаторов были загружены с нашего сайта ( https://arqatech.com/upload/iblock/398/INDICATORS.zip )?
Выберите версию Lua 5.3.5 для  скриптов-индикаторов , удалите из окна графика ранее добавленные Lua-индикаторы, затем добавьте нужный индикатор повторно.
Нет, я ваши не нашел, скачал такую же папку с гитхаба, они там ссылались на эту ветку форума.
Поставил вашу папку - все завелось сразу.
Сравнил файлы MA.lua, есть различие примерно в 400 байт, ваш файл больше по размеру и работает.
Спасибо за помощь.
Все индикаторы на Lua
 
Цитата
Anton Belonogov написал:
Денис, добрый день.

В настройках Рабочего места QUIK ( Основные настройки (F9) / Lua скрипты ) выберите версию Lua для скриптов-индикаторов 5.3.5.
Спасибо за ответ, но у меня так и стоит в настройках 5.3.5.. Решил поменять на 5.4.1 - та же ошибка.
Все индикаторы на Lua
 
Добрый день, понадобился для Quik индикатор WMA, скопировал всю папку с индикаторами в Quik, при выборе MA индикатора программа подвисает на некоторое время с ошибкой.

...\LuaIndicators\MA.lua:234: attempt to index a nil value (global 'arg')

в чем может быть дело? Штатные индикаторы MA нормально работают.

Quik версия 8.13.1.16

Спасибо.
Функция getCandlesByIndex() и закрытие свечки
 
Вроде как нашел некий вариант в виде таблицы. Почти на финишной прямой :))
Код выгружает в таблицу номера баров быстрее чем таймфрейм 1М, визуально наблюдаю заполнение таблицы в реальном времени. И тут очередной тупик,  не могу взять данные из ячейки для дальнейшего сравнения. Даже смог посчитать количество строк и столбцов.
В документации одна строка про GetCell без примеров, перерыл пол интернета, попадались примеры но по аналогии у меня ничего не выходит. Вообще есть смысл использовать эту таблицу или просто кинуть данные эти в массив и дальше уже обычными методами?

is_run = true

class_code = "SPBFUT"
sec_code = "SiM3"
interval = INTERVAL_M1

function cb(index)
 local t = ds:T(index)
 row = InsertRow(t_id,-1)
 SetCell(t_id,row,1,tostring(index))
 sleep(1000)
end


function main()
  t_id= AllocTable()
  AddColumn(t_id,1,'index',true,QTABLE_INT_TYPE,11)
  message(tostring(CreateWindow(t_id)),1)
  ds=CreateDataSource(class_code,sec_code,interval)
  sleep(1000)
  ds:SetUpdateCallback(cb)

while is_run do
  local rows, col = GetTableSize(t_id) -- номер строки с 1 до x, номер колонки с 0 до n-1 (!!!)

 --Cell = GetCell(t_id, 1,1).image

  message('rows = '..tostring(rows)..
 '\n col = '..tostring(col)..
 '\n Cell = '..tostring(Cell))

  sleep(1000)

  function OnStop(stop_flag)

     is_run= false
  end
end
end
Функция getCandlesByIndex() и закрытие свечки
 
Что-то счетчика тиков в чистоте я не обнаружил, в виде одной формулы (а я уж губы раскатал  :lol: ) только готовые индикаторы видел где уменьшается время до закрытия свечи. Тики похоже надо получать и сравнивать.
Вы хотите сказать, что часть блока тиков например из 500 штук  на одной секунде времени может переходить на следующую секунду уже следующей минуты? Если так и есть, то видимо сравнивание тиков это то что нужно, посмотрю на  днях, спасибо за наводку.
Функция getCandlesByIndex() и закрытие свечки
 
Цитата
nikolz написал:
Так все же просто в этом случае .Время свечи содержит счетчик тиков. Если счетчик меньше предыдущего то это открытие новой свечи. А предыдущая  это последняя закрытая.  
Нашел код где выводит время бара, время изменяется при открытии нового бара. Выдает в таком виде, это оно?
sTime --1681312260  
Функция getCandlesByIndex() и закрытие свечки
 
Цитата
Станислав написал:
Если использовать источником данных 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


class_code = "SPBFUT"
sec_code = "SiM3"
interval = INTERVAL_M1


function CreateDS()

ds = CreateDataSource(class_code, sec_code, interval)
local Size = ds:Size()
local datetime = ds:T()

return Size, datetime
end



function OnDataSourceUpdate(ds, class_code, sec_code, interval, param, index)

--local datetime = ds:T(ndex)

return datetime
end



function main()

while stopped == false  do

Size, datetime = CreateDS()

message('Size --'..tostring(Size)..'\n datetime --'..tostring(datetime ))
sleep(500)

end

end  
Функция getCandlesByIndex() и закрытие свечки
 
Цитата
nikolz написал:
Цитата
Денис написал:
Погуглив немного нашел кое-что похожее для определения нового бара. Подправил, сейчас переменная 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 - это вопрос разового применения. Хотел из питона сразу в Квик - но увидев что там еще больше прокладок между кодом и биржей - забил на это дело.
Функция getCandlesByIndex() и закрытие свечки
 
Погуглив немного нашел кое-что похожее для определения нового бара. Подправил, сейчас переменная 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
Функция getCandlesByIndex() и закрытие свечки
 
Похоже не просто будет мне получить информацию о том, что текущая свеча закрылась. Из ответов выше кроме костылей с обработкой времени баров других вариантов нет?
В питоне есть candle_close = true or false, в Амиброкере тоже есть свой костыль.
Попробовал что-то изобразить, но сессия закончилась.
У меня вроде стандартная задача - начинать расчет баров (обычное сравнение Bar-1 и Bar-2), но только когда текущая свеча закрылась. То что после закрытия текущей те бары сдвинуться на 1 - это понятно.
Может есть какие варианты с меньшим количеством костылей?
Спасибо.
Скрипт для перезапуска другого скрипта
 
Цитата
nikolz написал:
Цитата
Денис написал:
FUTURES_CLIENT_HOLDING
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;
         
      end;
      end;
       end;
    return Buy_Active_Limit
end
Скрипт для перезапуска другого скрипта
 
Цитата
nikolz написал:
Цитата
Денис написал:
Понятно, стебутся коллеги значит )))

Может быть можно перезапустить как-то функцию 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

Основная часть кода (получение баров с графика,расчеты и прочее )

end
end
Скрипт для перезапуска другого скрипта
 
Понятно, стебутся коллеги значит )))

Может быть можно перезапустить как-то функцию main()?
Как выйти из нее это понятно, но есть ли перезапуск?
Скрипт для перезапуска другого скрипта
 
Цитата
Kalmar написал:
Очевидно же:1. myScript = FindScript("MyScript")2. RestartScript(myScript)Всегда так делаю.
Интересно, понадобилась такая операция в Qlua, в питоне с этим проблем нет, все отлично перегружается и скрипт как свеже запущенный ))

А вот тут что-то не хочет, может я что не так делаю.

if бла бла
...........................
myScript = FindScript("robot_v8.lua")
Restart_Script (myScript)

дает ошибку    attempt to call a nil value (global 'FindScript')

в чистом луа нашел похожую функцию, но тоже не работает.
Wealth Lab 4 dev + Quik2Wld.dll = все шикарно, есть вопрос по адаптации коннектора для WL4 + криптобиржа, Вопрос по коннектору Quik2Wld.dll версия 4.0.0.8
 
Цитата
Anton написал:
Денис,   here you are .
Спасибо, ценная инфа.
Я ранее закинул удочки разным программерам, думаю скрины пригодятся.
Также нашел исходники похожего адаптера в сети (для WL4), как говорится пусть будет, посмотрел, приуныл (( , я же не программер :))
Wealth Lab 4 dev + Quik2Wld.dll = все шикарно, есть вопрос по адаптации коннектора для WL4 + криптобиржа, Вопрос по коннектору Quik2Wld.dll версия 4.0.0.8
 
Цитата
Anton написал:
Цитата
Денис написал:
перелопатил весь интернет и никаких исходных данных для создания адаптера к WL4 не нашел
Неудивительно, после перехода велса на шарп эту инфу зачистили. Буду ближе к своим архивам, пороюсь там, но это через пару-тройку недель и не обещаю найти. Вкратце - там ком-интерфейсы довольно простые, может кто вспомнит тему и поделится пораньше.
Да, подожду, спасибо большое, я также слышал что люди все же что-то делали на исходных данных, значит они где-то есть.))
Wealth Lab 4 dev + Quik2Wld.dll = все шикарно, есть вопрос по адаптации коннектора для WL4 + криптобиржа, Вопрос по коннектору Quik2Wld.dll версия 4.0.0.8
 
Цитата
Roman Azarov написал:
Денис, добрый день!

Мы не можем раскрывать информацию подобного рода.
Все, что можем порекомендовать, это обратиться к разработчикам 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 или в этом нет необходимости.

Заранее спасибо.
Страницы: 1
Наверх