<HELP> for explanation
А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z »

Quik Lua

Вебсайт

Lua — язык программирования, который используется в программировании торговых роботов под популярный в России терминал Quik.
Связанные статьи:
(1)



Язык Lua и квик: Как указать ссылку на график цены? Как указать ссылку на индикатор ?

Язык Lua и квик: Как указать ссылку на график цены? Как указать ссылку на индикатор?
avatar

kvazar

Как в Lua задать условие пересечения индикатора с ценой (сигнал нужно получить в момент пересечения, до закрытия свечи)? Мой не рабочий вариант ниже.

Как в Lua задать условие пересечения индикатора с ценой (сигнал нужно получить в момент пересечения, до закрытия свечи)? Мой не рабочий вариант ниже.
avatar

kvazar

Скрипт на qlua - Светофор

По следам этого поста скрипт на qlua, называется «Светофор».
Суть скрипта- отслеживать дистанцию до «дна», которое представляет собой лои 2008 года+накопленная инфляция.

Подсветка строк:
зеленым- цена ниже уровня инфляции
желтым — до дна менее 50%
красным — до дна более 80%

В чем не смог разобраться:
как получить лой 2008 года по акции (вбито вручную)
как получить полное название компаний (вбито вручную)
как сортировать таблицу (ctrl+клик не помогает)
кто знает — подскажите!

Как это выглядит в Квике:
Скрипт на qlua - Светофор
Бэктест на проливе 2014 года:
Скрипт на qlua - Светофор

Код:

-- Обьявляем переменные
sIsRun=true;
sDate=0;
sDno=0;
sDistance=0;

--Инфляция 2009-2016
sInflation=88.77; 

-- Массив с названием компаний
aTickerName= {"Сбербанк", "Газпром", "Лукойл", 
                "ГМКНорНик", "Система", 
                "Аэрофлот", "Роснефть", "Транснф",
                "ФСК ЕС", "РусГидро", "СеверСталь", 
                "Новатек", "Магнит", "Татнефть",
                "Сургнфтз-п", "М.видео", "ИнтерРАО",
                "НЛМК", "ММК", "Россети", 
                "Ростел", "МТС", "Уркалий"}

-- Массив с тикерами
aTickerList = {"SBER", "GAZP", "LKOH",
            "GMKN", "AFKS",
            "AFLT", "ROSN", "TRNFP",
            "FEES", "HYDR", "CHMF",
            "NVTK", "MGNT", "TATN",
            "SNGSP", "MVID", "IRAO",
            "NLMK", "MAGN", "RSTI", 
            "RTKM", "MTSS", "URKA"};

-- Массив с лоями 2008 года
aTickerLow2008={14, 86, 740,
            1228, 4.5,
            20, 94, 6728,
             0.054, 0.4, 80,
            50, 312, 32.63,
             5.16, 24, 0.54,
             20, 4.5, 0.6,
            14, 100, 25};

function main()
        -- Создает таблицу
        CreateTable();

        -- Основной цикл
        while sIsRun do
                -- Дата и время
                sDate=getInfoParam('TRADEDATE').." "..getInfoParam('SERVERTIME');
                -- Перебираем компании: k -порядковый номер, v - название тикера
                for k,v in pairs(aTickerList) do

                   -- Крайняя цена
                   sBID=tonumber(getParamEx("TQBR", v, "LAST").param_value);
                   -- Расчетное дно
                   sDno=math.floor(((aTickerLow2008[k]*(sInflation+100))/100)*100)/100;
                   -- Сколько до дна %
                   sDistance=math.floor((100-((sDno*100)/sBID))*100)/100;

                   -- Вставляем данные в табличку
                   SetCell(t_id, k, 0, tostring(sDate));
                   SetCell(t_id, k, 1, tostring(aTickerName[k]));
                   SetCell(t_id, k, 2, tostring(v));
                   SetCell(t_id, k, 3, tostring(sBID));
                   SetCell(t_id, k, 4, tostring(sDno));
                   SetCell(t_id, k, 5, tostring(sDistance));

                  -- Раскрашиваем желтым
                   if sDistance<50 then 
                        Yellow(k);
                   end;
                  -- Раскрашиваем красным
                   if sDistance>80 then 
                        Red(k);
                   end;
                  -- Раскрашиваем зеленым
                   if sDistance<0 then 
                        Green(k);
                   end;


                end;

                -- Спим
                sleep(50000);
        end;
