una estrategia de negociación basada en la teoría de las ondas de Elliott - página 151

 
pero el objetivo de la automatización probablemente no estaba previsto en primer lugar.
Tienes razón, no se pretendía automatizar la búsqueda de patrones.
 
Podría alguien que los haya descargado publicar esos indicadores en algún lugar de aquí.

https://c.mql5.com/mql4/forum/2006/10/indicators.zip
 
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 Sienna
#property indicator_color2 OrangeRed 
#property indicator_color3 Maroon
#property indicator_color4 Green
#property indicator_color5 Indigo
#property indicator_color6 Navy
#property indicator_color7 DarkSlateBlue
#property indicator_color8 DarkBlue

//---- input parameters
extern int CountBars=500;
extern bool alert = true;
extern int max_length = 30;
extern double error = 0.1;

extern color zz_clr   = Blue;
extern color bat_clr  = Sienna;
extern color crab_clr = OrangeRed;
extern color gar_clr = Maroon;
extern color ab_clr  = Green;
extern color but_clr = Indigo;

color get_harmony_color(int pattern){
   switch(pattern){
      case 1: return (ab_clr); break;
      case 2: return (gar_clr); break;
      case 3: return (but_clr); break;
      case 4: return (bat_clr); break;
      case 5: return (crab_clr); break;
      }
   return (zz_clr);
}

string get_harmony_pattern(int pattern,int shift){
   string pstr = "";
   switch(pattern){
      case 1: pstr = "AB=CD"; break;
      case 2: pstr = "Gartley"; break;
      case 3: pstr = "Butterfly"; break;
      case 4: pstr = "Bat"; break;
      case 5: pstr = "Crab"; break;
      }
   pstr = pstr + " at "+shift;
   return (pstr);
}

double bufBAT[];
double bufCRAB[];
double bufGAR[];
double bufAB[];
double bufBUT[];
double bufALL[];
double bufT0[];
double bufT1[];


int init(){
//----
   SetIndexStyle(0,DRAW_NONE,STYLE_SOLID,3);
   SetIndexStyle(1,DRAW_NONE,STYLE_SOLID,3);
   SetIndexStyle(2,DRAW_NONE,STYLE_SOLID,3);
   SetIndexStyle(3,DRAW_NONE,STYLE_SOLID,3);
   SetIndexStyle(4,DRAW_NONE,STYLE_SOLID,3);
   SetIndexStyle(5,DRAW_NONE);
   SetIndexStyle(6,DRAW_ARROW,STYLE_SOLID,2);
   SetIndexStyle(7,DRAW_ARROW,STYLE_SOLID,2);

   SetIndexBuffer(0,bufBAT);
   SetIndexBuffer(1,bufCRAB);
   SetIndexBuffer(2,bufGAR);
   SetIndexBuffer(3,bufAB);
   SetIndexBuffer(4,bufBUT);
   SetIndexBuffer(5,bufALL);
   SetIndexBuffer(6,bufT0);
   SetIndexBuffer(7,bufT1);

   //SetIndexBuffer(0,bufALL);

   SetIndexEmptyValue(0,0);
   SetIndexEmptyValue(1,0);
   SetIndexEmptyValue(2,0);
   SetIndexEmptyValue(3,0);
   SetIndexEmptyValue(4,0);
   SetIndexEmptyValue(5,0);
   SetIndexEmptyValue(6,0);
   SetIndexEmptyValue(7,0);
   
   SetIndexArrow(0,132);
   SetIndexArrow(1,133);
   SetIndexArrow(2,130);
   SetIndexArrow(3,129);
   SetIndexArrow(4,131);
   
   SetIndexArrow(6,167);
   SetIndexArrow(7,110);

   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2);
//----

   return(0);
  }

void delete_obj(){
   string  buff_str = "";
   for(int i=ObjectsTotal()-1;i>=0;i--){
      buff_str = ObjectName(i);
      if(StringFind(buff_str,"harmony_05_",0)==0) ObjectDelete(buff_str);
      }
}

static int acc = 0;

void update_zz(int from,double arr[],int ind[]){
   color c = Crimson;
   int off = 0 ;
   if(from==0){
      c = DarkBlue;
      off = 3;
      }
   for(int i=from;i<4;i++){
      create_line(ind[i],ind[i+1],get_harmony_color(7),arr[i],arr[i+1],0,STYLE_SOLID);
      if(i<3){
         place_text(
            DoubleToStr(MathAbs(arr[i+2]-arr[i+1])/MathAbs(arr[i]-arr[i+1]),3),
            (ind[i]+ind[i+2])/2,
            (arr[i]+arr[i+2])/2,
            zz_clr);
         create_line(ind[i],ind[i+2],Gray,arr[i],arr[i+2],0,STYLE_DOT);
         }
      switch(i){
         case 0:place_text("X",ind[i]+off,arr[i],c); break;
         case 1:place_text("A",ind[i]+off,arr[i],c); break;
         case 2:place_text("B",ind[i]+off,arr[i],c); break;
         case 3:place_text("C",ind[i]+off,arr[i],c); break;
         case 4:place_text("D",ind[i]+off,arr[i],c); break;
         }
      }
   if(from==0){
      create_triangle(ind[0],ind[1],ind[2],BurlyWood,arr[0],arr[1],arr[2]);
      create_triangle(ind[2],ind[3],ind[4],CadetBlue,arr[2],arr[3],arr[4]);
      }
   else{
      create_triangle(ind[2],ind[3],ind[4],Tomato,arr[2],arr[3],arr[4]);
      }
}

void place_text(string text,int x,double price,color c){
   static int acc = 0;
   string  buff_str = "harmony_05_text_"+acc; acc++;
      //OBJ_LABEL
   if(ObjectFind(buff_str)==-1){
      ObjectCreate(buff_str, OBJ_TEXT, 0, Time[x], price);
      }
   //ObjectSet(buff_str,OBJPROP_COLOR,c);
   ObjectSet(buff_str,OBJPROP_TIME1,Time[x]);
   ObjectSet(buff_str,OBJPROP_PRICE1,price);
   //ObjectSet(buff_str,OBJPROP_FONTSIZE,10);
   ObjectSetText(buff_str,text,10,"Arial",c);
   
}

void create_line(int from,int to,color c,double p0,double p1,int long,int type){
   static int acc = 0;
   string  buff_str = "harmony_05_"+acc; acc++;
   ObjectCreate(buff_str, OBJ_TREND, 0, Time[from], p0, Time[to], p1);
   ObjectSet(buff_str,OBJPROP_RAY,long);
   ObjectSet(buff_str,OBJPROP_COLOR,c);
   ObjectSet(buff_str,OBJPROP_XDISTANCE,100);
   ObjectSet(buff_str,OBJPROP_YDISTANCE,100);
   ObjectSet(buff_str,OBJPROP_STYLE,type);
   if(type!=STYLE_SOLID)
      ObjectSet(buff_str,OBJPROP_WIDTH,1);
   else
      ObjectSet(buff_str,OBJPROP_WIDTH,2);
}

int deinit(){
   delete_obj();
   return (0);
}

double last_time = 0;

double XA,XB,XD,AB,AC,BC,BD,CD,AD;
 
void init_lines(double arr[],int ind[]){
   XA = 0;
   if(MathAbs(ind[0]-ind[1])>1 && MathAbs(ind[1]-ind[2])>1 && MathAbs(ind[2]-ind[3])>1 && MathAbs(ind[3]-ind[4])>1){
      if(
         (arr[1]-arr[3])*(arr[2]-arr[3])<0 && 
         (arr[0]-arr[2])*(arr[1]-arr[2])<0
         ){
         XA = MathAbs(arr[1]-arr[0]) / Point;
         XB = MathAbs(arr[2]-arr[0]) / Point;
         XD = MathAbs(arr[4]-arr[0]) / Point;
         AB = MathAbs(arr[2]-arr[1]) / Point;
         AC = MathAbs(arr[3]-arr[1]) / Point;
         BC = MathAbs(arr[3]-arr[2]) / Point;
         BD = MathAbs(arr[4]-arr[2]) / Point;
         CD = MathAbs(arr[4]-arr[3]) / Point;
         AD = MathAbs(arr[4]-arr[1]) / Point;
         }
      }
}
/*
double get_retracement(int a,int b,double arr[],double ret){
   return (arr[a] + ((arr[a]-arr[b]) / Point)*ret*Point);
}
*/

