Elliot Dalga Teorisine dayalı ticaret stratejisi - sayfa 140

 
Если мы тестируем систему на достаточно длинной истории возникает проблема нормировки (например, кажется очевидным, что 100 пунктов при курсе 0.8 вовсе не эквивалентны 100 пунктам при курсе 1.36).

Bence bu çok değerli bir yorum! Örneğin, son bir veya iki ayın ortalama fiyatına göre fiyat aralığını normalleştirmek ve ardından bir dizi çubuk için aralığın normalleştirilmiş değerini hesaplamak muhtemelen mantıklıdır. Göstergeyi yakın gelecekte bu prensibe göre iyileştirmeye çalışacağım.

Bu teklife uygun olarak gösterge geliştirildi. Yayılmış. Bir önceki sürümün göstergesini kullandıysanız, yeni sürüme başladığınızda, bir sonraki günü beklememek için değerlerin zorunlu bir yeniden hesaplamasını yapmanız gerekir (force_recalculation=true).
Aşağıda, ilk sürümle karşılaştırma için göstergenin yeni sürümünün ekran görüntüleri bulunmaktadır.
//+------------------------------------------------------------------+
//|                                     AMPLITUDE_STAT_LEVELS_v2.mq4 |
//|                                        Copyright © 2006, Solandr |
//|                                                solandr99@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Solandr"
#property link      "solandr99@mail.ru"
#property indicator_chart_window

//В версии 2 происходит относительный расчёт размахов в соответствии со средней ценой за 25 баров.
//В принципе при достаточном количестве баров истории это эквивалентно отношению среднеарифметического значения размаха
//к среднему значению цены на истории, умноженное затем на текущее среднее значение цены (например по последним 25 барам).
//Но решено оставить всё-таки более сложный алгоритм расчёта (нормировка значений амплитуд), поскольку он наверное будет вполне 
//уместен и в случаях когда баров истории совсем немного. 
// ============================================================================================
//"Купи подешевле, продай подороже" - основа, на которой базируется спекуляция на финансовых рынках. 
//Данный индикатор предлагает своё видение этих уровней "подешевле" и "подороже". Он основан на простом 
//статистическом расчёте размахов (амплитуд High-Low) баров по имеющейся истории котировок.
//Расчёт амплитуд происходит по сериям от 1 до 10 баров. То есть в выбранной серии на истории находитcя разница между 
//максимальным и минимальным значением цены. Далее окно серии смещается на 1 бар и получаем следующий размах амплитуды 
//баров для выбранной серии баров. После усреднения значения полученных размахов мы имеем среднее арифметическое диапазона 
//колебания цены для выбранной серии баров. 
//
//Полученное таким образом значение амплитуды откладывается на графике по следующему принципу. К минимуму текущей серии 
//баров прибавляется значение среднеарифметического размаха, посчитанного на истории. Так мы получаем возможный 
//среднестатистический максимум цены для текущей серии баров. То же самое делаем для нахождения среднестатистического 
//минимума для текущей серии баров. То есть от максимума текущей серии баров отнимаем среднеарифметический размах, 
//посчитанный для данной серии баров по историческим данным. Индикатор производит описанные выше действия для серий 
//от 1 до 10 баров. На уровнях присутствуют надписи, поясняющие для какого текущего временного промежутка построен данный 
//уровень. С параметром TF_needed="AUTO" уровни строятся для серий баров текущего таймфрейма. Если требуется зафиксировать
// уровни какого-то таймфрейма на остальных периодах, то необходимо установить это значение в MN, W1, D1, H4, H1, M30, 
//M15, M5, или в M1. Например для значения TF_needed="D1" на всех периодах будут отображаться уровни для временных 
//промежутков от 1 до 10 дней, обозначаемых соответственно как D1,...,D10.
//
//При настройках по умолчанию индикатор производит перерасчёт среднестатистических амплитуд по истории один раз в день 
//с их внесением в глобальные переменные терминала. Если по какой-то причине (например импортирование дополнительных 
//котировок) требуется произвести перерасчёт среднеарифметических значений амплитуд для серий баров не дожидаясь 
//следующего дня, то необходимо установить force_recalculation=true и будет произведён перерасчёт 
//среднеарифметических значений размахов для серий баров при следующей инициализации индикатора.
//
//Данный индикатор может быть полезен при принятии решений о входе в позицию. Может поспособствовать сохранению депозита
//особенно начинающих трейдеров. Продавайте на красных уровнях и покупайте на зелёных и за Вас будет играть математика! ;o))) 
//Если Вы например купили на зелёных уровнях и курс пошёл резко против Вас, то убыточную позицию есть смысл удерживать лишь 
//до тех пор пока красные уровни не окажутся ниже Вашей открытой позиции. И когда цена окажется на этих красных уровнях - 
//закройте убыточную позицию с минимальным убытком, а во многих случаях и с маленьким плюсом. Желаю успехов!:o)
// ============================================================================================
extern string TF_needed="AUTO";
extern bool force_recalculation=false;//принудительный перерасчёт

