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

 
Пожалуй нужно уточнить. Хотя diam0nd высказался не совсем комплиментарно, мне всё равно приятно его здесь видеть в качестве нового лица :)

Dlia angloyazi4nih uzverey esty angloyazi4niy forum. Vot ya sobsno i predlogil emu tam i pisaty, tk zdesy on tolko sprasivaet, emu osobo ne otve4aiut a on vse prodolgaet raspaliatsia. Taki ya i predlogil poyti na English forum :)
 
Просто для разрядки:
... our eyes are the culmination of millennia of evolutionary pressure designed to detect patterns (food, lions) before the patterns detect us. (Marchette D.J. Random graphs for statistical pattern recognition (Wiley 2004))
:)
 
2 Alex Niroba
Изначально, открывая эту ветку я пыталься найти единомышлеников, т.е.
тех кто хорошо знаком с Волновой Теорией Эллиота.
Задумка была такова: на базе ZigZaga написать эффективный индикатор, который будет
распозновать волны и дорисовывать будущее поведение цен на графике.

Alex, если бы вы с самого начала сказали это, то могло бы состояться интересное обсуждение объявленной вами темы. Но поскольку вы не захотели конкретизировать постановку вопроса, то народ и перешел к обсуждению стратегии Владислава, который сформулировал ее более, чем конкретно.

Однако, ничего не мешает (при желании) сделать это сейчас. Я думаю, что вам может быть интересно узнать, в дополнение к мнению Rosh'а, что думают по этому поводу другие люди.

В свое время я тоже начинал с ZigZaga (наверное через это проходят все :). Написал даже свой, поскольку стандартный меня не устраивал. В результате кое-что понял не только о ZigZagе, но и относительно теории Элиотта. Именно поэтому я не являюсь ее поклонником.

Я не считаю, что "хорошо знаком с Волновой Теорией Эллиота". Однако, некоторое понимание, которое возникло в процессе работы, заставляет меня искать более глубокие решения. Пожалуй главным моим мотивом является то, что подход Элиотта может дать только качественное решение. А этого для торговли (как ручной, так и авто) недостаточно. Именно поэтому элиоттчики и не могут пойти дальше проблемы распознавания где 3-я волна, а где 5-я.

Впрочем, в обсуждении темы, если оно возникнет, поучаствую с интересом.
Успехов.
 
2 Dave Mason
I do not have solution but we have a start.
I asked Mrs. Six to explain what she means” I would also guess that work on this topic has been done.” So if she would be kind to explain for “free” I will share information.


Если это вам будет интересно, могу сообщить следующее.
В свое время, когда я разбирался с ZigZag'ом, я написал весьма простой советник, который умел распознавать всего один паттерн и на этой основе торговал. Конфигурацию паттерна задал я сам, основываясь на своем собственном визуальном анализе поведения ZigZag'а.

Тест этого советника на истории (6 месяцев) показал доход 26% за период. Тестирование я проводил на собственном скрипт-тестере, а не на встроенном в МТ4. Этот результат, а также понимание целого ряда обстоятельств, меня не устроил. Поэтому я и оставил этот подход.

Одно из обстоятельств, которое касается вас, привожу здесь:
Алгоритм ВЫДЕЛЕНИЯ паттернов плохо определен. Критерии этого выделения вообще не определены.
В результате у меня был только один способ - сначала придумать паттерн, а потом проверять тестированием насколько его можно использовать. Такой подход мне не нравится, слишком много произвола.

Если вам удастся применить теорию графов для выделения паттернов, то это будет радикальное решение вопроса. Однако, IMHO, это надо делать отдельно от советника. А советник должен работать уже с определенными и параметризованными паттернами. Если это удастся, то теория Элиотта вам вообще не будет нужна.
 
2 Yurixx
For me (this is my opinion) Elliott Wave Theory (EWT) is about theory of graphs, or even further price movement in forex, could be explained through theory of graphs, strictly mathematical. Unfortunately EWT for me (I am not mathematician) and I think for any mathematician is not really math theory. That is why no one could be sure which wave after which is at any moment.
It is not really math theory just guessing.
Well Theory of Graphs is something beyond my possibilities.
However I received answer from Mrs. Six:
“Hi Dave,

