基于艾略特波浪理论的交易策略 - 页 151

 
但是,自动化的目的可能并不是首先要实现的。你
是对的,我们的目的并不是要实现模式搜索 的自动化。
 
有谁下载了这些指标,能不能在这里把这些指标贴出来。

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

谢谢你。
 
nen
但自动化的目标可能从一开始就没有打算。
你是对的,我们的目的并不是要实现模式搜索的自动化。


其实这并不难,尤其是在你有编程经验的情况下。唯一的一点是IMHO--"拉直 "历史的算法并不合适,它们根本无法检测到实时的信号,然后就很难验证统计数据。如果我没有记错的话,在你的PMO中,有一个指标根据点和区域的偏差值绘制波动图--它非常合适:它不会重新绘制历史,为了平滑 "坏影响",允许为fibo比率引入容忍范围,正如在 "和谐交易者_06 "中所做的那样。实际上,你可以用所附的那个作为基础。

真诚的,弗拉迪斯拉夫。
好运和良好的趋势。

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


这不是很困难,特别是以你的编程经验。唯一的一点IMHO--"拉直 "历史的算法并不合适,根本不可能确定实时信号,然后很难检查统计。如果我没有记错的话,在你的PMO中,有一个指标根据点和区域的偏差值绘制波动图--它非常合适:它不会重新绘制历史,为了平滑 "坏影响",允许为fibo比率引入容忍范围,正如在 "和谐交易者_06 "中所做的那样。实际上,你可以用所附的那个作为基础。真诚的,弗拉迪斯拉夫。好运和良好的趋势。





他们是用什么之字形来勾勒历史?
1)来自mt的之字形--它的错误已经被稍微纠正了。蒙特的那个有很多错误。
2) 3)趋势指标
4) - 也没有什么财富
5) 波动...
6)从另一个时间框架中获取数据,并对mt之字形进行了严重的修正。

那你说的 "整顿历史 "是什么意思?

那里的公差范围有三种设置方式。好了,这就是细节。只是,真的没有一个任务可以自动完成。就是现在。这里有一个想法。我们根据 "时间表 "启动指标。我们设定要扫描的货币对和时间框架。而且该指标将以一定的形式显示:在什么货币对和什么时间段形成的模式(以及什么样的模式),还有模式形成的地点。该指标拥有解决这一问题的一切。
 
<br / translate="no">情况是这样的:模式搜索指标是基于所附的那个之字形的。它在检测到的那一刻画出一个图案,如果勾选了发出警报的复选框,它就会发出警报,并在一段时间后抹去一切。因此,以前检测到的模式是不可见的。

这里似乎是犹太人身上的指标所制定的东西。据我所知,这可能是欧盟垮台的一个信号,还是什么?
解释性图片来自这里http://www.harmonictrader.com/price_patternsbfly.htm

 
那你说的 "更丰富的历史 "是什么意思?


一些指标有一个反向通道,以消除 "额外 "的波动,这可以在一个给定的条形范围内进行。现实上这导致了指标读数 的变化--其他地方的其他极值。但这只能在历史上进行,因为要实时区分情况并不容易(到目前为止我还不知道如何区分)。MT4内置的Zig-zag也有同样的问题(参数ExtBackstep)。对于搜索模式来说,它并不是非常必要的(我指的是不必要的扫荡)。更糟糕的是,一段时间后,交易者可能会看到一个与实时不同的画面。但这是IMHO。也许有一些算法可以确定当前时间的真(假)极值(或者说,有一些策略允许使用这些具有这种特性的指标)。

该指标拥有解决这一问题所需的一切。


所以我说,凭借你的编程经验,自动搜索模式并不困难。越是这样,因为那里的算法很简单,而且描述得很好。真诚的,弗拉迪斯拉夫。好运和良好的趋势。


 
如果你是指理顺佩萨文托模式 的历史值(黄色)?但这不是在拉直。它只是给出了在公差范围内的最接近的Pesavento数字的值。这更容易看到。你可以一目了然地看到目前有哪些纤维正在工作。另外,顺便说一下,Pesavento模式是在Ensign中建立的。他们是一对一的。
可以设置为参数,按原样显示数值,不替换最近的数值。
原因: