local SecCode = «LKU0»
local Quantity=1
function main()
while stopped == false do
local Quotes = getQuoteLevel2(«SPBFUT», SecCode)
local Offer_Price = tonumber(Quotes.offer[1].price)
local Offer_Vol = tonumber(Quotes.offer[1].quantity)
--отправка формы заявки
local LimitOrderBuy = { ххххх}
--условие входа в лонг
if Offer_Vol>10 then
message(Order)
local Order = sendTransaction(LimitOrderBuy)
end
sleep (200)
end
Смысл его такой: если количество лукойла в первой строке стакана больше 10, то покупается 1 бумага и работа скрипта завершается.
Так как скрипт срабатывает при определенном условии, то для перезапуска используется while stopped == false do и sleep (200).
Прикол в том, что при наступлении условия, скрипт начинает бомбить заявки по 1 шт пока не кончаются деньги (виртуальные).
------------------------------------------------------------------------------------------------------- --- Функция получения результатов свечей в .CSV в виде: --- <Инструмент> <Дата> <Время> <Цена_Open> <Цена_High> <Цена_Low> <Цена_Close> <Объем> --- BRN0 1 20200605 200100 42.15 42.16 42.1 42.1 2150 ------------------------------------------------------------------------------------------------------- is_run=true -- Параметры tInstr="BRN0" --код инструмента/бумаги classcode="SPBFUT" --код класса инструмента/бумаги, если нужен фондовый рынок - вводить TQBR вместо SPBFUT iNterval=INTERVAL_M1 --таймфрейм -- доступные таймфреймы указаны в справке Quik (qlua.chm в папке с quik) по поиску CreateDataSource -- пример INTERVAL_H1 corrTime=3 --Время МСК. C сервера время приходит без корректировки. pFile="w:\\temp" --путь, где будет создаваться файл cBars=10 --сколько свечей надо вывести --настройка параметров function OnInit() out_file=io.open(pFile .."\\"..tostring(tInstr)..".csv","w") is_run=(out_file~=nil) ds=CreateDataSource(classcode, tInstr, iNterval ) --создаем источник данных ds:SetUpdateCallback(NewChartData) --обновление последних данных end function strText(int) local m=tostring(int) local mLen=string.len(int) if mLen==1 then Output="0" .. tostring(m) else Output=m end return Output end function main() while is_run do local Size=ds:Size() --Получение количества всех свечей в источнике данных if cBars>Size then cBars=Size-1 end for i=Size-cBars, Size, 1 do local O=ds:O(i) -- Значение цена открытия свечи local H=ds:H(i) -- Значение High для свечи local L=ds:L(i) -- Значение Low для свечи local C=ds:C(i) -- Значение Close для свечи local V=ds:V(i) -- Значение Volume для свечи local T=ds:T(i) -- Значение Time для свечи sTime=os.time(T) datetime=os.date("!*t",sTime) --вывод в файл out_file:write(tInstr..";"..tostring(iNterval)..";"..tostring(datetime.year)..tostring(strText(datetime.month))..tostring(strText(datetime.day))..";"..tostring(strText(datetime.hour + corrTime))..tostring(strText(datetime.min))..tostring(strText(datetime.sec))..";"..tostring(O)..";"..tostring(H)..";"..tostring(L)..";"..tostring©..";"..tostring(V).."\n") out_file:flush() --запись данных end out_file:close() sleep(1000) -- приостановка на 1 секунду out_file=io.open(pFile .."\\"..tostring(tInstr)..".csv","w") end end
По принципу своей работы индикатор %b – это моментум- осциллятор, сходный, например, со стохастиком. Однако есть и отличия: если у стохастического осциллятора цены колеблются в интервале от 1 до 100, то у нашего индикатора цена может и выходить за эти пределы, например, значение может быть 1,15 или -0,15, что означает- цена находится выше или ниже на 15% от ширины ленты. То, что формально интервал обозначен уровнями 0 и 1, не должно вас путать – это одно и то же, но умноженное на коэффициент 100.
Но что означают, все эти нулевые или единичные уровни?
Это означает, что если:
-- -- Выполнение действий с массивами. -- local pairs = pairs local type = type module(...) --- Создать копию массива (таблицы) -- @return копию массива (таблицы) function copy(array) local copy_array = {} if type(array) ~= "table" then return array end for k, v in pairs(array) do if type(v) == "table" then copy_array[k] = copy(v) else copy_array[k] = v end end return copy_array end --- Узнать, начинается ли индексация в массиве с нуля или с единицы. -- @return 0 или 1 function base(array) if array[0] ~= nil then return 0 else return 1 end end --- Вычислить число элементов в массиве. -- @return число элементов в массиве function size(array) local n = 0 for _, _ in pairs(array) do n = n + 1 end return n end --- Проверить пустой или нет массив. -- @return true/false function isEmpty(array) for _, _ in pairs(array) do return false end return true end --- Получить первый индекс массива, где ничего не записано. Поиск начинается с 1. -- @return первый индекс массива, где ничего не записано function firstEmptyIndex(array) local i = 1 while array[i] ~= nil do i = i + 1 end return i end