Это мой первый робот.
Суть стратегии заключается в мониторинге текущей цены по выбранному инструменту и при значительном изменении цены в противоположном направлении, при подъёме или падении осуществляется ввод заявки на покупку или продажу соответственно.
Код ещё «сырой». Кому не сложно прошу выявить ошибки и предложить советы, рекомендации по оптимизации кода.
Отправка транзакций заменена на сообщения для отладки алгоритма без последствий для счёта.
На данном этапе условия для покупки и продажи не корректны, так как покупает и продаёт с не всегда указанным 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
Самый простой, по сути код. Но Lua выдаёт ошибку при компилировании без function main(), при том что Quik выполняет этот код без конструкции main или function. Раньше такой ошибки не было.message(«a»)
------------------------------Output------------------------------
>lua -e «io.stdout:setvbuf 'no'» «a.lua»
lua: a.lua:1: attempt to call global 'message' (a nil value)
stack traceback:
a.lua:1: in main chunk
[C]: ?
>Exit code: 1