double average_price;
bool recalculation_needed=false;
bool aver_pr_recalc_needed=true;
int last_aver_pr_recalc_bars;
double delta[11];
string work_symbol;
int TF;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   int i,k,all_bars,counter_counted_bars;
   string b_str,global_name;
   double average_price_array[10];
 
   work_symbol=Symbol();
   
   //Выбор требуемого тайфрейма для расчёта;
   if(TF_needed=="AUTO" || (TF_needed!="MN" && TF_needed!="W1" && TF_needed!="D1" && TF_needed!="H4" && TF_needed!="H1" && TF_needed!="M30" && TF_needed!="M15" && TF_needed!="M5" && TF_needed!="M1")) TF=Period();
   if(TF_needed=="MN") TF=43200;
   if(TF_needed=="W1") TF=10080;
   if(TF_needed=="D1") TF=1440;
   if(TF_needed=="H4") TF=240;
   if(TF_needed=="H1") TF=60;  
   if(TF_needed=="M30") TF=30;  
   if(TF_needed=="M15") TF=15;  
   if(TF_needed=="M5") TF=5;  
   if(TF_needed=="M1") TF=1;  
      
   //Проверяем наличие посчитанных данных амплитуд для данного TF, а также производим проверку дня, в который был произведен расчёт этих данных
   global_name=work_symbol+"_"+TF+"_counted_day";
   if(GlobalVariableCheck(global_name) && !force_recalculation) 
   {  
      if(MathAbs(GlobalVariableGet(global_name)-DayOfYear())>0) recalculation_needed=true;
   }
   else recalculation_needed=true;
         
   if(recalculation_needed)
   {//Производим расчёт средней амплитуды бара (серии баров) по таймфрейму TF на символе work_symbol
      all_bars=iBars(work_symbol,TF);
      ArrayResize(average_price_array,all_bars);
   
      //Рассчитываем массив средних цен для каждого расчётного момента времени на основе 25 баров
      for(k=all_bars-1;k>=0;k--) 
      {      
            average_price_array[k]=0;
            counter_counted_bars=0;
            for(i=k;i<=k+24;i++)//вычисляем среднюю цену на 25 барах
            {
               if(i<all_bars) 
               {
                  average_price_array[k]=average_price_array[k]+(iOpen(work_symbol,TF,i)+iHigh(work_symbol,TF,i)+iLow(work_symbol,TF,i)+iClose(work_symbol,TF,i))/4;
                  counter_counted_bars++;
               }
            }
            if(counter_counted_bars>0) average_price_array[k]=average_price_array[k]/counter_counted_bars;
      }
   
      for(i=1;i<=10;i++) delta[i]=0;
   
      for(i=1;i<=10;i++)
      {      
         for(k=all_bars-i;k>=0;k--) 
         {  
            if(average_price_array[k]>0) delta[i]=delta[i]+(iHigh(work_symbol,TF,Highest(Symbol(),TF,MODE_HIGH,i,k))-iLow(work_symbol,TF,Lowest(Symbol(),TF,MODE_LOW,i,k)))/average_price_array[k];
            else Print("average_price_array[",k,"]<=0 при i=",i," и k=",k);
         }
         delta[i]=NormalizeDouble(delta[i]/(all_bars-i+1),Digits);   
         global_name=work_symbol+"_"+TF+"_"+i;
         GlobalVariableSet(global_name,delta[i]); 
         //Print("delta",i,"=",delta[i]);
      } 
      global_name=work_symbol+"_"+TF+"_counted_day";
      GlobalVariableSet(global_name,DayOfYear()); 
      recalculation_needed=false;
   }//if(recalculation_needed)
   else
   {//Если данные имеются в глобальных переменных терминала, то берём имеющиеся расчётные данные амплитуд из глобальных переменных терминала
      for(i=1;i<=10;i++)
      {
         global_name=work_symbol+"_"+TF+"_"+i;
         delta[i]=GlobalVariableGet(global_name);
         //Print("Глобал ",i," ",delta[i]);
      }
   }
}   
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
{
//----
   int i;
   string b_str;
   for(i=1;i<=10;i++)
   {
      b_str="up_line"+i;
      ObjectDelete(b_str);
      b_str="down_line"+i;
      ObjectDelete(b_str);
      b_str="up_line_txt"+i;
      ObjectDelete(b_str);      
      b_str="down_line_txt"+i;
      ObjectDelete(b_str);       
   }
}   

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int i;
   string line_name;
  
   /*
   for(i=iBars(work_symbol,TF)-1;i>=0;i--) average_price=average_price+(iOpen(work_symbol,TF,i)+iHigh(work_symbol,TF,i)+iLow(work_symbol,TF,i)+iClose(work_symbol,TF,i))/4;
   average_price=average_price/iBars(work_symbol,TF);
   Print("Средняя цена по всей выборке=",NormalizeDouble(average_price,Digits));
   average_price=0;
   */
   
   if(iBars(work_symbol,TF)!=last_aver_pr_recalc_bars) aver_pr_recalc_needed=true;
   
   if(aver_pr_recalc_needed)
   {  
      average_price=0;
      for(i=0;i<=24;i++) average_price=average_price+(iOpen(work_symbol,TF,i)+iHigh(work_symbol,TF,i)+iLow(work_symbol,TF,i)+iClose(work_symbol,TF,i))/4;
      average_price=average_price/25;
      aver_pr_recalc_needed=false;
      last_aver_pr_recalc_bars=iBars(work_symbol,TF);
   }
   //Print("average_price=",NormalizeDouble(average_price,Digits));
   
   for(i=1;i<=10;i++)
   {  
      if(TF==43200) line_name="MN"+i;   
      if(TF==10080) line_name="W"+i;
      if(TF==1440) line_name="D"+i;
      if(TF==240) line_name="H"+4*i;
      if(TF==60) line_name="H"+i;
      if(TF==30) line_name="M"+30*i;
      if(TF==15) line_name="M"+15*i;
      if(TF==5) line_name="M"+5*i;
      if(TF==1) line_name="M"+i;
            
      up_line(i,iLow(NULL,TF,Lowest(work_symbol,TF,MODE_LOW,i,0))+delta[i]*average_price,line_name);
      down_line(i,iHigh(NULL,TF,Highest(work_symbol,TF,MODE_HIGH,i,0))-delta[i]*average_price,line_name);
   }

   return(0);
  }