bool is_ABCD_pattern(double arr[],int ind[],double offset){

   double F0,F1;
   bool found = false;
   F0 = NormalizeDouble(BC / AB,3);
   F1 = NormalizeDouble(CD / BC,3);
   found = 
      (F0>=0.382-offset && F0<=0.382+offset && F1>=2.240-offset && F1<=2.240+offset) ||
      (F0>=0.500-offset && F0<=0.500+offset && F1>=2.000-offset && F1<=2.000+offset) ||
      (F0>=0.618-offset && F0<=0.618+offset && F1>=1.618-offset && F1<=1.618+offset) ||
      (F0>=0.707-offset && F0<=0.707+offset && F1>=1.414-offset && F1<=1.414+offset) ||
      (F0>=0.786-offset && F0<=0.786+offset && F1>=1.270-offset && F1<=1.270+offset) ;
      
   if(!found) return (false);
   bufAB[ind[4]]  = arr[4];
   bufALL[ind[4]] = 1.0;
   update_zz(1,arr,ind);
   bufT0[ind[4]]  = arr[4]+(((arr[2]-arr[4])/Point)*0.618)*Point;
   bufT1[ind[4]]  = arr[4]+(((arr[1]-arr[4])/Point)*0.618)*Point;
   
   place_text(get_harmony_pattern(1,ind[4]),ind[4],bufAB[ind[4]],get_harmony_color(1));
   //Print(harmony_pattern(1,ind[4]));
   return (true);
}

bool is_Gartley_pattern(double arr[],int ind[],double offset){
   double F0,F1;
   bool found = false;
   F0 = NormalizeDouble(AB / XA,3);
   F1 = NormalizeDouble(AD / XA,3);
   
   found = 
      (
      (F0>=0.382-offset && F0<=0.382+offset) ||
      (F0>=0.477-offset && F0<=0.477+offset) ||
      (F0>=0.500-offset && F0<=0.500+offset) ||
      (F0>=0.618-offset && F0<=0.618+offset) 
      ) &&
      (
      (F1>=0.618-offset && F1<=0.618+offset) ||
      (F1>=0.786-offset && F1<=0.786+offset) 
      );
      //(F0==0.618/*-offset && F0<=0.618+offset*/ && F1==0.786/*-offset && F1<=0.786+offset*/);
   
   if(!found) return (false);
   
   F0 = NormalizeDouble(BC / AB,3);
   F1 = NormalizeDouble(CD / BC,3);
   found = 
      (F0>=0.382-offset && F0<=0.382+offset && F1>=2.240-offset && F1<=2.240+offset) ||
      (F0>=0.500-offset && F0<=0.500+offset && F1>=2.000-offset && F1<=2.000+offset) ||
      (F0>=0.618-offset && F0<=0.618+offset && F1>=1.618-offset && F1<=1.618+offset) ||
      (F0>=0.707-offset && F0<=0.707+offset && F1>=1.414-offset && F1<=1.414+offset) ||
      (F0>=0.786-offset && F0<=0.786+offset && F1>=1.270-offset && F1<=1.270+offset) ||
      (F0>=0.886-offset && F0<=0.886+offset && F1>=1.129-offset && F1<=1.129+offset) ;
      
   if(!found) return (false);
   
   bufGAR[ind[4]] = arr[4]+10*Point;
   bufT0[ind[4]]  = arr[4]+(((arr[3]-arr[4])/Point)*0.618)*Point;
   bufT1[ind[4]]  = arr[4]+(((arr[1]-arr[4])/Point)*0.618)*Point;
   bufALL[ind[4]] = 2.0;
   update_zz(0,arr,ind);
   place_text(get_harmony_pattern(2,ind[4]),ind[4],bufGAR[ind[4]],get_harmony_color(2));
   //Print(harmony_pattern(2,ind[4]));
   return (true);
}

