엘리엇 파동 이론에 기반한 거래 전략 - 페이지 140

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

정말 소중한 댓글인 것 같아요! 예를 들어 지난 1~2개월 동안의 평균 가격으로 가격 범위를 정규화한 다음 일련의 막대에 대한 범위의 정규화된 값을 계산하는 것이 합리적일 수 있습니다. 이 원칙에 따라 가까운 시일 내에 지표를 개선하려고 노력할 것입니다.

이 제안에 따라 지표를 개선했습니다. 확산. 이전 버전의 표시기를 사용한 경우 새 버전을 시작할 때 다음 날을 기다리지 않도록 값을 강제로 다시 계산해야 합니다(force_recalculation=true).
아래는 첫 번째 버전과 비교하기 위한 지표의 새 버전에 대한 스크린샷입니다.
//+------------------------------------------------------------------+
//|                                     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);
}







 
제가 제대로 설명을 하지 못한 것일 수도 있습니다. 내가 말하는 것은 그래프 매칭(조합 그래프)을 위한 알고리즘을 사용하여 패턴 인식에 사용할 수 있다는 것입니다. 이동 :
http://citeseer.ist.psu.edu/ 및 검색:
그래프 패턴 인식 알고리즘
 
이런 식으로 지적하자(과학적인 방법인지 확실하지 않음). 하지만…
엘리엇 파동 이론은 가격 패턴에 관한 것입니다. 가격은 차트(시간에 따른 가격)-그래프로 표시됩니다.
Elliott Wave Theory는 가격 내에 있는 Impulse, ZigZag, Flats 등의 패턴을 식별합니다. 어떻게-
피보나치 되돌림 . 그런 다음 발견 된 파도가 확률 순서로 표시되지만 이것은 매우 어렵습니다 (결정을 내리는 것은 마녀 움직임이 다음 또는 100 % "확실합니다"입니다. 따라서 차트를 그래프로 간주하고 그에 따라 패턴을 찾으면 해당 문제를 해결하는 것이 좋습니다. 아마도(?) 더 정확할 것이고 결정은 엄격하게 수학적일 것입니다?!
 
아마도(?) 더 정확할 것이고 결정은 엄격하게 수학적일 것입니다?!

그건 그렇고, 아일랜드에서 온 제 친구(그녀는 그곳에서 5년 동안 살았습니다)는 원어민들은 그럴지도 모른다고 말하지는 않지만 아마도 그럴 것이라고 말합니다. 확실한가요?
 
솔직히, 나는 조합 및 그래프 분야에서 일하는 일부 수학자에게 조합 그래프를 사용하여 데이터에서 패턴을 찾는 것이 가능한지 설명하도록 요청했습니다. 다음은 Janet M.Six의 답변입니다.
"헤이 데이브,

조합 그래프를 사용하여 패턴을 찾을 수 있다고 확신합니다.
시장 차트 내. 나는 또한 이 주제에 대한 작업이
이미 함.


자넷 식스"
 
2 데이브 메이슨
조합 그래프라는 용어를 무엇이라고 합니까? Candid 가 쓴 것이라면
조합 그래프는 때때로 선(가장자리라고 함)으로 연결된 점의 네트워크(꼭짓점이라고 함)로 그림으로 나타낼 수 있습니다.

그러면 패턴 인식에 사용할 수 없을 것입니다. 점의 네트워크는 무엇보다도 닫힌 순환을 형성하는 다양한 선으로 연결될 수 있습니다. 가격 차트는 단순한 단일 선인 반면, 각 순간에 대해 하나의 가격 값만 있기 때문입니다. 그래프 이론(조합 그래프)의 관점에서 이러한 선은 가장 원시적인 대상입니다. 나는 그것에 대해 아무것도 할 수 없다고 생각합니다.

또한, 그래프(조합 그래프)는 일정한 공간 구조 를 갖는다. 그리고 가격 차트는 시간이 지남에 따라 끊임없이 변화합니다.

그러나 이것은 모두 IMHO입니다. 이 질문이 중요하다면 조합론 및 그래프 분야의 전문가에게 이에 대해 질문하는 것이 좋습니다. 예를 들어 자넷 식스. 그녀가 "조합 그래프를 사용하여 시장 차트 내에서 패턴을 찾을 수 있음"과 "이 주제에 대한 작업이 완료됨"이 확실하다면 링크를 제공하도록 하십시오.
 
Dave Mason , 화내지 마세요. 하지만 상황은 오래된 SF 이야기를 연상시킵니다. 그곳에서 한 그룹의 연구원들은 반중력 문제가 이미 해결되었다고 확신했고 그 후에 그들은 그것을 정말로 해결했습니다.
나는 그래프 이론에 대한 나의 생각이 다소 피상적이며 이 과학이 주로 찾고 있는 대상의 토폴로지에 관심이 있다는 사실에 구성되어 있다고 말해야 합니다. 패턴 자체의 토폴로지는 너무 단순합니다. 즉, 그래프 이론에 대해 흥미롭지 않을 가능성이 큽니다. 원칙적으로 우리는 표준 패턴을 공식화(인코딩)했으며 차트에서 찾으려고 한다고 상상할 수 있습니다. 그래프의 특정 섹션은 여러 샘플로 식별할 수 있습니다. 또한 샘플 자체가 프리미티브인 경우 서로 연관될 수 있습니다. 따라서 우리는 그래프 이론이 하는 것과 유사한 객체를 얻습니다. 작업은 크지 만 그러한 접근 방식이 무언가를 줄 것인지 여부는 분명하지 않습니다.
 
Yurixx
조합 그래프라는 용어는 무엇을 의미합니까? Candid 가 쓴 것이라면
조합 그래프는 때때로 선(가장자리라고 함)으로 연결된 점의 네트워크(꼭짓점이라고 함)로 그림으로 나타낼 수 있습니다.

제가 쓴게 아니라 링크가 있어요:))
원칙적으로 그렇습니다. 어떤 Janet M. Six가 있고 그녀는 실제로 그래프를 다룬다는 것을 쉽게 알 수 있습니다. 그러나 간단한 진술로는 충분하지 않습니다. 결론의 기초가 된 최소한의 간단한 고려 사항을 얻는 것이 좋습니다. 또는 실제로 특정 링크(해결책이 아닌 경우), 문제의 입구에 대한 잠재적인 "키"에 대한 링크입니다.
 
엘리엇 파동 이론이 무엇인지 정말 모르시는 것 같아요!
FRACTALS에 관한 것입니다.
프랙탈은 조합 그래프의 일부입니다. 따라서 말할 때 더 잘 준비해야 합니다.
"두피"를 하고 싶다면 전에 읽어보세요.

http://www.math.utah.edu/vigre/reu/reports/harris_fall2005.pdf#search=%22%20Ralph%20Nelson%20Elliott%20elliott%20wave%20theory%20%22
 
제가 쓴게 아니라 링크가 있어요:))

글쎄, 나는하지 않습니다! 이제 포기하기에는 너무 늦었습니다! :))