end;


--- Функция создает таблицу
function CreateTable()
        -- Получает доступный id для создания
        t_id = AllocTable();    
        -- Добавляет 6 колонок
        AddColumn(t_id, 0, "Дата", true, QTABLE_INT_TYPE, 15);
        AddColumn(t_id, 1, "Название", true, QTABLE_INT_TYPE, 15);
        AddColumn(t_id, 2, "Ticker", true, QTABLE_INT_TYPE, 15);
        AddColumn(t_id, 3, "BID", true, QTABLE_INT_TYPE, 15);
        AddColumn(t_id, 4, "Расчетное дно", true, QTABLE_INT_TYPE, 15);
        AddColumn(t_id, 5, "Сколько до дна (%)", true, QTABLE_INT_TYPE, 15);
        -- Создаем
        t = CreateWindow(t_id);
        -- Даем заголовок       
        SetWindowCaption(t_id, "Компании");
   -- Добавляет строку
      for k,v in pairs(aTickerList) do
        InsertRow(t_id, k);
      end
end;

--- Функции по раскраске ячеек таблицы
function Red(col)
 for i=0, 5 do
        SetColor(t_id, col, i, RGB(255,168,164), RGB(0,0,0), RGB(255,168,164), RGB(0,0,0));
 end;
end;
function Green(col)
 for i=0, 5 do
        SetColor(t_id, col, i, RGB(157,241,163), RGB(0,0,0), RGB(157,241,163), RGB(0,0,0));
 end;
end;
function Yellow(col)
 for i=0, 5 do
        SetColor(t_id, col, i, RGB(249,247,172), RGB(0,0,0), RGB(249,247,172), RGB(0,0,0));
 end;
end;

-- Функция вызывается когда пользователь останавливает скрипт
function OnStop()
   sIsRun = false;
end;


ссылка на скрипт
 
P.S.: не является рекомендацией к покупке/продаже акций, использование программы на ваш страх и риск.

Кросспост rffx.ru


avatar

gardist

Как в QLua узнать количество открытых позиций с помощью функции getParamEx?

Как в QLua узнать количество открытых позиций с помощью функции getParamEx?
avatar

kvazar

Вопрос по QLua. У одного брокера хорошо работает с квиком, у другого не срабатывает флаг открытия сделки. Как исправить?

Вопрос по QLua. У одного брокера хорошо работает с квиком, у другого не срабатывает флаг открытия сделки. Как исправить?
avatar

kvazar

Индикатор для парного трейдинга+рубле-бочка