bool is_Butterfly_pattern(double arr[],int ind[],double offset){
   double F0,F1;
   bool found = false;
   F0 = NormalizeDouble(AB / XA,3);
   F1 = NormalizeDouble(AD / XA,3);
   
   found = 
      (
      (F0>=0.618-offset && F0<=0.618+offset) ||
      (F0>=0.786-offset && F0<=0.786+offset) ||
      (F0>=0.886-offset && F0<=0.886+offset) 
      ) &&
      (
      (F1>=1.270-offset && F1<=1.270+offset) ||
      (F1>=1.618-offset && F1<=1.618+offset) 
      );
      //(F0==0.618/*-offset && F0<=0.618+offset*/ && F1==0.786/*-offset && F1<=0.786+offset*/);
   
   if(!found) return (false);

   F0 = NormalizeDouble(BC / AB,3);
   F1 = NormalizeDouble(CD / BC,3);
   found = 
      (
      (F0>=0.382-offset && F0<=0.382+offset) 
         && (
            (F1>=2.240-offset && F1<=2.240+offset) ||
            (F1>=1.618-offset && F1<=1.618+offset) ||
            (F1>=2.618-offset && F1<=2.618+offset) 
            )
      ) ||
      (
      (F0>=0.500-offset && F0<=0.500+offset) 
         && (
            (F1>=2.000-offset && F1<=2.000+offset) ||
            (F1>=2.618-offset && F1<=2.618+offset) 
            )
      ) ||
      (
      (F0>=0.618-offset && F0<=0.618+offset) 
         && (
            (F1>=1.618-offset && F1<=1.618+offset) ||
            (F1>=2.000-offset && F1<=2.000+offset) ||
            (F1>=2.618-offset && F1<=2.618+offset) ||
            (F1>=2.240-offset && F1<=2.240+offset) 
            )
      ) ||
      (F0>=0.707-offset && F0<=0.707+offset && F1>=1.414-offset && F1<=1.414+offset) ||
      (
      (F0>=0.786-offset && F0<=0.786+offset) 
         && (
            (F1>=1.618-offset && F1<=1.618+offset) ||
            (F1>=2.618-offset && F1<=2.618+offset) ||
            (F1>=2.240-offset && F1<=2.240+offset) 
            )
      ) ||
      (F0>=0.886-offset && F0<=0.886+offset && F1>=1.270-offset && F1<=1.270+offset);
      
   if(!found) return (false);

   bufBUT[ind[4]] = arr[4]+20*Point;
   bufALL[ind[4]] = 3.0;
   bufT0[ind[4]]  = arr[4]+(((arr[3]-arr[4])/Point)*0.618)*Point;
   bufT1[ind[4]]  = arr[4]+(((arr[1]-arr[4])/Point)*0.618)*Point;
   update_zz(0,arr,ind);
   place_text(get_harmony_pattern(3,ind[4]),ind[4],bufBUT[ind[4]],get_harmony_color(3));
   //Print(harmony_pattern(3,ind[4]));
   return (true);
}

bool is_BAT_pattern(double arr[],int ind[],double offset){
   double F0,F1,F2;
   bool found = false;
   F0 = NormalizeDouble(AB / XA,3);
   F1 = NormalizeDouble(AD / XA,3);
   F2 = NormalizeDouble(CD / BC,3);
   found = 
      (F0>=0.382-offset && F0<=0.618+offset) 
      && (F1>=0.886-offset && F1<=0.886+offset)
      && (F2>=1.618-offset && F2<=2.618+offset)
      ;
   
   if(!found) return (false);

   F0 = NormalizeDouble(BC / AB,3);
   F1 = F2;
   
   found = 
      (F0>=0.500-offset && F0<=0.500+offset && F1>=2.618-offset && F1<=2.618+offset) ||
      (F0>=0.618-offset && F0<=0.618+offset && F1>=2.000-offset && F1<=2.000+offset) ||
      (F0>=0.618-offset && F0<=0.618+offset && F1>=2.240-offset && F1<=2.240+offset) ||
      (F0>=0.786-offset && F0<=0.786+offset && F1>=1.618-offset && F1<=1.618+offset) ||
      (F0>=0.886-offset && F0<=0.886+offset && F1>=1.270-offset && F1<=1.270+offset) ;
   if(!found) return (false);

   bufBAT[ind[4]] = arr[4]+30*Point;
   bufALL[ind[4]] = 4.0;
   bufT0[ind[4]]  = arr[4]+(((arr[3]-arr[4])/Point)*0.618)*Point;
   bufT1[ind[4]]  = arr[4]+(((arr[1]-arr[4])/Point)*0.618)*Point;
   update_zz(0,arr,ind);
   place_text(get_harmony_pattern(4,ind[4]),ind[4],bufBAT[ind[4]],get_harmony_color(4));
   
   return (true);
}

