Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
14.11.2023 15:54:47
Проба пера, вот время заказа os.time({hour = 9, min = 00, sec = 0, day = 14, month = 11, year = 2023})
ответ с 4 тайм фреймах [Tue Nov 14 15:50:16 2023] Trace: Source: SPBFUT, BRZ3, 1 [Tue Nov 14 15:50:16 2023] Trace: Source: SPBFUT, BRZ3, 5 [Tue Nov 14 15:50:16 2023] Trace: Source: SPBFUT, BRZ3, 120 [Tue Nov 14 15:50:16 2023] Trace: Source: SPBFUT, BRZ3, 1440 [Tue Nov 14 15:50:16 2023] Info: BRZ3; 1; 65537! [Tue Nov 14 15:50:16 2023] Info: [65537] 14/11/2023; 9:0:0; o[65537]=83.42; h[65537]=83.43; l[65537]=83.33; c[65537]=83.35 [Tue Nov 14 15:50:16 2023] Info: BRZ3; 5; 65537! [Tue Nov 14 15:50:16 2023] Info: [65537] 14/11/2023; 9:0:0; o[65537]=83.42; h[65537]=83.43; l[65537]=83.33; c[65537]=83.4 [Tue Nov 14 15:50:16 2023] Info: BRZ3; 120; 5516! [Tue Nov 14 15:50:16 2023] Info: [5516] 14/11/2023; 10:0:0; o[5516]=83.4; h[5516]=83.42; l[5516]=83.03; c[5516]=83.27 [Tue Nov 14 15:50:16 2023] Info: BRZ3; 1440; 1093! [Tue Nov 14 15:50:16 2023] Info: [1093] 14/11/2023; 0:0:0; o[1093]=83.43; h[1093]=83.43; l[1093]=82.42; c[1093]=82.82
На минутных отрабатывает, на Н2 идет сбой? Цена открытия сессии на D1 14/11/2023; 0:0:0; o[1093]=83.43; на M1 M5 [65537] 14/11/2023; 9:0:0; o[65537]=83.42;
Очереди и двойные очереди в луа, Пример из книги Р.Е.
nikolz написал: Основное из которых то, что на фондовом рынке действует нормальный закон плотности вероятности цены.
по меньший мере не корректно . Ну что значить "на фондовом рынке действует нормальный закон"?
Нормальный закон распределения наиболее формализован описан в литературе, Для того чтоб им можно было пользовать в наших целях, делается преобразования (доходности, лог доходности, приращения, преобразование Фишера...) В данный момент речь идет не про анализ динамики цен, про анализ сделок. Распределение сделок по времени(Wines/Loss) можно отнести к нормальному закону?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
13.11.2023 20:57:17
Цитата
Nikolay написал: Есть точка времени, есть массив времен. Все это натуральные числа os.time(ds:T(index)).
Не понял? Найти нужно индекс зная время и дату открытия свечи, а здесь индекс задается в качестве параметра.
Цитата
Nikolay написал: Двоичный поиск вполне быстро найдет его, надо просто перейти на числовое представление времени (unix time).
А можно пример.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
13.11.2023 19:46:44
Цитата
Nikolay написал: Ну ее нет, так что надо её написать и забыть.
Например?
Цитата
Nikolay написал: Что касается математической оценки серии сделок, то это тоже давно все формализовано. Вот, для примера,
Нет я сейчас не про статистику управляющего хедж-фондом, это я видел и Вашу работу это все супер. Я про экспресс оценку, опубликована в статье John F. Ehlers "Evaluating TradingSystems", ну а без мат ожидания системы никуда. проще сразу сделать перевод.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
13.11.2023 19:28:06
Nikolay, я накидал алгоритм принципиально описав в сообщении 23.10.2023 16:41:34, на текущих данных все пойдет.
Стратегия описанная А. Элдером в его книгах, внутри дневная чтоб можно было получить оценку. Диверсификация портфеля 5% капитала на инструмент т.е. не более 20 бумаг. Прислушался к Вашему совету на кидал итератор для тестера, данные получаю через подписку с сервера. И чего только не натерпелся прогоняя исторические данные за несколько дней.
Алгоритм применил следующий 1) Получаю Индекс на D1 2) Сдвигаю индекс на количество дней для теста получаю дату начало. 3) на M1 определяю индекс на 0900 4) На внутридневных интервалах получаю цену закрытия М1, те смотрю как распределялась цена на других тайм фреймах, с визуализацией.
Все медленно прогоняю и просматриваю.
Нужно определить цену открытия сессии на 0900 имея перед глазами тайм фрейм H2, и Вот оно 0800 с ценами, так погодите сессия закрыта.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
13.11.2023 18:41:46
На выходе любой стратегии, после совершения сделки, мы имеем результат Wines/Loss. Именно его и обрабатываем для оценки показателей торговой системы. эти данные так же используются при расчете количества в сделке.
Nikolay написал: либо должно быть самообучение с коротким горизонтом.
Тогда не понял?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
13.11.2023 18:15:58
Ну если еще обобщить вопрос, если можно найти параметры свечей по индексу, то должна быть и обратная функция поиска индекса по времени и дате?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
13.11.2023 18:09:08
Цитата
Nikolay написал: Не очень понятен вопрос. Как получить бар, зная дату и время?
Ну да Квик хранит свечи в виде массивов данных и разработчики предлагают чтоб получить свечу с ее данными нужно найти вначале индекс в массиве. И начинаются пляски с бубнами Но часто нужно ответить на вопрос какой была цена в 1200 на такую то дату?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
13.11.2023 18:02:50
Nikolay, Собственно поэтому я и пытаюсь более детально описать подход и загвозки связанные с ним.
Цитата
Nikolay написал: Так что если тестируете, то либо это надо делать часто (не скатившись в переобучение), либо должно быть самообучение с коротким горизонтом.
Вы не поняли, нет никакого обучения не какого AI даже не четкую не применяю, все максимально упрощено. сам алгоритм описан выше. Подход "система нескольких окон" заключается беру дневную свечу и внутри дня прогоняю меньшие таймфреймы, к примеру 1 час как цена распределялась за день, таймфрейм к примеру 1 минута внутри одного часа и т.д.
Стратегия входов и выходов это преодоление пороговых значений. Какая здесь может быть подгонка прогоняю 5 дней. Статистику считаю по сделкам.
Касаемо стационарности я имел ввиду привидение к нормальному распределению входных данных (цены). Описывать не чего все давно описано. Я лишь говорю про подход. Нормальное распределение является стационарным?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
13.11.2023 17:16:37
Суть проблемы.
Вот описан процесс хранения данных Квиком.
Karina Dmitrieva написал: В папку archive директории QUIK сохраняется информация (исторические данные) обо всех открытых графиках (в имени *.dat файла: класс, название инструмента, таймфрейм).По своему усмотрению Вы можете удалить всю папку archive или же конкретный файл. Но многие пользователи хранят данную информацию, чтобы была возможность просмотреть более дальнюю историю по инструментам, поскольку сам сервер QUIK хранит всего 3000 свечей, а Рабочее место QUIK умеет накапливать локально до 65000 свечей (для каждого инструмента и таймфрейма).Таким образом, при удалении данных о графиках (локально история будет очищена), но при подключении терминала QUIK к серверу и построении графика произойдет перезаказ архивов графиков с сервера (с количеством 3000 свечей + текущая торговая сессия).
Т.е. если, открыт график, "то локально до 65000 свечей (для каждого инструмента и таймфрейма)". можно использовать для анализа в наших целях. Получить эти свечи можно по индексу массива.
А как их получить цену зная дату и время дате свечи???
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Я маленько не об этом, это пишу в качестве постановки вопроса (проблемы) короче не получается.
Хотя и Ваше утверждение не бесспорно. Это от куда посмотреть, да и мат. методы есть приведения к стационарность
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
13.11.2023 16:23:31
Обо всем и по порядку.
Если внутридневные стратегии еще куду ни шло, то уже средний срок без бэк - теста, и не туда и не сюда.
Экспресс показатели, ну это в первую очередь 1) мат. ожидание системы (должно быть положительно не важно какое значение но +); 2) Количество сделок (Выигрыш/Проигрыш) для расчета коэффициента процент выигрышных сделок; 3) Профит / Лосс, для расчета профит фактора. Я еще считаю оптимальную фракцию и средние показатели за сделку. Прошла сделка пересчет. Для экспресс анализа достаточно первых 3.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
13.11.2023 15:48:15
Далеко не секрет чтоб успешно торговать, нужна торговая система (набор стратегий), и совсем не важно ручная это торговля или алгоритм. Собрав торговую систему хотелось бы ее оценить, для этого применяется тестирование на исторических данных. Для оценки систем используют ряд показателей. Казалось бы что проще, загрузил, откатил индекс назад и прокатился по ним с применением стратегий. Квик хранит историю данных. Но не тут то было
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
13.11.2023 15:28:21
Всем добрый день!
Хочу поднять тему тестирования торговой системы. Да именно системы а не стратегий.
Так и не понятно, есть ли с кем на сайте это обсуждать? (активность участников впечатляет!).
Флаги обезличенной сделки в событии OnAllTrade
Пользователь
Сообщений: Регистрация: 15.06.2023
26.10.2023 11:51:15
Рынок двигают рыночные заявки! И логично им нести знамя. Karina Dmitrieva, спасибо. Проверю свой интерпретатор.
Флаги обезличенной сделки в событии OnAllTrade
Пользователь
Сообщений: Регистрация: 15.06.2023
26.10.2023 08:59:57
Кто явился инициатором тому и нести флаг, смысл если вы Вы выставили ордер на покупку и его акцептовали то сделкам на покупку. и обратное.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
23.10.2023 17:09:04
А что случилось со статистикой на форуме? Строка "Сейчас на форуме" вообще пустая , если раньше чуть-чуть приписывала то нынче вообще ничего не отражает. Таланты!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
23.10.2023 16:41:34
Вернулся к проекту - "суперкар", (Фреймворк HackTrade 1.4 для написания торговых роботов от .)
Изменения, на что следует обратить внимание: Фреймворк написан на lua 5.1, модуль qlua 5.4.1; Поправим на соответствие. изменений не много.
Но выявилась и концептуальная ошибка, ну скорее недочет. Так как HackTrade продолжает летать со скоростями в один тик, то и проект смело можно назвать "ракета".
Текущая реализация концептуально выглядит так, код:
Код
dofile("hacktrade.lua") -- основной модуль
function Robot() -- основной функции
-- 1) (~) Инициализация
2) Получение констант
3) Предварительные расчеты
while working do -- основной цикл
for i=1,#sec do ---- цикла по бумагам:
-- Система нескольких окон
for j=1,#tf do ---- цикла по таймфремам
F[i][j]() --парад стратегий
end
signal[i] -- Вырабатываем сигнал на сделку
rm[i] -- определение риска на сделку
mm[i] -- расчет колличества на сделку
p[i] -- получаем цену на сделку
SmartOrder[i]( p[i], q[i] ) -- формируем ордер на сделку
end
Trade() -- Вызова функции Trade, для осуществления торговых действий
pos[i] -- получаем позицию по инструменту
sleep(950) -- тормозим чтоб в ближним космосе очутиться!
end
--Сохраняем
--Закрываем
end
Вопрос с модульностью решен, пишем свои стратегии входа, стратегии выхода, управление позицией, риском, алгоритмы - все независимо! Собираем Систему (торговую!)
Чего не хватает так это тестера, но об этом отдельно.
Ну и конечно, скажем дружно, огромное, человеческое спасибо автору! (Фреймворк HackTrade 1.4 для написания торговых роботов от .)
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
09.10.2023 11:56:49
Судить о луа я конечно не могу, я им просто пользуюсь, таким какой он есть, и прислушиваюсь к автору и другим советам, в том числе с форума к тем кто лучше меня разбирается.
Вот например пишет автор:
"Lua предлагает как раз то, для чего С недостаточно хорош: высокая степень независимости от аппаратного обеспечения, динамические структуры, отсутствие избыточности и легкость тестирования и отладки".
"многие алгоритмы с использованием таблиц становятся до банальности простыми. Например, мы редко пишем алгоритм поиска в Lua, поскольку таблицы предоставляют прямой доступ к любому типу.
Таблица в Lua — это объект во многих отношениях. Подобно объектам, у таблиц есть состояние. Подобно объектам, у таблиц есть идентичность (собственное «я» — self), которая не зависит от ее значений; Подобно объектам, у таблиц есть жизненный цикл У объектов есть свои собственные действия. У таблиц также могут быть действия..."
И я не понимаю почему этим не пользоваться в полной мере, да мета таблицы здесь самое сложное, но то что получаешь на выходе стоит, того чтоб сними один раз разобраться.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
09.10.2023 11:51:54
Владимир, рад Вас слышать! Без Вас и nikolz, данный форум просто пропадёт
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
09.10.2023 11:32:54
Что касается высказывания "Таблицы в Lua — это не одна из структур данных, — это единственная структура данных.", это от автора языка.
Ну судите сами, вот пишет автор:
"ГЛАВА 16 Объектно-ориентированное программирование Таблица в Lua — это объект во многих отношениях."
Я видел два примера реализации ООП под нашу задачу и те от одного автора.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Проблемы с терминалом описанные здесь возникли при переводе скриптов на 5.4 (с 5.1 на 5.3 получилось с минимальными затратами по времени), здесь так не получилось, пришлось разбираться. Оказалось скрипты которые годами работали "запустил и забыл" (ну к примеру скрип сохранения сделок) нужно проверять на соответствие с 5.4.
Я уже здесь писал, что к программированию имею отношение только в части данного проекта (хобби). Мои отношения с луа: читаю автора; ищу примеры; встраиваю в свои алгоритмы; думал что можно добавить обсуждение на форуме.
Я не обсуждаю на форуме личные качества участников, я лишь высказываю собственное мнение, в силу собственного понимания, о предмете обсуждения. Уровни в программировании я тоже не обсуждаю, я в этом ни чего не понимаю, я даже не понимаю то что Вы написали, чем Вы занимаетесь на луа.
Я обсуждаю конкретный проект, "программирование на луа" для целей автоматизации процесса торговли на бирже, который не заканчивается программированием! И рад единомышленникам или объективной здоровой критике!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
08.10.2023 15:39:18
Уважаемый nikolz, Вы видимо имеете отношение к программированию, но не знакомы с надежностью (Есть такая теория). Не нужно валить все в одну кучу. Обо всем и по порядку.
Цитата
nikolz написал: Терминал сделали, чтобы Вы могли подавать заявки брокеру руками. И эту функцию он реализует прекрасно.
Именно об этом мое самое первое сообщение на этом форуме. Сломали что работало лет 20. и не могут исправить. Ломать не строить
Цитата
nikolz написал: Так как терминал посылает сообщения на сервер и Вы в скрипте формируете эти сообщения, то Вы можете даже организовать DDOS атаку даже из своего скрипта.
Это вообще шедевр таланты. Сообщению чтоб попасть на сервер, нужно отвечать определённым требованиям, посланное хоть руками хоть еще чем. Атаку в подобной реализации вообще не вопрос, достаточно ошибиться в количестве. Но это к вопросу надежности. Версии лепятся не понятно зачем, а где надежность?
Цитата
nikolz написал: А уж завалить терминал это Вы можете как два пальца...
Цитата
про это уже писал: VPM написал: Кто виноват? и Что делать? Вот вопрос.Терминал устанавливают для возможности торговать (в не зависимости от его версии).Пользовательские скрипты используют для автоматизации этого процесса (в не зависимости от языка и версии).И это не сколько не отменяет тот факт, что пользовательский скрип не должен убивать терминал и тем более влиять на работу сервера ,кем бы и как не был написан.
nikolz написал: Вы как и многие "профи" на этом форуме постоянно ругаете КВИК , а когда понимаете, что это вы на...ли г-но, скромно молчите.
Цитата
nikolz написал: Увы, LUA дает доступ во внутрь терминала. Поэтому защиту от дурака здесь установить невозможно.
Квик я люблю, а не ругаю (разве немного таланты), мои сообщения о недочетах замеченных, надеюсь это помогает (так называема обратная связь), это одна из задач данного форума.
"защиту от дурака" должна быть установлена! Скрипты писал и буду писать. К профи не отношусь, здесь их на пальцах одной руки. Да и луа мало кто понимает: "Таблицы в Lua — это не одна из структур данных, — это единственная структура данных."
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Терминал устанавливают для возможности торговать (в не зависимости от его версии). Пользовательские скрипты используют для автоматизации этого процесса (в не зависимости от языка и версии). И это не сколько не отменяет тот факт, что пользовательский скрип не должен убивать терминал и тем более влиять на работу сервера , кем бы и как не был написан.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
07.10.2023 17:33:21
Добрый день!
Дошли руки восстановил работу квик обновился до версии 10.3.и опять в боевом строю! Вероятно причиной задержки, при получении ответа терминалом от сервера, являлись скрипты луа при переходе на версию 5.4. Хотя снес почти все лишнее. Все скрипты нужно проверять на соответсвие с 5.4.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Andrey Golik написал: Уточните, пожалуйста, после какого обновления столкнулись с данной проблемой (на какую версию)?
Откатил назад с версии 10.3 на 10.1.2.2 удалил самописные индикаторы из папки, проверил получение данных(обезличенные сделки и 4 класса), задержка на рынке акций, при вводе в окно ввода заявки, пишет "ожидании ответа сервера" и так до нескольких минут. После отката чуть улучшилось по времени но все равно работает не нормально.
Цитата
Andrey Golik написал: После выставления заявки терминал "зависает", то есть становятся недоступны никакие действия с программой?
Нет во время выставления, после исполнения идет очень медленное обновление таблиц о сделке до нескольких минут. Графики тоже тормозят. (~ 20шт) Обращался к брокеру не помогли. Брокер "АТОН". Терминал стоит очень давно обновляется вместе с рекомендациями брокера.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
18.09.2023 15:25:14
Цитата
БорисД написал: В любом бизнесе учет и аналитика первостепенны и без них даже не стоит открывать бизнес или торговлю на бирже начинать.
Целиком и полностью! Вот скрип которым я пользуюсь, по принципу "запустил и забыл", за что автору скажем спасибо. Это конечно не бухгалтерия в полном виде, но вполне достаточно чтоб в екселе сделать анализ.
Взято
Код
local Run;-- = true; -- флаг работы цикла в main
local DataFolder = ''; -- Полный путь к папке "Данные(c)quikluacsharp.ru"
local TradesFiles = {};-- Массив дескрипторов файлов
-- Функция возвращает значение бита (число 0, или 1) под номером bit (начинаются с 0) в числе flags, если такого бита нет, возвращает nil
function CheckBit(flags, bit)
-- Проверяет, что переданные аргументы являются числами
if type(flags) ~= "number" then error("Ошибка!!! Checkbit: 1-й аргумент не число!"); end;
if type(bit) ~= "number" then error("Ошибка!!! Checkbit: 2-й аргумент не число!"); end;
local RevBitsStr = ""; -- Перевернутое (задом наперед) строковое представление двоичного представления переданного десятичного числа (flags)
local Fmod = 0; -- Остаток от деления
local Go = true; -- Флаг работы цикла
while Go do
Fmod = math.fmod(flags, 2); -- Остаток от деления
flags = math.floor(flags/2); -- Оставляет для следующей итерации цикла только целую часть от деления
RevBitsStr = RevBitsStr ..tostring(Fmod); -- Добавляет справа остаток от деления
if flags == 0 then Go = false; end; -- Если был последний бит, завершает цикл
end;
-- Возвращает значение бита
local Result = RevBitsStr:sub(bit+1,bit+1);
if Result == "0" then return 0;
elseif Result == "1" then return 1;
else return nil;
end;
end;
-- Добавляет новую сделку в файл истории
function AddTradeInFile(trade)
local DateTime = trade and trade.datetime;
local Date = tonumber(DateTime.year);
local month = tostring(DateTime.month);
if #month == 1 then Date = Date.."0"..month; else Date = Date..month; end;
local day = tostring(DateTime.day);
if #day == 1 then Date = Date.."0"..day; else Date = Date..day; end;
Date = tonumber(Date);
local Time = "";
local hour = tostring(DateTime.hour);
if #hour == 1 then Time = Time.."0"..hour; else Time = Time..hour; end;
local minute = tostring(DateTime.min);
if #minute == 1 then Time = Time.."0"..minute; else Time = Time..minute; end;
local sec = tostring(DateTime.sec);
if #sec == 1 then Time = Time.."0"..sec; else Time = Time..sec; end;
Time = tonumber(Time);
-- Если ночная сделка, смещает дату на 1 день вперед
if Time < 90000 then
local seconds = os.time(DateTime);
seconds = seconds + 24*60*60;
DateTime = os.date("*t",seconds);
Date = tonumber(DateTime.year);
month = tostring(DateTime.month);
if #month == 1 then Date = Date.."0"..month; else Date = Date..month; end;
day = tostring(DateTime.day);
if #day == 1 then Date = Date.."0"..day; else Date = Date..day; end;
Date = tonumber(Date);
end;
local Operation = "";
if CheckBit(trade.flags, 2) == 1 then Operation = "S"; else Operation = "B"; end;
-- Добавляет сделку в массив
local Trade = {};
Trade.Account = trade.account;
Trade.Sec_code = trade.sec_code;
Trade.Num = trade.trade_num;
Trade.Date = Date;
Trade.Time = Time;
Trade.Operation = Operation;
Trade.Qty = tonumber(trade.qty);
Trade.Price = tonumber(trade.price);
Trade.Hint = "Счет: "..tostring(Trade.Account).."_Номер: "..tostring(trade.trade_num).."_Дата: ";
if #day == 1 then Trade.Hint = Trade.Hint.."0"..day.."/"; else Trade.Hint = Trade.Hint..day.."/"; end;
if #month == 1 then Trade.Hint = Trade.Hint.."0"..month.."/"..DateTime.year; else Trade.Hint = Trade.Hint..month.."/"..DateTime.year; end;
if #hour == 1 then Trade.Hint = Trade.Hint.."_Время: 0"..hour..":"; else Trade.Hint = Trade.Hint.."_Время: "..hour..":"; end;
if #minute == 1 then Trade.Hint = Trade.Hint.."0"..minute..":"; else Trade.Hint = Trade.Hint..minute..":"; end;
if #sec == 1 then Trade.Hint = Trade.Hint.."0"..sec; else Trade.Hint = Trade.Hint..sec; end;
Trade.Hint = Trade.Hint.."_Количество: "..trade.qty;
Trade.Hint = Trade.Hint.."_Цена: "..trade.price;
-- Получает путь к файлу инструмента в папке торгового счета
local PathAccountSec = DataFolder..Trade.Account..'\\'..Trade.Sec_code..'.csv';
local FileIndex = Trade.Account..'_'..Trade.Sec_code;
-- Если файл еще не открыт, или не существует
if TradesFiles[FileIndex] == nil then
-- Пытается открыть файл текущего инструмента в режиме "дописывания"
TradesFiles[FileIndex] = io.open(PathAccountSec,"a+");
-- Если файл не существует, то сделка не записана
if TradesFiles[FileIndex] == nil then
-- Создает файл в режиме "записи"
TradesFiles[FileIndex] = io.open(PathAccountSec,"w");
-- Закрывает файл
TradesFiles[FileIndex]:close();
-- Открывает уже существующий файл в режиме "дописывания"
TradesFiles[FileIndex] = io.open(PathAccountSec,"a+");
end;
end;
-- Встает в начало файла
TradesFiles[FileIndex]:seek("set",0);
-- Если файл пустой
if TradesFiles[FileIndex]:read() == nil then
-- Добавляет строку заголовков
TradesFiles[FileIndex]:write("Счет;Код бумаги;Номер сделки;Дата сделки;Время сделки;Операция;Количество;Цена;Текст подсказки", "\n");
end;
-- Встает в конец файла
TradesFiles[FileIndex]:seek("end",0);
-- Записывает сделку в файл
TradesFiles[FileIndex]:write(Trade.Account..";"..Trade.Sec_code..";"..Trade.Num..";"..Trade.Date..";"..Trade.Time..";"..Trade.Operation..";"..Trade.Qty..";"..Trade.Price..";"..Trade.Hint, "\n");
TradesFiles[FileIndex]:flush();
end;
-- Создает каталоги по всем найденным счетам
function CreateAccountsFolders()
-- Перебирает все счета
for i=0, getNumberOf("trade_accounts")-1 do
-- Получает номер счета
local Account = getItem("trade_accounts", i).trdaccid;
message('Account = '..Account)
-- Получает путь
local Path = '"'..DataFolder..Account..'\\"';
-- Если каталог не существует
---- можно получить доступ к выхлопу команды, взяв result
--[[local handle = io.popen('cd '..Path)
local result = handle:read("*a")
handle:close()
message('result = '..tostring(result))
--]]
--message(' os.execute(cdPath) = '..os.execute('cd '..Path))
if os.execute('cd '..Path) == 1 then
-- Создает каталог
os.execute('mkdir '..Path);
end;
end;
end;
-- Проверяет записана ли данная сделка в файл истории
function CheckTradeInFile(trade)
-- Получает путь к файлу инструмента в папке торгового счета
local PathAccountSec = DataFolder..trade.account..'\\'..trade.sec_code..'.csv';
-- Пытается открыть файл текущего инструмента в режиме "чтения"
local TradesFile = io.open(PathAccountSec,"r");
-- Если файл не существует, то сделка не записана
if TradesFile == nil then return false;
else -- Если файл существует
-- Получает индекс файла
local FileIndex = trade.account..'_'..trade.sec_code;
-- Если файл еще не открыт для дописывания
if TradesFiles[FileIndex] == nil then
-- Открывает файл текущего инструмента в режиме "дописывания"
TradesFiles[FileIndex] = io.open(PathAccountSec,"a+");
end;
-- Перебирает строки файла
local Count = 0; -- Счетчик строк
for line in TradesFile:lines() do
Count = Count + 1;
if Count > 1 and line ~= "" then
-- Если номера сделок совпадают, то сделка записана
local i = 0;
for str in line:gmatch("[^;^\n]+") do
i = i + 1;
if i == 3 and tonumber(str) == trade.trade_num then
TradesFile:close();
return true;
end;
end;
end;
end;
end;
TradesFile:close();
return false;
end;
-- Записывает все ранее не записанные сделки из таблицы "Сделки" в файлы
function CheckAndSaveTerminalTrades()
local trade = nil;
-- Перебирает все сделки в таблице "Сделки"
for i=0,getNumberOf("trades")-1,1 do
trade = getItem ("trades", i);
-- Если данная сделка еще не записана в файл истории
if not CheckTradeInFile(trade) then
-- Добавляет сделку в файл истории
AddTradeInFile(trade);
end;
end;
end;
---------------------------------
function OnTrade(trade)
-- Если данная сделка еще не записана в файл истории
if not CheckTradeInFile(trade) and Run then
-- Добавляет сделку в файл истории
AddTradeInFile(trade);
end;
end;
function OnStop()
-- Закрывает все файлы
for key,Handle in pairs(TradesFiles) do
if Handle ~= nil then Handle:close(); end;
end;
Run = false;
end;
--function OnInit() end;
function main()
Run = true;
-- Получает полный путь к папке "Данные(c)quikluacsharp.ru"
DataFolder = getWorkingFolder()..'\\Данные(c)quikluacsharp.ru\\';
-- Создает папки по всем найденным счетам
CreateAccountsFolders();
-- Записывает все ранее не записанные сделки из таблицы "Сделки" в файлы
CheckAndSaveTerminalTrades();
while Run do
sleep(1000);
end;
end;
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
18.09.2023 15:10:27
Всем добрый день!
Что - то с последними обновлениями все переломалось. У одного из брокеров терминал зависает на несколько минут после отдачи приказа в ожидании ответа сервера?
БорисД, Я ни кого не переубеждаю, я лишь публично высказываю свое видение на то чем мы тут занимаемся, и не претендую на истину в последний инстанции.
"не опровержимые факты" кого угодно переубедят, на то они не опровержимы. С Владимир мы не спорим, скорее дискутируем о взглядах на рынок, так как придерживаемся разных подходов в торговле, а судья здесь один торговый счет. Вот и Вы про
Цитата
БорисД написал: наблюдаем это в 10 секундном тайфрейме онлайн
Но Вы то наверняка знаете, что говоря о тайм фрейме нужно говорить о фрактальности в поведении цены, а значить поймав тенденции на 10 сек. то и горизонт планирования сделки такой же.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
27.08.2023 15:18:04
Владимир, Я описываю свою задачу, как я ее вижу немного утрирую для обсуждения. и те технические вопросы которые возникают по ходу.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
27.08.2023 15:13:46
Цитата
Nikolay написал: Да. Перебираем бары и когда надо перейти на новый индекс, вызывается функция.Также это будет работать и для текущих данных. Так что код становится однотипным.
Заманчиво попробую посмотрим что из этого получится у меня.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
27.08.2023 15:08:47
Вот текущая моя реализация:
1) При инициализации задаю массивы
----- Data Source: for i=1,#sec do DS[i] = {}; for j=1,#Interval do DS[i][j] = Source(cl[1],sec[i],Interval[j]);
2) функцией получаю индексы
function test_begin()--ds,test
local Interval = { --[0]=INTERVAL_TICK, ---- Тиковые данные INTERVAL_M1, ---- 1 минута --INTERVAL_M2, ---- 2 минуты --INTERVAL_M3, ---- 3 минуты --INTERVAL_M4, ---- 4 минуты INTERVAL_M5, ---- 5 минут --INTERVAL_M6, ---- 6 минут --INTERVAL_M10, ---- 10 минут --INTERVAL_M15, ---- 15 минут --INTERVAL_M20, ---- 20 минут --INTERVAL_M30, ---- 30 минут --INTERVAL_H1, ---- 1 час INTERVAL_H2, ---- 2 часа --INTERVAL_H4, ---- 4 часа INTERVAL_D1, ---- 1 день --INTERVAL_W1, ---- 1 неделя --INTERVAL_MN1, ---- 1 месяц };
local DS = {}; local I = {};
return function(class,d,t) --ds
for i=1,#sec do ---- цикла по бумагам:
for j=1,#Interval do -----------------------------------------
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
27.08.2023 15:01:26
Цитата
Nikolay написал: При этом у каждого ds в списке можно написать свой колбек на приход нового индекса. Тогда код становится еще более простой, в функциональном стиле.
Посмотрел Вашу идею более внимательно. Не понял вот здесь "написать свой колбек на приход нового индекса" Вы говорите про исторические данные?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
27.08.2023 14:57:58
Цитата
Владимир написал: Лучше спросить: А ЗАЧЕМ она нужна?
Ну речь идет о тестировании на прошлых свечах, вот я показываю
Цитата
VPM написал: Ну к примеру, на H2,Свечи сформированы у них есть High и Low, текущая цена становится ниже Low на H2 . lact < Low это только условия для поиска ситуации на открытие Short позиции на 5 минутах.на 5 минутах свои условия на подтверждении.
Время 1000 24.08.2023г. начало теста, мне нужно найти индекс для свечей на 1 Часовом графике и на 1 минутном (для простоты рассуждения) чтоб можно было получить все остальные значения со свечи. и дальше их синхронно смещать, получая для каждого графика свой индекс. Сравнить индексы можно только установив время.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
27.08.2023 13:57:19
Цитата
Владимир написал: Общая точка отсчета на всех таймфреймах вовсе не обязательна.
Не понял почему?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
27.08.2023 13:32:36
Цитата
Nikolay написал: Я ничего не говорю про точки входа, алгоритмы и т.д.
Да но чтоб начать синхронный перебор данных нужна точка отсчета общая на всех таймфреймах
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
27.08.2023 11:56:27
Вопрос остался открытым
Цитата
Nikolay написал: Да и спрятать можно все, написав свой итератор. Тогда вызов станет универсальным, простым в конечной точке вызова.
Мало найти общую т. для входа нужен универсальный итератор.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
27.08.2023 11:43:28
Цитата
Владимир написал: Я рассказал, как, по моему мнению, нужно работать со свечами и историческими данными.
За это спасибо, но это мне не подходит, я прочитал и дал даже ответ по какой причине не подходит.
Цитата
Владимир написал: Я НЕ использую цены максимальную и минимальную на интервале.
Ну тогда свечи
Цитата
Владимир написал: В моём подходе 6 000 000 секундных свечей
Называйте вещи своими именами - это среднее значение цены за секунду, причем здесь свеча или бар у которые на это том же интервал имеют пять значений.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
VPM написал: В своих алгоритмах я использую цены максимальную на интервале и минимальную на интервале.Я это называю так, последний покупатель и последний продавец, это чтоб не забыть смысл. На мой взгляд они наиболее информативны чем просто средние. Отражают уровни поддержки и сопротивление, тенденцию.Т.е. можно реализовать пробойные стратегии, лучше характеризуют трендовое движение.
Без разниц
Цитата
Владимир написал: 6 000 000 тиков, а на 6 000 000 секундных свечей
Цитата
Владимир написал: 6 000 000 тиков, а на 6 000 000 секундных свечей
В моем подходе все это шум. Все что ниже даже 5 минут тоже шум. Так как оценку веду от старшего таймфрейма.
Ну к примеру, на H2, Свечи сформированы у них есть High и Low, текущая цена становится ниже Low на H2 .
lact < Low это только условия для поиска ситуации на открытие Short позиции на 5 минутах. на 5 минутах свои условия на подтверждении.
Все Ваши секундные свечи уже сидят внутри 5 минутной свечи и для нее это шум.
Я несколько утрирую но смысл сохраняется!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Ну на том и порешим. Писать массив на 6 000 000 тиков по сотне бумаг не вижу смысла. Данные есть и так только их нужно получить корректно. Свой подход я тоже описал достаточно подробно буду дальше реализовывать. Ну а депозит рассудит!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
26.08.2023 20:37:11
Цитата
Владимир написал: Там двухмесячный тиковый массив (по-моему, Борька его нашёл), 44 мега с датами сделок или 28 мегов голых секундных свечей. Торги не идут все 24 часа, и выходные имеются. Мой скрипт тыщу раз тестировался на этом массиве в разных режимах, пробегает он его секунд за 20. Если кто-то знает более оптимальный подход, то это не я.
Ну смотри те сами, пишите "тиковый массив". Давайте посмотрим что такое тик Вариант 1) ликвидный рынок есть лучшей аск 1 контракт есть лучшей бид 1 контракт с рынка продали 1 контракт. Как это повлияло на рынок? Ответ ни как (шум)! Вариант 2) неликвидный рынок та же ситуация. Может изменить баланс так как спреды огромные или никак.
Вы это пытаетесь оценить Вопрос успешно?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
26.08.2023 20:24:37
Цитата
Владимир написал: Я хороший алгоритмист, неплохой программист, мои способности проявлялись в самых разнообразных областях, а биржевыми погремушками я начал заниматься уже на пенсии.
Еще век назад люди торговали, рисовали графики на миллиметровке карандашами, и писали алгоритмы. Я подчеркиваю, при этом создавая личное благополучие и делясь своими знаниями.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Да не обращайте внимание. Я не последняя инстанция, Это просто частное мнение.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
26.08.2023 20:14:54
Цитата
Владимир написал: Да плевать мне на Ваше мнение. Я хороший алгоритмист, неплохой программист, мои способности проявлялись в самых разнообразных областях, а биржевыми погремушками я начал заниматься уже на пенсии. Что Вы можете знать обо мне? Да ничего!
Я Вас совсем не обидеть хотел или изучить, а лишь говорю о том чем мы с Вами здесь занимаемся и обсуждаем на этом форуме. Ни чего личного. Если я чем то обидел Вас то извините. Я лишь высказываюсь сию минутном занятии.
"биржевыми погремушками" - это огромный бизнес, как да сами убедитесь я думаю Ваш подход изменится.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
26.08.2023 20:05:20
А Вы с Борькой не слышали что рынок меняется? Вы рассуждаете так как рассуждают для подбора тестовых массивов нейросетей.
Ну смотрите сами ваш массив учитывает событие 02.22г. Ваш подход оценил это, дальше нестабильность рынок скачет при каждом шорохе без всяких тенденций. оценил это. Наступило затишье, и что ему делать основываясь на прошлом опыте. Вывод не торговать. Это описание ситуации происходящей на наших глазах. Я там торговал.
Я лишь рассуждаю о том чтоб, оптимизировать поведение скрипта под поведение рынка в своей торговле, оставляю режим эксперт, для переоценки изменений в поведения рынком.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
Пользователь
Сообщений: Регистрация: 15.06.2023
26.08.2023 19:41:41
Владимир, Мы с Вами уже достаточно времени общались на страницах этого форума, у меня сложилось мнение, и о Ваших способностях и о Вашей деятельности.