торговая стратегия на базе Волновой теории Эллиота - страница 28
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
В общем, много полезного узнал. :)
Одной из Ваших аксиом является наличие истинной (т.е. единственной) траектории, которая и определяется в результате процесса оптимизации. Каким образом единственная траектория может привести к нескольким каналам ?
Сорри опять за поздние ответы. При аппроксимации траектории Вы никогда не сможете знать насколько одна аппроксимация лучше другой описывает саму траекторию, если они в одном доверительном интервале. И соотвественно все аппроксимации, попадающие в границы доверительного интервала могут считаться равнозначными. В принципе так и есть. Для построения прогноза из множества возможных (обычно не одна аппроксимация удовлетворяет критериям отбора, потому, что задаются границы погрешностей) лучше выбрать так сказать "самую" оптимальную. По мере изучения алгоритма я понял еще одну особенность - хоть аппроксимации и разные, но прогнозы, в подавляющем большинстве случаев, одинаковы. Еще раз напомню сама траектория не нужна и я ее не ищу. По поводу каналов - неединственность каналов связана со "степенью детализации" (назовем так) исследуемых структур. Так при наличии трендов можно определить зоны откатов и оценить вероятности окончания трендов, пробоя разворотных зон и т.д. Или просто выделить зоны неопределенностей, когда на рынок лучше не выводить позиций. Еще нужно всегда помнить об ограничениях на размеры выборок, иначе результат будет обладать слишком высокой долей неопределенности.
Удачи и попутных трендов.
У меня возникло непонимание по поводу расчета коэффициента Херста.
В случае линейной регрессии мы имеем 2 варианта рачета S и R.
Вариант1.
S - мы можем расчитывать как сумму разностей отклонений по всей длинне линии линейной регрессии.
То есть:
S=0.0;
for (n=0; n<Period; n++) { S+ = MathPow( Close[n] - (a+b*n) , 2); }
S=MathSqrt( S / Period );
А R - мы можем расчитывать как разность между максимальным и минимальным отклонением вдоль всей линии линейной регрессии.
То есть:
pMax=0.0; pMin=0.0;
for (n=0; n<Period; n++)
{
dc=Close[n] - (a+b*n);
if ( dc > pMax) pMax = dc;
if ( dc < pMin) pMin = dc
}
R=MathAbs( pMax - pMin);
Вариант 2.
Мы можем расчитывать S тносительно последнего бара воспользовавшись функцией iStdDev( ) из набора стандартных технических индикаторов. Но в этом случае мы будем иметь S рассчитанное по mov, относительно последнего бара, что равносильно расчету относительно значения середины линии линейной регрессии.
А R - как разность максимального и минимального значения в горизонтальной проекции:
pMax=High[Highest(NULL,0,MODE_HIGH,Period,i)];
pMin=Low[Lowest(NULL,0,MODE_Low,Period,i)];
что несовсем корректно, чуть корректней было бы использовать MODE_CLOSE, если изначально считаем по Close.
У Вас насколько я понял применен второй вариант? Или я ошибаюсь?
Вообщем вопрос: какой вариант более правильный для более точного расчета коеффициента Херста?
Заранее благодарю за ответ - Александр.
Спасибо, Vladislav, этот момент я как-то не учел. А ведь это действительно так. Это значит, что на самом деле получается не несколько каналов, а целый диапазон, ограниченный линиями с максимальным и минимальным углом.
Не совсем понимаю о какой неопределенности Вы говорите. Однако, мне понятно другое. Выборка должна определять канал регрессии, а канал регрессии - это трендовый канал. Если свалить в выборку и тренд, и флэт, то такая выборка вряд ли позволит получить хоть что-нибудь полезное. Поэтому возникает проблема разделения рынка на фазы и, что более важно, идентификации тренда и флэта на ранних этапах, то есть в реале. По-моему задача весьма нетривиальная.
Kartinka mne napomnila standartnyj indikator kanalov, vot i spomnil svoju razrabotku kokda iskal filtra dlia ods4iota kokda na4inajetsia bolshyje volny Elliota - po Standart Deviation formule:
Vot kod mojevo indikatora:
//+------------------------------------------------------------------+ //| StdDevChan.mq4 | //| Copyright © 2005, Arunas Pranckevicius | //| irc://irc.omnitel.net/forex | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, Arunas Pranckevicius(T-1000), Lithuania" #property link "irc://irc.omnitel.net/forex" #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 Red #property indicator_color2 White #property indicator_color3 Blue //---- input parameters extern int PriceBars=350; extern int Shift; extern bool Comments=false; double Support[]; double StdDev[]; double Resistance[]; //---- buffers //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void SetObject(string ObjName,int ObjType,datetime ObjTime1,double ObjPrice1,datetime ObjTime2=0,double ObjPrice2=0,color ObjColor=Red,int ObjSize=1,int ObjStyle=STYLE_SOLID,datetime ObjTime3=0,double ObjPrice3=0) { if (ObjectFind(ObjName) != -1) ObjectDelete(ObjName); ObjectCreate(ObjName, ObjType, 0,ObjTime1 , ObjPrice1, ObjTime2, ObjPrice2, ObjTime3, ObjPrice3); ObjectSet(ObjName,OBJPROP_COLOR,ObjColor); ObjectSet(ObjName,OBJPROP_STYLE,ObjStyle); ObjectSet(ObjName,OBJPROP_WIDTH,ObjSize); } int init() { //---- indicators IndicatorBuffers(3); SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,Resistance); SetIndexDrawBegin(0,0); SetIndexEmptyValue(0,0); SetIndexShift(0,0); SetIndexLabel(0,"Standart Deviation Support-"); //---- SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(1,StdDev); SetIndexDrawBegin(1,0); SetIndexEmptyValue(1,0); SetIndexShift(1,0); SetIndexLabel(1,"Standart Deviation"); //---- SetIndexStyle(2,DRAW_LINE); SetIndexBuffer(2,Support); SetIndexDrawBegin(2,0); SetIndexEmptyValue(2,0); SetIndexShift(2,0); SetIndexLabel(2,"Standart Deviation Resistance+"); //---- return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counter,counter2; double DevAvg=0; double DevPlus1=0; double DevMinus1=0; double DevPlusStart=0; double DevMinusStart=0; double DevAvgStart=0; double DevPlusEnd=0; double DevMinusEnd=0; double DevAvgEnd=0; double DevPlus2=0; double DevMinus2=0; double DevAvg1=0; double DevAvg2=0; double PriceDiff; double deviance,Max,Min; int DrawBegin = Shift; int DrawEnd; int counted_bars=IndicatorCounted(); DrawEnd=Bars-counted_bars; if ( DrawEnd < DrawBegin + PriceBars) DrawEnd = DrawBegin + PriceBars; if (Bars < (PriceBars * 2 + Shift)) return(0); for (counter=DrawBegin-1;counter<=DrawEnd;counter++) { deviance=iMA(Symbol(),Period(),PriceBars,0,MODE_SMA,PRICE_MEDIAN,counter); Max=High [Highest (NULL,0,MODE_HIGH,PriceBars,counter)]; Min=Low [Lowest (NULL,0,MODE_LOW,PriceBars,counter)]; //DevAvg=MathPow((Max + Min + deviance) / 3,2); DevAvg=(Max + Min + deviance) / 3; for (counter2=(PriceBars + counter);counter2 >=counter;counter2--) { PriceDiff = (Max + Min + Open[counter2]) / 3; deviance+= MathPow((PriceDiff - DevAvg),2); } // Calculate average deviation deviance = deviance / (PriceBars + 1); DevAvg = MathSqrt(deviance/Point) * Point; // Calculate deviation channel starting/current average deviation prices DevAvg1 = (DevPlus1 + DevMinus1 + (Max + Min + Open[PriceBars + counter]) / 3) / 3; // Calculate deviation channel +/- starting points DevPlus1 = (Min+Max + Open[PriceBars + counter]) / 3 + DevAvg; DevMinus1 = (Min+Max + Open[PriceBars + counter]) / 3 - DevAvg; // Calculate deviation channel current +/- points DevPlus2 = (Max + DevAvg1) / 2 + DevAvg; DevMinus2 = (Min + DevAvg1) / 2 - DevAvg; DevAvg2 = (DevPlus2 + DevMinus2 + (Max + Min + DevAvg1) / 3) / 3; Resistance[counter]=DevMinus2; Support[counter]=DevPlus2; StdDev[counter]=DevAvg2; //if (counter == DrawEnd && Symbol() == "EURUSD" ) Print ("DevMinus2=",DevMinus2," DevPlus2=",DevPlus2," DevAvg2=",DevAvg2); if (counter == DrawBegin) { DevPlusEnd=Resistance[counter]; DevMinusEnd=Support[counter]; DevAvgEnd=StdDev[counter]; // if (Symbol() == "EURUSD" ) Print ("DrawBegin=",DrawBegin," DrawEnd=",DrawEnd," DevMinus2=",DevMinus2," DevPlus2=",DevPlus2," DevAvg2=",DevAvg2); } if (counter == DrawBegin + PriceBars) { DevPlusStart=Resistance[counter]; DevMinusStart=Support[counter]; DevAvgStart=StdDev[counter]; } } //---- if (Comments) Comment(Symbol()," DevAvg=",DevAvg," DevAvgStart=",DevAvgStart," DevAvgEnd=",DevAvgEnd," DevPlusStart=",DevPlusStart," DevPlusEnd=",DevPlusEnd," DevMinusStart=",DevMinusStart," DevMinusEnd=",DevMinusEnd); //Draw channel SetObject(Symbol()+"_StdDev+",OBJ_TREND,Time[PriceBars + Shift],DevPlusStart,Time[Shift],DevPlusEnd,Blue,1,STYLE_SOLID); ObjectSetText(Symbol()+"_StdDev+","Standart Deviation Resistance", 8, "Arial", Green); SetObject(Symbol()+"_StdDev-",OBJ_TREND,Time[PriceBars + Shift],DevMinusStart,Time[Shift],DevMinusEnd,Red,1,STYLE_SOLID); ObjectSetText(Symbol()+"_StdDev-","Standart Deviation Support", 8, "Arial", Green); SetObject(Symbol()+"_StdDevAvg",OBJ_TREND,Time[PriceBars + Shift],DevAvgStart,Time[Shift],DevAvgEnd,White,1,STYLE_SOLID); ObjectSetText(Symbol()+"_StdDevAvg","Standart Deviation Average", 8, "Arial", Green); return(0); } //+------------------------------------------------------------------+Ключевым здесь является: если изначально считаем по Close
2Yurixx По поводу неопределенности - при недостаточном количестве степеней свободы в выборке ее сходимость достоверно оценить не представляется возможным и соотвественно Вы можете к расхродящейся выборке применить методы анализа статистики, которые применимы только к сходящимся выборкам. Соотвественно и результат будет неопределенным.
PS Здесь под термином "выборка" имелось ввиду распределение. Т.е более корректно было бы сказать так :"Количество степеней свободы выборки влияет на степень достоверности в определении сходимости распределения, действующего на данной выборке". И соотвестивенно методы, действующие на сходящися распределениях, могут быть применены к расходящимся (или к распеределениям с неустановленным фактом сходимости).
Удачи и попутных трендов.
Vot po4emu ja dal kod svojevo indikatora - ras4ioty idut po vsem parametram:
Smotrite indikator i probuite na grafik :-D
У меня возникло непонимание по поводу расчета коэффициента Херста.
В случае линейной регрессии мы имеем 2 варианта рачета S и R.
А вот это вопрос интересный :)
Допустим, мы имеем канал линейной регрессии, например восходящий, который удовлетворяет критерию сходимости СКО. С одной стороны, раз канал восходящий, то посчитаный КХ на барах входящих в него, будет стремиться к 1.0 (так как смещение на лицо). С другой стороны, если мы будем считать КХ относительно линии регрессии (тем самым удаляя смещение), то КХ будет стремиться к 0.5 , потому что СКО близко к нормальному распределению. Думаю, каждый должен сам проверить это для себя (так гораздо интереснее).
//+------------------------------------------------------------------+ //| Herst-II.mq4 | //| solandr (обработал напильником Rosh) | //| http://www.metaquotes.ru/forum/6839/page11 | //+------------------------------------------------------------------+ #property copyright "solandr (обработал напильником Rosh)" #property link "http://www.metaquotes.ru/forum/6839/page11" #property show_inputs extern int start_bar=500; extern int end_bar=0; //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { double viborka[]; int size_of_array,i; size_of_array=start_bar-end_bar+1; ArrayResize(viborka, size_of_array); for(i=size_of_array-1;i>=0;i--) viborka[i]=Open[i+end_bar]; double S_A=iMAOnArray(viborka,0,size_of_array,0,MODE_SMA,0); Print("Среднее арифметическое выборки = ",DoubleToStr(S_A,8)); double S=iStdDevOnArray(viborka,0,size_of_array,MODE_SMA,0,0); Print("СКО выборки (размах) = ",DoubleToStr(S,8)); double pMax=viborka[ArrayMaximum(viborka)]; double pMin=viborka[ArrayMinimum(viborka)]; double R=pMax-pMin; Print("pMin = ",pMin," pMax = ",pMax, " R = ",R); double Hrst; if( (R>0)&&(S>0)) Hrst = MathLog(R/S)/MathLog(size_of_array*0.5); Print("Хёрст = ",DoubleToStr(Hrst ,8)); return(0); } //+------------------------------------------------------------------+Ну и поиск экстремумов идет по исходным данным , а не по хаям и лоям.
Соотвествено, критерий несколько отличается:
2006.05.28 14:53:08 Herst EURUSD,M15: Хёрст = 0.27582880
2006.05.28 14:53:08 Herst EURUSD,M15: pMin = 1.2691 pMax = 1.2892 R = 0.0201
2006.05.28 14:53:08 Herst EURUSD,M15: СКО выборки (размах) = 0.00438062
2006.05.28 14:53:08 Herst EURUSD,M15: Дисперсия выборки = 0.00001919
2006.05.28 14:53:08 Herst EURUSD,M15: Среднее арифметическое выборки = 1.27924631
2006.05.28 14:53:06 Herst EURUSD,M15: loaded successfully
2006.05.28 14:52:59 Herst-II EURUSD,M15: removed
2006.05.28 14:52:59 Herst-II EURUSD,M15: Хёрст = 0.26196806
2006.05.28 14:52:59 Herst-II EURUSD,M15: pMin = 1.2696 pMax = 1.2882 R = 0.0186
2006.05.28 14:52:59 Herst-II EURUSD,M15: СКО выборки (размах) = 0.00437625
2006.05.28 14:52:59 Herst-II EURUSD,M15: Среднее арифметическое выборки = 1.27924631
2006.05.28 14:52:59 Herst-II EURUSD,M15: loaded successfully
2006.05.28 14:52:54 Compiling 'Herst-II'
Спасибо Вам за исчерпывающий ответ.