Как и обещал, выкладываю простой индикатор для анализа двух инструментов. Его можно использовать для любых пар на свой вкус.
Вот например, Сбер обычный (вверху) против сбера привилегированного (посерёдке). Индикатор внизу — красный. Для его расчёта первый график поделён на второй.
Индикатор=SBER/SBERP
Индикатор для парного трейдинга+рубле-бочка
Дивиденды по ним одинаковые, ценообразование одинаковое, однако по странной воле рынка в эти дни Сбер обычный слишком дёшев против сбера привилегированного. Красный график утоптан вниз, а ведь ещё недавно был намного выше. Это не совет, но если (вдруг!) вы думаете, что эта несправедливость скоро выровняется, вам надо купить SBER и шортануть на такой же объём SBERP. А ещё лучше шортануть фьючерс на SBERP, чтобы не платить брокеру за акции взятые в долг.
----------
Итак, индикатор. Я дописал к коду комментарии, чтобы даже новичок не кодер мог разобраться.
Скачать индикатор.
Индикатор для парного трейдинга+рубле-бочка
----------
План действий.
1. Графики обоих инструментов надо впихнуть в одно окошко, как это вы видели у меня на рисунке. Это позволит качественно учитывать пропуски свечей, ведь пропуски свечей бывают часто. Если вы откроете графики каждый в своём окошке, это нарушит весь расчёт, так как будут делиться неправильные свечки. Будет неинформативный бред.
Два графика в одном окошке — это обязательно. Делается это так:
Индикатор для парного трейдинга+рубле-бочка
2. К верхнему графику надо прикрутить идентификатор. По умолчанию — это циферка 1. В коде индикатора я написал где этот параметр можно поменять. Если вы захотите размножить этого робота на разные пары инструментов, этот навык пригодится.
Идентификатор вписывается на ВЕРХНЕМ графике вот здесь:
Индикатор для парного трейдинга+рубле-бочка
3.  Дальше надо положить индикатор в правильное место: в папку LuaIndicators. КВИК умеет читать индикаторы только из неё. Если этой папки у вас нет, создайте её в той папке, где лежит КВИК.
После этого индикатор появится в общем списке индикаторов. На рисунке он виден с названием !Sintetika
Дальше этот индикатор надо прикрутить к правильном графику. Этот выбор делается вверху окошка там где зелёный овал.
Индикатор для парного трейдинга+рубле-бочка
Индикатор прикручивается к ДРУГОМУ графику, не к тому, которому вы присвоили идентификатор. Если правой кнопкой мышки кликнуть по нижнему графику, то он и выберется. Но можно задать вручную как на картинке.
4. Нужно правильно задать множитель. Фьючерс Си стоит 57 000, а доллар рубль 57 рублей. То есть верхнюю цену надо сократить на три ноля. Эту задачу и решает параметр umnozhenie. Его можно поменять прямо в коде, а можно в настройках индикатора. Вот здесь:
Индикатор для парного трейдинга+рубле-бочка
Для SBER/SBERP его надо исправить на 1. В этом случае нули сокращать не нужно. Если оставить как есть — 1000 — , то внизу будут неправильные цифры как показывает зелёная стрелка.
5. Параметр umnozhenie для разных пар:
Si/USD_TOM=1000
ФьючGAZP/GAZP=100 (в 1 фьючерсе 100 единиц базового актива — акций)
SBER/SBERP=1
Для любых других пар акций тоже можно ставить 1.
Вот несколько примеров этого индикатора на разных инструментах.
1. Фьючерс Сбер-обычка против акции Сбер-обычка. Множитель 100. Фьючерс торгуется дешевле акции, потому что во фьючерсе нет дивидендов. Часовик.
Индикатор для парного трейдинга+рубле-бочка
На вечорке акции не торгуются, поэтому будет удобно отфильтровать вечорку и утренний аукцион вот здесь:
Индикатор для парного трейдинга+рубле-бочка
2. Фьючерс Си против спотового доллар-рубля. Минутки.
Индикатор для парного трейдинга+рубле-бочка
Пишите о результатах, постараюсь помочь. На забывайте:
1. Два графика впихиваются в одно окно
2. Идентификатор «1» прикрепляем к верхнему графику, а сам индикатор к нижнему.
3. Не забывайте ставить верный множитель.
Удачи :)

П.С. Добавлю ещё один индикатор: рубле-бочка. Может оказаться полезным. Он делает то же самое, только формула чуть другая: он перемножает два значения: Си умножает на брент и делит на 1000. Скачать рубле-бочку.
Индикатор для парного трейдинга+рубле-бочка


avatar

Albus

Qlua. Не срабатывает while Run and trans_Status == nil do sleep(1); end; в коде. Помогите пожалуйста настроить флажок открытия заявки и позиции.https://cloud.mail.ru/public/5YEP/aAot7CJjr

Qlua. Не срабатывает while Run and trans_Status == nil do sleep(1); end; в коде. Помогите пожалуйста настроить флажок открытия заявки и позиции.https://cloud.mail.ru/public/5YEP/aAot7CJjr
avatar

kvazar