bool is_CRAB_pattern(double arr[],int ind[],double offset){
   double F0,F1;
   bool found = false;
   F0 = NormalizeDouble(AB / XA,3);
   F1 = NormalizeDouble(CD / BC,3);
   
   found = 
      (
      (F0>=0.382-offset && F0<=0.382-offset) ||
      (F0>=0.477-offset && F0<=0.477+offset) ||
      (F0>=0.500-offset && F0<=0.500+offset) ||
      (F0>=0.618-offset && F0<=0.618+offset) 
      )
      &&
      (
      (F1>=2.618-offset && F1<=2.618+offset) ||
      (F1>=3.140-offset && F1<=3.140+offset) ||
      (F1>=3.618-offset && F1<=3.618+offset) 
      );
   
   if(!found) return (false);
   
   bufCRAB[ind[4]] = arr[4]+40*Point;
   bufALL[ind[4]] = 5.0;
   bufT0[ind[4]]  = arr[4]+(((arr[3]-arr[4])/Point)*0.618)*Point;
   bufT1[ind[4]]  = arr[4]+(((arr[1]-arr[4])/Point)*0.618)*Point;
   update_zz(0,arr,ind);
   place_text(get_harmony_pattern(5,ind[4]),ind[4],bufCRAB[ind[4]],get_harmony_color(5));
   //Print(harmony_pattern(5,ind[4]));
   return (true);
}

int last = 0 ;
datetime last_ = 0;

int start(){
   if(last==Bars) return (0);
   delete_obj();
   last = Bars;
   //delete_obj();
  
  
   int point_arr[5];
   double val_arr[5];
   
   int i,l = 0;
   int pi = 4,j = 0;
   datetime ld;
   double gann = 0;
   int limit = CountBars;
   
   int found = limit;
   for(int len = max_length;len>2;len--){
      j = 0;
      pi = 4;
      while(j<limit && pi>=0){
         gann = iCustom(Symbol(),Period(),"a_ZZ",limit,0,len,0,j);
         //gann = iCustom(Symbol(),Period(),"0_ZigZag",Length,0,0,0,from,0,j);
         if(gann!=0.0){
            point_arr[pi] = j;
            val_arr[pi] = gann;
            pi--;
            }
         j++;
         }
      //limit -= 10;
      init_lines(val_arr,point_arr);
      if(XA!=0){
         if( 
             is_ABCD_pattern(val_arr,point_arr,error) ||
             is_Gartley_pattern(val_arr,point_arr,error) ||
             is_Butterfly_pattern(val_arr,point_arr,error) ||
             is_CRAB_pattern(val_arr,point_arr,error) ||
             is_BAT_pattern(val_arr,point_arr,error)
            ){
            if(found>point_arr[4]){
               found = point_arr[4];
               }
            Sleep(50);
            }
         }
      }
   if(found!=CountBars && Time[found]>last_){
      last_ = Time[found];
      if(alert) Alert(Symbol()+":: Possible Price Pattern found at "+found+" bar.");
      }
   //ObjectsRedraw();
   return(0);
  }
//+------------------------------------------------------------------+

void create_triangle(int p0,int p1,int p2,color c,double c0,double c1,double c2){
   static int acc = 0;
   string  buff_str = "harmony_05_tri_"+acc; acc++;
   
   datetime t0 = Time[p0],t1 = Time[p1],t2 = Time[p2];
   if(p1<0) t1 = Time[0] + Period()*60*MathAbs(p1);
   if(p2<0) t2 = Time[0] + Period()*60*MathAbs(p2);
   
   ObjectCreate(buff_str, OBJ_TRIANGLE, 0, t0, c0, t1, c1, t2, c2);
   ObjectSet(buff_str, OBJPROP_COLOR, c );
   ObjectSet(buff_str, OBJPROP_STYLE,  STYLE_DOT );
   ObjectSet(buff_str,OBJPROP_BACK,true);
}
 
