Странное обсуждение. Корутины в lua - это синхронные вытесняющие сопрограммы. Т.е. никакой многопоточности здесь нет. Если бы была, то пришлось бы в язык вводить многие другие элементы, отвечающие за синхронизацию. А так - это просто такая методика замыкания состояния окружения функции. И все это можно воспроизвести на обычном цикле, опрашивая методы-объекты: готово - выполни это, нет - ждем дальше. Они удобны - да, но сказать, что без них нельзя - нет.
Владимир, да давненько, рад что Ваш скрип поживает хорошо!
Фактически на все Ваши вопросы есть ответы выше.
Цитата
VPM написал: Этот подход позволяет носиться по тикам, писать на чистом lua, и навсегда забыть про тему скоростей (исполнения кода)!
Видите в чем еще дело, я активно в своих работах использую историю данных, это приводит к резкому росту памяти в конце сессии, меня это сильно смущает, поиск оптимального среднего между использованием памяти и скоростью.
Nikolay, Ну да, так в этом вся суть, что это делается средствами lua, останавливается задача на получение и обработку данных выработку сигала, и начинается исполнение ордеров в цикле со всей дурью на что способна lua.
Nikolay написал: И все это можно воспроизвести на обычном цикле, опрашивая методы-объекты: готово - выполни это, нет - ждем дальше.Они удобны - да, но сказать, что без них нельзя - нет.
Нет нельзя, это две задачи исполняемые с разными скоростями. В моем примере функция Trade() имеет свой внутренний цикл без всяких ограничений.
VPM написал: Нет нельзя, это две задачи исполняемые с разными скоростями. В моем примере функция Trade() имеет свой внутренний цикл без всяких ограничений.
Скорости здесь ни причем. Раз сделано так в этом решении, не значит что так нельзя сделать. Я вместо корутин использую очереди задач и переход от одной к другой, управляя этим. Надо в одной задаче подождать дольше - идем дальше. Можно было бы сделать через корутины - да. Но в моем случае проще сделать иначе. Корутины же хороши в качестве генераторов для итераторов, да.
"В многозадачном алгоритме исполнителей несколько и у каждого из них - свое состояние и свой путь в графе состояний. Многопоточные алгоритмы - просто другое название для многозадачных."
"В Lua реализована "совместная многопоточность", когда потоки явно уступают выполнение друг другу и сохраняют состояние до следующего момента, когда выполнение столь же явно будет передано им снова".
"Только явная передача управление и сохранение состояния. Это логическая многозадачность - на самом деле в любой момент времени выполняется только один поток. Просто их несколько и они переключаются между собой".
Наверняка можно сделать, только зачем если уже есть, и сделано классно.
Вы очереди перебираете в цикле, цикл идет с какой то определенной задержкой на исполнение.
Мой пример это выделение какой то задачи в коде, которую нужно выполнять с максимальной скоростью. Ну к примеру пронестись по тикам, и снова вернуться к аналитике на медленных скоростях и здесь скорости имеют значения.
Я не утверждаю что это единственное использование каротин, но согласитесь видь классно! А главное можно работать со скоростью исполнения скрипта!
Владимир написал: 5. Мой скрипт преспокойно обновляет информацию от биржи именно раз в секунду на самом дохлом железе (количество графиков, тиков, стаканов и всех сделок равно нулю).
Владимир, в пору задаться вопросом: А зарабатывает ли ? А то он у Вас как "раб на галерах"
Вы очереди перебираете в цикле, цикл идет с какой то определенной задержкой на исполнение.
Корутины имеют накладные расходы. Внимательно посмотрите на код решения, что Вы используете, и Вы увидите там точно такой же цикл опрашивающий корутины. Что касается быстрых и медленных задач, то они реализуются одинаково. У них разное время выполнения, поэтому одна завершится быстро, другая будет долго выполняться, а какая-то будет вообще всегда работать. Техническая же реализация - это в одном случае Вы их заворачиваете в корутину через wrap, а в другом реализуете более сложный объект, точно так же хранящий свое состояние. А уже какая будет скорость работы самого этого объекта, корутины - сами и определяете. Я не вижу никакого смысла добавлять какие-то задержки в исполнение, что в одном случае, что в другом. Также как и нет никакого смысла перебирать объекты, корутины с задержкой. Единственная задержка добавляется в бесконечный цикл в main, и то, потому что иначе Квик зависнет. Вот и вся разница. Используйте, никто не мешает. Но не надо говорить о многопоточности, многозадачности и т.д.
VPM написал: "Технически вся магия происходит в методе main, там в цикле вызывается сопрограмма, которая создаётся из функции Robot. функция Trade() Это псевдоним стандартной функции coroutine.resume, при вызове этой функции прерывается код робота и происходит отработка умных заявок (обновляются цены лимитников, количество, и т.п.)"
Вот так это работает. Справочно:
Цитата
VPM написал: Как это работает (функционал сопрограмм).Вызов `corutine.create` получает функцию и возвращает спящую ("suspended") сопрограмму. Её можно "разбудить" вызовом `coroutine.resume`( Trade() ) и тогда она начинает выполняться.Выполняется она до тех пор, пока не встретиться вызов `coroutine.yield`. В этот момент управление возвращается к вызывающему потоку. Следующий вызов `coroutine.resume` восстановит выполнение сопрограммы, передавая управление ровно в то место, где она была приостановлена.Сопрограмма может быть вечной - если она время от времени уступает выполнение, то в какой-то момент её можно просто не возобновить. Но она может и завершится и перейти в состояние "dead", возобновить из которого её будет уже невозможно. Вызовы `.resume` и `.yield` могут не только передавать управление, но и обмениваться данными. Вот, собственно, и все.
Nikolay, Корутины где угодно реализуются через программирование данными. Мои ребятки когда-то склепали "генератор сайтов", так там (алгоритмически) были три потока даже на внешних файлах: конфигурационный, файлы шаблонов и файлы данных. А "технически" это был один поток, перебрасывающий управление между ними, так что не было никаких проблем с синхронизацией. И опрашивать ничего не надо: закончил свой квант - сообщи "начальству", оно передаст управление кому надо. Но здесь настолько тривиальная задача, что все подобные выкрутасы просто нафиг не нужны.
VPM, А я давно уже завязал со скриптом - с августа ни единого символа там не поменял. Борька иногда ругается, хочет ещё какие-то идеи воткнуть, но я считаю, что лучшее - враг хорошего. Я "навсегда забыл про тему скоростей", историю данных не использую, памяти трачу немного, "сессия" может длиться месяцами, про глюки давно забыл - разве что связь иногда рвётся.
Многопоточные алгоритмы это НЕ "просто другое название для многозадачных". Многозадачные не знают о существовании друг друга, многопоточные - знают.
Да, скрипт-то зарабатывает, но в последнее время очень плохо - биржа ведь фактически уничтожена, там творится чёрт знает что. А мой любимый долларовый рынок и вообще накрылся медным тазом.
VPM написал: Nikolay, Ну давайте сначала, вот от "метров":
"В многозадачном алгоритме исполнителей несколько и у каждого из них - свое состояние и свой путь в графе состояний. Многопоточные алгоритмы - просто другое название для многозадачных."
"В Lua реализована "совместная многопоточность", когда потоки явно уступают выполнение друг другу и сохраняют состояние до следующего момента, когда выполнение столь же явно будет передано им снова".
"Только явная передача управление и сохранение состояния. Это логическая многозадачность - на самом деле в любой момент времени выполняется только один поток. Просто их несколько и они переключаются между собой".
Наверняка можно сделать, только зачем если уже есть, и сделано классно.
Вы очереди перебираете в цикле, цикл идет с какой то определенной задержкой на исполнение.
Мой пример это выделение какой то задачи в коде, которую нужно выполнять с максимальной скоростью. Ну к примеру пронестись по тикам, и снова вернуться к аналитике на медленных скоростях и здесь скорости имеют значения.
Я не утверждаю что это единственное использование каротин, но согласитесь видь классно! А главное можно работать со скоростью исполнения скрипта! ::
Вы опять ошибаетесь. Многопоточная и многозадачная - это две большие разницы. ---------------- Потоки нужны для параллельного исполнения задач, что возможно лишь при наличии нескольких процессоров или ядер. Многозадачность реализуется и на одном ядре и зависит от операционной системы.
Уважаемые, я "Ни сном ни духом" в Многопоточности, все мои выдержки это цитаты специалистов и разработчиков языка, Вам нужно спорить с ними, По мне так, если поток один то говорить без сленга можно только о многозадачности. Как она реализована в луа, мне понравилась, я при вожу пример как можно использовать.
Владимир написал: Да, скрипт-то зарабатывает, но в последнее время очень плохо - биржа ведь фактически уничтожена, там творится чёрт знает что. А мой любимый долларовый рынок и вообще накрылся медным тазом.
Да нет все не так плохо, зарабатывать можно и нужно!
Правда я сам последнее время руками, скрипт в режиме советник и прогноз, но это то моя проблема, не его. Дело в том что при переходе на обработку портфеля все оказалось немного сложней, чем я ожидал, где то просто банально не хватает знаний в программировании.
Вам удачи, со своей стороны могу посоветовать пересмотреть масштаб, на рынке стало тесно.
nikolz, Не знаю в чем я здесь ошибся, это русский перевод текста с английского языка, все что нужно здесь для понимания, это читать начиная с конца. Например если на писали на ангельском "Все хорошо", то понимать нужно "Хорошо все".
VPM, Всё не так плохо, всё ещё хуже. Зарабатывать-то можно, но, во-первых, значительная часть моих денег просто арестована (фондовый рынок на евро и доллары). Во-вторых, неизвестно как пойдёт дело дальше. В-третьих, то, что сейчас происходит, это не рынок, поведение рынка изменилось, и резко, и в худшую сторону. На рынке стало не тесно, на рынке стало скучно. И объёмы упали со страшной силой, и волатильность ракообразная. Ранее рынок был живой, сейчас он мёртвый. В лучшем случае, полуживой. Но, боюсь, ненадолго.
С капиталистами часть ликвидности конечно утекло, это объективно, это видно по рынку, капитал бегает от одного инструмента к другому более часто, но это рынок и капитал здесь замкнут. Все также, есть крупные игроки, есть маркетмейкер обеспечивающий сделки, волатильность все также на "Америке".
Да первоначального капитала много не нужно чтоб еще одну пенсию себе делать, здесь уже важней знание правил управления капиталом. Размер имеет значение! Но это размер открываемой позиции к собственным средствам, не нужно перегружать (ну это я больше в свой адрес).
Ну в общем все как всегда в отношении стратегии, подправив тактику. Допустим мой основной торговый тайм фрейм сейчас Н1 при краткосрочной торговле, редко на америке поглядываю на М20, в основном посматриваю на Н4.
VPM, Нет да! Поведение рынка изменилось: то он неделями сопли жуёт, то вдруг ломанётся куда-то почти без сопротивления. Одно это правило об утроенной ктомиссии остановило рынок. Размер, конечно имеет значение, но небольшое - алгоритм давно отлажен и на сверхмалых, и на средних, и на огромных размеров кошелька, он прекрасно знает как определять "размер открываемой позиции к собственным средствам". И я давно уже перестал смотреть на все эти Н1 или Н4.- не моё это собачье дело.
На самом деле, подняты две очень важных основных темы в трейдинге:
1) Когда открывать позицию; 2) Сколько открывать - это вопрос управления позицией и управления риском.
Как открывать позицию, Когда открывать позицию, в каком направлении вот вечный вопрос трейдера. Так есть здесь какая то опора для стабильных результатов торговли?
Позиционная торговля - это прежде всего прочтение ценового действия на графиках разных тайм фреймах. Даже если торговать на 1 секундном графике, то не обходимо учитывать что происходит на 1 минутном, на 5 минутном и старших. Именно такой подход начал давать понимание, что же происходит на рынке в целом, ответы как входить и когда входить.
Алгоритмически я подкрепляю эту торговлю: элементами VSA, Smart Money, уровнями, фильтром трендов это основное. Но главное здесь ценовое действие - распознать куда Маркетмейкер ведет рынок.
nikolz, Не знаю в чем я здесь ошибся, это русский перевод текста с английского языка, все что нужно здесь для понимания, это читать начиная с конца. Например если на писали на ангельском "Все хорошо", то понимать нужно "Хорошо все".
Поясняю в чем Вы ошиблись. ----------------------- Первое. В луа корауны - это обычная функция у которой сделан отдельный стек. Для этого используется функция API C lua_newthread, Но все коорауны в одном потоке ОС. Слово "поток" в Lua - это просто не удачное название . Например, есть мороженое 48 коп. Но 48 коп - это не цена, а название. Так и со словом поток в луа. ------------------- Второе. Понятие "задача" относится к скрипту - т е к коду и данным - т е к тому "что вычислить", а понятие "поток" - относится к вычислителю, т е процессору(ядру, эмулятору АЛУ и регистрам процессора) - т.е. к тому "чем вычислять". ------------------------ Т е задача и поток = это две совершенно разные сущности. ---------------------- Поэтому "многозадачность" и многопоточность" это как "красное" и "кислое" - две большие разности.
"В многозадачном алгоритме исполнителей несколько и у каждого из них - свое состояние и свой путь в графе состояний. Многопоточные алгоритмы - просто другое название для многозадачных."
это Артур Сэвидж "Я разработчик полного стека с более чем 23-летним опытом разработки корпоративного прикладного программного обеспечения".
Для нас важно другое:
Цитата
nikolz написал: "Это логическая многозадачность - на самом деле в любой момент времени выполняется только один поток. Просто их несколько и они переключаются между собой".
VPM, Вообще-то, проблем в трейдинге чуть больше: 1) Что открывать. 2) Когда открывать. 3) Сколько открывать. 4) Когда закрывать. Это и есть задача алгоритма - торгует ведь он, а не какой-то там "маркетмейкер". На каком таймфрейме? Да на всех, если денег хватает! Это называется "темпоральная диверсификация".
nikolz, Ваша эрудиция не перестаёт меня поражать. Мои искренние соболезнования Вашим ученикам, если Вы не соврали и они действительно у Вас есть. Я не раз лично писал многопоточные программы, и НИ В ОДНОЙ ИЗ НИХ понятие "поток" НЕ относилось к "вычислителю, т е процессору(ядру, эмулятору АЛУ и регистрам процессора) - т.е. к тому чем вычислять". Я уже говорил, что "задача и поток это две разные сущности", но не "совершенно", а совсем чуть-чуть. И то, и другое спокойно можно реализовать на одном процессоре, что и делалось ещё в те времена, когда понятие "ядро" вообще не существовало, и весь процессор рассматривался как единый "камень". Поэтому "многозадачность" и многопоточность" это как "красное" и "розовое" - две небольшие разницы. В конце концов, даже сраная printf может рассматриваться как многопоточная функция: поток форматной строки, поток входных данных и результирующий выходной поток, любой из них может быть куда-то перенаправлен. Точнее, printf в этом плане немного "недоделанная", вследствие чего появились sprintf, fprintf и прочая лабуда, но легко может быть написана универсальная утилита копирования, в т.ч. с форматным преобразованием. Я себе такую написал ещё лет 30-40 назад.
Уважаемые программисты, Вы уже определитесь сами это одно и тоже или чуть чуть нет.
Цитата
Владимир написал: Поэтому "многозадачность" и многопоточность" это как "красное" и "розовое" - две небольшие разницы.
а нам дайте определения.
Владимир, Вы уже нас "неучей" пощадите, от таких оборотов, нам попроще растолкуйте. Нет конечно можно погуглить, но тогда не поймешь, что вы имели ввиду под этим.
Цитата
Владимир написал: Это называется "темпоральная диверсификация".
Если к этому относиться как к проблеме она останется проблемой.
Цитата
Владимир написал: Вообще-то, проблем в трейдинге чуть больше:
это задачи любого трейдера в не зависимости как он торгует, и они гораздо шири чем здесь описано. Если не понимаешь как все устроено, как можно создать рабочий алгоритм? В дальнейшем его работу нужно оценить и не собственным депозитом, понять что происходит, и если нужно поправить алгоритм.
Мой подход модульность, а если валить все в кучу, то получится куча. В своих программах придерживаюсь этого подхода, (здесь есть сообщения на эту тему), это позволяет обсуждать, писать, анализировать, и даже "облизывать" каждую задачу отдельно!
Затем собирая в супер проект, это как собрать автомобиль кто создает двигатель кто то коробку кто то трансмиссию.
А вот это важно от профессора: Как и функции, сопрограммы Lua являются значениями первого класса; их можно хранить в переменных, передавать в качестве аргументов и возвращать в виде результатов. Не существует явной операции для удаления сопрограммы Lua; как и любое другое значение в Lua, сопрограммы отбрасываются при сборке мусора.
VPM, Я уже давал определение: одна задача о другой не знает, а о (своих) потоках знает. В принципе, внутри одной задачи может быть несколько "процессов" - каждый из них тоже не знает друг о друге. Если угодно, это подзадачи.
Откуда я знаю? О диверсификации я слышал давно, а в трейдинге до своего прихода на биржу, прочитал лишь об одном виде диверсификации, который я теперь называю "горизонтальная" (по тикерам). Соответственно, "темпоральная" - по таймфреймам. Есть ещё "вертикальная", но это одна из изюминок моего алгоритма, про неё говорить не хочу. Все термины придумал я сам.
Это задача алгоритма. А моя задача как трейдера - запустить скрипт и отойти в сторонку.
Я прекрасно понимаю как всё устроено, но против моей шахматной программы у меня нет никаких шансов. И против моего торгового скрипта тоже.
У всех нормальных программистов "подход модульность". В частности, у последней версии моего скрипта 28 модулей, то бишь функций.
Да насрать мне на всех маркетмейкеров, помноженных друг на друга! И на что такое сопрограммы Lua - я их тыщу лет реализую как программирование данными. А скрипт для торговли настолько тривиален, что здесь эта хрень вообще не нужна. Соответственно, никаких сопрограмм у меня нет, не было и не будет. Зачем искать на свою задницу приключений?.
Не давно посмотрел фильм "дурные деньги", кто не видел посмотрите, это рассказ о том как частный трейдер организовав канал общения, держал позицию против хедж фонда. История поучительная.
Владимир написал: В принципе, внутри одной задачи может быть несколько "процессов" - каждый из них тоже не знает друг о друге. Если угодно, это подзадачи.
Ну вот наконец то - "это подзадачи" внутри общей глобальной задачи.
Я никого не призываю так делать, я говорю что есть возможность! Что одна из этих возможностей менять время исполнения скрипта не прибегая к сторонним языкам! Ну согласитесь что классно!
Цитата
Владимир написал: У всех нормальных программистов "подход модульность". В частности, у последней версии моего скрипта 28 модулей, то бишь функций.
В Луа модуль - это не тоже что функция, но я не про это, я про разделение задач, что переделывая один модуль, не нужно переделывать всю программу.
VPM, А я и есть "кнопочник". После того, как убедился, что решения моего скрипта в 9 случаях из 10 лучше, чем мои. Один из эффектных примеров, когда я ещё пытался с ним соревноваться: был у меня один неудачный тикер, который провалился и долго болтался внизу. И вдруг он попёр вверх. Я обрадовался - наконец-то от него избавлюсь! И скрипт мой встрепенулся, начал торговать. Я присмотрелся - а эта сволочь их ПОКУПАЕТ! И что же? Через несколько часов он сбросил с хорошей прибылью и то, что у меня было и то, что он докупил.
Не понимаю: ЧТО "классно"? Менять время исполнения скрипта не прибегая к сторонним языкам? Что это такое и на кой это нужно? Мой скрипт написан на чистейшем Луа.
Мне плевать, что там "в Луа модуль" - язык есть полное говно, а модульность везде означает, что переделывая один модуль, не нужно переделывать всю программу.
И так в своих рассуждениях мы подошли к большой теме формализация - "Ценового действия" (Price Action).
Но прежде чем о нем говорить, нужно формализовать участников торгов, с кем мы дело имеем, их можно представить в виде 3 основных групп:
1) Ну конечно "Маркетмейкер"; 2) Это крупный игрок - "SmartMoney" (есть сериал американский "Миллиарды" кому интересно с чем дело имеем посмотрите); 3) Нас по разному называют, не хочется повторять, но по смыслу это "толпа", небольшие разрозненные депозиты, пища для двух первых.
Владимир, Я уже несколько раз отвечал на этот вопрос, вот накидал может так понятней будет. Текущая реализация программы сейчас принципиально выглядит так:
Код
dofile("hacktrade.lua") -- подключаю основной модуль HackTrade (движок)
function Robot() -- 1) основная функция
-----
1) Инициализация (~)
2) Получение констант
3) Предварительные расчеты
4) симулятор фона на истории
while working do -- основной цикл
local (~)
local data={}
for i=1,#sec do ---- цикла по бумагам:
-- Система нескольких окон
for j=1,#tf do ---- цикла по тайм ремам
data[i][j]=algo(index, settigs)
end
F[j]() -- парад стратегий - генератор сигналов
rule={} -- Вырабатываем правила на сделку (открт, закрытие, sl, tp и тд)
rm={} -- определение риска на сделку, расчет цели;
q = mm.calc() -- расчет количества на сделку исходя из правил уставленных риск менеджером и допустимой суммы.
-- Если выполнено правило формирую умный ордер на сделку
if rule.open_pos or rule.close_pos or rule.sl or rule.open_pos then
p = price.last -- получаем предварительную цену на сделку
SmartOrder( p, q ) -- формирую умный ордер на сделку
end
end
-- Вызов сопрограммы.
Trade() -- 2) основная функция - псевдоним стандартной функции coroutine.resume, осуществляет торговых операции
for i=1,#sec do
pos={} -- получаем позицию по инструменту
-- если сделка обрабатываю результат
end
sleep(950) -- тормозим чтоб космосе очутиться!
end
--Сохраняем
--Закрываем
end
Вопрос с модульностью решен,
- пишем свои стратегии входа,
- стратегии выхода,
- управление позицией,
- управление риском,
- алгоритмы.
Все независимо! Собираем все в Торговую Систему!
VPM, Ну, код-то я уж точно смотреть не буду. Разве что грубо сравню со своим по комментариям. 1. Подключаю основной модуль (main) 2. Читаю данные по портфелю и кошельку из входного файла. 3. Жду событий - OnTrade, клики мышой, нажатие клавиш или срабатывание таймера, реагирую на них в бесконечном цикле.
Собссно, всё. А все эти "правила на сделку, расчёт количества, подача заявок, стратегии входа и выхода давно прошиты в алгоритмах.
Владимир, Это не код, я хотел показать принципиальную схему своей программы. тут много чего нет. но принципиально это так, хотя и с ошибками (поторопился).
Вот пояснения: sec - это массив тикеров чем торгуем: tf - это массив интервалов (такт) откуда берем информацию.
while working do -- основной цикл программы --исполнение идет с задержкой sleep(950) -- тормозим чтоб космосе очутиться! end
Внутри этого цикла есть сопрограмма -- Вызов сопрограммы. Trade() -- 2) основная функция - псевдоним стандартной функции coroutine.resume, осуществляет торговых операции
И так Программа бегает в 2 циклах, по двум массивам sec, tf получая данные. по выходу из цикла tf формируется сигнал, если он отвечает правилу допустив открытию позиции, то будет сформирован ордер на покупку (умный ордер и это не для красного словца).
Когда будет управление перейдет к сопрограмме у нее есть внутренний цикл вот он, и у него не задержки, он выполняется на что луа способна!
for trans_id, smartorder in pairs(SmartOrder.pool) do smartorder:process() end
Владимир написал: А все эти "правила на сделку, расчёт количества, подача заявок, стратегии входа и выхода давно прошиты в алгоритмах
Про модульность выше есть большой блок мы обсуждаем с Nikolay, просто не хочется повторяться. Но если что то не понятно или не согласны готов обсудить.
Цитата
Владимир написал: Ну, код-то я уж точно смотреть не буду.
Я не понимаю почему Вы не читаете код, ведь иногда горазда проще показать, чем на 100 страниц описывать!
VPM, Если я что-нибудь в чём-нибудь понимаю, на каждый тикер должен быть свой массив интервалов, а на каждый интервал свой массив свечей. И за каким хером здесь нужны сопрограммы, по-прежнему без понятия, как и что такое "умный ордер".
Да я же сказал: работу со скриптом я закончил, такшта и модульность мне до лампады, и код тем более.
Владимир написал: Если я что-нибудь в чём-нибудь понимаю, на каждый тикер должен быть свой массив интервалов, а на каждый интервал свой массив свечей
Вы знаете другие примеры? Я этим лишь пользуюсь!
Цитата
Владимир написал: И за каким хером здесь нужны сопрограммы
В своем примере я это показал.
Цитата
Владимир написал: по-прежнему без понятия, как и что такое "умный ордер".
Вот уже 16 лист я рассказываю про один и тот же пример, (наверно плохо . но как умею не обессудьте), Но если Вы с вашим опытом не разобрались, то вероятно фреймворк HackTrade намного опережает свое время Мой совет, вместо моих комментариев, посмотрите сам код, уверяю Вас это намного интересней! Да и комментарии мои сводятся к одному из ..... возможных далеко не лучших (Но рабочих) применений.
Умные заявки. В данном разделе представлена реализация stateful-заявок, которые помнят своё внутреннее состояние и могут динамически принимать изменения параметров. Этот подход сильно отличается от традиционных лимитных заявок.
Заявка в фреймворке HackTrade представляет собой динамическую лимитную заявку с изменяемой ценой.
При этом также может меняться количество и даже направление. Главное, то нужно запомнить, 'умная заявка' будет пытаться набирать указанное количество лотов по заданной цене. Даже если вы снимите заявку торговой систем, SmartOrder породит новую и продолжить добирать заданное ранее количество (представьте, что SmartOrder - это заявка, которая гарантированно набирает зданный объём).
«умные заявки» избавляют от бесконечной отладки; можно наштамповать умных ордеров order1, order2… orderN и каждый умный ордер будет внутри себя отслеживать свою собственную позицию Каждая заявка помнит, сколько она набрала, и сколько надо скидывать. А если ей дать отрицательное значение, она войдёт в шорт (даже из логна с любым остатком). А если в шорте передадите 0, шорт закроется, причём тем объёмом, которым заявка успеет войти, когда будет переворачивать лонг.
Я использую такой подход, 'умная заявка' будет пытаться набирать указанное количество лотов если цена изменилась будет догонять, главное набрать заданную позицию.
Да при чём тут пример? Цель непонятна. Мне нафиг не нужны ни сопрограммы, ни "умные ордера", ни фреймворки, ни библиотеки, ни другие языки, все заявки "традиционные лимитные", цены неизменяемые. ЗА КАКИМ ХЕРОМ менять количество, направление и прочая дребедень? Заняться больше нечем, кроме как "гарантированно набирать заданный объём"? Ужас какой-то. На помойку, НЕМЕДЛЕННО!