//+------------------------------------------------------------------+
int up_line(int q_days, double level, string ln)
{
   string b_str="up_line"+q_days;

   if(ObjectFind(b_str) == -1) 
   {
     ObjectCreate(b_str, OBJ_TREND, 0, Time[1], level, Time[1]+2700000,level);
     ObjectSet(b_str, OBJPROP_STYLE, STYLE_DOT);
     ObjectSet(b_str, OBJPROP_COLOR, Brown);
     ObjectSet(b_str, OBJPROP_RAY, true);
     ObjectSet(b_str, OBJPROP_WIDTH, 1);
     ObjectMove(b_str, 0, Time[1],  level);
   }
   else 
   {
      if(MathAbs(level-ObjectGet(b_str, OBJPROP_PRICE1))>0.9*Point) ObjectDelete(b_str);
   }
   
   b_str="up_line_txt"+q_days;
   string b_txt=ln;
   datetime t_bar;
   if(ObjectFind(b_str) == -1) 
   {
     ObjectCreate(b_str, OBJ_TEXT, 0, Time[0], 0);
     ObjectSetText(b_str, b_txt, 8, "Arial", Brown);
     ObjectMove(b_str, 0, Time[0]+2*q_days*Period()*60,  level);
   }
   else 
   {
     ObjectMove(b_str, 0, Time[0]+2*q_days*Period()*60,  level);
   }      
   
   return(0);
}