Qlua. Как с помощью функция OnTransReply и OnTrade получить информацию об открытии сделки или поступлении заявки?

Qlua. Как с помощью функция OnTransReply и OnTrade получить информацию об открытии сделки или поступлении заявки?
avatar

kvazar

QLua. Скрипт продает 2 раза, в итоге не нужная открытая позиция. Помогите пожалуйста найти ошибку. Ссылка https://cloud.mail.ru/public/FUxM/b4NFJCb9w

QLua. Скрипт продает 2 раза, в итоге не нужная открытая позиция. Помогите пожалуйста найти ошибку. Ссылка cloud.mail.ru/public/FUxM/b4NFJCb9w
avatar

kvazar

QLua. Как определить, открыта-ли таблица скрипта? Как сделать кнопки в таблице? Такое определение не работает if IsWindowClosed(t_id)==false then t = CreateWindow(t_id) end

QLua. Как определить, открыта-ли таблица скрипта? Как сделать кнопки в таблице? Такое определение не работает if IsWindowClosed(t_id)==false then t = CreateWindow(t_id) end
avatar

kvazar

Qlua. Как по значениям обработки переменных построить график в квике ?

Qlua. Как по значениям обработки переменных построить график в квике?
avatar

kvazar

Lua

Всем добрый день. Появилась необходимость написать робота, но из языков программирования знаю только R, а говорят необходимо изучать lua.  Подскажите есть ли у кого опыт работы с данным языком, на сколько он сложен или возможно пойти по какому то другому пути?
 
avatar

222

Нужен робот для Quik

Комрады, кто пишет для QUIK на lua/Qlua/qpile? К кому можно обращаться?
avatar

jeremy

Скорость серверов Открытия

Мой друг несколько лет назад написал программу на Луа. Она выставляет в КВИК и сразу снимает 20 заявок. Это происходит по очереди, одна заявка за другой. Робот замеряет сколько времени ушло на выставление и сколько времени на снятие. Заявки ставятся далеко от рынка, поэтому сделок не происходит.
Вот сегодняшний тест серверов брокера Открытие. Я арендую виртуалку с московским IP, так что все заявки выставляются из Москвы.
Речь про эти сервера, которые можно выбирать при залогинивании в КВИК.
Скорость серверов Открытия

-1-
Выделенный сервер с повышенной скоростью и мощным железом. Он платный. С него торгует мой робот, которому нужна скорость.
Вот тест сервера:
Скорость серверов Открытия
Данные в секундах. То есть средняя задержка выставления заявки 71 миллисекунда. Средняя задержка снятия 61 миллисекунда. Это конечно не ХФТ, но всё равно неплохо.
-2-
Следующий сервер Открытия — «Сервер 1 Билайн». Он доступен для всех.
Скорость серверов Открытия
Как видите, робот всё равно ставит этому серверу твёрдую пятёрку. Потому что средняя задержка постановки 229 миллисекунд и средняя задержка снятия 213 миллисекунд — это очень хороший результат для обычного (не платного) сервера.

-3-
Следующий общедоступный сервер Открытия. Сервер 1 Макомнет.
Скорость серверов Открытия
Скорость почти такая же как у предыдущего.
-4-
Сервер с названием «Открытие сервер 3»
Скорость серверов Открытия
Цифры почти такие же. И опять робот ставит оценку «пять».
-5-
Открытие Сервер 4 Макомнет. Крутейший из бесплатных.
Скорость серверов Открытия
103 миллисекунды — средняя задержка выставления
116 миллисекунд — средняя задержка снятия.
Это самый быстрый результат среди бесплатных серверов Открытия. Он всего в два раза медленнее платного выделенного сервера. Мои роботы, которым не нужна высокая скорость, торгуют с него. 
-6-
И последний «Сервер 4 Реллайн». 
Скорость серверов Открытия
Задержка постановки 235
Задержка снятия 203.
То есть он обычный середнячок. «Пятёрка», но не «пять с плюсом».
----------
Большой выбор серверов — это огромное преимущество для брокера. До Открытия я торговал в Неттрейдере. У них удобный личный кабинет, красиво считается доходность портфеля, наглядно учитываются сделки, но… сервер всего и один и постоянно глючит. Бывало что несколько дней подряд час-полтора КВИК не работал. И перескочить на другой сервер было нельзя, потому что сервер всего один. А каждое утро в 10-30 у них на этом сервере запускалась какая-то программа, может быть бэк офиса, может быть бухгалтерии, которая что-то интенсивно считала и вызывала дикие невыносимые тормоза в клиентских КВИКах. 
Поэтому я сбежал от них в Открытие. 
Такие дела. 
Всем удачных торгов!
avatar

