Это мой первый робот.
Суть стратегии заключается в мониторинге текущей цены по выбранному инструменту и при значительном изменении цены в противоположном направлении, при подъёме или падении осуществляется ввод заявки на покупку или продажу соответственно.
Код ещё «сырой». Кому не сложно прошу выявить ошибки и предложить советы, рекомендации по оптимизации кода.
Отправка транзакций заменена на сообщения для отладки алгоритма без последствий для счёта.
На данном этапе условия для покупки и продажи не корректны, так как покупает и продаёт с не всегда указанным 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
Ожидаете большой наплыв тестировщиков-энтузиастов и код-ревьюеров энтузиастов?))
По мне так сама постановка вопроса здесь главная ошибка. Я что-то написал, но оно не все работает, есть ошибки и т.д. — посмотрите че кого.
Эти вещи делаются самостоятельно через боль — очень сложно превозмогать свою лень, отсутствие времени, отсутствие знаний и т.д.
Ну ладно, побрюзжал, теперь и по вопросам можно пройтись).
>>«Интересуют следующие вопросы: Как сделать, чтобы не покупал пока есть открытая позиция?»
Ну найти поле-метод, которые возвращают, что-то что позволит понять, что есть открытая позиция)) или позволит вычислить). Это ж Квик? Хз какие тут поля есть. Ну вывести разные поля посмотреть что в них когда есть поза и когда нет.
>«Если возможно, как рассчитать издержки комиссий, чтобы при вычитании их не быть в минусе?»
Ну как минимум всегда можно эмулировать. Посмотреть общую формулу брокера, значения комиссий и посчитать. Если комисс — это % от стоимости ордера, то и умножить % комисса из тарифа на стоимость в ордере и т.д.
Хотел попросить совета у опытных, у тех кто умеет.
где надо начинать программирование с азбуки
и вопросов типа «а где буква А?».
PS: не «еще в разработке», а еще не начинал разрабатываться.
Опубликовал для критики, чтобы понять в какую сторону развиваться. Я даже не программист и не трейдер. Это хобби которое мне интересно.
Что значит изменение цены в противоположном направлении? противоположном чему? Если Вы отслеживаете тренд и, к примеру, не растущем рынке при откате на определенный процент покупаете, то где определение тренда?
:) смайлик для поднятия настроения
Теперь пошли рекомендации:
1. Начните отсюда: https://quik2dde.ru/viewforum.php?id=12
Там вообще много полезной информации.
2. Не забудьте скачать себе библиотеку QL.lua — избавитесь от необходимости изобретать различные велосипеды.
3. Запомните одно из важных правил построения роботов QLua:
Цикл Main(), по возможности, всегда должен выглядеть примерно так:
function main()
while is_run or true do
sleep(100)
end
end
4. Когда поймете, что Вам нужна визуализация и/или требуется запуск большого количества роботов — сразу ищите пути перехода на другой язык программирования.
Это первый шаг который приведет Вас к успеху.
Вот только вопрос бот будет реагировать просто на то что куснули оба края спреда.
Это так и задумывалось?