Пример торгового робота

Страницы: 1 2 След.
RSS
Пример торгового робота, Помощь с торговым роботом
 
Господа добрый день! Активно изучаю язык луа для написания торгового робота.
Пока просто собираю информацию и узнаю основы.
Возможно дикость но буду очень благодарен если кто ни будь выложит самого простого робота для луа. Или поделится важной информацией которая может помочь в создании.  Без всяких личных секретов, просто что бы был фундамент для создания своего робота, это сбережет очень много сил и даст большой рывок вперед.
+ 200 к карме кто поможет
 
Очень хорошая и правильная тема! Тоже недавно начал изучать луа,и очень много непонятного. Пока вообще не пойму как правильно писать на этом языке. Да ещё и справка далека от совершенства. Или дело mql4-5,очень понятная и развернутая справка,большое колличество примеров написания роботов. Поэтому согласен с автором,тоже посмотрел бы на самый простой пример робота. Всем спасибо за ответы.
 
Я предлагал когда-то примерно то же самое. Только код робота тут почти бесполезен - я предлагал обсудить базовые алгоритмы, нюансы реализации, вплоть до кодов некоторых утилит - всё это благополучно умерло. Да и не программирует тут на Lua почти никто.

Самый простой робот далеко не прост. Алгоритмически простейший - тот, который позволяет торговать вручную, но сам никаких решений не принимает. Но и это немалый пласт инструментария - прорисовка таблиц, обработка событий от юзера, отправка заявок и вообще взаимодействие с брокером, работа с файлами и массивами. Проблема еще и в том, что инструментарий этот тесно перевязан, так что способен порождать разные наведённые ошибки, и отлаживать нужно сразу всё в комплексе. Короче, придётся вам, господа, набивать собственные шишки. Зато это самый надёжный и эффективный метод обучения! :smile:  
 
То,что самим придется набивать шишки,это понятно. Вопрос в другом, почему так непонятно,а точнее вообще никак написана справка?!
 
Господа, нашел пример простого робота со скользящей средней на сайте  QLua (o-s-a.net)
Давайте это обсудим.


-- переменная для прырывания цикла при срабатывании функции обратного вызова OnStopis_run = true

-- присванивание переменным начальных базовых значений торгового алгоритма

Account = "NL0011100043"     -- торговый счет
Class_Code = "QJSIM"         -- класс торгуемого инструмента
Sec_Code = "SBER"            -- код торгуемого инструмента
TF = INTERVAL_M1             -- торговый таймфрейм
g_lots = 1                   -- количество торгуемых лот

function main()
   -- подписываемся на получение данных свечей по инструменту в массив ds
   ds = CreateDataSource(Class_Code, Sec_Code, TF)
   while is_run do
         sleep(1000)            -- обрабатываем цикл с задержкой 1сек.
         ds:SetEmptyCallback()  -- обновляем данные по инструменту в массиве ds
         local serv_time=tonumber(timeformat(getInfoParam("SERVERTIME"))) -- помещене в переменную времени сервера в формате HHMMSS                  
         if isConnected()==1 and serv_time>=10000 and serv_time<235000 then -- проверка наличия соеденения с сервером и поподания в торговое окно
            -- место для размещения торговой логики
            -- расчет значения скользящей средней
            local SMA = 0
            local period = 20
            local count_candle = ds:size()
            if count_candle>20 then
               local sum = 0
               for i=0 , period-1 do                                                  
                   sum = sum + ds:C(count_candle-i)
               end
               SMA = sum / period
               local lots = get_lots()            

               -- получение количества лот в клиентском портфеле по инструменту
               if ds:C(count_candle)>SMA and lots<g_lots then
                   -- получение минимального шага цены для организации величины проскальзываня в ордере
                   local step=tonumber(getParamEx(Class_Code, Sec_Code, "SEC_PRICE_STEP").param_value)
                   local price_order = ds:C(count_candle)+(step*20)
                   -- цена для ордера будет = цена закрытия + 20-ть минимальных шагов инст.
                   send_order("B", math.abs(g_lots-lots) , price_order)
               end
               if ds:C(count_candle)<SMA and lots>(g_lots*(-1)) then
                   -- получение минимального шага цены для организации величины проскальзываня в ордере
                   local step=tonumber(getParamEx(Class_Code, Sec_Code, "SEC_PRICE_STEP").param_value)
                   local price_order = ds:C(count_candle)-(step*20)    
                   -- цена для ордера будет = цена закрытия - 20-ть минимальных шагов инст.
                   send_order("S", math.abs(g_lots+lots) , price_order)
               end
            end                  
          end
   end