int down_line(int q_days, double level, string ln)
{
   string b_str="down_line"+q_days;
   
   if(ObjectFind(b_str) == -1) 
   {
     ObjectCreate(b_str, OBJ_TREND, 0, Time[1], level, Time[1]+2700000,level);
     ObjectSet(b_str, OBJPROP_STYLE, STYLE_DOT);
     ObjectSet(b_str, OBJPROP_COLOR, DarkGreen);
     ObjectSet(b_str, OBJPROP_RAY, true);
     ObjectSet(b_str, OBJPROP_WIDTH, 1);
     ObjectMove(b_str, 0, Time[1],  level);
   }
   else 
   {
      if(MathAbs(level-ObjectGet(b_str, OBJPROP_PRICE1))>0.9*Point) ObjectDelete(b_str);
   }
   
   b_str="down_line_txt"+q_days;
   string b_txt=ln;
   if(ObjectFind(b_str) == -1) 
   {
     ObjectCreate(b_str, OBJ_TEXT, 0, Time[0], 0);
     ObjectSetText(b_str, b_txt, 8, "Arial", DarkGreen);
     ObjectMove(b_str, 0, Time[0]+2*q_days*Period()*60,  level);
   }
   else 
   {
     ObjectMove(b_str, 0, Time[0]+2*q_days*Period()*60,  level);
   }      
   
   return(0);
}







 
Belki doğru anlatmıyorum. Benim söylediğim, grafik eşleştirme (kombinatoryal grafikler) için algoritmaların kullanılması, örüntü tanıma için kullanılabilir. Git:
http://citeseer.ist.psu.edu/ ve şunu arayın:
Grafik deseni tanıma algoritması
 
Şöyle yapalım (bilimsel olduğundan emin değilim) ama…
Elliott Dalga Teorisi, fiyattaki kalıplarla ilgilidir. Fiyat, grafik (zamandaki fiyat)-grafik olarak temsil edilmektedir.
Elliott Dalga Teorisi, fiyat dahilindeki kalıpları-Impulse, ZigZag, Flats… tanımlar. Nasıl-
Fibonacci düzeltmesi . Daha sonra bulunan dalgalar olasılık sırasına göre çizilir, ancak bunu yapmak çok zordur (karar vermek cadı hareketi sonraki veya %100 “EMİN”dir. Bu yüzden önerdiğim şey, grafiği grafik olarak kabul edersek bu sorunu çözmek daha iyidir ve buna göre bulunan desenler bulunur). Belki (?) daha doğru olacak ve karar kesinlikle matematiksel mi olacak?!
 
Belki (?) daha doğru olacak ve karar kesinlikle matematiksel mi olacak?!

Bu arada, İrlanda'dan arkadaşım (beş yıldır orada yaşıyor) anadili İngilizce olan kişiler olabilir demiyor ama muhtemelen diyor. emin mi?
 
Samimi, kombinatorik ve grafikler alanında çalışan bazı matematikçilerden, verilerdeki kalıpları bulmak için kombinatoryal grafikleri kullanmanın mümkün olup olmadığını açıklamalarını istedim. İşte Janet M.Six'in cevabı:
"Merhaba Dave,

Kalıpları bulmak için kombinatoryal grafiklerin kullanılabileceğine eminim.
piyasa çizelgeleri içinde. Bu konuyla ilgili çalışmaların da olduğunu tahmin ediyorum.
yapıldı.


Janet Altı"
 