No, this is not fantasy.

I am sure that researchers or businesses have
Published research papers or white papers that you will find
Interesting. If you don't find it with your first search on google,
keep trying.

Go for it!


Regards,
Janet Six, Ph.D.


Dave Mason wrote:

> Thank you for your prompt request.
> Can you tell me what you mean” work on this topic has
> been done"? Please, specify since my colleagues in forex forum think
> that this is "fantasy".
> Regards,
> Dave

Well she says this is not “fantasy”.
But even if someone find something in google or …this does not solve the problem.
This is serious work for math professionals.
What I have done is ask one of the best professional of Graph Theory who is a professor to help in some way. He said that will answer me in a few weeks time.
 
What I have done is ask one of the best professional of Graph Theory who is a professor to help in some way. He said that will answer me in a few weeks time.

Сомневаюсь, что он скажет намного больше, чем Janet Six, Ph.D. :-)
Но это только мое мнение. Посмотрим.

For me (this is my opinion) Elliott Wave Theory (EWT) is about theory of graphs, or even further price movement in forex, could be explained through theory of graphs, strictly mathematical.

Не думаю, что это так. Если бы это было действительно так, то движение цены на форексе уже давно бы предсказывалось "строго математически". Однако, общепринятым мнением является как раз обратная точка зрения: никакая математика не может дать точного предсказания движения цены.

Unfortunately EWT for me (I am not mathematician) and I think for any mathematician is not really math theory. That is why no one could be sure which wave after which is at any moment.
It is not really math theory just guessing.

Вот с этим я абсолютно согласен. И, думаю, именно поэтому Мандельброт (чистый математик) не счел нужным упоминать Элиотта в своей статье. Кстати, об этой статье: написана на уровне старших классов школы, никакой практической пользы не имеет. Зачем вообще было ее писать ?

ИМХО по поводу теории Элиотта. Волновой паттерн 5-3 встречается на рынке достаточно часто, чтобы это можно было зафиксировать визуально. Этого, очевидно, было достаточно, чтобы Элиотт попытался найти этому объяснение. То, что он предложил, к сожалению, является чисто качественным и, к тому же, "психологическим" объяснением. Поэтому пользы от него мало, хотя впечатление такое, как будто мы знаем, что происходит на рынке. Увы, это только впечатление.

С таким же успехом можно дать еще пачку подобных объяснений. Предлагаю, например, свое, простое до примитивности и совершенно очевидное.
Ломаная ЗигЗага, соединяющая Min и Max (или наоборот), всегда имеет НЕЧЕТНОЕ число сегментов.
То есть, Min-Max - 1 сегмент (но 2 вершины),
Min-Max-Min-Max - 3 сегмента (но 4 вершины),
Min-Max-Min-Max-Min-Max - 5 сегментов (но 6 вершин), и т.д.
При uptrend'e количество ступеней ЗигЗага вверх будет, очевидно, превышать количество ступеней вниз.
В одном из простейших случаев получаем соотношение 5-3. При downtrend'e наоборот - 3-5.
А соотношение 3-3 или 5-5 это, как можно догадаться flat.

Тот кто смотрел на график цены глазами знает, что на рынке встречаются разные паттерны, 5-3 только один из них. Более того, никто не осмелится сказать, что какой-нибудь из паттернов невозможен в принципе. Однако вариант 3-1 является для uptrend'а минимальным, а варианты 21-1 или, к примеру, 21-19 - очень и очень маловероятны. Так вот 5-3 - это всего лишь неиболее вероятный паттерн. И пытаться "натянуть" рынок на 5-3 и 3-5 могут только те, кто уж совсем не понимает его стохастической и даже хаотической природы.

Поэтому прежде, чем пытаться распознать где 3-я волна, а где 5-я, следовало бы посчитать (хотя бы экспериментально, на истории) распределение частот появления различных паттернов. А не сделано это потому, что сложно это: распределение получится двумерным, алгоритм разбиения ЗигЗага цены на отдельные up и down участки неоднозначен. И, более того, даже ЗигЗаг можно строить несколькими, существенно отличающимися друг от друга способами.

