Блог им. RomanPodbornyh
Это мой первый робот.
Суть стратегии заключается в мониторинге текущей цены по выбранному инструменту и при значительном изменении цены в противоположном направлении, при подъёме или падении осуществляется ввод заявки на покупку или продажу соответственно.
Код ещё «сырой». Кому не сложно прошу выявить ошибки и предложить советы, рекомендации по оптимизации кода.
Отправка транзакций заменена на сообщения для отладки алгоритма без последствий для счёта.
На данном этапе условия для покупки и продажи не корректны, так как покупает и продаёт с не всегда указанным 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. Когда поймете, что Вам нужна визуализация и/или требуется запуск большого количества роботов — сразу ищите пути перехода на другой язык программирования.
Это первый шаг который приведет Вас к успеху.
Вот только вопрос бот будет реагировать просто на то что куснули оба края спреда.
Это так и задумывалось?