------------------------------------------------------------------------------------------------------- --- Функция получения результатов свечей в .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
Это мой первый робот.
Суть стратегии заключается в мониторинге текущей цены по выбранному инструменту и при значительном изменении цены в противоположном направлении, при подъёме или падении осуществляется ввод заявки на покупку или продажу соответственно.
Код ещё «сырой». Кому не сложно прошу выявить ошибки и предложить советы, рекомендации по оптимизации кода.
Отправка транзакций заменена на сообщения для отладки алгоритма без последствий для счёта.
На данном этапе условия для покупки и продажи не корректны, так как покупает и продаёт с не всегда указанным local Procent, уже голову себе сломал как это исправить.
Интересуют следующие вопросы:
1)Как сделать, чтобы не покупал пока есть открытая позиция?
2)Если возможно, как рассчитать издержки комиссий, чтобы при вычитании их не быть в минусе?
3)Правильная ли структура кода?
CLASSCODE="TQBR" SECCODE="YNDX" QUANTITY="1" tB = { ["CLASSCODE"]=CLASSCODE, ["SECCODE"]=SECCODE, ["ACTION"]="NEW_ORDER", ["ACCOUNT"]="СЧЕТ", ["CLIENT_CODE"]="КОД КЛИЕНТА", ["TYPE"]="M", ["OPERATION"]="B", ["QUANTITY"]=QUANTITY, ["PRICE"]="0", ["TRANS_ID"]="1" } tS = { ["CLASSCODE"]=CLASSCODE, ["SECCODE"]=SECCODE, ["ACTION"]="NEW_ORDER", ["ACCOUNT"]="СЧЕТ", ["CLIENT_CODE"]="КОД КЛИЕНТА", ["TYPE"]="M", ["OPERATION"]="S", ["QUANTITY"]=QUANTITY, ["PRICE"]="0", ["TRANS_ID"]="1" } run=true function main() local Price="0" local Procent=0.005 while run do --Получение текущей цены по инструменту local lastPriceT = getParamEx(CLASSCODE, SECCODE, "LAST");--Обращение к ячейке таблицы с ценой local lastPrice = tonumber(lastPriceT.param_value);--Значение текущей цены --Текущая цена получена в переменной - "lastPrice" ---------------------------------------------------- --Преобразование Price в строчное значение Price=tonumber(Price) if Price==0 then Price=lastPrice --Если Price=0, то к Price присваивается lastPrice end Proc=(lastPrice-Price)/Price*100 --Процент изменения в переменной Proc ---------------------------------------------------- --Покупка if Price < lastPrice then Price = lastPrice --Если Price больше lastPrice то, к Price присваивается lastPrice elseif Proc>-Procent then message("Произведена покупка по цене="..tostring(lastPrice)) --sendTransaction(tB)-- --Иначе, если Proc>-0.005 то отправляется заявка на покупку --Покупка произведена ---------------------------------------------------- end --Продажа if Price > lastPrice then Price = lastPrice elseif Proc>Procent then message("Произведена продажа по цене="..tostring(lastPrice)) --Продажа произведена end sleep(5000) --Прерывание скрипта на 5 секунд end end function OnStop() run=false end