Избранное трейдера Андрей Вячеславович (Ganesh)
Settings={ Name = "Fractal_Chennal", period=5, line={ { Name = "Level_High", Type =TYPE_LINE,-- = LINE --линии = DASH -- тире = POINT -- точки Width = 1, Color = RGB(0,255, 0)--green }, { Name = "Level_Low", Type =TYPE_LINE, Width = 1, Color = RGB(255,0,0)--root }}} idx_prosl=0 function Init() return 2 end function OnCalculate(idx) if idx==1 then P = math.floor(Settings.period/2)*2+1 message("Код бумаги: "..getDataSourceInfo().sec_code.." ; период индикатора: "..P,1) t_H,t_L={},{} end if idx~=nil and idx>P then if idx_prosl~=idx then local l=idx-P for l=l,idx-1 do t_H[l]=H(l) t_L[l]=L(l) end if t_H[#t_H-(P-1)/2]==math.max(unpack(t_H,#t_H-P+1,#t_H)) then H_ind_value=t_H[#t_H-(P-1)/2] end if t_L[#t_L-(P-1)/2]==math.min(unpack(t_L,#t_L-P+1,#t_L)) then L_ind_value=t_L[#t_L-(P-1)/2] end end else H_ind_value=nil L_ind_value=nil end idx_prosl=idx return H_ind_value, L_ind_value endКак пользоваться:
require(quantmod) require(xts) require(TTR) require(PerformanceAnalytics) getSymbols('^GSPC', src='yahoo', from = '1900-01-01') monthlyGSPC <- Ad(GSPC)[endpoints(GSPC, on = 'months')] movAvg <- SMA(monthlyGSPC, 10) signal <- monthlyGSPC > movAvg gspcRets <- Return.calculate(monthlyGSPC)Далее построим две системы одна с ошибкой заглядывания, вторая корректная. Суть системы простая, месячная SMA с периодом 10, выше покупаем, ниже продаем.
lookahead <- signal * gspcRets correct <- lag(signal) * gspcRets
compare <- na.omit(cbind(gspcRets, lookahead, correct)) colnames(compare) <- c("S&P 500", "Lookahead", "Correct") charts.PerformanceSummary(compare) rbind(table.AnnualizedReturns(compare), maxDrawdown(compare), CalmarRatio(compare)) logRets <- log(cumprod(1+compare)) chart.TimeSeries(logRets, legend.loc='topleft')
Как было отмечено в предыдущей части – вся суть технического анализа со всеми его индикаторами сводится к пересечению линий. Например, быстрая скользящая средняя пересекает медленную скользящую среднюю; цена пересекает уровень или любую линию какого-нибудь индикатора; RSI пересек уровень 70% и т.д. Ну пусть даже и есть исключения – напишем под них отдельные функции, главное, что наше обобщение будет охватывать 90% случаев ))).
Итак, из чего же состоят сигналы пересечения линий? А состоят они из событий и состояний. Событие – это факт пересечения, состояние – это фактическое расположение линий относительно друг друга.
На рисунке показано, как это выглядит геометрически на примере пересечения скользящих средних. А с точки зрения программирования эти события и состояния удобно представить в виде битовых флагов – сопоставить каждому из них определенный бит числа и если он установлен, то событие или состояние имеется и наоборот.