Господа добрый день! Активно изучаю язык луа для написания торгового робота. Пока просто собираю информацию и узнаю основы. Возможно дикость но буду очень благодарен если кто ни будь выложит самого простого робота для луа. Или поделится важной информацией которая может помочь в создании. Без всяких личных секретов, просто что бы был фундамент для создания своего робота, это сбережет очень много сил и даст большой рывок вперед. + 200 к карме кто поможет
Очень хорошая и правильная тема! Тоже недавно начал изучать луа,и очень много непонятного. Пока вообще не пойму как правильно писать на этом языке. Да ещё и справка далека от совершенства. Или дело mql4-5,очень понятная и развернутая справка,большое колличество примеров написания роботов. Поэтому согласен с автором,тоже посмотрел бы на самый простой пример робота. Всем спасибо за ответы.
Я предлагал когда-то примерно то же самое. Только код робота тут почти бесполезен - я предлагал обсудить базовые алгоритмы, нюансы реализации, вплоть до кодов некоторых утилит - всё это благополучно умерло. Да и не программирует тут на Lua почти никто.
Самый простой робот далеко не прост. Алгоритмически простейший - тот, который позволяет торговать вручную, но сам никаких решений не принимает. Но и это немалый пласт инструментария - прорисовка таблиц, обработка событий от юзера, отправка заявок и вообще взаимодействие с брокером, работа с файлами и массивами. Проблема еще и в том, что инструментарий этот тесно перевязан, так что способен порождать разные наведённые ошибки, и отлаживать нужно сразу всё в комплексе. Короче, придётся вам, господа, набивать собственные шишки. Зато это самый надёжный и эффективный метод обучения!
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
Игорь, А чего тут обсуждать? Лично я в код вообще смотреть не хочу - постановка задачи должна быть на русском языке. И скользящая средняя мне нафиг не нужна - она только захламляет код.
Игорь, Всё же бегло просмотрел код - вот АБСОЛЮТНО ничего не нужно!
Во-первых, "переменная для прерывания цикла" прерывает цикл всегда, КРОМЕ срабатывания OnStop. Во-вторых, присваивание переменным начальных базовых значений В КОДЕ - это сразу в морг. В-третьих, CreateDataSource лично я никогда не пользовался, и другим не советую - тем более, на минутном таймфрейме. Про timeformat и getInfoParam впервые слышу, а isConnected мгновенно забыл, как страшный сон. ЧАВО?! Какое такое "получение количества лот в клиентском портфеле"?! Тьфу ты - при чём тут фьючерсы? Шаг цены также нафиг не нужен. О! step*20 - это круто! Неужели кто-то рискнёт этим торговать?
Владимир, Спасибо что просмотрели код и разнесли его в пух и прах Вопрос по торговым индикаторам- в квике уже есть много разных торговых индикаторов. Значит не нужно писать громоздкий код по созданию индикаторов, нужно вызвать их из квика и создать условия для покупки продажи? (может криво сформулировал вопрос уповаю на ваше понимание) Нашел еще одного робота выкладывать сюда на обозрение?
Игорь, Не ко мне вопрос - индикаторы меня не интересуют ВААПЩЕ!
Цитата
Нашел еще одного робота выкладывать сюда на обозрение?
НЕ НАДО!!! Сначала нужно обсудить концепции, предполагаемый набор утилит (как чёрный ящик: вход-выход), структуры данных, примерные алгоритмы торговли... короче, что-то типа ТЗ.
Да не стоит брать чужих роботов, бед только хлебнете. Пишите с нуля неспешно, чтобы понимать полностью весь код.
Дело в том, что чистый код робота это по сути-то получил позиции, получил данные на основе которых выдал/не выдал сигнал, после чего и создал заявку и так по кругу Но в реальной торговле это совершенно не жизнеспособно.
А в результате чуть ли ни половина кода робота будет обработка не стандартных ситуаций возникающих при торговле и устранение косяков qlua через разнообразные костыли.
Бегло пробежавшись по коду, сражу же понятно что его не стоит использовать. 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 из которых очень важны для новичков типа меня,но почему-то все, что вы описали,не описывают в мануале к языку. Поэтому эта ветка думаю очень важна для новичков. Да и более уверенные кодеры ломаю тоже могут подчерпнуть для себя много чего интересного! Лично я буду регулярно читать эту ветку,и может получится написать самый простейший алгоритм. Хотя я пока вообще не могу даже представить,что тут и как.
почему так непонятно,а точнее вообще никак написана справка?!
Чтобы жизнь мёдом не казалась. :: Впрочем, хрен с ней, со справкой - почему вся софтина так написана?
На счёт софтины с вами полностью согласен. Хотя может когда разберусь с этим чудо-языком,изменю свое мнение,а пока для меня это полный пипец,а не софт.
Игорь, BlaZed прав насчёт "надо писать самому". И задача эта не из лёгких. В смысле, написать робота, который тебя без штанов оставит, относительно несложно (хотя и там придётся попотеть), а вот зарабатывающего...
И насчёт "я своего писал неделю если не меньше"... мой давно работает (и хорошо работает!), а я всё пишу ТЗ на доработки. Месяц, если не больше.
Владимир написал: Игорь, BlaZed прав насчёт "надо писать самому". И задача эта не из лёгких. В смысле, написать робота, который тебя без штанов оставит, относительно несложно (хотя и там придётся попотеть), а вот зарабатывающего...
И насчёт "я своего писал неделю если не меньше"... мой давно работает (и хорошо работает!), а я всё пишу ТЗ на доработки. Месяц, если не больше. ::
Да тут хоть бы какого нибудь написать!))) Даже который без штанов оставит. На демо счёте конечно чтоб работал. Но пока увы, мозгов не хватает даже на убыточного.
Владимир написал: Maksimus, Язык поганый, но несложный - разобраться в нём можно без особых усилий. Но подводных камней в софте более, чем достаточно.
Для меня как раз таки очень сложный показался. И самое главное,непонятный абсолютно. Я как то читал вопросы,которые форумчане задают разработчикам квика,и ответ в основном один - К сожалению такой возможности нет,но мы примем к сведению ваше пожелание- ... Вот лично я пока вообще не могу понять,как с этими таблицами работать,как данные получать и т.д... Вообщем одним словом,нужно разбираться.
самостоятельное изучение - очень много времени уйдет и все равно вопросы останутся (я шел этим путем) возможно есть смысл поучится у кого то, по крайней мере будет первоначальная база
самостоятельное изучение - очень много времени уйдет и все равно вопросы останутся (я шел этим путем) возможно есть смысл поучится у кого то, по крайней мере будет первоначальная база
Именно так я учился писать на mql4-5. Сначала смотрел видео уроки и пробовал по ним,потом начинал разбираться в каждой строчке кода и в итоге без проблем получается на этом языке. Но qlua для меня пока темный лес-куча дров.
Maksimus написал: Именно так я учился писать на mql4-5. Сначала смотрел видео уроки и пробовал по ним,потом начинал разбираться в каждой строчке кода и в итоге без проблем получается на этом языке. Но qlua для меня пока темный лес-куча дров.
Знакомо. Первые роботы на мкл4 были. Потом перешел на квик и lua - матерился долго. После метатрейдера на квик - это прыжок назад. Но что делать на метатрейдере опционов нет.
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;
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;
Пугнуть у вас получилось!!!)))) Ну может и я когда нибудь буду с лёгкостью писать такие строки!)
Константин Рейм, Самое разумное. У меня тоже так: основная таблица по тикерам есть головное меню, а при клике правой кнопкой по строке с интересующим тикерам открывается дочернее. Очень просто и удобно.
Огромное,человеческое спасибо! Обязательно почитаю эту ветку. Значит буду начинать именно с вывода значений различных таблиц. Думаю все так и начинали.
Константин Рейм, О, Господи! Да у меня весь скрипт короче! Не, я думал, что есть какие-то встроенные средства, а не самому писать 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 указанных выше пункта и не ищите халяву.
nikolz, Лапуль, а Вы-то кто? Вы же и есть самый натуральный, без подмесу, чайник.
1) Толку-то от этих учебников? Давно известно: "Кто умеет - тот делает, кто не умеет - тот учит, как надо делать".
2) Чтобы "изучить язык программирования LUA и умееть писать на нем программы" требуется примерно полчаса.
3) Какие, в жопу, "конечные автоматы"? Какие, в жопу, "некоторые рутинные действия"?
4) Ну вот МОЙ робот "не сливает счет а даже приносит прибыль" - и чего? В рынках я ни уха ни рыла, а ИИстов я уже лет 20 гоняю стихами Маршака: Мой мальчик! Тебе эту песню дарю. Рассчитывай силы свои. И, если сказать не умеешь "хрю-хрю", - Визжи, не стесняясь: "ИИ!"....
nikolz написал: Специально для чайников объясняю: -------------------- 1) отличие LUA от языка для метатрейда (mql) в том, что для луа есть не только подробная инструкция но и куча учебников . ---------------------- 2) справка по qlua - это справочник библиотеки , а не описания языка. Как всякий справочник он предполагает, что Вы изучили язык программирования LUA и умеете писать на нем программ. --------------------------- 3) Создание роботов это вообще не про qLua или Lua, а про умение создавать алгоритмы конечных автоматов, которые автоматизируют некоторые рутинные действия ------------------------ 4) Создание робота , который не сливает счет а даже приносит прибыль - это вообще не про то, что Выше, а про знание рынков и возможно ИИ. ------------------------------ Поэтому для получения бабла с рынка изучайте все 4 указанных выше пункта и не ищите халяву.
Слушай "уважаемый"! Ты по-моему не в ту ветку залез! Здесь люди новички спрашивают знающих людей,что и как в написании робота. И нормальные,знающие люди объясняют нормальным языком,что и как! И за это этим людям огромное спасибо!! А ту хрень,что ты написал выше сфотографируй и повесь у себя на стене,и читай каждый день свои бесполезные советы!! Больших неудач тебе в написании роботов!