2 Dave Mason
Kombinatoryal grafikler terimine ne diyorsunuz? Candid ne yazmışsa
Kombinatoryal grafikler bazen, çizgilerle (kenarlar olarak adlandırılır) birbirine bağlanan nokta ağları (köşeler olarak adlandırılır) olarak resimsel olarak temsil edilebilir.

o zaman onu örüntü tanıma için kullanmanız pek olası değildir. Bir noktalar ağı, diğer şeylerin yanı sıra kapalı döngüler oluşturacak çeşitli çizgilerle bağlanabilir. Oysa fiyat grafiği basit bir tek satırdır, çünkü zaman içinde her an için yalnızca bir fiyat değeri vardır. Graf teorisi (kombinatoryal grafikler) açısından, böyle bir çizgi en ilkel nesnedir. Bu konuda bir şey yapılabileceğini sanmıyorum.

Ayrıca grafiğin (kombinatoryal grafikler) sabit bir uzamsal yapısı vardır. Ve fiyat tablosu zaman içinde sürekli değişiyor.

Ancak, bunların hepsi IMHO. Bu soru sizin için önemliyse, kombinatorik ve grafikler alanındaki uzmanlara bu konuda soru sormak daha iyidir. Örneğin, Janet Six. Eğer "kombinatoryal grafiklerin piyasa grafiklerindeki kalıpları bulmak için kullanılabileceğinden" ve "bu konuyla ilgili çalışma yapıldığından" eminse, o zaman bir bağlantı vermesine izin verin.
 
Dave Mason , kusura bakmayın ama durum biraz eski bir bilimkurgu hikayesini andırıyor: Orada bir grup araştırmacı anti-yerçekimi sorununun çoktan çözüldüğüne ikna oldu ve ondan sonra gerçekten çözdüler :).
Graf teorisi hakkındaki fikirlerimin oldukça yüzeysel olduğunu ve bu bilimin esas olarak aranan nesnelerin topolojisiyle ilgilenmesi gerçeğinden oluştuğunu söylemeliyim. Modelin topolojisi çok basittir, yani graf teorisi için büyük olasılıkla ilgi çekici değildir. Prensip olarak, standart kalıpları resmileştirdiğimizi (kodladığımızı) ve bunları grafikte aramaya çalıştığımızı hayal edebiliriz. Grafiğin belirli bölümleri birkaç örnekle tanımlanabilir. Ayrıca, örneklerin kendileri, eğer bazı ilkel iseler, birbirleriyle ilişkilendirilebilirler. Böylece, belki de grafik teorisinin yaptığına benzer bir nesne elde ederiz. İş büyük ama böyle bir yaklaşımın bir şey kazandırıp kazandırmayacağı belli değil.
 
Yurixx
Kombinatoryal grafikler terimine ne diyorsunuz? Candid ne yazmışsa
Kombinatoryal grafikler bazen, çizgilerle (kenarlar olarak adlandırılır) birbirine bağlanan nokta ağları (köşeler olarak adlandırılır) olarak resimsel olarak temsil edilebilir.

Ben yazmadım orda link var :))
Prensipte, evet, Janet M. Six adında birinin olduğunu ve onun gerçekten grafiklerle uğraştığını saptamak kolaydır. Ancak basit ifadeler yeterli değildir. Sonuçların temeli haline gelen en azından kısa değerlendirmeler almak güzel olurdu. Ya da gerçekten, bir çözüme olmasa da, soruna girişin potansiyel bir "anahtarına" özel bir bağlantı.
 
Elliott Dalga Teorisi'nin ne hakkında olduğunu gerçekten bilmediğinizi düşünüyorum!
FRAKTALLER ile ilgilidir.
Fraktallar, kombinatoryal grafiklerin bir parçasıdır. O yüzden konuşurken daha hazırlıklı olsan iyi olur.
Eğer "kafa derisi almak" istiyorsanız daha önce bir şeyler okuyun.

http://www.math.utah.edu/vigre/reu/reports/harris_fall2005.pdf#search=%22%20Ralph%20Nelson%20Elliott%20elliott%20wave%20theory%20%22
 
Ben yazmadım orda link var :))

Ben istemiyorum! Artık vazgeçmek için çok geç! :))