VPM, У меня речь идёт о тестировании на прошлых ТИКАХ, а нынешние свечи я сам считаю, и у них нет ни High ни Low. А уж "поиск ситуации на открытие позиции" достаточно сложная вещь, там значения свечей вообще не используются. Да и графиков у меня сроду не было.
Nikolay написал: Да. Перебираем бары и когда надо перейти на новый индекс, вызывается функция.Также это будет работать и для текущих данных. Так что код становится однотипным.
Заманчиво попробую посмотрим что из этого получится у меня.
Владимир написал: VPM, Да плевать мне на Ваше мнение. Я хороший алгоритмист, неплохой программист, мои способности проявлялись в самых разнообразных областях, а биржевыми погремушками я начал заниматься уже на пенсии. Что Вы можете знать обо мне? Да ничего!
Володь - мой взляд со стороны имеет противоположное мнение про тебя : ты хороший программист и не плохой алгоритмист . А вот когда создашь дневник трейдера ....... тогда возможно и я тебя хорошим алгоритмистом начну считать. ( помнишь я тебе примеры про бухгалтерский учет и зачем он нужен приводил ) . В любом бизнесе учет и аналитика первостепенны и без них даже не стоит открывать бизнес или торговлю на бирже начинать.
Владимир написал: VPM, И чего? Там двухмесячный тиковый массив (по-моему, Борька его нашёл), 44 мега с датами сделок или 28 мегов голых секундных свечей. Торги не идут все 24 часа, и выходные имеются. Мой скрипт тыщу раз тестировался на этом массиве в разных режимах, пробегает он его секунд за 20. Если кто-то знает более оптимальный подход, то это не я.
Вообще то это общедоступная инфа с сайта Финама . А именно этот период я брал для того чтобы тестить роботов в критических ситуациях ....... помните ведь как валились цены на всех тикерах с началом СВО ? Да , твои тестовики неплохо научились справляться с такими кризис - ситуациями . Но нужно паралельно запускать исторические данные и за последние пару недель , а лучше пару месяцев ........ мы с тобой по телефону это уже обсуждали.
VPM написал: А Вы с Борькой не слышали что рынок меняется? Вы рассуждаете так как рассуждают для подбора тестовых массивов нейросетей.
Ну смотрите сами ваш массив учитывает событие 02.22г. Ваш подход оценил это, дальше нестабильность рынок скачет при каждом шорохе без всяких тенденций. оценил это. Наступило затишье, и что ему делать основываясь на прошлом опыте. Вывод не торговать. Это описание ситуации происходящей на наших глазах. Я там торговал.
Я лишь рассуждаю о том чтоб, оптимизировать поведение скрипта под поведение рынка в своей торговле, оставляю режим эксперт, для переоценки изменений в поведения рынком.
Не только слышали но и наблюдаем как рынок меняется , причем наблюдаем это в 10 секундном тайфрейме онлайн и с изменением каждую прошедшую секунду ( меньший тайфрейм не нужен , так как не каждые 10 сек. даже в самых активных тикерах происходят сделки , а не которым дохлым тикерам и 10 мин. самое то ) . Кстати - спорить и переубеждать Владимира бесполезно - он очень упертый и только не опровержимые факты его способны переубедить и изменить его мнение. Чужим мнением он не только не доверяет но изначально пытается их опровергнуть.
Нет, Борь, ты просто никогда не видел программистов экстра-класса, а я видел их пачками - в частности, был лично знаком с человеком, который был признан лучшим программистом мира 1993 года. Хороший программист - это всегда зануда, хороший алгоритмист - это всегда раздолбай. А кто из них я - ты знаешь. Да один мой "сортир", которого нет ни в трёхтомнике Кнута, ни вообще где бы то ни было, хотя это самая популярная задача программирования во все времена, с логарифмической сложностью в худшем случае и линейной почти во всех остальных, доказывает, что алгоритмист я, как ни крути, мирового уровня. А твой "дневник трейдера" я тебе прислал в двух последних письмах, гда тщательно проанализировал поведение алгоритма буквально во всех возможных ситуациях.
Борь, ну ты же прекрасно знаешь, что "мои тестовики" отличаются от боевого режима одним-единственным символом. А могут даже и не отличаться - переопределить режим по умолчанию можно даже в IN-файле. И что вместе с двумя последними тестами (месячным и недельным) параллельно работал скрипт и в боевом режиме. И режим по историческим данным предварительно запускался, как черновая отладка алгоритма. И данные эти как раз были за пару месяцев, причём там было всё: и топтание на месте, и бурный рост, и катастрофическое падение - это же ТВОЙ тестовый массив! Любой другой, в лучшем случае, продемонстрирует то же самое. И дополнительным бонусом оказалась просто изумительная работа алгоритма на слаболиквидных тикерах благодаря технике "прогрева", который, как ты помнишь, создавался СОВСЕМ для других целей. Буквально вчера, когда торги по всем тикерам велись очень вяло, а мартовский фьючерс VBH4 и вообще почти всегда сидел в состоянии "инструмент не торгуется" в какой-то момент скрипт увидел, что торги по нему всё-таки идут, посмотрел - МАМА ДОРОГАЯ! Да у меня же там 2.5% прибыли! Пора фиксировать! Кинул заявку, она там часа два повисела (рынок же фактически мёртвый) и сработала. То есть торговать на полудохлых тикерах скучно, но как дополнение к портфелю они очень даже полезны. Тот же VBH4 начнёт нормально торговаться где-то в будущем году, а пока в режиме "курочка по зёрнышку" тоже пригодится. И - да, "чужим мнениям я не доверяю, но чужое мнение может стать и моим, и уж тогда...
Что - то с последними обновлениями все переломалось. У одного из брокеров терминал зависает на несколько минут после отдачи приказа в ожидании ответа сервера?
БорисД, Я ни кого не переубеждаю, я лишь публично высказываю свое видение на то чем мы тут занимаемся, и не претендую на истину в последний инстанции.
"не опровержимые факты" кого угодно переубедят, на то они не опровержимы. С Владимир мы не спорим, скорее дискутируем о взглядах на рынок, так как придерживаемся разных подходов в торговле, а судья здесь один торговый счет. Вот и Вы про
Цитата
БорисД написал: наблюдаем это в 10 секундном тайфрейме онлайн
Но Вы то наверняка знаете, что говоря о тайм фрейме нужно говорить о фрактальности в поведении цены, а значить поймав тенденции на 10 сек. то и горизонт планирования сделки такой же.
БорисД написал: В любом бизнесе учет и аналитика первостепенны и без них даже не стоит открывать бизнес или торговлю на бирже начинать.
Целиком и полностью! Вот скрип которым я пользуюсь, по принципу "запустил и забыл", за что автору скажем спасибо. Это конечно не бухгалтерия в полном виде, но вполне достаточно чтоб в екселе сделать анализ.
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;
VPM написал: Что - то с последними обновлениями все переломалось. У одного из брокеров терминал зависает на несколько минут после отдачи приказа в ожидании ответа сервера?
Уточните, пожалуйста, после какого обновления столкнулись с данной проблемой (на какую версию)? После выставления заявки терминал "зависает", то есть становятся недоступны никакие действия с программой? Просьба описать более подробно. Будем благодарны, если удастся снять системные дампы во время проявления зависания и прислать нам на почту quiksupport@arqatech.com Инструкция по снятию dmp файлов находится в документе по ссылке. Пункт 5.3.
Andrey Golik написал: Уточните, пожалуйста, после какого обновления столкнулись с данной проблемой (на какую версию)?
Откатил назад с версии 10.3 на 10.1.2.2 удалил самописные индикаторы из папки, проверил получение данных(обезличенные сделки и 4 класса), задержка на рынке акций, при вводе в окно ввода заявки, пишет "ожидании ответа сервера" и так до нескольких минут. После отката чуть улучшилось по времени но все равно работает не нормально.
Цитата
Andrey Golik написал: После выставления заявки терминал "зависает", то есть становятся недоступны никакие действия с программой?
Нет во время выставления, после исполнения идет очень медленное обновление таблиц о сделке до нескольких минут. Графики тоже тормозят. (~ 20шт) Обращался к брокеру не помогли. Брокер "АТОН". Терминал стоит очень давно обновляется вместе с рекомендациями брокера.
Дошли руки восстановил работу квик обновился до версии 10.3.и опять в боевом строю! Вероятно причиной задержки, при получении ответа терминалом от сервера, являлись скрипты луа при переходе на версию 5.4. Хотя снес почти все лишнее. Все скрипты нужно проверять на соответсвие с 5.4.
Похвально, наметился прогресс в риторике. Следующим шагом должно быть признание, что виноват автор скриптов, либо тот, кто использует халявные скрипты не разобравшись в них. ----------------------- Зеркало не виновато.
Терминал устанавливают для возможности торговать (в не зависимости от его версии). Пользовательские скрипты используют для автоматизации этого процесса (в не зависимости от языка и версии). И это не сколько не отменяет тот факт, что пользовательский скрип не должен убивать терминал и тем более влиять на работу сервера , кем бы и как не был написан.
VPM написал: nikolz, Ваши посты как всегда актуальны.
Кто виноват? и Что делать? Вот вопрос.
Терминал устанавливают для возможности торговать (в не зависимости от его версии). Пользовательские скрипты используют для автоматизации этого процесса (в не зависимости от языка и версии). И это не сколько не отменяет тот факт, что пользовательский скрип не должен убивать терминал и тем более влиять на работу сервера , кем бы и как не был написан. ::
Терминал сделали, чтобы Вы могли подавать заявки брокеру руками. И эту функцию он реализует прекрасно. --------------- Но Вы же лепите ,гордясь своим невежеством в программировании, монстров на луа и пихаете их в терминал. ------------------------ Так как терминал посылает сообщения на сервер и Вы в скрипте формируете эти сообщения, то Вы можете даже организовать DDOS атаку даже из своего скрипта. -------------------------- А уж завалить терминал это Вы можете как два пальца... ------------------------ Вы как и многие "профи" на этом форуме постоянно ругаете КВИК , а когда понимаете, что это вы на...ли г-но, скромно молчите. ---------------- Увы, LUA дает доступ во внутрь терминала. Поэтому защиту от дурака здесь установить невозможно. ------------------------
Уважаемый nikolz, Вы видимо имеете отношение к программированию, но не знакомы с надежностью (Есть такая теория). Не нужно валить все в одну кучу. Обо всем и по порядку.
Цитата
nikolz написал: Терминал сделали, чтобы Вы могли подавать заявки брокеру руками. И эту функцию он реализует прекрасно.
Именно об этом мое самое первое сообщение на этом форуме. Сломали что работало лет 20. и не могут исправить. Ломать не строить
Цитата
nikolz написал: Так как терминал посылает сообщения на сервер и Вы в скрипте формируете эти сообщения, то Вы можете даже организовать DDOS атаку даже из своего скрипта.
Это вообще шедевр таланты. Сообщению чтоб попасть на сервер, нужно отвечать определённым требованиям, посланное хоть руками хоть еще чем. Атаку в подобной реализации вообще не вопрос, достаточно ошибиться в количестве. Но это к вопросу надежности. Версии лепятся не понятно зачем, а где надежность?
Цитата
nikolz написал: А уж завалить терминал это Вы можете как два пальца...
Цитата
про это уже писал: VPM написал: Кто виноват? и Что делать? Вот вопрос.Терминал устанавливают для возможности торговать (в не зависимости от его версии).Пользовательские скрипты используют для автоматизации этого процесса (в не зависимости от языка и версии).И это не сколько не отменяет тот факт, что пользовательский скрип не должен убивать терминал и тем более влиять на работу сервера ,кем бы и как не был написан.
nikolz написал: Вы как и многие "профи" на этом форуме постоянно ругаете КВИК , а когда понимаете, что это вы на...ли г-но, скромно молчите.
Цитата
nikolz написал: Увы, LUA дает доступ во внутрь терминала. Поэтому защиту от дурака здесь установить невозможно.
Квик я люблю, а не ругаю (разве немного таланты), мои сообщения о недочетах замеченных, надеюсь это помогает (так называема обратная связь), это одна из задач данного форума.
"защиту от дурака" должна быть установлена! Скрипты писал и буду писать. К профи не отношусь, здесь их на пальцах одной руки. Да и луа мало кто понимает: "Таблицы в Lua — это не одна из структур данных, — это единственная структура данных."
VPM, Я не возражаю , Каждый имеет право на собственное мнение. -------------------------- Что же про Lua, то я его знаю очень хорошо, так как встраиваю в IOT уже лет восемь, пишу свои библиотеки и делаю многопоточные варианты с встроенными JIT компиляторами. Написал это не для рекламы, а как возражение на Ваше высказывание. ----------------- Если У Вас есть проблемы со скриптом, то напишите конкретно и покажите скрипт, я вам его исправлю и объясню, если хотите даже на уровне внутреннего содержания VMLua и байт кода. ----------------------------- Что же касается Вашего или кого-еще мнения о моем уровне программирования, то мне это пофиг, так как этот уровень доказали многочисленные мои ученики, некоторые из которых успешно работают в ведущих мировых компаниях, а также те системы, которые я внедрял в вузах и на предприятиях на просторах СССР. ------------------ Успехов вам в написании скриптов.
nikolz, Лапуль, Вы меня убили наповал. У ВАС ЕСТЬ УЧЕНИКИ?! Я же не раз советовал Вам заняться чем-нибудь другим, кроме программирования - вдруг в этом "другом" Вы хоть что-то соображаете. Не соблаговолите ли пригласить сюда парочку учеников - на такое следует посмотреть!
Что же про Lua, то это один из самых дебильных языков, которые попадались мне на моём пути. Несмотря на всю свою дебильнось он позволяет-таки организовать торговлю в Квике, и требуется для этого... ща посчитаю... 28 функций общим весом 31747 байт. Это и на торговлю, и на диалог, и на работу с файлами, и на акции, и на фьючерсы, и на компенсацию глюков системного софта - НА ВСЁ! Скрипт спокойно держит 1000 тикеров и более, спокойно работает месяцами, давно отлажен, описан, перевязан ленточкой. Чем тут можно заниматься ВОСЕМЬ ЛЕТ - это выше моего понимания. За каким хером здесь нужна многопоточность, библиотеки, встроенные компиляторы, ловля микросекунд и прочая дребедень - тем более. Я в своё время потратил недели две, чтобы, наоборот, запихнуть всё, что можно, в поток main, и с тех пор вообще забыл про глюки - месяцев пять назад последний раз что-то глючило. А может и год назад. И перестаньте корчить из себя учителя - Вас, как я сильно подозреваю, НИКТО за него не принимает.
Проблемы с терминалом описанные здесь возникли при переводе скриптов на 5.4 (с 5.1 на 5.3 получилось с минимальными затратами по времени), здесь так не получилось, пришлось разбираться. Оказалось скрипты которые годами работали "запустил и забыл" (ну к примеру скрип сохранения сделок) нужно проверять на соответствие с 5.4.
Я уже здесь писал, что к программированию имею отношение только в части данного проекта (хобби). Мои отношения с луа: читаю автора; ищу примеры; встраиваю в свои алгоритмы; думал что можно добавить обсуждение на форуме.
Я не обсуждаю на форуме личные качества участников, я лишь высказываю собственное мнение, в силу собственного понимания, о предмете обсуждения. Уровни в программировании я тоже не обсуждаю, я в этом ни чего не понимаю, я даже не понимаю то что Вы написали, чем Вы занимаетесь на луа.
Я обсуждаю конкретный проект, "программирование на луа" для целей автоматизации процесса торговли на бирже, который не заканчивается программированием! И рад единомышленникам или объективной здоровой критике!
Судить о луа я конечно не могу, я им просто пользуюсь, таким какой он есть, и прислушиваюсь к автору и другим советам, в том числе с форума к тем кто лучше меня разбирается.
Вот например пишет автор:
"Lua предлагает как раз то, для чего С недостаточно хорош: высокая степень независимости от аппаратного обеспечения, динамические структуры, отсутствие избыточности и легкость тестирования и отладки".
"многие алгоритмы с использованием таблиц становятся до банальности простыми. Например, мы редко пишем алгоритм поиска в Lua, поскольку таблицы предоставляют прямой доступ к любому типу.
Таблица в Lua — это объект во многих отношениях. Подобно объектам, у таблиц есть состояние. Подобно объектам, у таблиц есть идентичность (собственное «я» — self), которая не зависит от ее значений; Подобно объектам, у таблиц есть жизненный цикл У объектов есть свои собственные действия. У таблиц также могут быть действия..."
И я не понимаю почему этим не пользоваться в полной мере, да мета таблицы здесь самое сложное, но то что получаешь на выходе стоит, того чтоб сними один раз разобраться.
Вернулся к проекту - "суперкар", (Фреймворк HackTrade 1.4 для написания торговых роботов от https://github.com/DenisKolodin.)
Изменения, на что следует обратить внимание: Фреймворк написан на 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 для написания торговых роботов от https://github.com/DenisKolodin.)
А что случилось со статистикой на форуме? Строка "Сейчас на форуме" вообще пустая , если раньше чуть-чуть приписывала то нынче вообще ничего не отражает. Таланты!
VPM написал: А что случилось со статистикой на форуме? Строка "Сейчас на форуме" вообще пустая , если раньше чуть-чуть приписывала то нынче вообще ничего не отражает. Таланты!
Далеко не секрет чтоб успешно торговать, нужна торговая система (набор стратегий), и совсем не важно ручная это торговля или алгоритм. Собрав торговую систему хотелось бы ее оценить, для этого применяется тестирование на исторических данных. Для оценки систем используют ряд показателей. Казалось бы что проще, загрузил, откатил индекс назад и прокатился по ним с применением стратегий. Квик хранит историю данных. Но не тут то было
Если внутридневные стратегии еще куду ни шло, то уже средний срок без бэк - теста, и не туда и не сюда.
Экспресс показатели, ну это в первую очередь 1) мат. ожидание системы (должно быть положительно не важно какое значение но +); 2) Количество сделок (Выигрыш/Проигрыш) для расчета коэффициента процент выигрышных сделок; 3) Профит / Лосс, для расчета профит фактора. Я еще считаю оптимальную фракцию и средние показатели за сделку. Прошла сделка пересчет. Для экспресс анализа достаточно первых 3.
Попытаться привести к стационарному виду Вы, конечно, можете. Правда не забудьте потом работу написать...
А что касается тестов, то на истории подгоните показатели - это не сложно, но, из-за выше сказанного, жить эти показатели будут неизвестно сколько. Поэтому, кстати, стратегии основанные на статистических аномалиях "как бы" лучше, т.к. это аномалии. Но и здесь "толстые хвосты" легко приведут в чувство. Так что если тестируете, то либо это надо делать часто (не скатившись в переобучение), либо должно быть самообучение с коротким горизонтом.
Karina Dmitrieva написал: В папку archive директории QUIK сохраняется информация (исторические данные) обо всех открытых графиках (в имени *.dat файла: класс, название инструмента, таймфрейм).По своему усмотрению Вы можете удалить всю папку archive или же конкретный файл. Но многие пользователи хранят данную информацию, чтобы была возможность просмотреть более дальнюю историю по инструментам, поскольку сам сервер QUIK хранит всего 3000 свечей, а Рабочее место QUIK умеет накапливать локально до 65000 свечей (для каждого инструмента и таймфрейма).Таким образом, при удалении данных о графиках (локально история будет очищена), но при подключении терминала QUIK к серверу и построении графика произойдет перезаказ архивов графиков с сервера (с количеством 3000 свечей + текущая торговая сессия).
Т.е. если, открыт график, "то локально до 65000 свечей (для каждого инструмента и таймфрейма)". можно использовать для анализа в наших целях. Получить эти свечи можно по индексу массива.
А как их получить цену зная дату и время дате свечи???
Nikolay, Собственно поэтому я и пытаюсь более детально описать подход и загвозки связанные с ним.
Цитата
Nikolay написал: Так что если тестируете, то либо это надо делать часто (не скатившись в переобучение), либо должно быть самообучение с коротким горизонтом.
Вы не поняли, нет никакого обучения не какого AI даже не четкую не применяю, все максимально упрощено. сам алгоритм описан выше. Подход "система нескольких окон" заключается беру дневную свечу и внутри дня прогоняю меньшие таймфреймы, к примеру 1 час как цена распределялась за день, таймфрейм к примеру 1 минута внутри одного часа и т.д.
Стратегия входов и выходов это преодоление пороговых значений. Какая здесь может быть подгонка прогоняю 5 дней. Статистику считаю по сделкам.
Касаемо стационарности я имел ввиду привидение к нормальному распределению входных данных (цены). Описывать не чего все давно описано. Я лишь говорю про подход. Нормальное распределение является стационарным?
Nikolay написал: Не очень понятен вопрос. Как получить бар, зная дату и время?
Ну да Квик хранит свечи в виде массивов данных и разработчики предлагают чтоб получить свечу с ее данными нужно найти вначале индекс в массиве. И начинаются пляски с бубнами Но часто нужно ответить на вопрос какой была цена в 1200 на такую то дату?
VPM написал: Ну да Квик хранит свечи в виде массивов данных и разработчики предлагают чтоб получить свечу с ее данными нужно найти вначале индекс в массиве. И начинаются пляски с бубнами :: Но часто нужно ответить на вопрос какой была цена в 1200 на такую то дату?
Да, предполагается, что надо этот индекс найти. Двоичный поиск вполне быстро найдет его, надо просто перейти на числовое представление времени (unix time). Почему найти, потому что когда у Вас уже 65000 тыс. бар, то при переподключении к серверу удивительным образом нумерация баров "съедет", т.к. произойдет сдвиг, чтобы не выходить за пределы доступного объема массива. Поэтому индекс сегодня не обязательно будет тот же, что и вчера.
VPM написал: Nikolay, Собственно поэтому я и пытаюсь более детально описать подход и загвозки связанные с ним.
Вы не поняли, нет никакого обучения не какого AI даже не четкую не применяю, все максимально упрощено. сам алгоритм описан выше. Подход "система нескольких окон" заключается беру дневную свечу и внутри дня прогоняю меньшие таймфреймы, к примеру 1 час как цена распределялась за день, таймфрейм к примеру 1 минута внутри одного часа и т.д.
Стратегия входов и выходов это преодоление пороговых значений. Какая здесь может быть подгонка прогоняю 5 дней. Статистику считаю по сделкам.
Касаемо стационарности я имел ввиду привидение к нормальному распределению входных данных (цены). Описывать не чего все давно описано. Я лишь говорю про подход. Нормальное распределение является стационарным?
Я и не советую никакой AI. Если задача просто посмотреть что получилось и ничего с этим не делать, то и нет проблем. Задача простая.
На выходе любой стратегии, после совершения сделки, мы имеем результат Wines/Loss. Именно его и обрабатываем для оценки показателей торговой системы. эти данные так же используются при расчете количества в сделке.
Ну это, видимо, современная деформация, когда слово самообучение воспринимается как AI. Хотя та же кластеризация ( которой уж сколько лет) тоже накапливает данные и "как бы" учится.
VPM написал: Ну если еще обобщить вопрос, если можно найти параметры свечей по индексу, то должна быть и обратная функция поиска индекса по времени и дате?
Nikolay, я накидал алгоритм принципиально описав в сообщении 23.10.2023 16:41:34, на текущих данных все пойдет.
Стратегия описанная А. Элдером в его книгах, внутри дневная чтоб можно было получить оценку. Диверсификация портфеля 5% капитала на инструмент т.е. не более 20 бумаг. Прислушался к Вашему совету на кидал итератор для тестера, данные получаю через подписку с сервера. И чего только не натерпелся прогоняя исторические данные за несколько дней.
Алгоритм применил следующий 1) Получаю Индекс на D1 2) Сдвигаю индекс на количество дней для теста получаю дату начало. 3) на M1 определяю индекс на 0900 4) На внутридневных интервалах получаю цену закрытия М1, те смотрю как распределялась цена на других тайм фреймах, с визуализацией.
Все медленно прогоняю и просматриваю.
Нужно определить цену открытия сессии на 0900 имея перед глазами тайм фрейм H2, и Вот оно 0800 с ценами, так погодите сессия закрыта.
Нет я сейчас не про статистику управляющего хедж-фондом, это я видел и Вашу работу это все супер. Я про экспресс оценку, опубликована в статье John F. Ehlers "Evaluating TradingSystems", ну а без мат ожидания системы никуда. проще сразу сделать перевод.
Nikolay написал: Ну ее нет, так что надо её написать и забыть.
Например?
Не очень понятна проблема. Есть точка времени, есть массив времен. Все это натуральные числа os.time(ds:T(index)). Т.е. все сводится к простой задаче - найти индекс в массиве с нужным числом. Как выше написал - двоичный поиск быстро найдет. Правда, конечно, функция сравнения должна быть не на равенство, а на вхождение искомой точки в диапазон бара. Например для 10 минутных баров, точка времени 10:03.
В этой статье есть много ошибочных утверждений. --------------------------- Основное из которых то, что на фондовом рынке действует нормальный закон плотности вероятности цены. ------------------------- Более того, еще в прошлом веке доказали, что нормальный закон редко встречается в природе, т е в реальности. ------------------------------- В результате этого появилась теория и методы робастного оценивания.
В этой статье есть много ошибочных утверждений. --------------------------- Основное из которых то, что на фондовом рынке действует нормальный закон плотности вероятности цены. ------------------------- Более того, еще в прошлом веке доказали, что нормальный закон редко встречается в природе, т е в реальности. ------------------------------- В результате этого появилась теория и методы робастного оценивания.
С этим не поспоришь. Но статья, кажется, не о будущей цене актива и вероятности этого события, а о статистическом анализе последовательности совершенных сделок.
nikolz написал: Основное из которых то, что на фондовом рынке действует нормальный закон плотности вероятности цены.
по меньший мере не корректно . Ну что значить "на фондовом рынке действует нормальный закон"?
Нормальный закон распределения наиболее формализован описан в литературе, Для того чтоб им можно было пользовать в наших целях, делается преобразования (доходности, лог доходности, приращения, преобразование Фишера...) В данный момент речь идет не про анализ динамики цен, про анализ сделок. Распределение сделок по времени(Wines/Loss) можно отнести к нормальному закону?