торговая стратегия на базе Волновой теории Эллиота - страница 28

 
И еще, по поводу вычислений. Думал недавно о необходимости задействовать функцию плотности нормального распределения, но пока , правда, так и не приступил. И тоже думал как это сделать, то ли через хитрую функцию, то ли табличным методом, больше склонялся к тому, чтобы в Экселе заполнить таблицу с шагом одну тысячную(или одну десятитысячную), сохранить в виде txt файла, содержащего mq4-код заполнения большого массива. Только думал, что это не совсем красиво, теперь благодаря Владиславу знаю, что это еще и экономит ресурсы процессора.
В общем, много полезного узнал. :)
 

Одной из Ваших аксиом является наличие истинной (т.е. единственной) траектории, которая и определяется в результате процесса оптимизации. Каким образом единственная траектория может привести к нескольким каналам ?


Сорри опять за поздние ответы. При аппроксимации траектории Вы никогда не сможете знать насколько одна аппроксимация лучше другой описывает саму траекторию, если они в одном доверительном интервале. И соотвественно все аппроксимации, попадающие в границы доверительного интервала могут считаться равнозначными. В принципе так и есть. Для построения прогноза из множества возможных (обычно не одна аппроксимация удовлетворяет критериям отбора, потому, что задаются границы погрешностей) лучше выбрать так сказать "самую" оптимальную. По мере изучения алгоритма я понял еще одну особенность - хоть аппроксимации и разные, но прогнозы, в подавляющем большинстве случаев, одинаковы. Еще раз напомню сама траектория не нужна и я ее не ищу. По поводу каналов - неединственность каналов связана со "степенью детализации" (назовем так) исследуемых структур. Так при наличии трендов можно определить зоны откатов и оценить вероятности окончания трендов, пробоя разворотных зон и т.д. Или просто выделить зоны неопределенностей, когда на рынок лучше не выводить позиций. Еще нужно всегда помнить об ограничениях на размеры выборок, иначе результат будет обладать слишком высокой долей неопределенности.

Удачи и попутных трендов.
 
Уважаемый Vladislav!

У меня возникло непонимание по поводу расчета коэффициента Херста.
В случае линейной регрессии мы имеем 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, этот момент я как-то не учел. А ведь это действительно так. Это значит, что на самом деле получается не несколько каналов, а целый диапазон, ограниченный линиями с максимальным и минимальным углом.
Еще нужно всегда помнить об ограничениях на размеры выборок, иначе результат будет обладать слишком высокой долей неопределенности

Не совсем понимаю о какой неопределенности Вы говорите. Однако, мне понятно другое. Выборка должна определять канал регрессии, а канал регрессии - это трендовый канал. Если свалить в выборку и тренд, и флэт, то такая выборка вряд ли позволит получить хоть что-нибудь полезное. Поэтому возникает проблема разделения рынка на фазы и, что более важно, идентификации тренда и флэта на ранних этапах, то есть в реале. По-моему задача весьма нетривиальная.
 
Privet,
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);
  }
//+------------------------------------------------------------------+
 
2 ANG3110 вообще-то на этот вопрос я уже отвечал выше по ветке. Отвечу еще раз - последний -- мне ведь тоже лень ;). Расчет стандартного отклонения нужно вести относительно аппроксимации и реально полученных цен. Если Вы аппроксимируете цены закрытия мувингом, то тогда это должна быть разница между Клозе и значением мувинга на каждом баре. И можно использовать стандартный алгоритм - iStdDev( ). Если каналом линейной регрессии, то тогда между значением линии регрессии и клозе. Если чем-либо другим, то разницу и нужно брать между значением аппроксимирующей функции и реально полученным значением. Если Вы аппроксимируете что-либо другое, например прибыльность по сделкам, то и выбирать нужно другие переменные. У меня в расчетах iStdDev( ) не используется.

что несовсем корректно, чуть корректней было бы использовать MODE_CLOSE, если изначально считаем по Close.

Ключевым здесь является: если изначально считаем по Close

2Yurixx По поводу неопределенности - при недостаточном количестве степеней свободы в выборке ее сходимость достоверно оценить не представляется возможным и соотвественно Вы можете к расхродящейся выборке применить методы анализа статистики, которые применимы только к сходящимся выборкам. Соотвественно и результат будет неопределенным.

PS Здесь под термином "выборка" имелось ввиду распределение. Т.е более корректно было бы сказать так :"Количество степеней свободы выборки влияет на степень достоверности в определении сходимости распределения, действующего на данной выборке". И соотвестивенно методы, действующие на сходящися распределениях, могут быть применены к расходящимся (или к распеределениям с неустановленным фактом сходимости).

Удачи и попутных трендов.
 
Privet,

Vot po4emu ja dal kod svojevo indikatora - ras4ioty idut po vsem parametram:

   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=(Max + Min + deviance) / 3;  



Smotrite indikator i probuite na grafik :-D

 
Уважаемый Vladislav!

У меня возникло непонимание по поводу расчета коэффициента Херста.
В случае линейной регрессии мы имеем 2 варианта рачета S и R.


А вот это вопрос интересный :)
Допустим, мы имеем канал линейной регрессии, например восходящий, который удовлетворяет критерию сходимости СКО. С одной стороны, раз канал восходящий, то посчитаный КХ на барах входящих в него, будет стремиться к 1.0 (так как смещение на лицо). С другой стороны, если мы будем считать КХ относительно линии регрессии (тем самым удаляя смещение), то КХ будет стремиться к 0.5 , потому что СКО близко к нормальному распределению. Думаю, каждый должен сам проверить это для себя (так гораздо интереснее).
 
Не удержался, и переделал скрипт solandr'а. В том числе и вычмсление СКО более правильно делать используя встроенный iStdDevOnArray, так как деление на (число степеней-1) оправдано долько для выборок до 30 эелментов.
//+------------------------------------------------------------------+
//|                                                     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: removed
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'

 
Уважаемый Vladislav!
Спасибо Вам за исчерпывающий ответ.