end

-- функция возвращает количество лот в клиентском портфеле по заданному инструменту
function get_lots()
   local lots = 0
   local n = getNumberOf("futures_client_holding")
   local futures_client_holding={}                    
   for i=0,n-1 do            
      futures_client_holding = getItem("futures_client_holding", i)
      if tostring(futures_client_holding["sec_code"])==Sec_Code then
         lots=tonumber(futures_client_holding["totalnet"])
      end
   end      
   return lots
end
----------------------

-- отправка транзакции
function send_order(operation, quantity, price)      
   -- получение минимального шага цены для округления цены отправляемого ордера
   local step=tonumber(getParamEx(Class_Code, Sec_Code, "SEC_PRICE_STEP").param_value)
   local trans_params =
         {
           CLIENT_CODE = Account,
           CLASSCODE = Class_Code,
           SECCODE = Sec_Code,
           ACCOUNT = Account,
           TYPE = "L",
           TRANS_ID = tostring(1),
           OPERATION = tostring(operation),
           QUANTITY = tostring(math.abs(quantity)),
           PRICE = tostring(math.floor(tonumber(price)/step)*step),  -- округление цены при отправлении транзакции
           ACTION = "NEW_ORDER"
         }
   local res = sendTransaction(trans_params)
   if string.len(res) ~= 0 then
       message('Error: '..res,3)
       return 0
   else
       return trans_id
   end      
end

function OnStop(stop_flag)              
    is_run=false
    stop_flag=1
    ds:Close()
end


function timeformat(time_unf)
    local in1, in2=0,0
    local time_form=0      
    in1=string.find(time_unf,":" , 0)
    if in1~=nil and in1~=0 then
       in2=string.find(time_unf,":" , in1+1)
       time_form=string.sub(time_unf, 0 ,in1-1)..string.sub(time_unf, in1+1 ,in2-1)..string.sub(time_unf, in2+1 ,string.len(time_unf))
    end
    return time_form
end
 
Maksimus,
Цитата
почему так непонятно,а точнее вообще никак написана справка?!
Чтобы жизнь мёдом не казалась. :smile: Впрочем, хрен с ней, со справкой - почему вся софтина так написана?
 
Игорь, А чего тут обсуждать? Лично я в код вообще смотреть не хочу - постановка задачи должна быть на русском языке. И скользящая средняя мне нафиг не нужна - она только захламляет код.
 
Игорь, Всё же бегло просмотрел код - вот АБСОЛЮТНО ничего не нужно!

Во-первых, "переменная для прерывания цикла" прерывает цикл всегда, КРОМЕ срабатывания OnStop. Во-вторых, присваивание переменным начальных базовых значений В КОДЕ - это сразу в морг. В-третьих, CreateDataSource лично я никогда не пользовался, и другим не советую - тем более, на минутном таймфрейме. Про timeformat и getInfoParam впервые слышу, а isConnected мгновенно забыл, как страшный сон. ЧАВО?! Какое такое "получение количества лот в клиентском портфеле"?! Тьфу ты - при чём тут фьючерсы? Шаг цены также нафиг не нужен. О! step*20 - это круто! Неужели кто-то рискнёт этим торговать?

И что здесь обсуждать? На помойку! Немедленно! :smile:  
 
Владимир, Спасибо что просмотрели код и разнесли его в пух и прах :smile:
Вопрос по торговым индикаторам-  в квике уже есть много разных торговых индикаторов. Значит не нужно писать громоздкий код по созданию индикаторов, нужно  вызвать их из квика и создать условия для покупки продажи? (может криво сформулировал вопрос уповаю на ваше понимание)
Нашел еще одного робота выкладывать сюда на обозрение? :smile:  
 
Игорь, Не ко мне вопрос - индикаторы меня не интересуют ВААПЩЕ!
Цитата
Нашел еще одного робота выкладывать сюда на обозрение?
НЕ НАДО!!!  :smile: Сначала нужно обсудить концепции, предполагаемый набор утилит (как чёрный ящик: вход-выход), структуры данных, примерные алгоритмы торговли... короче, что-то типа ТЗ.
 
Да не стоит брать чужих роботов, бед только хлебнете.
Пишите с нуля неспешно, чтобы понимать полностью весь код.

Дело в том, что чистый код робота это по сути-то получил позиции, получил данные на основе которых выдал/не выдал сигнал, после чего и создал заявку и так по кругу
Но в реальной торговле это совершенно не жизнеспособно.

А в результате чуть ли ни половина кода робота будет обработка не стандартных ситуаций возникающих при торговле и устранение косяков qlua через разнообразные костыли.
 
Владимир, Хорошо, тогда я ухожу курить интернет нашел крутой ресурс  База скрипта в QLua (lua) | QUIKBOT . EVOLUTION … (quikluacsharp.ru)
Когда наберусь достаточно знаний, вернусь сюда за дальнейшим обсуждением. Несколько напутствующих слов приветствуется :smile:  
 
BlaZed, Наверное так правильно да, просто кажется бесконечным. Чем больше узнаешь, понимаешь как много ты еще не знаешь)
 
Бегло пробежавшись по коду, сражу же понятно что его не стоит использовать.
1) CreateDataSource нет проверки что он хоть что нибудь вернул
2) SetEmptyCallback не надо вызывать в цикле, одного раза достаточно
3) getInfoParam("SERVERTIME") в нерабочее время может вернуть все что угодно, будете посылать свои заявки в пустоту и ловить ошибки
4) не учтено время клирингов, в которое будете получать от биржи всякий бред, который надо жестко фильтровать
5) С таблицей futures_client_holding тоже не все так просто, она запросто может оказаться например пустая, хотя позиции есть, но еще не прогрузились. Ну или например сделка уже прошла, но колбек задерживается из-за нагрузки сервера и таблица не успела обновиться, в результате получаем некорректные данные.
6) ну про стратегию торговли по SMA тут и говорить не чего

И это только не сильно всматриваясь в код.
 
Цитата
Игорь написал:
BlaZed, Наверное так правильно да, просто кажется бесконечным. Чем больше узнаешь, понимаешь как много ты еще не знаешь)
Это нормально.
Я вот своего писал неделю если не меньше , зато потом еще где-то полгода ловил и исправлял ошибки которых по логике-то и быть не должно.
Это у вас еще впереди.
Просто учти, что написать робота это несложно, сложно будет заставить его корректно обрабатывать постоянно встречающиеся нестандартные ситуации.
 
Цитата
BlaZed написал:
Бегло пробежавшись по коду, сражу же понятно что его не стоит использовать.
1) CreateDataSource нет проверки что он хоть что нибудь вернул
2) SetEmptyCallback не надо вызывать в цикле, одного раза достаточно
3) getInfoParam("SERVERTIME") в нерабочее время может вернуть все что угодно, будете посылать свои заявки в пустоту и ловить ошибки
4) не учтено время клирингов, в которое будете получать от биржи всякий бред, который надо жестко фильтровать
5) С таблицей futures_client_holding тоже не все так просто, она запросто может оказаться например пустая, хотя позиции есть, но еще не прогрузились. Ну или например сделка уже прошла, но колбек задерживается из-за нагрузки сервера и таблица не успела обновиться, в результате получаем некорректные данные.
6) ну про стратегию торговли по SMA тут и говорить не чего

И это только не сильно всматриваясь в код.
Ну это пример робота для обучения программированию,как я понял. Поэтому стратегия зашитая в этот алгоритм,думая неважна. Главное как вы правильно сказали,это написать робота,который будет правильно реагировать на нестандартные или проблемные ситуации. Вот вы привели 6 пунктов,5 из которых очень важны для новичков типа меня,но почему-то все, что вы описали,не описывают в мануале к языку. Поэтому эта ветка думаю очень важна для новичков. Да и более уверенные кодеры ломаю тоже могут подчерпнуть для себя много чего интересного! Лично я буду регулярно читать эту ветку,и может получится написать самый простейший алгоритм. Хотя я пока вообще не могу даже представить,что тут и как.
 
Цитата
Владимир написал:
Maksimus,
Цитата
почему так непонятно,а точнее вообще никак написана справка?!
Чтобы жизнь мёдом не казалась. :: Впрочем, хрен с ней, со справкой - почему вся софтина так написана?
На счёт софтины с вами полностью согласен. Хотя может когда разберусь с этим чудо-языком,изменю свое мнение,а пока для меня это полный пипец,а не софт.
 
Игорь, BlaZed прав насчёт "надо писать самому". И задача эта не из лёгких. В смысле, написать робота, который тебя без штанов оставит, относительно несложно (хотя и там придётся попотеть), а вот зарабатывающего...

И насчёт "я своего писал неделю если не меньше"... мой давно работает (и хорошо работает!), а я всё пишу ТЗ на доработки. Месяц, если не больше. :smile:  
 
Maksimus, Язык поганый, но несложный - разобраться в нём можно без особых усилий. Но подводных камней в софте более, чем достаточно.
 
Цитата
Владимир написал:
Игорь, BlaZed прав насчёт "надо писать самому". И задача эта не из лёгких. В смысле, написать робота, который тебя без штанов оставит, относительно несложно (хотя и там придётся попотеть), а вот зарабатывающего...

И насчёт "я своего писал неделю если не меньше"... мой давно работает (и хорошо работает!), а я всё пишу ТЗ на доработки. Месяц, если не больше. ::  
Да тут хоть бы какого нибудь написать!))) Даже который без штанов оставит. На демо счёте конечно чтоб работал. Но пока увы, мозгов не хватает даже на убыточного.
 
Цитата
Владимир написал:
Maksimus, Язык поганый, но несложный - разобраться в нём можно без особых усилий. Но подводных камней в софте более, чем достаточно.
Для меня как раз таки очень сложный показался. И самое главное,непонятный абсолютно. Я как то читал вопросы,которые форумчане задают разработчикам квика,и ответ в основном один - К сожалению такой возможности нет,но мы примем к сведению ваше пожелание- ... Вот лично я пока вообще не могу понять,как с этими таблицами работать,как данные получать и т.д... Вообщем одним словом,нужно разбираться.
 
Цитата
Игорь написал:
Возможно дикость но буду очень благодарен если кто ни будь выложит самого простого робота для луа.
простейший робот на Луа — форум QUIK
пост № 4

самостоятельное изучение - очень много времени уйдет и все равно вопросы останутся (я шел этим путем)
возможно есть смысл поучится у кого то, по крайней мере будет первоначальная база
 
Цитата
Константин Рейм написал:
Цитата
Игорь написал:
Возможно дикость но буду очень благодарен если кто ни будь выложит самого простого робота для луа.
 простейший робот на Луа — форум QUIK
пост № 4

самостоятельное изучение - очень много времени уйдет и все равно вопросы останутся (я шел этим путем)
возможно есть смысл поучится у кого то, по крайней мере будет первоначальная база
Именно так я учился писать на mql4-5. Сначала смотрел видео уроки и пробовал по ним,потом начинал разбираться в каждой строчке кода и в итоге без проблем получается на этом языке. Но qlua для меня пока темный лес-куча дров.
 
Цитата
Maksimus написал:
Именно так я учился писать на mql4-5. Сначала смотрел видео уроки и пробовал по ним,потом начинал разбираться в каждой строчке кода и в итоге без проблем получается на этом языке. Но qlua для меня пока темный лес-куча дров.
Знакомо. Первые роботы на мкл4 были. Потом перешел на квик и lua - матерился долго. После метатрейдера на квик - это прыжок назад. Но что делать на метатрейдере опционов нет.
 
Maksimus, Ну, не знаю... я-то уже добрым десятком языков владел, когда впервые увидел Lua (сентябрь прошлого года). Другое дело, что после знакомства с С ничего другого искать и писать на чём-то ином просто НЕ ХОЧЕТСЯ - гениальный язык! Ну, а где-то на другом конце помещается Lua. :smile:

А чего там "с этими таблицами работать"? Строки - они и в Африке строки. А больше тут ничего и нет.

Пугнуть, что ли, каким-нить своим оператором?  :smile: Ну вот, скажем:
if tostring(a[i][12][j][0])==tostring(s.trans_id) and a[i][12][j][1]==0 then a[i][12][j][0]=s.order_num;end;
 
