Смена стратегии на трендовую в торговой системе HT, (да уже можно заявлять о торговой системе), дает возможность сосредоточиться на усовершенствовании TS не отвлекаясь на сделки.
HT ведет себя прекрасно - замечаний нет.
Цитата
VPM написал: Сколько открывать SmartOrder? Которая на прямую упираемся "что делать с открытыми позициями во время пере запусков" и как их согласовывать с SmartOrder?
Присвоил вес каждому инструменту, предварительно рассчитал количество в торговой позиции согласно этому кол. открываю SmartOrder. Во время пере запусков согласовываю с кол. открытых SmartOrder с разрешенным количеством.
В силу определенной тенденции открываем поз. по тренду. Если позиция растет количество контрактов растет. Если позиция падает количество контрактов уменьшается.
И так стает вопрос как поступить. Вариант 1: HT встроить в рабочий скрипт. Вариант 2: До работать данный проект.
Выбор - развить данный.
Все вынес на отдельный счет.
RM: local RiskDay = round(E*RiskDay*0.01,2); -- Задаем риск на торговый день Вынесен в отдельный скрипт, если достигнута просадка все сбросит.
Сделок маловато, добавим бумагу и средовую стратегию, все это легко делается.
Добавлю сбор статистики по сделкам для оценки торговых стратегий. Но в таком состоянии это бессмысленно, так как стратегия реверсная, нужен более вразумительный выход из позиции.
OrderSmart[trans_id]:update(feed[i].last, 0);
Я просто не перестаю восхищаться насколько все лаконично реализовано!
При выполнении условия на закрытие цена просто будет догонять пока все не сбросит. Вперед!
Владимир написал: А подумать? К тому же, я тыщу раз говорил открытым текстом: список тикеров, которыми ему вообще разрешено торговать и сумму, которой ему дозволено распоряжаться, определяю я
Подумал.
Цитата
Владимир написал: Повторяю: НЕ БЫЛО за мно никаких "конечных решений". Я дал ему денег - И ВСЁ!
Владимир, Я вот Вас ни как не пойму, зачем все передергиваете?
Цитата
Владимир написал: VPM, У меня сейчас запущены в тестовом режиме 43 тикера, хочу погонять месячишко, чтобы посмотреть, заслуживают ли они того, чтобы торговать ими в боевом режиме. По первому впечатлению, половина из них годится для этого, но пока ещё и недели не прошло.
А как же это. "Повторяю: НЕ БЫЛО за мно никаких "конечных решений".
А здесь,
Цитата
Владимир написал: А "торговать на всю котлету" - наивернейший способ остаться без штанов, причём НА ЛЮБЫХ тикерах
Я ведь показал расчет
Цитата
VPM написал: local FreeMoney = cur_cost() -- Возвращает доступные средстваlocal E = FreeMoney*fraction; -- fraction - разрешение на использование средств (доля)
fraction - разрешение на использование средств (доля).
Цитата
VPM написал: local RiskDay = round(E*RiskDay*0.01,2); -- Задаем риск на торговый день
это риск на торговый день, Причем тут "бабушкины котлеты"?
Цитата
Владимир написал: Наконец, маневрирование ресурсами между тикерами на все 146% задача скрипта.
Задача проекта не соревнование с Вашим скриптом, 1)
Цитата
VPM написал: Здесь главная цель достигнута, Все можно подключить не зависимо к движку, и Все работает!
2) и главное
Цитата
VPM написал: Но Напомню, задача теста состоит выяснить насколько стабильна работа Фреймворка.
Столкнувшись с тем что, в моем рабочем скрипте, на больших Таймфремах на одно событие стало приходит несколько приказов, начел исправлять, вспомнил о данной разработке, где все уже за меня решено, способами мне не доступными, теперь проверяю на ошибки, чем их больше вылезет сей час тем лучше, тем спокойней будет дальше. Есть замечания милости просмм.
Цитата
Владимир написал: У меня сейчас запущены в тестовом режиме 43 тикера
А на это я Вам свое мнение сообщал; Изначально неверно сформулирована задача.
Как бы нас Владимир, не критиковал, суть в следующим:
1) отобрал бумаги разношерстные, от медленного вечного фьючерса CNY, До шустрого Nasdaq 100 (Portfel); 2) Выделил средства под проект (Capital); 3) Определил риск на проект (RM); 4) Определил кол. которым буду торговать по каждому инструменту (MM); 5) Задал стратегию - трендовая классический реверс (TS);
Здесь главная цель достигнута, Все можно подключить не зависимо к движку, и Все работает!
Да пусть пока примитивные расчеты, "совершенству нет предела"! Да нет управлением позицией. Да нет управлением риском на сделку.
Но с этим уже можно работать кто бы что не говорил! Но Напомню, задача теста состоит выяснить насколько стабильна работа Фреймворка.
Добавьте сюда статистику по сделкам, и появится инструмент для анализа входа и выхода в сделку!
А это, возможно поможет начинающим найти свой подход в автоматизации процессов и не делать хотя бы мои ошибки. Так как они уже сделаны за них. И называется это поделиться опытом.
'NGQ3', -- Натуральный газ 'RMU3', -- RTSM-9.23 Индекс РТС (мини) Расчетный фьючерс на RTSI. Стоимость пункта цены 18,46 p; ГО 3546; 'CNYRUBF', -- CNYRUBF Юань - Рубль Расчетный фьючерс на CNY/RUB. Торгуется до 31.12.2099 (еще 27909 дней) Стоимость пункта цены 1000 p; ГО 1036; 'NAU3', -- NASD-9.23 Nasdaq 100 Расчетный фьючерс на Invesco QQQ ETF Trust Unit Series Стоимость пункта цены 0,92p; ГО 1799; --'SFU3', -- SPYF-9.23 S&P 500 Расчетный фьючерс на SPDR S&P 500 ETF Trust Стоимость пункта цены 92,3p; ГО 5243;
Да забыл сказать, понравился 'NAU3', NASD-9.23 Nasdaq 100 Расчетный фьючерс на Invesco QQQ ETF Trust Unit Series Стоимость пункта цены 0,92p; ГО 1799; недорогой летает как самолет , да еще озвучивает лучшие мировые компании.
Добавил!
Теперь 4 бумаги в портфеле, пришлось отменить принцип "каждому по заслугам", решаю я теперь кому чего.
local FreeMoney = cur_cost() -- Возвращает доступные средства local E = FreeMoney*fraction; -- fraction - разрешение на использование средств (доля) local RiskDay = round(E*RiskDay*0.01,2); -- Задаем риск на торговый день
E = round(E-RiskDay,2); -- я его сразу вычитаю так как торговать будет на всю "котлету"
--local WorkCapital = E/#sec; -- "каждому по заслугам"
Уперся в другую проблему. Сколько открывать SmartOrder? Которая на прямую упираемся "что делать с открытыми позициями во время пере запусков" и как их согласовывать с SmartOrder? Не понятно? Дело в том что замучили детские ошибки (невнимательность + тестовый режим), а может дело в местных флюидах Ну в любом случае позицию жалко ликвидировать все встает по тренду, а когда все на глазах увеличивается тут "жаба душит".
Проскочить не получилось. Эксперимент затягивается "жаба" + нерешённая проблема это надолго.
А тем временем, получив сигналы от нашей стратегии, подошли в плотную к вопросам Мани Менеджмента. Распределению весов в портфеле и количеству контрактов на сделку.
Владимир написал: Нет за мной никакого "конечного решения". Я обычно вообще не знаю, как он торгует, а иногда даже чем он торгует. И торгует он куда более "рентабельно", чем я сам.
Включить выключить когда вкл. это конечные решения. Суть не в этом, то как на писали так и торгует все решения были за Вами, исполнение за скриптом.
Владимир написал: Какая, в задницу, "чёткая логика"? Побитовые операции, хоть и называются "логическими", никакого отношения к логике не имеют.
bit -0; 1; да или нет;
Цитата
Владимир написал: А сленгом обычно пользуются дилетанты, которые пытаются изображать из себя профессионалов
Любая дисциплина профессия в сленге, не смотря на то что называют профессиональным языком (химия, физика,......)
Цитата
Владимир написал: В профессиональной среде сленг неустойчив и частенько привязан к конкретной задаче.
Только сленг, послушайте академика обязательно будет сленг даже при обсуждении фундаментальных Вопросов.
Профессиональная среда это шахтеры, металлурги, транспорт и т.д. Торгаши как без них, а то о чем Вы, прикладное к данным профессиям: облегчить, упростить, автоматизировать и т.д.
Владимир написал: Лично я учиться быть трейдером не хочу и, соответственно, торгую не я.
А это просто иллюзия! Торгуете Вы и конечное решение за Вами. А для того чтоб торговал Ваш скрипт рентабельно, не достаточно знаний побитовых операций, нужно еще кое что знать и применять
Владимир написал: Если Вы не "писатель", то и велосипед не Вам конструировать - нужно брать готовый.
По Вашей логике, если Вы не инвестор (трейдер) то и торговать не Вам.
Главная задача ради которой здесь - это автоматизации торговли. Торговать!
Если Вы, собираете велосипед, то вам не нужны отдельно спицы, достаточно целого колеса, а уж куда его прикрутить, какое колесо, это решения конструктора!
Тяжело с Вами программистами, все "с ног на голову" поставите
Владимир написал: Если Вы не знаете побитовые операции, то Вам просто нечего делать в программировании
Так и я же об этом, я не "писатель" я "конструктор", конструирую свой маленький велосипед для автоматизации торговли средствами QUIK!
Цитата
Владимир написал: а тут несколько страниц обсуждается несчастный AND
Обсуждаем как его прикрутить к buy = line1 > line2 sell = line1 < line2 Вот ребята и объясняют одному неучу!
Цитата
Владимир написал: А мы с Борькой когда-то хотели обсудить и реализовать идеальный интерфейс для программиста, отлаженный в боевых условиях и нечувствительный ко всем существующим глюкам. Это вряд ли больше десятка функций, на отлладку которых и гробится 99% времени программистов и которым посвящены чуть ли не все здешние ветки
Хотеть и делать чуть разные вещи. А так одни лозунги. "Экономика должна быть экономной"
БорисД написал: Я дважды предлагал совместно обсудить "технические" утилиты, вплоть до открытых кодов - один раз сам, другой вместе с Борисом.
Вопрос на мой взгляд не в технических утилитах, их достаточно опубликовано (большая библиотека Универа, здесь публикуются, даются ссылки, да и свои накапливаются).
Ну к примеру если Вы не писатель, а конструктор и собираете свой еще трехколесный велосипед, то зачем знать побитовые операции? Хорошо здешние пользователи "разжёвывают" что за чем, за что им отдельное спасибо.
Все что нужно начинающему конструктору уметь делать "без ковыряния в носу":
Ziveleos написал: По моему, определять лучше сразу оба бита.Если bit.band(order.flags,3) или order.flags & 3 равно 3, то заявка снята, равно 2 - исполнена, 1 - активна.
Кое что нашел:
true - флаг установлен
false - флаг не установлен
-- Функция проверяет установлен бит, или нет (возвращает true, или false)
CheckBit = function(flags, _bit)
-- Проверяет, что переданные аргументы являются числами
if type(flags) ~= "number" then error("Ошибка!!! Checkbit: 1-й аргумент не число!") end
if type(_bit) ~= "number" then error("Ошибка!!! Checkbit: 2-й аргумент не число!") end
if _bit == 0 then _bit = 0x1
elseif _bit == 1 then _bit = 0x2
elseif _bit == 2 then _bit = 0x4
elseif _bit == 3 then _bit = 0x8
elseif _bit == 4 then _bit = 0x10
elseif _bit == 5 then _bit = 0x20
elseif _bit == 6 then _bit = 0x40
elseif _bit == 7 then _bit = 0x80
elseif _bit == 8 then _bit = 0x100
elseif _bit == 9 then _bit = 0x200
elseif _bit == 10 then _bit = 0x400
elseif _bit == 11 then _bit = 0x800
elseif _bit == 12 then _bit = 0x1000
elseif _bit == 13 then _bit = 0x2000
elseif _bit == 14 then _bit = 0x4000
elseif _bit == 15 then _bit = 0x8000
elseif _bit == 16 then _bit = 0x10000
elseif _bit == 17 then _bit = 0x20000
elseif _bit == 18 then _bit = 0x40000
elseif _bit == 19 then _bit = 0x80000
elseif _bit == 20 then _bit = 0x100000
end
if bit.band(flags,_bit ) == _bit then return true
else return false end
end
function OnOrder(order)
--бит 0 (0x1) Заявка активна, иначе – не активна
--бит 1 (0x2) Заявка снята. Если флаг не установлен и значение бита «0» равно «0», то заявка исполнена
--бит 2 (0x4) Заявка на продажу, иначе – на покупку. Данный флаг для сделок и сделок для исполнения определяет направление сделки (BUY/SELL)
--бит 3 (0x8) Заявка лимитированная, иначе – рыночная
--бит 4 (0x10) Разрешить / запретить сделки по разным ценам
--бит 5 (0x20) Исполнить заявку немедленно или снять (FILL OR KILL)
--бит 6 (0x40) Заявка маркет-мейкера. Для адресных заявок – заявка отправлена контрагенту
--бит 7 (0x80) Для адресных заявок – заявка получена от контрагента
--бит 8 (0x100) Снять остаток
--бит 9 (0x200) Айсберг-заявка
-- Проверка бита 2
if CheckBit(order.flags, 2) then
message("Заявка на продажу");
else
message("Заявка на покупку");
end;
end;
https://quikluacsharp.ru/qlua-osnovy/funktsiya-dlya-raboty-s-bitovymi-flagami-v-qlua-lua/
Сейчас в QLua появилась встроенная функция bit.test, которая решает ту же задачу,
т.е. смысла в использовании функции CheckBit больше нет!
Открываю справку
bit.test
Функция проверяет состояние указанного бита в значении.
Возвращает
true, если бит равен «1», и
false, если бит равен «0».
BOOLEAN bit.test(NUMBER х, NUMBER n)
где:
х – значение;
n – номер бита. Нумерация битов начинается с «0».
Владимир, Вы не поняли. В основном пользуются двумя видами Стоп лосов;
1) На торговый день защита депозита от чрезмерной просадки, К примеру если депозит теряет 2-5%, то сделки по счету закрывают, активные заявки сбрасываются, торговля останавливается, выясняется причина такой просадки. Смысл сводится, Сколько просадок депозит выдержит что можно было восстановить счет.
2) На сделку. Здесь защищают конкретную сделку обычно привязываются к рынку (волатильности прикидывают risk/rewar или другим способом).
То что Вы описали это стоп на сделку, если бы у Вас стоял и сработал, Вы получаете ожидаемый убыток в моменте, но продолжаете крутить высвобожденную сумму, Нет упущенной выгоды! Пересиживать можно в акциях и то на свои.
Цитата
Владимир написал: а уж вероятность того, что именно в этот момент случится что-то страшное
То что сейчас все спокойно, еще не повод, да и новости никто не отменял.
Цитата
Владимир написал: Сейчас вероятность проблем со связью близка к нулю
От этого защищаются установкой на сторонней сервер.
При переходе от одного инструмента к портфелю, встал вопрос как поступить с расчетом индикаторов:
Вариант 1) Оставить как есть, то есть расчеты вести в QUIK и получать результат. Вариант 2) Сбросить все алгоритмы в main и там их считать.
Стратегия реверсная по тренду, на стадии наладки Вариант1: за) визуализация, main просто отдыхает замедление минимальное ставим, нет проблем с синхронизацией данных. против) нужны графики на каждый инструмент, нагрузка на Терминал.
Пока так быстрее, да и хочется посмотреть как оно будет, такой подход практиковала команда Универ.
Nikolay написал: Только я писал о проблеме, если колбек пропущен по любой причине.
Да но заявка формируется еще до запуска основного потока main, то есть изначально существует у нее trans_id. если увидит свой trans_id то поступит с ней согласно SmartOrder:update(price, planned), Ну вообще нужно посмотреть этот момент? Спасибо.
Nikolay написал: Элементарно - выключил скрипт, все данные потерял. Надо дописывать хранение данных между запусками.
Да это нужно доделать!
Цитата
Nikolay написал: Также пропустил колбек - ордер не будет в актуальном состоянии.
Там получение через два колбека.
1) OnTransReply активирует получение ordernum:
if trans_reply.status == 3 then executor.order.number = trans_reply.ordernum else executor.order = nil end
и 2) OnOrder уже контролирует исполнение заявки:
Нет заказа, если он был выполнен немедленно! if executor ~= nil and executor.order ~= nil then executor.order.filled = order.qty - order.balance if (order.flags % 2) == 0 then --Заявка снята. Если флаг не установлен и значение бита «0» равно «0», то заявка исполнена executor.order.active = false end end Намой взгляд на оборот более надежно.
Цитата
Nikolay написал: Ну и другие вещи - обрывы связи, ожидание получения данных, смена торговой сессии, суток, ошибки чтения данных с графиков и т.д.
Это со старых беру.
Цитата
Nikolay написал: Но оставлять его без присмотра - это надо быть смелым.
До самостоятельности пока далековато. Я его тоже раньше видел, но тогда показался сложным в написании, а сейчас зашел на раз, да еще закрыл затычки при установлении момент наступления события.
Игорь М написал: В фрейморке HackTrade так было написано не из-за надежности, а из-за отсутствия побитовых операций в Lua52 на тот момент, они только в 2015 году появились в Lua53.
У Вас есть опыт работы с фрейморк HackTrade, если есть может поделитесь на что обратить внимание? Переписываю свой рабочий вариант встраиваю HackTrade, подкупает модульность, ну и конечно умная заявка.
TGB написал: Влючительно до версии 5.4.1, в кодах стандартных библиотек Lua не был учтен существующий режим конфигурирования (предусмотренный в исходниках Lua) использования стеков сопрограмм (thread) в отдельных потоках. Функции стандартных библиотек определены в Lua как сишные (потокобезопасные, допускающие параллельное выолнение), но в их коде нередко используется внутренняя среда интерпретатора Lua (не являющаяся потокобезопасной), и нет гарантии на уровне архитектуры реализации языка, того, что стандартные функции Lua по-токобезопасны для упомянутого режима.
Вот это совсем не понял? можно своими словами попроще.
Владимир написал: В если дяди нет, то решения принимает АЛГОРИТМ.
Ну алгоритм это часть чего то большего, а если несколько и на основании этих решений нужно принять решение без участия человека. А кто Каспарова обыграл? Не думаю что там один алгоритм матрица 8х8, разные фигуры ходят по разному?