Блог им. 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
  • Ключевые слова:
  • qlua
★1
18 комментариев

Ожидаете большой наплыв тестировщиков-энтузиастов и код-ревьюеров энтузиастов?))

По мне так сама постановка вопроса здесь главная ошибка. Я что-то написал, но оно не все работает, есть ошибки и т.д. — посмотрите че кого. 

Эти вещи делаются самостоятельно через боль — очень сложно превозмогать свою лень, отсутствие времени, отсутствие знаний и т.д.

 

Ну ладно, побрюзжал, теперь и по вопросам можно пройтись).

 

>>«Интересуют следующие вопросы: Как сделать, чтобы не покупал пока есть открытая позиция?»

Ну найти поле-метод, которые возвращают, что-то что позволит понять, что есть открытая позиция)) или позволит вычислить). Это ж Квик? Хз какие тут поля есть. Ну вывести разные поля посмотреть что в них когда есть поза и когда нет.

 

>«Если возможно, как рассчитать издержки комиссий, чтобы при вычитании их не быть в минусе?»

Ну как минимум всегда можно эмулировать. Посмотреть общую формулу брокера, значения комиссий и посчитать. Если комисс — это % от стоимости ордера, то и умножить % комисса из тарифа на стоимость в ордере и т.д.

avatar
Replikant_mih, 
Ожидаете большой наплыв тестировщиков-энтузиастов и код-ревьюеров энтузиастов?))
Хотел попросить совета у опытных, у тех кто умеет.
Роман Подборных, наверно это все же не тот ресурс,
где надо начинать программирование с азбуки
и вопросов типа «а где буква А?».

PS: не «еще в разработке», а еще не начинал разрабатываться.
avatar
VladMih, 
Роман Подборных, наверно это все же не тот ресурс, где надо начинать программирование с азбукии вопросов типа «а где буква А?».
К чему такие насмешки? Программирование на Turbo Pascal основы( и немного ещё) усвоены хорошо
Replikant_mih, 

По мне так сама постановка вопроса здесь главная ошибка. Я что-то написал, но оно не все работает, есть ошибки и т.д. — посмотрите че кого. 

Эти вещи делаются самостоятельно через боль — очень сложно превозмогать свою лень, отсутствие времени, отсутствие знаний и т.д.

Опубликовал для критики, чтобы понять в какую сторону развиваться. Я даже не программист и не трейдер. Это хобби которое мне интересно.
Роман Подборных, начните с руководства по языку Lua )
Пафос Респектыч, уже закончил)))
Роман Подборных, чот не заметно, надо ещё разок значит, по новой
Вы не проверяете наличие открытых позиций, не проверяете прошла ли транзакция или нет — мало ли ошибка или сбой и ордер не отправился — это с ходу в глаза бросилось. Комиссии так же можно выдернуть из квика из одной из таблиц — не помню какой, ибо особой надобности не было. Вроде как из сделок по функции OnTrade даже можно получить эту информацию. В общем и целом Ваш код, не в обиду — не более, чем набросок идеи. Подобную идею реализовать несложно, но, как минимум, добавьте проверки на наличие позиций и их направление.
Что значит изменение цены в противоположном направлении? противоположном чему? Если Вы отслеживаете тренд и, к примеру, не растущем рынке при откате на определенный процент покупаете, то где определение тренда?
:) смайлик для поднятия настроения 
avatar
Vitaliy, некогда это всё, пока ошибки будешь проверять можно всю прибыль так упустить! ))
Пафос Респектыч, это да — тут не поспоришь :) ну у вас отличный робот — можно на счет кидать. Цена уйдет — он по самое набалуйся на всю котлету войдет и так за день на яхту успеете сделать до вечернего клиринга ))) 
avatar
Vitaliy, 
Цена уйдет — он по самое набалуйся на всю котлету войдет и так за день на яхту успеете сделать до вечернего клиринга ))) 
Это точно))), робот только успевает заявки в обе стороны шлёпать.
Критику Вам уже озвучили. Ошибки в своих роботах придется искать самому.
Теперь пошли рекомендации:
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. Когда поймете, что Вам нужна визуализация и/или требуется запуск большого количества роботов — сразу ищите пути перехода на другой язык программирования.

avatar
Дорогу осилит идущий.
Это первый шаг который приведет Вас к успеху.

Вот только вопрос бот будет реагировать просто на то что куснули оба края спреда.
Это так и задумывалось?
avatar
Антон Б, задумка в том чтобы бот отслеживал тренд и при его развороте после изменении цены на определённый процент отправлял соответствующие транзакции. Открывать или закрывать позицию. Только надо ещё как-то запретить боту шорт.
Роман Подборных, хорошая задумка отслеживать тренд и при его развороте делать сделки.

avatar
Антон Б, Если тренд низходящий, то при его развороте покупаем, если восходящий, то при изменении направления продаём. Только лонговые позиции, без шорта.
Роман Подборных, логично, растет значит покупаем, падает значит продам. как все
avatar

теги блога Роман Подборных

....все тэги



UPDONW
Новый дизайн