Albus

Код робота на LUA для QUIK

В двух словах: робот анализирует спот, выставляет лимитные и стоп-лимитные заявки по фьючерсу. Делает пересчет сигналов по выбранному тайм-фрейму, снятие выставленных заявок, запись в файл текущего состояния, ведение логов, сообщения, запрос текущей позиции и пр. Из робота удалена алгоритмика вычисления сигнала и в текущем виде скрипт будет иметь сигнал на покупку на каждом баре.

Предназначается для новичков в алготрейдинге, что-то типа болванки.

Важно: выставление заявок я закомментировал, поэтому можете смело запускать этот скрит, он не натворит ужаса по счету.

require"QL"

log = "sbrf.log"
seccode = "SRM6"
lots_in_trade = 80
accnt = ""
better = -5
chart = "sberbankxxx"
is_run = true
prev_datetime = {}
len = 100
basis = 9
k_bal = {0,1,2,3}
sell = false
buy = false
id = 0
first = true

function trade_signal(shift)
        number_of_candles = getNumCandles(chart)
        bars_temp,res,legend = getCandlesByIndex(chart,0,number_of_candles-2*len-shift,2*len)
        bars={}

        i=len
        j=2*len
        while i>=1 do
                if bars_temp[j-1].datetime.hour>=10 then
                        sk=true
                        if bars_temp[j-1].datetime.hour==18 and bars_temp[j-1].datetime.min==45 then
                                sk=false
                        end
                        if sk then
                                bars[i]=bars_temp[j-1]
                                i=i-1
                        end
                end
                j=j-1
        end

        t = len+1

        do_sell = false
        do_buy = true

        value = 0
        if do_sell then value = 1 end
        if do_buy then value = -1 end
        toLog(log,"value="..value.." on candle: "..bars[len].datetime.year.."-"..bars[len].datetime.month.."-"..bars[len].datetime.day.." "..bars[len].datetime.hour..":"..bars[len].datetime.min.."   O="..bars[len].open.." H="..bars[len].high.." L="..bars[len].low.." C="..bars[len].close.." V="..bars[len].volume)
        return value
end

function mysplit(inputstr, sep)
        if sep == nil then
                sep = "%s"
        end
        local t={} ; i=1
        for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
                t[i] = str
                i = i + 1
        end
        return t
end

function OnInit(path)
        log=getScriptPath()..'\\'..log
        toLog(log,"==========OnInit: START")
        toLog(log,"==========OnInit: FINISH")
end

function OnStop()
        is_run = false
        toLog(log,"==========OnStop: script finished manually")
end

function CheckBit(flags, bit)
   -- Проверяет, что переданные аргументы являются числами
   if type(flags) ~= "number" then error("Ошибка!!! Checkbit: 1-й аргумент не число!"); end;
   if type(bit) ~= "number" then error("Ошибка!!! Checkbit: 2-й аргумент не число!"); end;
   local RevBitsStr  = ""; -- Перевернутое (задом наперед) строковое представление двоичного представления переданного десятичного числа (flags)
   local Fmod = 0; -- Остаток от деления
   local Go = true; -- Флаг работы цикла
   while Go do
      Fmod = math.fmod(flags, 2); -- Остаток от деления
      flags = math.floor(flags/2); -- Оставляет для следующей итерации цикла только целую часть от деления
      RevBitsStr = RevBitsStr ..tostring(Fmod); -- Добавляет справа остаток от деления
      if flags == 0 then Go = false; end; -- Если был последний бит, завершает цикл
   end;
   -- Возвращает значение бита
   local Result = RevBitsStr :sub(bit+1,bit+1);
   if Result == "0" then return 0;
   elseif Result == "1" then return 1;
   else return nil;
   end;
