Избранное трейдера Advait
Практически все программы для разработки и тестирования механических торговых систем автоматически предоставляют отчет о показателях созданной вами стратегии, позволяющий оценить ее предполагаемую рентабельность. Однако иногда возникает потребность рассчитать параметры доходности самостоятельно. Например, когда торговля ведется вручную, либо стоит задача рассчитать совокупную эффективность по портфелю систем – обращение к таким программам, как Tradestation, Wealth-lab и подобным в данном случае является не самым оптимальным решением. С другой стороны, считать параметры на калькуляторе также не видится рациональным способом решения задачи.
При данном раскладе весьма полезной может оказаться старая программа из имеющегося у каждого пакета Microsoft Office – Excel. Функционал программы позволяет легким образом получать необходимые данные. Предлагаю один из способов создания отчета об эффективности торговой системы на описанном ниже примере.
Привет всем! Давно не публиковал ничего — значит настало время. Готовил много всего интересного, что касается торговых приемов. Все будет структурировано, понятно и от общего к частному!
Введение в прайс экшен.
Price Action – «ценовое действие» -анализ, построенный на изучении движения цены. Почему цена двигается? Я знаю, что цена стоит на месте, когда спрос и предложение взаимно «удовлетворяют» друг друга. Одни покупают по 10, другие – продают, тоже по десять. В другом случае, когда желающих купить по 10 больше, чем тех, кто хочет продать, происходит сдвиг цены. В таком несоответствии заключен принцип ценообразования. Когда рынок находится в некотором «балансе», цена не делает резких скачков, ходит в пределах некоторого коридора (флет). Застои — это места, где рынок перераспределяется, то есть деньги «переходят» из одних рук в другие. Направление движения цены после выхода из флета может показать нам, кому было больно, кто победитель, а кто проигравший. Если я анализирую цену, то должен понимать, как формируются движения цены в общем и свечи графиков частности. Давайте посмотрим на рисунок ниже.
Поскольку предыдущую часть мы завершили на том, как задавать условия и цену для открытия/закрытия позиций, то в начале этой части рассмотрим две распространённые ошибки, допускаемые при тестировании систем: открытие позиции внутри гэпа и заглядывание в будущее.
Из страницы "Статистика конкурса ЛЧИ 2015" в номинации «Лучший трейдер миллионер» выбираем какого-нибудь участника, например clank,
и скачиваем его сделки.
Полученный архив распаковываем, csv-файл копируем в каталог Lchi2015 нашего рабочего Quik и переименовываем в Lchi2015.csv.
На 5-минутный график SiZ5 добавляем индикатор Lchi2015 в Окно 1 — метки сделок.
В Новое Окно добавим индикатор LchiEquity.lua (из xsharp.ru или на Google Диск ) — график доходности в пунктах по выбранному инструменту.
Давненько не писал про торговлю.
Торгую ботами под тслабом 5 лет. Поднял немного денех. Но счас откатывает. Идет запил уже 3месяца. Счет овер 10мио с запасом. Перепишу хаи — выложу стейт.
1. Тслаб меня огорчает. Функционал новых версий порезан. Поэтому сижу на старой версии 1.2.13. В новой версии дополна глюков и багов, которые перекочевали в Тслаб2.0. Править баги разрабы не хотят. Типа вот выйдет новая версия — там и исправим. Вышла 2.0 — никуя не работает.
баги тслаба следующие...
а) не работает с Смартком3… там целая куча багов… за целый год не могли исправить...
б) нет гарантии входа в сделку… т.е. вместо 100 лотов вам нальют 1 и никаких сообщений и предупреждений не будет...
в) не работают лимитные ордера… если их ставить близко от текущей цены… — т.е арбитражник не сделать никак… да и вообще там все очень криво… например логика по входу в позицию отличается от логики по выходу из позы...
г) нет итогового подсчета позы… крайне неудобно… у меня до 50-70ти поз открыто по каждой бумаге… крайне неудобно пересчитывать вручную… постоянно потеряно поз на 1-2мио...
//Читаем их Excel данные в массив List getParamsFromExcel(string filePath) { //С какой строки начинаем читать данные int start_from_row = 2; //Индекс колонки с Тикером int symbol_index = 1; //Индекс колонки с типом ордера int order_type_index = 2; //Индекс колонки с ценой входа int entry_price_index = 4; //Индекс колонки с ценой стопа int stop_price_index = 5; //Индекс колонки с временем входа int entry_time_index = 7; int current_index = start_from_row; //Текущий символ графика string read_symbol = Bars.Symbol; //Текущий считанный из Excel символ string current_symbol; //Список параметров считанный из Excell List result; result = new List(); //Переменная Excel приложение Excel.Application xlApp; //Переменная рабочая книга Excel.Workbook xlWorkBook; //Переменная рабочий лист Excel.Worksheet xlWorkSheet; //Переменная диапазон Excel.Range range; //Инициализируем переменные xlApp = new Excel.Application(); xlWorkBook = xlApp.Workbooks.Open(filePath); xlWorkSheet = xlWorkBook.Worksheets.get_Item(1); range = xlWorkSheet.UsedRange; //Считываем тикер из Excel current_symbol = (string)(range.Cells[current_index, symbol_index] as Excel.Range).Value2; //Читаем тикеры, пока не наткнемся на пустую строку while(current_symbol != null) { //Если считанный тикер совпадает с тикером графика, на котором запустили робота if(read_symbol == current_symbol) { //Читаем и добавляем параметры ордера result.Add(new OrderParams { ePrice = Convert.ToDouble((range.Cells[current_index, entry_price_index] as Excel.Range).Value2), sPrice = Convert.ToDouble((range.Cells[current_index, stop_price_index] as Excel.Range).Value2), eTime = DateTime.FromOADate((range.Cells[current_index, entry_time_index] as Excel.Range).Value2), pType = ((string)(range.Cells[current_index, order_type_index] as Excel.Range).Value2 == "Short" ? PositionType.Short : PositionType.Long) }); } current_index++; //Считываем очередной тикер current_symbol = (string)(range.Cells[current_index, symbol_index] as Excel.Range).Value2; } //Закрываем рабочую книгу xlWorkBook.Close(true, null, null); //Выходим из приложения xlApp.Quit(); //Уничтожаем созданные объекты releaseObject(xlWorkSheet); releaseObject(xlWorkBook); releaseObject(xlApp); return result; } //Уничтожаем переданный объект private void releaseObject(object obj) { try { System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); obj = null; } catch (Exception ex) { obj = null; } finally { GC.Collect(); } }