Роман Подборных
Роман Подборных личный блог
19 мая 2020, 15:06

Мой первый робот(ещё в разработке)

Это мой первый робот.
Суть стратегии заключается в мониторинге текущей цены по выбранному инструменту и при значительном изменении цены в противоположном направлении, при подъёме или падении осуществляется ввод заявки на покупку или продажу соответственно.
Код ещё «сырой». Кому не сложно прошу выявить ошибки и предложить советы, рекомендации по оптимизации кода.
Отправка транзакций заменена на сообщения для отладки алгоритма без последствий для счёта.
На данном этапе условия для покупки и продажи не корректны, так как покупает и продаёт с не всегда указанным 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
18 Комментариев
  • Replikant_mih
    19 мая 2020, 15:21

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

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

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

     

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

     

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

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

     

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

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

      • VladMih
        19 мая 2020, 16:31
        Роман Подборных, наверно это все же не тот ресурс,
        где надо начинать программирование с азбуки
        и вопросов типа «а где буква А?».

        PS: не «еще в разработке», а еще не начинал разрабатываться.
  • Vitaliy
    19 мая 2020, 15:26
    Вы не проверяете наличие открытых позиций, не проверяете прошла ли транзакция или нет — мало ли ошибка или сбой и ордер не отправился — это с ходу в глаза бросилось. Комиссии так же можно выдернуть из квика из одной из таблиц — не помню какой, ибо особой надобности не было. Вроде как из сделок по функции OnTrade даже можно получить эту информацию. В общем и целом Ваш код, не в обиду — не более, чем набросок идеи. Подобную идею реализовать несложно, но, как минимум, добавьте проверки на наличие позиций и их направление.
    Что значит изменение цены в противоположном направлении? противоположном чему? Если Вы отслеживаете тренд и, к примеру, не растущем рынке при откате на определенный процент покупаете, то где определение тренда?
    :) смайлик для поднятия настроения 
    • Пафос Респектыч
      19 мая 2020, 15:34
      Vitaliy, некогда это всё, пока ошибки будешь проверять можно всю прибыль так упустить! ))
      • Vitaliy
        19 мая 2020, 15:39
        Пафос Респектыч, это да — тут не поспоришь :) ну у вас отличный робот — можно на счет кидать. Цена уйдет — он по самое набалуйся на всю котлету войдет и так за день на яхту успеете сделать до вечернего клиринга ))) 
  • Prophetic
    20 мая 2020, 10:56
    Критику Вам уже озвучили. Ошибки в своих роботах придется искать самому.
    Теперь пошли рекомендации:
    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. Когда поймете, что Вам нужна визуализация и/или требуется запуск большого количества роботов — сразу ищите пути перехода на другой язык программирования.

  • Антон Б
    20 мая 2020, 22:32
    Дорогу осилит идущий.
    Это первый шаг который приведет Вас к успеху.

    Вот только вопрос бот будет реагировать просто на то что куснули оба края спреда.
    Это так и задумывалось?
      • Антон Б
        21 мая 2020, 16:40
        Роман Подборных, хорошая задумка отслеживать тренд и при его развороте делать сделки.

          • Антон Б
            21 мая 2020, 17:28
            Роман Подборных, логично, растет значит покупаем, падает значит продам. как все

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн