Пример торгового робота, Помощь с торговым роботом
Пользователь
Сообщений: Регистрация: 15.08.2021
15.08.2021 13:29:38
Господа добрый день! Активно изучаю язык луа для написания торгового робота. Пока просто собираю информацию и узнаю основы. Возможно дикость но буду очень благодарен если кто ни будь выложит самого простого робота для луа. Или поделится важной информацией которая может помочь в создании. Без всяких личных секретов, просто что бы был фундамент для создания своего робота, это сбережет очень много сил и даст большой рывок вперед. + 200 к карме кто поможет
Пользователь
Сообщений: Регистрация: 23.10.2020
15.08.2021 13:53:19
Очень хорошая и правильная тема! Тоже недавно начал изучать луа,и очень много непонятного. Пока вообще не пойму как правильно писать на этом языке. Да ещё и справка далека от совершенства. Или дело mql4-5,очень понятная и развернутая справка,большое колличество примеров написания роботов. Поэтому согласен с автором,тоже посмотрел бы на самый простой пример робота. Всем спасибо за ответы.
Пользователь
Сообщений: Регистрация: 25.09.2020
15.08.2021 15:08:07
Я предлагал когда-то примерно то же самое. Только код робота тут почти бесполезен - я предлагал обсудить базовые алгоритмы, нюансы реализации, вплоть до кодов некоторых утилит - всё это благополучно умерло. Да и не программирует тут на Lua почти никто.
Самый простой робот далеко не прост. Алгоритмически простейший - тот, который позволяет торговать вручную, но сам никаких решений не принимает. Но и это немалый пласт инструментария - прорисовка таблиц, обработка событий от юзера, отправка заявок и вообще взаимодействие с брокером, работа с файлами и массивами. Проблема еще и в том, что инструментарий этот тесно перевязан, так что способен порождать разные наведённые ошибки, и отлаживать нужно сразу всё в комплексе. Короче, придётся вам, господа, набивать собственные шишки. Зато это самый надёжный и эффективный метод обучения!
Пользователь
Сообщений: Регистрация: 23.10.2020
15.08.2021 15:25:12
То,что самим придется набивать шишки,это понятно. Вопрос в другом, почему так непонятно,а точнее вообще никак написана справка?!
Пользователь
Сообщений: Регистрация: 15.08.2021
15.08.2021 15:35:06
Господа, нашел пример простого робота со скользящей средней на сайте Давайте это обсудим.
-- переменная для прырывания цикла при срабатывании функции обратного вызова 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
почему так непонятно,а точнее вообще никак написана справка?!
Чтобы жизнь мёдом не казалась. Впрочем, хрен с ней, со справкой - почему вся софтина так написана?
Пользователь
Сообщений: Регистрация: 25.09.2020
15.08.2021 15:42:22
Игорь, А чего тут обсуждать? Лично я в код вообще смотреть не хочу - постановка задачи должна быть на русском языке. И скользящая средняя мне нафиг не нужна - она только захламляет код.
Пользователь
Сообщений: Регистрация: 25.09.2020
15.08.2021 16:01:30
Игорь, Всё же бегло просмотрел код - вот АБСОЛЮТНО ничего не нужно!
Во-первых, "переменная для прерывания цикла" прерывает цикл всегда, КРОМЕ срабатывания OnStop. Во-вторых, присваивание переменным начальных базовых значений В КОДЕ - это сразу в морг. В-третьих, CreateDataSource лично я никогда не пользовался, и другим не советую - тем более, на минутном таймфрейме. Про timeformat и getInfoParam впервые слышу, а isConnected мгновенно забыл, как страшный сон. ЧАВО?! Какое такое "получение количества лот в клиентском портфеле"?! Тьфу ты - при чём тут фьючерсы? Шаг цены также нафиг не нужен. О! step*20 - это круто! Неужели кто-то рискнёт этим торговать?
И что здесь обсуждать? На помойку! Немедленно!
Пользователь
Сообщений: Регистрация: 15.08.2021
15.08.2021 17:03:58
Владимир, Спасибо что просмотрели код и разнесли его в пух и прах Вопрос по торговым индикаторам- в квике уже есть много разных торговых индикаторов. Значит не нужно писать громоздкий код по созданию индикаторов, нужно вызвать их из квика и создать условия для покупки продажи? (может криво сформулировал вопрос уповаю на ваше понимание) Нашел еще одного робота выкладывать сюда на обозрение?
Пользователь
Сообщений: Регистрация: 25.09.2020
15.08.2021 17:30:51
Игорь, Не ко мне вопрос - индикаторы меня не интересуют ВААПЩЕ!
Цитата
Нашел еще одного робота выкладывать сюда на обозрение?
НЕ НАДО!!! Сначала нужно обсудить концепции, предполагаемый набор утилит (как чёрный ящик: вход-выход), структуры данных, примерные алгоритмы торговли... короче, что-то типа ТЗ.
Пользователь
Сообщений: Регистрация: 20.12.2020
15.08.2021 19:16:29
Да не стоит брать чужих роботов, бед только хлебнете. Пишите с нуля неспешно, чтобы понимать полностью весь код.
Дело в том, что чистый код робота это по сути-то получил позиции, получил данные на основе которых выдал/не выдал сигнал, после чего и создал заявку и так по кругу Но в реальной торговле это совершенно не жизнеспособно.
А в результате чуть ли ни половина кода робота будет обработка не стандартных ситуаций возникающих при торговле и устранение косяков qlua через разнообразные костыли.
Пользователь
Сообщений: Регистрация: 15.08.2021
15.08.2021 19:26:59
Владимир, Хорошо, тогда я ухожу курить интернет нашел крутой ресурс Когда наберусь достаточно знаний, вернусь сюда за дальнейшим обсуждением. Несколько напутствующих слов приветствуется
Пользователь
Сообщений: Регистрация: 15.08.2021
15.08.2021 19:28:43
BlaZed, Наверное так правильно да, просто кажется бесконечным. Чем больше узнаешь, понимаешь как много ты еще не знаешь)
Пользователь
Сообщений: Регистрация: 20.12.2020
15.08.2021 19:48:16
Бегло пробежавшись по коду, сражу же понятно что его не стоит использовать. 1) CreateDataSource нет проверки что он хоть что нибудь вернул 2) SetEmptyCallback не надо вызывать в цикле, одного раза достаточно 3) getInfoParam("SERVERTIME") в нерабочее время может вернуть все что угодно, будете посылать свои заявки в пустоту и ловить ошибки 4) не учтено время клирингов, в которое будете получать от биржи всякий бред, который надо жестко фильтровать 5) С таблицей futures_client_holding тоже не все так просто, она запросто может оказаться например пустая, хотя позиции есть, но еще не прогрузились. Ну или например сделка уже прошла, но колбек задерживается из-за нагрузки сервера и таблица не успела обновиться, в результате получаем некорректные данные. 6) ну про стратегию торговли по SMA тут и говорить не чего
И это только не сильно всматриваясь в код.
Пользователь
Сообщений: Регистрация: 20.12.2020
15.08.2021 20:00:02
Цитата
Игорь написал: , Наверное так правильно да, просто кажется бесконечным. Чем больше узнаешь, понимаешь как много ты еще не знаешь)
Это нормально. Я вот своего писал неделю если не меньше , зато потом еще где-то полгода ловил и исправлял ошибки которых по логике-то и быть не должно. Это у вас еще впереди. Просто учти, что написать робота это несложно, сложно будет заставить его корректно обрабатывать постоянно встречающиеся нестандартные ситуации.
Пользователь
Сообщений: Регистрация: 23.10.2020
15.08.2021 20:10:22
Цитата
BlaZed написал: Бегло пробежавшись по коду, сражу же понятно что его не стоит использовать. 1) CreateDataSource нет проверки что он хоть что нибудь вернул 2) SetEmptyCallback не надо вызывать в цикле, одного раза достаточно 3) getInfoParam("SERVERTIME") в нерабочее время может вернуть все что угодно, будете посылать свои заявки в пустоту и ловить ошибки 4) не учтено время клирингов, в которое будете получать от биржи всякий бред, который надо жестко фильтровать 5) С таблицей futures_client_holding тоже не все так просто, она запросто может оказаться например пустая, хотя позиции есть, но еще не прогрузились. Ну или например сделка уже прошла, но колбек задерживается из-за нагрузки сервера и таблица не успела обновиться, в результате получаем некорректные данные. 6) ну про стратегию торговли по SMA тут и говорить не чего
И это только не сильно всматриваясь в код.
Ну это пример робота для обучения программированию,как я понял. Поэтому стратегия зашитая в этот алгоритм,думая неважна. Главное как вы правильно сказали,это написать робота,который будет правильно реагировать на нестандартные или проблемные ситуации. Вот вы привели 6 пунктов,5 из которых очень важны для новичков типа меня,но почему-то все, что вы описали,не описывают в мануале к языку. Поэтому эта ветка думаю очень важна для новичков. Да и более уверенные кодеры ломаю тоже могут подчерпнуть для себя много чего интересного! Лично я буду регулярно читать эту ветку,и может получится написать самый простейший алгоритм. Хотя я пока вообще не могу даже представить,что тут и как.
почему так непонятно,а точнее вообще никак написана справка?!
Чтобы жизнь мёдом не казалась. :: Впрочем, хрен с ней, со справкой - почему вся софтина так написана?
На счёт софтины с вами полностью согласен. Хотя может когда разберусь с этим чудо-языком,изменю свое мнение,а пока для меня это полный пипец,а не софт.
Пользователь
Сообщений: Регистрация: 25.09.2020
15.08.2021 20:15:33
Игорь, BlaZed прав насчёт "надо писать самому". И задача эта не из лёгких. В смысле, написать робота, который тебя без штанов оставит, относительно несложно (хотя и там придётся попотеть), а вот зарабатывающего...
И насчёт "я своего писал неделю если не меньше"... мой давно работает (и хорошо работает!), а я всё пишу ТЗ на доработки. Месяц, если не больше.
Пользователь
Сообщений: Регистрация: 25.09.2020
15.08.2021 20:19:00
Maksimus, Язык поганый, но несложный - разобраться в нём можно без особых усилий. Но подводных камней в софте более, чем достаточно.
Пользователь
Сообщений: Регистрация: 23.10.2020
15.08.2021 21:01:35
Цитата
Владимир написал: , BlaZed прав насчёт "надо писать самому". И задача эта не из лёгких. В смысле, написать робота, который тебя без штанов оставит, относительно несложно (хотя и там придётся попотеть), а вот зарабатывающего...
И насчёт "я своего писал неделю если не меньше"... мой давно работает (и хорошо работает!), а я всё пишу ТЗ на доработки. Месяц, если не больше. ::
Да тут хоть бы какого нибудь написать!))) Даже который без штанов оставит. На демо счёте конечно чтоб работал. Но пока увы, мозгов не хватает даже на убыточного.
Пользователь
Сообщений: Регистрация: 23.10.2020
15.08.2021 21:05:00
Цитата
Владимир написал: , Язык поганый, но несложный - разобраться в нём можно без особых усилий. Но подводных камней в софте более, чем достаточно.
Для меня как раз таки очень сложный показался. И самое главное,непонятный абсолютно. Я как то читал вопросы,которые форумчане задают разработчикам квика,и ответ в основном один - К сожалению такой возможности нет,но мы примем к сведению ваше пожелание- ... Вот лично я пока вообще не могу понять,как с этими таблицами работать,как данные получать и т.д... Вообщем одним словом,нужно разбираться.
Пользователь
Сообщений: Регистрация: 08.03.2016
15.08.2021 21:14:22
Цитата
Игорь написал: Возможно дикость но буду очень благодарен если кто ни будь выложит самого простого робота для луа.
пост № 4
самостоятельное изучение - очень много времени уйдет и все равно вопросы останутся (я шел этим путем) возможно есть смысл поучится у кого то, по крайней мере будет первоначальная база
написал: Возможно дикость но буду очень благодарен если кто ни будь выложит самого простого робота для луа.
пост № 4
самостоятельное изучение - очень много времени уйдет и все равно вопросы останутся (я шел этим путем) возможно есть смысл поучится у кого то, по крайней мере будет первоначальная база
Именно так я учился писать на mql4-5. Сначала смотрел видео уроки и пробовал по ним,потом начинал разбираться в каждой строчке кода и в итоге без проблем получается на этом языке. Но qlua для меня пока темный лес-куча дров.
Пользователь
Сообщений: Регистрация: 08.03.2016
15.08.2021 21:58:13
Цитата
Maksimus написал: Именно так я учился писать на mql4-5. Сначала смотрел видео уроки и пробовал по ним,потом начинал разбираться в каждой строчке кода и в итоге без проблем получается на этом языке. Но qlua для меня пока темный лес-куча дров.
Знакомо. Первые роботы на мкл4 были. Потом перешел на квик и lua - матерился долго. После метатрейдера на квик - это прыжок назад. Но что делать на метатрейдере опционов нет.
Пользователь
Сообщений: Регистрация: 25.09.2020
15.08.2021 22:04:53
Maksimus, Ну, не знаю... я-то уже добрым десятком языков владел, когда впервые увидел Lua (сентябрь прошлого года). Другое дело, что после знакомства с С ничего другого искать и писать на чём-то ином просто НЕ ХОЧЕТСЯ - гениальный язык! Ну, а где-то на другом конце помещается Lua.
А чего там "с этими таблицами работать"? Строки - они и в Африке строки. А больше тут ничего и нет.
Пугнуть, что ли, каким-нить своим оператором? Ну вот, скажем: 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;
написал: Именно так я учился писать на mql4-5. Сначала смотрел видео уроки и пробовал по ним,потом начинал разбираться в каждой строчке кода и в итоге без проблем получается на этом языке. Но qlua для меня пока темный лес-куча дров.
Знакомо. Первые роботы на мкл4 были. Потом перешел на квик и lua - матерился долго. После метатрейдера на квик - это прыжок назад. Но что делать на метатрейдере опционов нет.
Тогда вы конечно меня поймёте,как я сейчас матерюсь!!))) А ещё меня удивило,что в луа нет возможности работы с графическим интерфейсом. Например меню написать для ввода каких-то параметров. Теже линии на графике нарисовать и т.д.. Ну это сейчас не самая главная деталь в самолёте,но тем не менее. Хотелось бы чтоб этот функционал добавили конечно.
Пользователь
Сообщений: Регистрация: 23.10.2020
15.08.2021 22:08:17
Цитата
Владимир написал: , Ну, не знаю... я-то уже добрым десятком языков владел, когда впервые увидел 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;
Пугнуть у вас получилось!!!)))) Ну может и я когда нибудь буду с лёгкостью писать такие строки!)
Пользователь
Сообщений: Регистрация: 25.09.2020
15.08.2021 22:12:57
Maksimus, Да несложно всё это. И упаси, Господи, нас от графического интерфейса!
Пользователь
Сообщений: Регистрация: 08.03.2016
15.08.2021 22:14:08
Цитата
Maksimus написал: А ещё меня удивило,что в луа нет возможности работы с графическим интерфейсом. Например меню написать для ввода каких-то параметров.
О как! А как в этом меню менять какие либо параметры? Например ввести новое значение или поменять значение в каком либо поле?
Пользователь
Сообщений: Регистрация: 25.09.2020
15.08.2021 22:38:19
Константин Рейм, Самое разумное. У меня тоже так: основная таблица по тикерам есть головное меню, а при клике правой кнопкой по строке с интересующим тикерам открывается дочернее. Очень просто и удобно.
Пользователь
Сообщений: Регистрация: 08.03.2016
15.08.2021 22:40:06
Цитата
Maksimus написал: О как! А как в этом меню менять какие либо параметры? Например ввести новое значение или поменять значение в каком либо поле?
Как обычно - кликнули на поле в столбике "Значение" - прописали что нам надо и вперед
Пользователь
Сообщений: Регистрация: 25.09.2020
15.08.2021 22:44:34
Константин Рейм, Опа! А вот редактора значений полей у меня нет! И как тут это делается?
Пользователь
Сообщений: Регистрация: 08.03.2016
15.08.2021 22:49:12
Цитата
Владимир написал: Опа! А вот редактора значений полей у меня нет! И как тут это делается?
написал: Опа! А вот редактора значений полей у меня нет! И как тут это делается?
Огромное,человеческое спасибо! Обязательно почитаю эту ветку. Значит буду начинать именно с вывода значений различных таблиц. Думаю все так и начинали.
Пользователь
Сообщений: Регистрация: 25.09.2020
15.08.2021 22:55:37
Константин Рейм, О, Господи! Да у меня весь скрипт короче! Не, я думал, что есть какие-то встроенные средства, а не самому писать if (32 <= key_code and key_code <= 126) or (192 <= key_code and key_code <= 255) then...
Специально для чайников объясняю: -------------------- 1) отличие LUA от языка для метатрейда (mql) в том, что для луа есть не только подробная инструкция но и куча учебников . ---------------------- 2) справка по qlua - это справочник библиотеки , а не описания языка. Как всякий справочник он предполагает, что Вы изучили язык программирования LUA и умеете писать на нем программ. --------------------------- 3) Создание роботов это вообще не про qLua или Lua, а про умение создавать алгоритмы конечных автоматов, которые автоматизируют некоторые рутинные действия ------------------------ 4) Создание робота , который не сливает счет а даже приносит прибыль - это вообще не про то, что Выше, а про знание рынков и возможно ИИ. ------------------------------ Поэтому для получения бабла с рынка изучайте все 4 указанных выше пункта и не ищите халяву.
Пользователь
Сообщений: Регистрация: 25.09.2020
16.08.2021 13:03:11
nikolz, Лапуль, а Вы-то кто? Вы же и есть самый натуральный, без подмесу, чайник.
1) Толку-то от этих учебников? Давно известно: "Кто умеет - тот делает, кто не умеет - тот учит, как надо делать".
2) Чтобы "изучить язык программирования LUA и умееть писать на нем программы" требуется примерно полчаса.
3) Какие, в жопу, "конечные автоматы"? Какие, в жопу, "некоторые рутинные действия"?
4) Ну вот МОЙ робот "не сливает счет а даже приносит прибыль" - и чего? В рынках я ни уха ни рыла, а ИИстов я уже лет 20 гоняю стихами Маршака: Мой мальчик! Тебе эту песню дарю. Рассчитывай силы свои. И, если сказать не умеешь "хрю-хрю", - Визжи, не стесняясь: "ИИ!"....
Пользователь
Сообщений: Регистрация: 23.10.2020
16.08.2021 13:33:06
Цитата
nikolz написал: Специально для чайников объясняю: -------------------- 1) отличие LUA от языка для метатрейда (mql) в том, что для луа есть не только подробная инструкция но и куча учебников . ---------------------- 2) справка по qlua - это справочник библиотеки , а не описания языка. Как всякий справочник он предполагает, что Вы изучили язык программирования LUA и умеете писать на нем программ. --------------------------- 3) Создание роботов это вообще не про qLua или Lua, а про умение создавать алгоритмы конечных автоматов, которые автоматизируют некоторые рутинные действия ------------------------ 4) Создание робота , который не сливает счет а даже приносит прибыль - это вообще не про то, что Выше, а про знание рынков и возможно ИИ. ------------------------------ Поэтому для получения бабла с рынка изучайте все 4 указанных выше пункта и не ищите халяву.
Слушай "уважаемый"! Ты по-моему не в ту ветку залез! Здесь люди новички спрашивают знающих людей,что и как в написании робота. И нормальные,знающие люди объясняют нормальным языком,что и как! И за это этим людям огромное спасибо!! А ту хрень,что ты написал выше сфотографируй и повесь у себя на стене,и читай каждый день свои бесполезные советы!! Больших неудач тебе в написании роботов!