#property  copyright "ANG3110@latchess.com"
//-------------ang_Amp_ZZ---------------
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Blue

//--------------------------------
extern int cbars=1000;
extern int from=0;
extern int Length=10;
extern double error = 0.1;
extern bool draw = false;

//---------------------------------
double ha[],la[],zz[],un[],pattern[],position[];
double hi,li,hm,lm,di,j;
int f,f1,ai,bi,aii,bii,f0,aibar,bibar;
//----------------------------------------------
string id = "a_zz_";

int init()  {   
   id = id + Length +"_";
   IndicatorBuffers(6);
   SetIndexStyle(0,DRAW_SECTION,STYLE_SOLID,2);

   SetIndexBuffer(0,zz);
   SetIndexBuffer(1,la);
   SetIndexBuffer(2,ha);   
   SetIndexBuffer(3,un);
   SetIndexBuffer(4,pattern);
   SetIndexBuffer(5,position);
   
   

   SetIndexEmptyValue(0,0);
   SetIndexEmptyValue(1,0);
   SetIndexEmptyValue(2,0);
   SetIndexEmptyValue(3,0);
   SetIndexEmptyValue(4,0);
   SetIndexEmptyValue(5,0);
   
   return(0);  
}

void place_text(string text,int x,double price,color c){
   if(!draw) return (0);
   string  buff_str = id+text+x+price;
      //OBJ_LABEL
   if(ObjectFind(buff_str)==-1){
      ObjectCreate(buff_str, OBJ_TEXT, 0, Time[x], price);
      }
   //ObjectSet(buff_str,OBJPROP_COLOR,c);
   ObjectSet(buff_str,OBJPROP_TIME1,Time[x]);
   ObjectSet(buff_str,OBJPROP_PRICE1,price);
   //ObjectSet(buff_str,OBJPROP_FONTSIZE,10);
   ObjectSetText(buff_str,text,10,"Arial",c);
   
}

void create_line(int from,int to,color c,double p0,double p1,int long,int style){
   if(!draw) return (0);
   static int acc = 0;
   string  buff_str = id+acc; acc++;
   ObjectCreate(buff_str, OBJ_TREND, 0, Time[from], p0, Time[to], p1);
   ObjectSet(buff_str,OBJPROP_RAY,long);
   ObjectSet(buff_str,OBJPROP_COLOR,c);
   ObjectSet(buff_str,OBJPROP_XDISTANCE,100);
   ObjectSet(buff_str,OBJPROP_YDISTANCE,100);
   ObjectSet(buff_str,OBJPROP_STYLE,style);
   ObjectSet(buff_str,OBJPROP_BACK,true);
   //ObjectSet(buff_str,OBJPROP_WIDTH,2);
}

void delete_obj(){
   string  buff_str = "";
   for(int i=ObjectsTotal()-1;i>=0;i--){
      buff_str = ObjectName(i);
      if(StringFind(buff_str,id,0)==0) ObjectDelete(buff_str);
      }
}

int deinit(){
   delete_obj();
   return (0);
}