Цитата
Константин Рейм написал:
Цитата
Maksimus написал:
Именно так я учился писать на mql4-5. Сначала смотрел видео уроки и пробовал по ним,потом начинал разбираться в каждой строчке кода и в итоге без проблем получается на этом языке. Но qlua для меня пока темный лес-куча дров.
Знакомо. Первые роботы на мкл4 были. Потом перешел на квик и lua - матерился долго. После метатрейдера на квик - это прыжок назад. Но что делать на метатрейдере опционов нет.
Тогда вы конечно меня поймёте,как я сейчас матерюсь!!))) А ещё меня удивило,что в луа нет возможности работы с графическим интерфейсом. Например меню написать для ввода каких-то параметров. Теже линии на графике нарисовать и т.д.. Ну это сейчас не самая главная деталь в самолёте,но тем не менее. Хотелось бы чтоб этот функционал добавили конечно.
 
Цитата
Владимир написал:
Maksimus, Ну, не знаю... я-то уже добрым десятком языков владел, когда впервые увидел Lua (сентябрь прошлого года). Другое дело, что после знакомства с С ничего другого искать и писать на чём-то ином просто НЕ ХОЧЕТСЯ - гениальный язык! Ну, а где-то на другом конце помещается Lua. ::

А чего там "с этими таблицами работать"? Строки - они и в Африке строки. А больше тут ничего и нет.

Пугнуть, что ли, каким-нить своим оператором?  :: Ну вот, скажем:
if tostring(a[12][j][0])==tostring(s.trans_id) and a[12][j][1]==0 then a[12][j][0]=s.order_num;end;
Пугнуть у вас получилось!!!)))) Ну может и я когда нибудь буду с лёгкостью писать такие строки!)  
 
Maksimus, Да несложно всё это. И упаси, Господи, нас от графического интерфейса! :smile:  
 
Цитата
Maksimus написал:
А ещё меня удивило,что в луа нет возможности работы с графическим интерфейсом. Например меню написать для ввода каких-то параметров.
Меню можно сделать
 
Цитата
Константин Рейм написал:
Цитата
Maksimus написал:
А ещё меня удивило,что в луа нет возможности работы с графическим интерфейсом. Например меню написать для ввода каких-то параметров.
Меню можно сделать
Цитата
Владимир написал:
Maksimus, Да несложно всё это. И упаси, Господи, нас от графического интерфейса! ::  
Почему упаси всевышний от граф.интерфейса??
 
Цитата
Константин Рейм написал:
Цитата
Maksimus написал:
А ещё меня удивило,что в луа нет возможности работы с графическим интерфейсом. Например меню написать для ввода каких-то параметров.
Меню можно сделать
Че то не открывается картинка
 
Цитата
Maksimus написал:
Че то не открывается картинка
Я в курсе что не открывается - хз его знает как сюда рисунок воткнуть (попытка номер два)
 
Maksimus, Много лет назад один умный человек сказал: "Визуальное программирование создаёт у чайника иллюзию, что он тоже программист". :smile:  
 
Константин Рейм, Вторая попытка удалась, хоть и со скрипом.  :smile: Это меню на базе таблицы Квика?
 
Цитата
Владимир написал:
Это меню на базе таблицы Квика?
да
 
Цитата
Константин Рейм написал:
Цитата
Владимир написал:
Это меню на базе таблицы Квика?
да
О как! А как в этом меню менять какие либо параметры? Например ввести новое значение или поменять значение в каком либо поле?
 
Константин Рейм, Самое разумное. У меня тоже так: основная таблица по тикерам есть головное меню, а при клике правой кнопкой по строке с интересующим тикерам открывается дочернее. Очень просто и удобно.
 
Цитата
Maksimus написал:
О как! А как в этом меню менять какие либо параметры? Например ввести новое значение или поменять значение в каком либо поле?
Как обычно - кликнули на поле в столбике "Значение" - прописали что нам надо и вперед
 
Константин Рейм, Опа! А вот редактора значений полей у меня нет! И как тут это делается?
 
Цитата
Владимир написал:
Опа! А вот редактора значений полей у меня нет! И как тут это делается?
Как сделать поле ввода цены в таблице CreateTable? — форум QUIK
 