О какой "теории" можно говорить в такой ситуации ? Волны Элиотта есть, не спорю. А теории, увы, нет.

Пусть кто-нибудь попытается обоснованно мне возразить.
 
Define more accurately.
I said explained not predicted.
 
Define more accurately.
I said explained not predicted.


Да, конечно. Проблема только в том, насколько "more accurately". Если эта точность может быть измерена, то есть о чем говорить. Если же нет, то мы опять остаемся на уровне "качественных" обсуждений.

И, по-моему, задача заключается в том, чтобы именно предсказывать. Причем желательно с известной степенью достоверности, которую можно определять априори. А объяснить можно что угодно. EWT объясняет рынок очень даже красиво. Вот только объяснения эти никакого приоритета элиоттчикам пока не дают.
 
Немного подправил индикатор.

В версии 3 поправлена ошибка неверного отображения линий на младших таймфреймах валютных пар, с участием японской йены.
Введена центральная линия, обозначаемая жёлтым цветом. Она является средним арифметическим значением красных и зелёных уровней. По поводу её использования имеется предположение, что при прохождении этой линии можно добавляться к уже прибыльной позиции, открытой на красных или зелёных уровнях. Хотя с течением времени возможно появление также и других трактовок её использования.

//+------------------------------------------------------------------+
//|                                     AMPLITUDE_STAT_LEVELS_v3.mq4 |
//|                                        Copyright © 2006, Solandr |
//|                                                solandr99@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Solandr"
#property link      "solandr99@mail.ru"
#property indicator_chart_window

//В версии 3 поправлена ошибка неверного отображения линий на младших таймфреймах валютных пар, с участием японской йены.
//Введена центральная линия, обозначаемая жёлтым цветом. Она является средним арифметическим значением красных и зелёных 
//уровней. По поводу её использования имеется предположение, что при прохождении этой линии можно добавляться к уже 
//прибыльной позиции, открытой на красных или зелёных уровнях. Хотя с течением времени возможно появление также и других 
//трактовок её использования.
//
//В версии 2 происходит относительный расчёт размахов в соответствии со средней ценой за 25 баров.
//В принципе при достаточном количестве баров истории это эквивалентно отношению среднеарифметического значения размаха
//к среднему значению цены на истории, умноженное затем на текущее среднее значение цены (например по последним 25 барам).
//Но решено оставить всё-таки более сложный алгоритм расчёта (нормировка каждого из значений амплитуд по текущей средней 
//цене), поскольку он наверное будет вполне уместен и в случаях когда баров истории совсем немного. 
//
//Версия 1. Первоначальный вариант индикатора.
//
// ============================================================================================
//"Купи подешевле, продай подороже" - основа, на которой базируется спекуляция на финансовых рынках. 
//Данный индикатор предлагает своё видение этих уровней "подешевле" и "подороже". Он основан на простом 
//статистическом расчёте размахов (амплитуд High-Low) баров по имеющейся истории котировок.
//Расчёт амплитуд происходит по сериям от 1 до 10 баров. То есть в выбранной серии на истории находитcя разница между 
//максимальным и минимальным значением цены. Далее окно серии смещается на 1 бар и получаем следующий размах амплитуды 
//баров для выбранной серии баров. После усреднения значения полученных размахов с учётом нормировки по среднему значению 
//цены на 25 барах мы имеем среднее арифметическое диапазона колебания цены для выбранной серии баров (а точнее его 
//нормированное значение). Это значение помещается в глобальные переменные терминала.
//
//Далее при расчёте текущих уровней из глобальных переменных терминала извлекается требуемое нормированное значение 
//диапазона колебаний и умножается на среднюю цену, вычисленную по последним 25 барам. Полученное таким образом значение 
//амплитуды откладывается на графике по следующему принципу. К минимуму текущей серии 
//баров прибавляется это вычисленное значение. Так мы получаем возможный среднестатистический максимум цены для текущей 
//серии баров. То же самое делаем для нахождения среднестатистического минимума для текущей серии баров. То есть от 
//максимума текущей серии баров отнимаем полученное значение амплитуды, посчитанное для данной серии баров по историческим 
//данным. Индикатор производит описанные выше действия для серий от 1 до 10 баров. На уровнях присутствуют надписи, 
//поясняющие для какого текущего временного промежутка построен данный уровень. С параметром TF_needed="AUTO" уровни 
//строятся для серий баров текущего таймфрейма. Если требуется зафиксировать уровни какого-то таймфрейма на остальных 
//периодах, то необходимо установить это значение в MN, W1, D1, H4, H1, M30, M15, M5, или в M1. Например для значения 
//TF_needed="D1" на всех периодах будут отображаться уровни для временных промежутков от 1 до 10 дней, обозначаемых 
//соответственно как D1,...,D10.
//
//При настройках по умолчанию индикатор производит перерасчёт среднестатистических амплитуд по истории один раз в день 
//с их внесением в глобальные переменные терминала. Если по какой-то причине (например импортирование дополнительных 
//котировок) требуется произвести перерасчёт среднеарифметических значений амплитуд для серий баров не дожидаясь 
//следующего дня, то необходимо установить force_recalculation=true и будет произведён перерасчёт среднеарифметических 
//значений размахов для серий баров при следующей инициализации индикатора. После проведения принудительного пересчёта 
//значение force_recalculation нужно вернуть в значение false для исключения постоянного пересчёта данных!
//
//Данный индикатор может быть полезен при принятии решений о входе в позицию. Может поспособствовать сохранению депозита
//особенно начинающих трейдеров. Продавайте на красных уровнях и покупайте на зелёных и за Вас будет играть математика! ;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]=delta[i]/(all_bars-i+1);   
         global_name=work_symbol+"_"+TF+"_"+i;
         GlobalVariableSet(global_name,delta[i]); 
         //Print("delta",i,"=",DoubleToStr(delta[i],8));
      } 
      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);       
   }
   
   b_str="centr_line";
   ObjectDelete(b_str); 
   
}   

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int i;
   string line_name;
   double buffer,c_line=0;
  
   /*
   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;
      
      buffer=iLow(NULL,TF,Lowest(work_symbol,TF,MODE_LOW,i,0))+delta[i]*average_price;      
      up_line(i,buffer,line_name);
      c_line=c_line+buffer;
      buffer=iHigh(NULL,TF,Highest(work_symbol,TF,MODE_HIGH,i,0))-delta[i]*average_price;
      down_line(i,buffer,line_name);
      c_line=c_line+buffer;      
   }
   
   c_line=c_line/20.0;
   centr_line(c_line);
   
   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);
}

int centr_line(double level)
{
   string b_str="centr_line";
   
   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, Yellow);
     ObjectSet(b_str, OBJPROP_RAY, true);
     ObjectSet(b_str, OBJPROP_WIDTH, 1);
     ObjectSet(b_str, OBJPROP_BACK, false);
     ObjectMove(b_str, 0, Time[1],  level);
   }
   else 
   {
      if(MathAbs(level-ObjectGet(b_str, OBJPROP_PRICE1))>0.9*Point) ObjectDelete(b_str);
   }
   
   return(0);
}
 


Волны Элиотта есть, не спорю. А теории, увы, нет.

Пусть кто-нибудь попытается обоснованно мне возразить.



Почему же? Видно как Вы нашли теорию с использованием зигзага. И всё объяснили :-)
Только зигзаг - это всего навсего индикатор, который показывает процентное отклонение цены в противоположном направлении. С таким же успехом Вы могли использовать крестики-нолики, которые делают то же самое, только не в процентном, а в абсолютном значении.
Чтобы сравнивать образы, нужно хотя бы распозновать фоторобот, а с зигзагом это проблематично.
Эллиотт в уроке 12 начал, Нили в главе 5-9, а еще лучше в главе 6-1, потом Многоточки (сами того не подозревая) показали как определять волны. И это работает. Я пробовал в онлайне размечать минутный график и неоднократно с утра до вечера все сходилось. Редко, когда приходилось что-то менять. Бывает канал (линия тренда) после двойки уходит немного ниже и фиксирует несколько касаний растянутой третьей.