int last=0;
//================================
int start()  {   
   if(last==Bars) return (0);
   last=Bars;
   delete_obj();
   ArrayInitialize(zz,0);
   //ArrayInitialize(ha,0);
   //ArrayInitialize(la,0);
   
   int shift,Swing,Swing_n,uzl,i,zu,zd,mv;
   double LL,HH,BH,BL,NH,NL; 
   double Uzel[10000][3]; 
   string text;
// loop from first bar to current bar (with shift=0) 
   Swing_n=0;Swing=0;uzl=0; 
   
   int barn = from + cbars;
   BH =High[barn];
   BL=Low[barn];
   zu=barn;
   zd=barn; 

   for(shift=barn;shift>=from;shift--) { 
      LL=10000000;
      HH=-100000000; 
      for(i=shift+Length;i>=shift+1;i--) { 
         if (Low[i]< LL) LL=Low[i];
         if (High[i]>HH) HH=High[i]; 
         } 
         
      if (Low[shift]<LL && High[shift]>HH){ 
         Swing=2; 
         if (Swing_n==1)  zu=shift+1; 
         if (Swing_n==-1) zd=shift+1; 
         }
      else{ 
         if (Low[shift]<LL)  Swing=-1; 
         if (High[shift]>HH) Swing=1; 
         } 
         
      if (Swing!=Swing_n && Swing_n!=0) { 
         if (Swing==2) {
            Swing=-Swing_n;
            BH = High[shift];
            BL = Low[shift]; 
            } 
         uzl=uzl+1; 
         if(Swing==1) {
            Uzel[uzl][1]=zd;
            Uzel[uzl][2]=BL;
            } 
         if(Swing==-1) {
            Uzel[uzl][1]=zu;
            Uzel[uzl][2]=BH; 
            } 
         BH = High[shift];
         BL = Low[shift]; 
         } 
      if (Swing==1) { 
         if(High[shift]>=BH) {
            BH=High[shift];
            zu=shift;
            }
         } 
      else if(Swing==-1) {
         if(Low[shift]<=BL) {
            BL=Low[shift]; 
            zd=shift;
            }
         } 
      Swing_n=Swing; 
      } 
   
   for(i=1;i<=uzl;i++) { 
      mv=StrToInteger(DoubleToStr(Uzel[i][1],0));
      zz[mv]=Uzel[i][2];
      } 

   //--------------------------------
   int dir = 0;
   int pos[3]; int cpos = 0; int id = 0;
   for(i=barn; i>=from; i--){ 
      un[i] = 0;
      if(zz[i]!=0){
         pos[cpos] = i; cpos++;
         if(cpos==3){
            un[i]    =  (MathAbs(zz[pos[2]]-zz[pos[1]])/Point) /  // AB
                        (MathAbs(zz[pos[0]]-zz[pos[1]])/Point);   // XA
            double d = get_real_value(un[i],error);
            if(d!=0){
               place_text(DoubleToStr(d,3),(pos[0]+pos[2])/2,(zz[pos[0]]+zz[pos[2]])/2,Crimson);
               create_line(pos[0],pos[2],Gray,zz[pos[0]],zz[pos[2]],0,STYLE_DASHDOT);
               }
               
            pos[0]   = pos[1];
            pos[1]   = pos[2];
            cpos     = 2;
            }
         }
      }

    zz[from] = Close[from];
    pos[cpos] = 0; cpos++;
    if(cpos==3){
      un[from]    =  (MathAbs(zz[pos[2]]-zz[pos[1]])/Point) /  // AB
                  (MathAbs(zz[pos[0]]-zz[pos[1]])/Point);   // XA
      d = get_real_value(un[from],error);
      if(d!=0){
         place_text(DoubleToStr(d,3),(pos[0]+pos[2])/2,(zz[pos[0]]+zz[pos[2]])/2,Crimson);
         create_line(pos[0],pos[2],Gray,zz[pos[0]],zz[pos[2]],0,STYLE_DASHDOT);
         }
      }
   int cp = 0;
   for(i=from; i<barn; i++){ 
      if(un[i]!=0){
         pattern[cp] = un[i];
         position[cp] = i;
         cp++;
         }
      }

//------------------------------------
return(0);  
}

double get_real_value(double v,double err){
   double table[15] = {
      0.382,2.240,
      0.500,2.000,
      0.618,1.618,
      0.707,1.414,
      0.786,1.270,
      0.886,1.129,
      3.140,3.618,
      2.618
      };
   for(int i=0;i<15;i++){
      if(v>=table[i]-err && v<=table[i]+err){
         return (table[i]);
         }
      }
   return (v);
}
 
А мог бы кто-нибудь из скачавших, выложить где-то здесь те индикаторы.

https://c.mql5.com/mql4/forum/2006/10/indicators.zip

Gracias.
 
nen
pero es probable que los objetivos de la automatización no estuvieran previstos desde el principio.
Tienes razón, no se pretendía automatizar la búsqueda de patrones.


En realidad no es muy difícil, especialmente con tu experiencia en programación. La única cosa IMHO - los algoritmos que "enderezan" la historia no son adecuados, simplemente no pueden detectar las señales de tiempo real y luego es difícil de verificar las estadísticas. Si no me equivoco, en su PMO hay un indicador que traza las oscilaciones según los valores de desviación en puntos y por regiones - es bastante adecuado: no redibuja el historial y para suavizar los "malos efectos" permite introducir rangos de tolerancia para los ratios de fibo como se hacía en el "harmony trader_06". En realidad, puede utilizar el adjunto como base.