Цитата
Константин Рейм написал:
Цитата
Владимир написал:
Опа! А вот редактора значений полей у меня нет! И как тут это делается?
 Как сделать поле ввода цены в таблице CreateTable? — форум QUIK
Огромное,человеческое спасибо! Обязательно почитаю эту ветку. Значит буду начинать именно с вывода значений различных таблиц. Думаю все так и начинали.
 
Константин Рейм, О, Господи! Да у меня весь скрипт короче!  :smile: Не, я думал, что есть какие-то встроенные средства, а не самому писать   if (32 <= key_code and key_code <= 126) or (192 <= key_code and key_code <= 255) then...  
 
Maksimus, Так ВЫВОДА, а не ВВОДА! :smile:  
 
Цитата
Владимир написал:
Да у меня весь скрипт короче!
Да у меня тоже. Менюшка 100 строк, а сам код 15 (цифры условные).)))
 
Цитата
Владимир написал:
Maksimus, Так ВЫВОДА, а не ВВОДА! ::  
А как сделать ввод параметров?
 
Цитата
Maksimus написал:
А как сделать ввод параметров?
Так ввод параметров из Меню - пример кода выше
 
Цитата
Константин Рейм написал:
Цитата
Maksimus написал:
А как сделать ввод параметров?
Так ввод параметров из Меню - пример кода выше
А поле ввода как сделать? Есть какая то функция?
 
Специально для чайников объясняю:
--------------------
1)  отличие LUA от языка для метатрейда (mql)  в том, что для луа есть не только подробная инструкция но и куча учебников .
----------------------
2) справка по qlua - это справочник библиотеки , а не описания языка. Как всякий справочник он предполагает, что Вы изучили язык программирования LUA и умеете писать на нем программ.
---------------------------
3) Создание роботов это вообще не про qLua или Lua, а про умение создавать алгоритмы конечных автоматов, которые автоматизируют некоторые рутинные действия
------------------------
4) Создание робота , который не сливает счет а даже приносит прибыль - это вообще не про то, что Выше, а про знание рынков и возможно ИИ.
------------------------------  
Поэтому для получения бабла с рынка изучайте все 4 указанных выше пункта и не ищите халяву.  
 
nikolz, Лапуль, а Вы-то кто? Вы же и есть самый натуральный, без подмесу, чайник. :wink:

1)  Толку-то от этих учебников? Давно известно: "Кто умеет - тот делает, кто не умеет - тот учит, как надо делать".

2) Чтобы "изучить язык программирования LUA и умееть писать на нем программы" требуется примерно полчаса.

3) Какие, в жопу, "конечные автоматы"? Какие, в жопу, "некоторые рутинные действия"?

4) Ну вот МОЙ робот "не сливает счет а даже приносит прибыль" - и чего? В рынках я ни уха ни рыла, а ИИстов я уже лет 20 гоняю стихами Маршака:
Мой мальчик! Тебе эту песню дарю.
Рассчитывай силы свои.
И, если сказать не умеешь "хрю-хрю", -
Визжи, не стесняясь: "ИИ!"....
 
Цитата
nikolz написал:
Специально для чайников объясняю:
--------------------
1)  отличие LUA от языка для метатрейда (mql)  в том, что для луа есть не только подробная инструкция но и куча учебников .
----------------------
2) справка по qlua - это справочник библиотеки , а не описания языка. Как всякий справочник он предполагает, что Вы изучили язык программирования LUA и умеете писать на нем программ.
---------------------------
3) Создание роботов это вообще не про qLua или Lua, а про умение создавать алгоритмы конечных автоматов, которые автоматизируют некоторые рутинные действия
------------------------
4) Создание робота , который не сливает счет а даже приносит прибыль - это вообще не про то, что Выше, а про знание рынков и возможно ИИ.
------------------------------  
Поэтому для получения бабла с рынка изучайте все 4 указанных выше пункта и не ищите халяву.  
Слушай "уважаемый"! Ты по-моему не в ту ветку залез! Здесь люди новички спрашивают знающих людей,что и как в написании робота. И нормальные,знающие люди объясняют нормальным языком,что и как! И за это этим людям огромное спасибо!! А ту хрень,что ты написал выше сфотографируй и повесь у себя на стене,и читай каждый день свои бесполезные советы!! Больших неудач тебе в написании роботов!
Страницы: 1 2 След.
Читают тему
Наверх