Не давно посмотрел фильм "дурные деньги", кто не видел посмотрите, это рассказ о том как частный трейдер организовав канал общения, держал позицию против хедж фонда. История поучительная.
А вот это важно от профессора: Как и функции, сопрограммы Lua являются значениями первого класса; их можно хранить в переменных, передавать в качестве аргументов и возвращать в виде результатов. Не существует явной операции для удаления сопрограммы Lua; как и любое другое значение в Lua, сопрограммы отбрасываются при сборке мусора.
Уважаемые программисты, Вы уже определитесь сами это одно и тоже или чуть чуть нет.
Цитата
Владимир написал: Поэтому "многозадачность" и многопоточность" это как "красное" и "розовое" - две небольшие разницы.
а нам дайте определения.
Владимир, Вы уже нас "неучей" пощадите, от таких оборотов, нам попроще растолкуйте. Нет конечно можно погуглить, но тогда не поймешь, что вы имели ввиду под этим.
Цитата
Владимир написал: Это называется "темпоральная диверсификация".
Если к этому относиться как к проблеме она останется проблемой.
Цитата
Владимир написал: Вообще-то, проблем в трейдинге чуть больше:
это задачи любого трейдера в не зависимости как он торгует, и они гораздо шири чем здесь описано. Если не понимаешь как все устроено, как можно создать рабочий алгоритм? В дальнейшем его работу нужно оценить и не собственным депозитом, понять что происходит, и если нужно поправить алгоритм.
Мой подход модульность, а если валить все в кучу, то получится куча. В своих программах придерживаюсь этого подхода, (здесь есть сообщения на эту тему), это позволяет обсуждать, писать, анализировать, и даже "облизывать" каждую задачу отдельно!
Затем собирая в супер проект, это как собрать автомобиль кто создает двигатель кто то коробку кто то трансмиссию.
"В многозадачном алгоритме исполнителей несколько и у каждого из них - свое состояние и свой путь в графе состояний. Многопоточные алгоритмы - просто другое название для многозадачных."
это Артур Сэвидж "Я разработчик полного стека с более чем 23-летним опытом разработки корпоративного прикладного программного обеспечения".
Для нас важно другое:
Цитата
nikolz написал: "Это логическая многозадачность - на самом деле в любой момент времени выполняется только один поток. Просто их несколько и они переключаются между собой".
Позиционная торговля - это прежде всего прочтение ценового действия на графиках разных тайм фреймах. Даже если торговать на 1 секундном графике, то не обходимо учитывать что происходит на 1 минутном, на 5 минутном и старших. Именно такой подход начал давать понимание, что же происходит на рынке в целом, ответы как входить и когда входить.
Алгоритмически я подкрепляю эту торговлю: элементами VSA, Smart Money, уровнями, фильтром трендов это основное. Но главное здесь ценовое действие - распознать куда Маркетмейкер ведет рынок.
На самом деле, подняты две очень важных основных темы в трейдинге:
1) Когда открывать позицию; 2) Сколько открывать - это вопрос управления позицией и управления риском.
Как открывать позицию, Когда открывать позицию, в каком направлении вот вечный вопрос трейдера. Так есть здесь какая то опора для стабильных результатов торговли?
С капиталистами часть ликвидности конечно утекло, это объективно, это видно по рынку, капитал бегает от одного инструмента к другому более часто, но это рынок и капитал здесь замкнут. Все также, есть крупные игроки, есть маркетмейкер обеспечивающий сделки, волатильность все также на "Америке".
Да первоначального капитала много не нужно чтоб еще одну пенсию себе делать, здесь уже важней знание правил управления капиталом. Размер имеет значение! Но это размер открываемой позиции к собственным средствам, не нужно перегружать (ну это я больше в свой адрес).
Ну в общем все как всегда в отношении стратегии, подправив тактику. Допустим мой основной торговый тайм фрейм сейчас Н1 при краткосрочной торговле, редко на америке поглядываю на М20, в основном посматриваю на Н4.
nikolz, Не знаю в чем я здесь ошибся, это русский перевод текста с английского языка, все что нужно здесь для понимания, это читать начиная с конца. Например если на писали на ангельском "Все хорошо", то понимать нужно "Хорошо все".
Владимир написал: Да, скрипт-то зарабатывает, но в последнее время очень плохо - биржа ведь фактически уничтожена, там творится чёрт знает что. А мой любимый долларовый рынок и вообще накрылся медным тазом.
Да нет все не так плохо, зарабатывать можно и нужно!
Правда я сам последнее время руками, скрипт в режиме советник и прогноз, но это то моя проблема, не его. Дело в том что при переходе на обработку портфеля все оказалось немного сложней, чем я ожидал, где то просто банально не хватает знаний в программировании.
Вам удачи, со своей стороны могу посоветовать пересмотреть масштаб, на рынке стало тесно.
Уважаемые, я "Ни сном ни духом" в Многопоточности, все мои выдержки это цитаты специалистов и разработчиков языка, Вам нужно спорить с ними, По мне так, если поток один то говорить без сленга можно только о многозадачности. Как она реализована в луа, мне понравилась, я при вожу пример как можно использовать.
VPM написал: "Технически вся магия происходит в методе main, там в цикле вызывается сопрограмма, которая создаётся из функции Robot. функция Trade() Это псевдоним стандартной функции coroutine.resume, при вызове этой функции прерывается код робота и происходит отработка умных заявок (обновляются цены лимитников, количество, и т.п.)"
Вот так это работает. Справочно:
Цитата
VPM написал: Как это работает (функционал сопрограмм).Вызов `corutine.create` получает функцию и возвращает спящую ("suspended") сопрограмму. Её можно "разбудить" вызовом `coroutine.resume`( Trade() ) и тогда она начинает выполняться.Выполняется она до тех пор, пока не встретиться вызов `coroutine.yield`. В этот момент управление возвращается к вызывающему потоку. Следующий вызов `coroutine.resume` восстановит выполнение сопрограммы, передавая управление ровно в то место, где она была приостановлена.Сопрограмма может быть вечной - если она время от времени уступает выполнение, то в какой-то момент её можно просто не возобновить. Но она может и завершится и перейти в состояние "dead", возобновить из которого её будет уже невозможно. Вызовы `.resume` и `.yield` могут не только передавать управление, но и обмениваться данными. Вот, собственно, и все.
Владимир написал: 5. Мой скрипт преспокойно обновляет информацию от биржи именно раз в секунду на самом дохлом железе (количество графиков, тиков, стаканов и всех сделок равно нулю).
Владимир, в пору задаться вопросом: А зарабатывает ли ? А то он у Вас как "раб на галерах"
"В многозадачном алгоритме исполнителей несколько и у каждого из них - свое состояние и свой путь в графе состояний. Многопоточные алгоритмы - просто другое название для многозадачных."
"В Lua реализована "совместная многопоточность", когда потоки явно уступают выполнение друг другу и сохраняют состояние до следующего момента, когда выполнение столь же явно будет передано им снова".
"Только явная передача управление и сохранение состояния. Это логическая многозадачность - на самом деле в любой момент времени выполняется только один поток. Просто их несколько и они переключаются между собой".
Наверняка можно сделать, только зачем если уже есть, и сделано классно.
Вы очереди перебираете в цикле, цикл идет с какой то определенной задержкой на исполнение.
Мой пример это выделение какой то задачи в коде, которую нужно выполнять с максимальной скоростью. Ну к примеру пронестись по тикам, и снова вернуться к аналитике на медленных скоростях и здесь скорости имеют значения.
Я не утверждаю что это единственное использование каротин, но согласитесь видь классно! А главное можно работать со скоростью исполнения скрипта!
Nikolay написал: И все это можно воспроизвести на обычном цикле, опрашивая методы-объекты: готово - выполни это, нет - ждем дальше.Они удобны - да, но сказать, что без них нельзя - нет.
Нет нельзя, это две задачи исполняемые с разными скоростями. В моем примере функция Trade() имеет свой внутренний цикл без всяких ограничений.
Nikolay, Ну да, так в этом вся суть, что это делается средствами lua, останавливается задача на получение и обработку данных выработку сигала, и начинается исполнение ордеров в цикле со всей дурью на что способна lua.
Владимир, да давненько, рад что Ваш скрип поживает хорошо!
Фактически на все Ваши вопросы есть ответы выше.
Цитата
VPM написал: Этот подход позволяет носиться по тикам, писать на чистом lua, и навсегда забыть про тему скоростей (исполнения кода)!
Видите в чем еще дело, я активно в своих работах использую историю данных, это приводит к резкому росту памяти в конце сессии, меня это сильно смущает, поиск оптимального среднего между использованием памяти и скоростью.
for i=1,#sec do ---- цикла по бумагам: -- Система нескольких окон for j=1,#tf do ---- цикла по таймфремам F[j]() --парад стратегий end
signal -- Вырабатываем сигнал на сделку rm -- определение риска на сделку mm -- расчет количества на сделку p -- получаем цену на сделку SmartOrder( p, q ) -- формируем ордер на сделку end Trade() -- Вызова функции Trade, для осуществления торговых действий pos -- получаем позицию по инструменту sleep(950) -- тормозим чтоб в ближним космосе очутиться! end --Сохраняем --Закрываем end Вопрос с модульностью решен, пишем свои стратегии входа, стратегии выхода, управление позицией, риском, алгоритмы - все независимо!Собираем Систему (торговую!)
nikolz, Прежде всего нужно ответить на вопрос зачем что то ускорять, если все скрипты мы тормозим выставляя sleep(х)?
"Lua не только быстро выполняется, но и быстро компилируется. Например, вышеприведенная программа для составления списка авторов обрабатывает 1 Мб данных за одну десятую секунды. (Примечание: На моем старом Пентиуме.)" (от Профессора)
В реализации же HackTrade, при помощи стандартной библиотеки coroutine, поток разделен на две задачи, выполняемых на разных скоростях. (Я выше про это рассказываю).
Цитата
VPM написал: В чем суть, есть 2 основные функции: 1) Pobot() 2) Trade()
Которые между собой взаимодействуют.
Цитата
VPM написал: "В Lua реализована "совместная многопоточность", когда потоки явно уступают выполнение друг другу и сохраняют состояние до следующего момента
nikolz написал: Поэтому коруунды ничего не ускоряют.
А никто не утверждает что они что ускоряют, речь идет о разделении скорости исполнения кода на две части. Там где нужна максимальная - исполнения ордера, и где можно раз в секунду.
nikolz написал: О псевдо поточности коруундов можно почитать в учебниках по программированию и документации по Луа.
Не так важно, выполняются ли потоки разными физическими процессорами или разными потоками одного, переключаются ли они операционной системой, "главным" потоком или явно передают управление друг другу - главное, что каждый поток (строго говоря "нить", от английского "thread" ) имеет свое состояние!
Цитата
VPM написал: При вызове функции Trade() прерывается код функции Pobot(), идет исполнение сопрограммы со всей той скорость на что способна lua и позволяет система! Этот подход позволяет носиться по тикам, писать на чистом lua, и навсегда забыть про тему скоростей (исполнения кода)!
Именно в сопрограмме достигается максимальное исполнение кода,
Цитата
VPM написал: В функции Robot получаем информацию от терминала обрабатываем ее формируем правило торговой системы, именно здесь работает задержка основного цикла sleep()!
нету смысла гонять быстрее 1 миллисекунды, так как нет обновления информации, а намой в взгляд и быстрее 1 секунды нету смысла.
Вызов `corutine.create` получает функцию и возвращает спящую ("suspended") сопрограмму. Её можно "разбудить" вызовом `coroutine.resume`( Trade() ) и тогда она начинает выполняться.
Выполняется она до тех пор, пока не встретиться вызов `coroutine.yield`. В этот момент управление возвращается к вызывающему потоку. Следующий вызов `coroutine.resume` восстановит выполнение сопрограммы, передавая управление ровно в то место, где она была приостановлена.
Сопрограмма может быть вечной - если она время от времени уступает выполнение, то в какой-то момент её можно просто не возобновить. Но она может и завершится и перейти в состояние "dead", возобновить из которого её будет уже невозможно.
Вызовы `.resume` и `.yield` могут не только передавать управление, но и обмениваться данными.
Вот, собственно, и все. Эта простая реализация дает возможность реализовывать многозадачные алгоритмы даже не в многозадачной среде.
nikolz написал: Но корунды имеют накладные расходы. Поэтому вместо выигрыша может быть проигрыш.
Это совсем не понятно? Я привожу конкретный пример реализации,
Цитата
VPM написал: В функции Robot получаем информацию от терминала обрабатываем ее формируем правило торговой системы,именно здесь работает задержка основного цикла sleep()!При вызове функции Trade() прерывается код функции Pobot(), идет исполнение сопрограммы со всей той скорость на что способна lua и позволяет система!
nikolz написал: Если действительно хотите многопоточность без загрузки процессора пустыми циклами и пропуска данных по тикам,то смотрите Event OC.
Все что пытаюсь добиться это стабильной работы скриптов!
Пример HackTrade я реализую у себя с не большой доработкой, но об этом я делал сообщения. В этом сообщении я рассказал о еще одной стороне HackTrade - почему это лучшая работа. Более того он опубликован и каждый желающий может его опробовать.
Lua реализовывался как язык сценариев (посмотрите игры созданные на нем) но это уже другая тема. Мы здесь о быстродействии.
nikolz написал: Вы либо умолчали, либо заблуждаетесь.---------------------Корутина - это псевдо многопоточность. т е исполняются они на одной VMLua и в одном потоке OC.--------------------
nikolz, Я совсем не обсуждал как реализована многозадачность в lua (какой смысл это уже есть), это доступная известная информация:
"В Lua реализована "совместная многопоточность", когда потоки явно уступают выполнение друг другу и сохраняют состояние до следующего момента, когда выполнение столь же явно будет передано им снова. Никакого разделения на физические процессоры или совместного использования процессорного времени. Никакой вытесняющей многозадачности, неблокирующего доступа, семафором, диспетчеров. Только явная передача управление и сохранение состояния. Это логическая многозадачность - на самом деле в любой момент времени выполняется только один поток. Просто их несколько и они переключаются между собой."
Я лишь говорю о том что, не используются, те возможности которые нам представляет lua, что зачастую совсем не нужно "городить огород", а стоит разобраться с lua!
На страницах данного форума очень часто и много обсуждается быстродействие lua. Чего только не услышишь от "заслуженных метров данного форума", но на мой взгляд не заслуженно, не уделяется внимание многопоточности уже реализованной в lua. На русском языке, да и техническое исполнение, правильно определять как многозадачность, на английском - это "корутины".
Ну давайте, об всем и по порядку!
Lua быстрый язык, (в этом легко убедиться уберите в Вашей программе sleep()). В терминале квик, минимальный тик времени это 1 миллисекунда, информация обновляется один раз в секунду (таблица текущих параметров), это срезы в какой-то момент времени и трансляция информации от биржи, через сервер в терминал.
То есть технически обновить информацию от биржи можно 1 раз в секунду (это еще зависит от количества графиков открытых, "железа" ...) Но есть еще тики, стакан и таблица всех сделок.
Но причём тут многозадачность, я много на страницах этого поста пишу про пример от Дениса Колодина фреймворк HackTrade. Это пример реализации многозадачности в lua!
В чем суть, есть 2 основные функции: 1) Pobot() 2) Trade()
"Технически вся магия происходит в методе main, там в цикле вызывается сопрограмма, которая создаётся из функции Robot. функция Trade() Это псевдоним стандартной функции coroutine.resume, при вызове этой функции прерывается код робота и происходит отработка умных заявок (обновляются цены лимитников, количество, и т.п.)"
В функции Robot получаем информацию от терминала обрабатываем ее формируем правило торговой системы, именно здесь работает задержка основного цикла sleep()!
При вызове функции Trade() прерывается код функции Pobot(), идет исполнение сопрограммы со всей той скорость на что способна lua и позволяет система!
Этот подход позволяет носиться по тикам, писать на чистом lua, и навсегда забыть про тему скоростей (исполнения кода)!
Виталий Дерягина, все Вы правильно понимаете, просто нужно быть внимательней! Пробуйте тот же код:
Код
function OnCalculate(index)
local median = (H(index)+L(index))*0.5 or C(index);
local label={TEXT="Тарам",
FONT_HEIGHT=25,
R=255,G=255,B=0,
FONT_FACE_NAME='Times New Roman',
FONT_HEIGHT=18,
DATE = get_date( T(index) ),TIME = get_time( T(index) )
YVALUE=median,
};
AddLabel ('20', label)
if index == Size()-1 then
return С(index)
end
end
Serge123, У меня подобная проблема решилась после удаления сам описных скриптов (индикаторов и роботов) из папки терминала, Видимо на скапливались ошибки, что и приводила к тормозам.
Виталий Дерягина написал: Спасибо за помощь VPM ! Я понял почему не видно меток, они просто за пределами масштаба и их просто не видно, но они есть. А что по оси Y масштабирования нет? Или еще есть какой-то подвох?
По чему нет, собственно метка для этого и нужна, для вывода, какого то полученного или расчётного значения, YVALUE = (H(I)+L(I))*0.5 or С(I); Это можно представить как координаты на плоскости где х=DATE ,TIME, а у=значение цены.
Попробуйте так (на график добавьте 20 - chart_tag – тег графика, к которому привязывается метка) function get_date(td)-- получаем local d = string.format('%.4d%.2d%.2d',td.year,td.month,td.day) if d~=nil then return d else return '0' end end function get_time(td)-- получаем local t = string.format('%.2d%.2d%.2d',td.hour,td.min,td.sec) --or T--.datetime if t~=nil then return t else return '000000' end end
OnCalcul ate = function(index)
--if index == 1 then label={ TEXT="Тарам", FONT_HEIGHT=25, R=255, G=255, B=0, FONT_FACE_NAME='Times New Roman', FONT_HEIGHT=18, --Yvalue=101, ---datetime"]=20191007 YVALUE=101, DATE = get_date( T(index) ), TIME = get_time( T(index) ) } AddLabel ('20', label)
Виталий Дерягина, В каждой версии терминала содержится такой файл "QLUA.chm" это справка "Руководство пользователя QLua, "находится там куда установили квик.
Открываете, читаем: "Добавляет метку с заданными параметрами.
Формат вызова:
NUMBER AddLabel(STRING chart_tag, TABLE label_params)
Параметры:
chart_tag – тег графика, к которому привязывается метка,
label_params – таблица с параметрами метки.
Функция возвращает числовой идентификатор метки. В случае неуспешного завершения функция возвращает «nil».
Это то о чем Вам подсказал Nikolay, теперь в Вашем примере
Nikolay написал: Есть компании с огромной капитализацией, но польза от них ничтожна.
Вы вероятно имеете ввиду маркетинг, который занимает львиную долю в оценке, а затем и стоимости. Нет я о Майкрософт и другом обкушенном продукте.
Насколько я помню, мы с Вами из одних прошлых лет (+-10).
Вот вам другая история, сегодня это покажется дикостью, но будучи молодым специалистом - инженер, руководитель отдела, получив "железо" в пользование, не нечем было работать, (тогда было все еще под DOC), пришлось лететь в Казахстан, там мой товарищ возглавлял автоматизацию золотодобывающего предприятия (писали САУ под DOC), у них водились "денюжки", и они могли себе позволить, чтоб получить на выходе электронную таблицу и редактор. на дискетке.
Сегодня просто из Москвы сел на рейс и в любой точке мира, тогда из Сибири почти на "лошадях". Ник то не гнал, по собственному желанию за свой счет.
Результат написал в э. таблице программу, обсчитывала одну из наших задач, то что считали 2 сотрудника 3 суток, теперь в программу нужно было загрузить данные и нажать кнопку.
Чем дело кончилось "на всю жизнь урок" - сократили сотрудника в отделе.
Сегодня школьники пишут подобное в excele, но тем не менее, грузите под э.т. и она работает. Но так мир остановится, а программисты останутся без вознаграждения.
Нет конечно нужен технический руководитель проекта, но и очень важно как написано.
Nikolay написал: Так что SciTE - это такой же новодел как VSCode.
Новодел новоделу рознь!
Вот доступный всем пример, судите сами:
Две компании в недалеком прошлом на стадии становления и развития - занимаются программированием, одни "торгаши" ( без сомнения, нужная вещь и не обходимая) вторые "Программисты" (заглавная буква не случайна).
На старте занимались одним и тем же, ну давайте взглянем на то что нам близко, капитализация компаний ну и на продукт.
Nikolay написал: А лучше добавить параметр -s. Правда если цель - писать скрипты для себя и только для себя, то зачем вообще компилировать. Квик это сам сделает перед запуском.
У меня это в SciTE запрограммировано, делаю это машинально особенно когда переделываешь,
3 кнопки по очереди: 1) сохранил изменения; 2) проверил на исполнение; 3) скомпилировал.
Особенно удобно для индикаторов, так как тело находится в модуле (таблице) , а голова в терминале. Все основные исправления идут в теле индикатора (три кнопочки), редко голова редактируется так как структуру продумываешь сразу.
И дальше можно не продолжать Я шучу кому как удобно и на чем, я просто привык, но есть одно неоспоримое преимущество он Стабилен! Поставил уже на верно лет 20 назад (когда там 5.1 вышло), накидал разного сервиса и забыл как лезть в него.
Цитата
Nikolay написал: Также советую проверить какую команду выдает SciTE для компиляции. Скорее всего без -s, что оставит отладочную информацию и позволит декомпилировать код, если он компилировался в чистом виде.
Вот пример компиляции: >luac54.exe -o "*.luac" "*.lua" >Exit code: 0 Time: 0.138
Начну с конца. Решил сбросить на графики индикатор Структура рынка (Market Structure), помогает определить глобальный тренд. Это тоже самое что всем хорошо известный индикатор Зиг-Заг, пользовался разработкой Nikolay, это больше чем индикатор, это программа анализа, зашел к нему на "поседелочки" посмотреть что нового, взял новую разработку "*zz_algo".
Nikolay, Пока не запускал в терминале, но в SciTE(lua 5.1) выдает ошибку:
lua: ...\Untitled11.lua:2390: function at line 1990 has more than 60 upvalues >Exit code: 1 Time: 0.229
Хотя не знаю может в lua 5.4 не уже ограничения по количеству локальных переменных, но решил Вам оставить сообщение, сам не разбирался.
Кстати если кто знает как перевести SciTE(lua 5.1) на lua 5.4 подскажите пожалуйста? Компилятор легко перевел!
Здесь пока никаких переделок. Есть старый скрипт запущу в работу. Смысл, защита дипозита на просадку (по умолчанию 5% от депозита), при снижении счета на величину допустимой просадки, просто сбрасывает все позиции, и остановка торговли.
Прежде чем заняться редактированием мани менеджментом, нужно испрвить работу моего MarketSimulator - это уже просто какое - то наказание для меня. Ну нет доверия нужно прверять?
Да выводы конечно делать рано, но при новой организации данных, заработал сборщик мусора, взял под контроль память! (хотя не все доделал)
Риск на сделку, здесь все просто. Сделаю метод для моего класса.
Все начинается с капитала. Размер имеет значение!
Задаю в % (от 1% - 10% заввисит от стратегии по умолчанию 2% (т.е. 50 сделок) пересчет в cash - для анализа по залогам; пересчет в pips - для анализа по валотильности.
На выходе: 1) risk на сделку. 2) reward на сделку. 3) contract на сделку.