Sinceramente, Vladislav.
Buena suerte y buenas tendencias.

 
nen
но цели автоматизации, скорее всего, изначально не ставились.
Вы правы, цели по автоматизации поиска паттернов не было.


No es muy difícil, especialmente con tu experiencia en programación. Lo único IMHO - los algoritmos que "enderezan" la historia no son adecuados, es simplemente imposible determinar las señales en tiempo real y entonces es difícil comprobar las estadísticas. Si no me equivoco, en su PMO hay un indicador que traza las oscilaciones según los valores de desviación en puntos y por regiones - es bastante adecuado: no redibuja el historial y para suavizar los "malos efectos" permite introducir rangos de tolerancia para los ratios de fibo como se hacía en el "harmony trader_06". En realidad, puede utilizar el adjunto como base.

Sinceramente, Vladislav.
Buena suerte y buenas tendencias.


¿Qué zigzags se utilizan para delinear la historia?
1) El zigzag de mt - sus errores han sido ligeramente corregidos. La mt tiene muchos errores.
2) 3) indicadores de tendencia
4) - también nada riquezas
5) oscilaciones...
6) toma los datos de otro marco temporal con un zigzag mt muy corregido.

¿Y qué quiere decir con "enderezar la historia"?

El rango de tolerancia se establece allí de tres maneras. Bueno, esos son los detalles. Es que realmente no había una tarea para automatizarla. Ahora sí. Esta es la idea. Ponemos en marcha el indicador según el "calendario". Establecemos los pares de divisas a escanear y los marcos temporales. Y el indicador mostrará de una forma determinada: en qué pares de divisas y en qué plazos se formaron los patrones (y qué tipo de patrones) y también dónde se forman los patrones. El indicador lo tiene todo para resolver este problema.
 
<br / translate="no"> Esta es la situación: el indicador de búsqueda de patrones se basa en ese zig-zag que se adjunta. Dibuja un patrón en el momento en que se detecta, si la casilla para emitir una alerta está marcada, emite una alerta y borra todo después de un tiempo. Así, los patrones detectados previamente no son visibles.

Aquí parece haber algo elaborado por el indicador del judío. Por lo que entiendo es probablemente una señal para la caída de la UE o qué?
La imagen explicativa está tomada de aquí http://www.harmonictrader.com/price_patternsbfly.htm

 
¿Y qué quiere decir con "historia más rica"?


Algunos indicadores tienen un pase inverso para eliminar las oscilaciones "extra" y esto se puede hacer en un rango de barras determinado. En realidad, esto lleva a un cambio en las lecturas del indicador: otros extremos en otros lugares. Pero sólo se puede hacer sobre el historial, porque no será fácil distinguir la situación en tiempo real (hasta ahora no tengo ni idea de cómo). El zig-zag incorporado en MT4 también sufre de lo mismo (parámetro ExtBackstep). Para la búsqueda de patrones no es muy esencial (me refiero a los columpios extra). Mucho peor es que después de un tiempo el comerciante puede ver una imagen diferente a la del tiempo real. Pero esto es IMHO. Quizás existan algoritmos que permitan determinar el verdadero (falso) extremo en el momento actual (alternativamente, existen estrategias que permiten utilizar estos indicadores con tales propiedades).

El indicador tiene todo lo necesario para resolver este problema.


Por eso digo que no será difícil automatizar la búsqueda de patrones con tu experiencia en programación. Sobre todo porque los algoritmos son sencillos y están bien descritos.

Sinceramente, Vladislav.
Buena suerte y buenas tendencias.
 
¿Si te refieres a enderezar la historia de los valores del patrón Pesavento (en amarillo)? Pero no se está enderezando. Sólo da el valor del número Pesavento más cercano que entra dentro de la tolerancia. Es más fácil de ver. Puedes ver de un vistazo qué fibras se están trabajando en ese momento. Además, por cierto, en Ensign se construyen los patrones de Pesavento. Son uno a uno.
Es posible establecer como parámetro, que se muestren los valores tal y como son, sin sustitución de los valores más cercanos.
Razón de la queja: