une stratégie commerciale basée sur la théorie des vagues d'Elliott - page 151

 
mais l'objectif de l'automatisation n'était probablement pas prévu au départ.
Vous avez raison, l'objectif n'était pas d'automatiser la recherche de motifs.
 
Quelqu'un qui les a téléchargés pourrait-il poster ces indicateurs quelque part ici ?

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

Merci.
 
nen
mais les objectifs de l'automatisation n'étaient probablement pas prévus dès le départ.
Vous avez raison, l'objectif n'était pas d'automatiser la recherche de motifs.


Ce n'est en fait pas très difficile, surtout avec votre expérience de la programmation. La seule chose IMHO - les algorithmes qui "redressent" l'histoire ne sont pas adaptés, ils ne peuvent tout simplement pas détecter les signaux en temps réel et il est alors difficile de vérifier les statistiques. Si je ne me trompe pas, dans votre PMO il y a un indicateur qui trace les oscillations en fonction des valeurs d'écart en points et par régions - il est tout à fait adapté : il ne redessine pas l'historique et pour lisser les "mauvais effets" il est possible d'introduire des plages de tolérance pour les ratios fibo comme cela a été fait dans "l'harmonie trader_06". En fait, vous pouvez utiliser le modèle ci-joint comme base.

Sincèrement, Vladislav.
Bonne chance et bonnes tendances.

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


Ce n'est pas très difficile, surtout avec votre expérience de la programmation. La seule chose IMHO - les algorithmes qui "redressent" l'histoire ne sont pas appropriés, il est tout simplement impossible de déterminer les signaux en temps réel et ensuite il est difficile de vérifier les statistiques. Si je ne me trompe pas, dans votre PMO il y a un indicateur qui trace les oscillations en fonction des valeurs d'écart en points et par régions - il est tout à fait adapté : il ne redessine pas l'historique et pour lisser les "mauvais effets" il est possible d'introduire des plages de tolérance pour les ratios fibo comme cela a été fait dans "l'harmonie trader_06". En fait, vous pouvez utiliser le modèle ci-joint comme base.

Sincèrement, Vladislav.
Bonne chance et bonnes tendances.


Quels sont les zigzags utilisés pour tracer l'histoire ?
1) Le zigzag de mt - ses erreurs ont été légèrement corrigées. Le mt one a beaucoup d'erreurs.
2) 3) indicateurs de tendance
4) - également rien de riche
5) oscillations...
6) prend les données d'une autre période de temps avec un zigzag mt fortement corrigé.

Et qu'entendez-vous par "redresser l'histoire" ?

La plage de tolérance y est définie de trois manières. Voilà pour les détails. C'est juste qu'il n'y avait pas vraiment de tâche pour l'automatiser. C'est maintenant. Voici l'idée. Nous commençons l'indicateur selon le "calendrier". Nous définissons les paires de devises à analyser et les délais. Et l'indicateur s'affichera sous une certaine forme : sur quelles paires de devises et sur quels délais les modèles ont été formés (et quel type de modèles) et aussi où les modèles sont formés. L'indicateur a tout pour résoudre ce problème.
 
<br / translate="no">Voici la situation : l'indicateur de recherche de motif est basé sur ce zig-zag qui est attaché. Il dessine un motif au moment où il est détecté, si la case pour émettre une alerte est cochée, il émet une alerte et efface tout après un certain temps. Ainsi, les modèles précédemment détectés ne sont pas visibles.

Ici, il semble que l'indicateur sur le juif ait été élaboré. D'après ce que j'ai compris, c'est probablement un signal pour la chute de l'UE ou quoi ?
La photo explicative est prise ici http://www.harmonictrader.com/price_patternsbfly.htm

 
Et qu'entendez-vous par "histoire plus riche" ?


Certains indicateurs disposent d'un passage inverse pour supprimer les oscillations "supplémentaires" et cela peut être fait sur une plage donnée de barres. De manière réaliste, cela entraîne un changement dans les relevés de l'indicateur - d'autres extrema à d'autres endroits. Mais cela ne peut se faire que sur l'historique, car il ne sera pas facile de distinguer la situation en temps réel (jusqu'à présent, je ne sais pas comment). Le zig-zag intégré à MT4 souffre également de la même chose (paramètre ExtBackstep). Pour la recherche de motifs, il n'est pas très essentiel (je veux dire des balayages inutiles). Le pire est qu'au bout d'un certain temps, le trader peut voir une image différente de celle qu'il a en temps réel. Mais c'est IMHO. Il existe peut-être des algorithmes qui permettent de déterminer le vrai (faux) extremum au moment présent (alternativement, il existe des stratégies qui permettent d'utiliser ces indicateurs avec de telles propriétés).

L'indicateur a tout ce dont vous avez besoin pour résoudre ce problème.


Je dis donc qu'il ne sera pas difficile d'automatiser la recherche de modèles avec votre expérience de la programmation. D'autant plus que les algorithmes y sont simples et bien décrits.

Sincèrement, Vladislav.
Bonne chance et bonnes tendances.
 
Si vous voulez dire redresser l'historique des valeurs du motif Pesavento (en jaune) ? Mais ce n'est pas du lissage. Il donne simplement la valeur du numéro de Pesavento le plus proche qui entre dans la tolérance. C'est plus facile à voir. Vous pouvez voir d'un coup d'œil quelles sont les fibres en cours de traitement en ce moment. Au fait, les modèles Pesavento sont construits dans Ensign. Ils sont à un contre un.
Il est possible de définir comme paramètre, d'afficher les valeurs telles qu'elles sont, sans substitution des valeurs les plus proches.