end;

function killorders(ccode,scode)
    for i=0,getNumberOf("orders")-1,1 do
        local t=getItem("orders", i)
        if t ~= nil and type(t) == "table" then
            if( t.seccode == scode and CheckBit(t.flags, 0) == 1) then
                local transaction={
                    ["TRANS_ID"]=tostring(math.random(2000000000)),
                    ["ACTION"]="KILL_ORDER",
                    ["CLASSCODE"]=ccode,
                    ["SECCODE"]=scode,
                                        ["ACCOUNT"] = accnt,
                    ["ORDER_KEY"]=tostring(t.ordernum),
                }
                                res=sendTransaction(transaction)
            end
        end
    end
end

function killstoporders(ccode,scode)
    for i=0,getNumberOf("stop_orders")-1,1 do
        local t=getItem("stop_orders", i)
        if t ~= nil and type(t) == "table" then
            if( t.seccode == scode and CheckBit(t.flags, 0) == 1) then
                local transaction={
                    ["TRANS_ID"]=tostring(math.random(2000000000)),
                    ["ACTION"]="KILL_STOP_ORDER",
                    ["CLASSCODE"]=ccode,
                    ["SECCODE"]=scode,
                                        ["ACCOUNT"] = accnt,
                    ["STOP_ORDER_KEY"]=tostring(t.ordernum),
                }
                                res=sendTransaction(transaction)
            end
        end
    end
end


function main()
        toLog(log,"==========main: START")
        while is_run do
                if isConnected() == 1 then
                        ss = getInfoParam("SERVERTIME")
                        if string.len(ss) >= 5 then
                                hh = mysplit(ss,":")
                                str=hh[1]..hh[2]
                                h = tonumber(str)
                                if (h>=1000 and h<1400) or (h>=1405 and h<1845) or (h>=1905 and h<2350) then
                                        if first then
                                                for ti = 50,2,-1 do     trade_signal(ti) end
                                                if buy and not sell then message(seccode.." Current state: green and buy",1) end
                                                if sell and not buy then message(seccode.." Current state: red and sell",1) end
                                                if buy and sell then message(seccode.." ERROR: green and red",1) end
                                                if not buy and not sell then message(seccode.." WARNING: nothing",1) end
                                                first = false
                                        end
                                        prev_candle = getPrevCandle(chart,0)
                                        if not isEqual(prev_candle.datetime,prev_datetime) then
                                                current_value = trade_signal(1)

                                                if current_value ~= 0 then
                                                        optn = "B"
                                                        if current_value==1 then optn = "S" end
                                                        curvol=0
                                                        no=getNumberOf("FUTURES_CLIENT_HOLDING")
                                                        if no>0 then
                                                                for i=0,no-1,1 do
                                                                        im=getItem("FUTURES_CLIENT_HOLDING", i)
                                                                        if im.sec_code==seccode then
                                                                        curvol=im.totalnet
                                                                        end
                                                                end
                                                        end
                                                        trvol = -current_value*lots_in_trade-curvol
                                                        if trvol ~= 0 then
                                                                killorders("SPBFUT",seccode)
                                                                killstoporders("SPBFUT",seccode)
                                                                f = io.open(getScriptPath().."\\sbrf2_pos.txt","r")
                                                                sbrf2_pos=f:read("*n")
                                                                f:close()
                                                                f = io.open(getScriptPath().."\\sbrf3_pos.txt","r")
                                                                sbrf3_pos=f:read("*n")
                                                                f:close()
                                                                pr,n,l = getCandlesByIndex ("futsber", 0, getNumCandles("futsber")-1, 1)
                                                                local trans =
                                                                {
                                                                        ["ACTION"] = "NEW_ORDER",
                                                                        ["CLASSCODE"] = "SPBFUT",
                                                                        ["SECCODE"] = seccode,
                                                                        ["ACCOUNT"] = accnt,
                                                                        ["OPERATION"] = optn,
                                                                        ["PRICE"] = toPrice(seccode,pr[0].close+current_value*better),
                                                                        ["QUANTITY"] = tostring(math.abs(curvol-sbrf2_pos-sbrf3_pos)),
                                                                        ["TRANS_ID"] = tostring(getTradeDate().month*100+getTradeDate().day+id)
                                                                }
                                                                id = id+1
                                                                --res = sendTransaction(trans)
                                                                message(seccode.." Send : " .. res, 2)
                                                                toLog(log,"Send: ".. res)
                                                                for btr=0,200,5 do
                                                                        local trans =
                                                                        {
                                                                                ["ACTION"] = "NEW_STOP_ORDER",
                                                                                ["CLASSCODE"] = "SPBFUT",
                                                                                ["SECCODE"] = seccode,
                                                                                ["ACCOUNT"] = accnt,
                                                                                ["OPERATION"] = optn,
                                                                                ["PRICE"] = toPrice(seccode,pr[0].close-current_value*btr),
                                                                                ["STOPPRICE"] = toPrice(seccode,pr[0].close-current_value*(btr+better)),
                                                                                ["QUANTITY"] = tostring(6),
                                                                                ["TRANS_ID"] = tostring(getTradeDate().month*100+getTradeDate().day+id),
                                                                                ["EXPIRY_DATE"] = "GTC"
                                                                        }
                                                                        id = id+1
                                                                        --res = sendTransaction(trans)
                                                                        message(seccode.." Send : " .. res, 2)
                                                                        toLog(log,"Send: ".. res)
                                                                end
                                                                if current_value == 1 then
                                                                        message(seccode..' RED: buy->sell',1)
                                                                        toLog(log,"RED signal")
                                                                else
                                                                        message(seccode..' GREEN: sell->buy',1)
                                                                        toLog(log,"GREEN signal")
                                                                end
                                                        else
                                                                if current_value == 1 then
                                                                        message(seccode..' RED: buy->sell',1)
                                                                        toLog(log,"RED signal, but nothing to do")
                                                                else
                                                                        message(seccode..' GREEN: sell->buy',1)
                                                                        toLog(log,"GREEN signal, but nothing to do")
                                                                end
                                                        end
                                                else
                                                        if buy and not sell then toLog(log,"Nothing to do. Current state: green and buy",1) end
                                                        if sell and not buy then toLog(log,"Nothing to do. Current state: red and sell",1) end
                                                        if buy and sell then toLog(log,"Nothing to do. ERROR: green and red",1) end
                                                        if not buy and not sell then toLog(log,"Nothing to do. WARNING: nothing",1) end
                                                end
                                                prev_datetime = prev_candle.datetime
                                        end
                                end
                        end
                end
                sleep(5*1000)
        end
        toLog(log,"==========main: FINISH")
end
avatar

Sergey Pavlov

Баги QUIK. алготрейдерам

Добрый день.
    Собирал, через коннектор(самописный) Lua и C++, дату с квика: лента, стакан, ои и пр.
    Обнаружил, что свернутый в трей КВИК начинает общаться с сервером раз в 10-15 сек.Баги QUIK.  алготрейдерам

    Пакеты трафика не анализировал через tcpdump и пр. проги, но по косвенным признакам: помимо нагрузки сети и «моргания лампочки модема  :-)», вижу, что и в записанном файле дата представленна неровными временными срезами.

    Уважаемые знатоки вопрос:
 1) есть ли, в настройках QUIK, возможность исправить вышеизложенное.
 2) присутсвует ли в МТ5 или (др. проги по совету)  такая проблема.
 3) какой софт вы используете.
avatar

h.

Как в не рабочий день биржи производить отладку qlua скрипта для quik?

или в выходной день положено отдыхать?))
а если серьезно?
avatar

GVS

lua

Пост немного не по теме трейдинга, скорее его надо задавать программистам, но среди трейдеров таких полно, может поделитесь опытом.

Многолетнее использование Lua в QUIK`е подтолкнуло к идее использовать скриптовый язык в других приложениях.
Из всего немногочисленного набора того, что есть для C# удалось найти:
— NLua — 18K скачиваний в NuGet
— LuaInterface -?
— NeoLua – 50k скачиваний в NuGet
— LuBox – 1k скачиваний в NuGet

Автор проекта LuaInterface давно не поддерживает проект и прямо говорит, что NLua успешно продолжает его дело.

NeoLua – наиболее популярен среди программистов в NuGet.

LuBox показался удобным и наиболее «молодым» проектом.

Кто-нибудь из смартлабовцев использовал какую-то из этих библиотек для встраивания Lua-скриптов? Поделитесь опытом использования: плюсы, минусы, баги.

 

 

 

avatar

Кирков Алексей

Справочник Lua для Quik


Справочник Lua для Quik

 
В статье речь пойдет о новом справочнике luaq.ru
У каждого разный подход к созданию роботов: одни заказывают у разработчиков, другие используют программы и строят алгоритмы из кубиков, третьи пишут сами использую языки программирования.

Я хочу рассказать о проблемах и решениях написания роботов на языке Lua для платформы Quik. Я не храню в голове весь справочник функций, которые предоставляют языки и платформы. Почти у каждого есть свой online справочник (кроме quik Lua). Когда-то был сайт qlua.net (или .org). Но срок домена закончился и сайт ушел в другом направлении. Конечно можно открыть PDF версию справочника и искать там, но это не всегда удобно. Да и этих PDF несколько и иногда они ссылаются друг на друга. Предоставленные примеры скорее вызывают улыбку. Есть несколько огромных примеров работы с таблицами и «Пример реализации игры «Крестики-нолики»». Оба примера настраивают на торговый лад. :)
Я периодически использовал ресурс https://quikluacsharp.ru очень полезный и хороший ресурс, где много всего. Но искать конкретные функции и их описание не так удобно. В итоге создал свой справочник, точнее свой ресурс www.luaq.ru
Тут можно найти описание каждой функции, таблицы, на которые ссылается функция или ее параметры, а также бесплатно (пока бесплатно) заказать примеры для конкретных функций. Прошу любить и не жаловаться. Шутка. Жаловаться можно и нужно.
avatar

Dzam

Индикаторы для Квика

Всем привет.

Я писал для себя несколько индикаторов для Квика. Все они здесь - https://github.com/nick-nh/qlua.
Часть — подсмотренные и адаптированные идеи, часть сам писал. Никогда не думал их делать закрытыми.
Возможно, кому-то будут полезными.

Да простит меня Тимофей, дам ссылку на МФД, где я выкладывал их ранее c описанием.
forum.mfd.ru/forum/poster/?id=85696
avatar

nicknh

Как в квике получить текущую позицию по бумагам

Коллеги! Помогите решить простую задачку.

Дано: имеются позиции по бумагам (TQBR).

Надо: получить текущую позицию по каждой бумаге при помощи LUA.

Пробовал пользоваться таблицами depo_limits, firm_holding и account_balance.

Хоть каких-то чисел добился лишь через таблицу depo_limits следующим кодом:
pos1={}
pos2={}
for j=0,getNumberOf("DEPO_LIMITS")-1 do
 pos1[#pos1+1]=getItem("DEPO_LIMITS",j).sec_code
 pos2[#pos2+1]=getItem("DEPO_LIMITS",j).currentbal
end
Проблема такого варианта в том, что он показывает ненулевые значения в currentbal только для позиций, которые были открыты ранее (возможно, по которым прошло +2 дня). По позициям, которые были открыты сегодня, он точно показывает 0.

Подскажите, как правильно решить эту задачку?

Премного благодарен:)
avatar

Sergey Pavlov


Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.

Залогиниться

Зарегистрироваться
Регистрация
UPDONW