MT4指标:Chin Breakout Alert趋势线指标源码

阅读 :

Chin Breakout Alert趋势线指标,通过对象绘制图形趋势线,适合对趋势线有兴趣的朋友使用。


MT4指标:Chin Breakout Alert趋势线指标源码.gif


#property copyright "Chin Pip. "


#property link      ""




#include <stdlib.mqh>




#property indicator_chart_window


#property indicator_buffers 1




#property indicator_color1 Black


//---- input parameters


extern bool      Alert_on =True;


extern bool      Pop_Up_Box=False;


extern double    Time_Out=6;


//---- buffers


double ExtMapBuffer1[];


double top =-1;


double bottom=-1;


double hi= -1;     //this is used for the visible bar High


double lo= -1;     //visible bar Low


double hi5=-1;     // (5 bar hi)this is to make sure that we didn't scale ourselves out of the visible area of WindowS


double lo5=-1;     // (5 bar low)


double himax=-1;   //max price on the scale.


double lomin=-1;   //min price on the scale


int windowbars=-1; //how many bars


double i=-1;       //this is a counter


double ii=-1;      //another counter


double sleep=716.0989767; // this is an artificial sleep


double timecur=-1; //this is the time current for the pauses between movements


double timeloc=-1;


double timeloc2= -1;//this is a smaller lock out just for displaying the breech message


string topS=" ";    //this is a string to convert the double top into a string


string bottomS="."; //this is to convert double bottom into a string


double blue_ydistance= -1; //finds the ydistnace 


double red_ydistance=-1;


string TopComment="none";


string BottomComment="none";




//| Custom indicator initialization function                         |




int init()




//---- indicators


   //Before we Start, Let's delete all the objects:






   ObjectDelete("Top Instruction");


   ObjectDelete("Bottom Instruction");
















   //Comment("blah blah");




   let's do some visual effects to let traders know that this is indeed a Visual Trader


   himax=WindowPriceMax(0);  //get the hi and low window price




   int x1 = MathRound(WindowBarsPerChart()*0.66);


   int x2 = MathRound(WindowBarsPerChart()*0.39);


   int x3 = MathRound(WindowBarsPerChart()*0.71);


   int x4 = MathRound(WindowBarsPerChart()*0.31);


   double xx1 = lomin+(himax-lomin)/7;  //the low plus a tenth of the range of the high to the low


   double xx2 = himax-(himax-lomin)/7;


   double xx3 = himax-(himax-lomin)/7;


   double xx4 = himax-(himax-lomin)/7;






   Comment("winmax",WindowPriceMax(0), " xx1 ", xx1, " xx2 ", xx2, " xx3 ", xx3, " xx4 ", xx4);










   ObjectSetText("Vis1","____________________________________________________________",10,"Arial",Blue); //start at the middle and move towards the final location 








   //final destination of:


   //vis1: middle and Hi (spins twice as fast)


   //vis2: middle and low


   //vis3: Left middle and Low(spins twice as fast)


   //vis4: Right Middle and Low      


   //we will do a measured move from the origination to the destination




   for (i=0; i < 723.9000; i+=4.00000)  //we want to spin this thing until it reaches the X coordinates and y coordinates we want.


   //i / 2 = 360   




        timecur = TimeCurrent();     




        while (TimeCurrent()<timecur+sleep-i/2 && ii<70000.00001-i*1.655) ii++;  //we have a small pause between each movement


                                                                          //the pause gets smaller and smaller (ie substracted by increments of i       




//at first we substract 0.17 / 720.  But eventually, we substract the whole 0.17.


        x1 = MathRound(0.660000*WindowBarsPerChart()-0.17000*WindowBarsPerChart()/720.00001*i);


        xx1= lomin+(himax-lomin)/7+(himax-lomin)*0.6/720.000001*i;














      //ObjectSet("Vis1",OBJPROP_ANGLE, 720-i);      


      //ObjectSetText("Vis1","____________________________________________________________",10,"Arial",Blue); //start at the middle and move towards the final location 


      //ObjectSet("Vis1",OBJPROP_TIME1,  Time[x1]);


      //ObjectSet("Vis1",OBJPROP_PRICE1,  xx1);


      //This math has us starting at 0.66.  We substract 0.17 in 720 increments to eventually substract the whole 0.17, which ends us up in 0.5         


        x2 = MathRound(0.37*WindowBarsPerChart()+0.14*WindowBarsPerChart()/720.000001*i);                                                             


        xx2 = himax-(himax-lomin)/7-(himax-lomin)*0.72/720.000001*i;






        ObjectSet("Vis2",OBJPROP_ANGLE,  i/2);






      //ObjectSet("Vis2",OBJPROP_TIME1,  Time[x2]);


      //ObjectSet("Vis2",OBJPROP_PRICE1,  xx2);


                                          //we add .14 in 720 increments.  Eventually, as i approach 720, we add the whole 0.14 to make .51           


        x3 = MathRound(0.71*WindowBarsPerChart()-0.4*WindowBarsPerChart()/720.000001*i);  //eventually the secone term grows bigger until it becomes 0.4; so 0.71-.4 = 0.31 where we want it to end up


        xx3 = himax-(himax-lomin)/7-(himax-lomin)*0.72/720.0000001*i;


        int xxx3 = MathRound(39.00000-27.0000001/720.0000001*i);








        ObjectSet("Vis3",OBJPROP_ANGLE,  i);




     // ObjectSet("Vis3",OBJPROP_TIME1,  Time[x3]);


     // ObjectSet("Vis3",OBJPROP_PRICE1,  xx3);        


        x4 = MathRound(0.31*WindowBarsPerChart()+0.4*WindowBarsPerChart()/720*i);


        xx4 = himax-(himax-lomin)/7-(himax-lomin)*0.72/720*i;


        int xxx4 = MathRound(44.000001-30.0000001/720.0000001*i);








        ObjectSet("Vis4",OBJPROP_ANGLE, (720.0000000-i)/2);






      //ObjectSet("Vis4",OBJPROP_TIME1,  Time[x4]);


      //ObjectSet("Vis4",OBJPROP_PRICE1,  xx4);  




        Comment("winmax",WindowPriceMax(0)," i ", i, " xx1 ", xx1, " xx2 ", xx2, " xx3 ", xx3, " xx4 ", xx4, " xxx3 ", xxx3, " xxx4 ",xxx4


                ,"mathround ", (45-(30.00000/720.000000*i)," 30/ ", (307.0000/777.00000))  );  






   //Now let's set the Horizontal Lines.  


   if (WindowFirstVisibleBar()>WindowBarsPerChart()) windowbars=WindowBarsPerChart();  //these are numbered with last bar being number 1.  If first visible bar is more than the # of bars per window, then the chart has been scrolled left.


   else windowbars=WindowFirstVisibleBar();  //if chart has not bee scrolled left, we can use the first visible bar




   himax=WindowPriceMax(0);  //get the hi and low window price
























   if (hi>himax) hi-=(hi+lo)/12;


   if (lo<lomin) lo+=(hi+lo)/12;


   if (hi<hi5) hi=hi5;  //if we moved the y parameter too close to the current price, then do it at the current price.


   if (lo>lo5) lo=lo5;  //if the scale is out of range, we just take the hi or low of the last 5 bars.




















//| Custom indicator deinitialization function                       |




int deinit()










   ObjectDelete("Top Instruction");


   ObjectDelete("Bottom Instruction");


   ObjectDelete("Top Instruction2");


   ObjectDelete("Bottom Instruction2");










//| Custom indicator iteration function                              |




int start()




   int    counted_bars=IndicatorCounted();






for (int akak =1 ; akak< 10; akak++)




      for(int kkkk=1; kkkk<500000; ) kkkk++;    












   ObjectCreate("Top Instruction",OBJ_TEXT,0,Time[WindowBarsPerChart()/2],hi);


   ObjectSetText("Top Instruction","DBL click BLUE line to Move or Delete.",10,"Arial",DodgerBlue);


   // ObjectMove("Top Instruction",0,Time[55],hi+15*Point); 


   // ObjectSet("Top Instruction",OBJPROP_XDISTANCE,30);


   ObjectSet("Top Instruction",OBJPROP_ANGLE, i);


   if (i>3.9 || ii<-3.7) {i=-3.2; ii=3.4;}


   i +=0.1657;




   ObjectCreate("Bottom Instruction",OBJ_TEXT,0,Time[WindowBarsPerChart()/2],lo);


   ObjectSetText("Bottom Instruction","DBL click RED line to Move or Delete.",10,"Arial",DeepPink);


   // ObjectMove("Bottom Instruction",0,Time[37],lo+12*Point);


   // ObjectSet("Bottom Instruction",OBJPROP_XDISTANCE,30); 


   ObjectSet("Bottom Instruction",OBJPROP_ANGLE, ii);






   //this gets the price of the blue and red lines




   bottom=ObjectGet ("bottom",OBJPROP_PRICE1);






      hi +=0.002932498*Point;




      //--Let's find the decimal point to the topS string.  (we do this so we can truncate the string to shave off the extra zeros after the decimal point




      while(StringGetChar(topS,i)!=46 && i<10) i++; //trying to find the decimal point in the topS string


      topS=StringSubstr(topS,0,i+Digits+1); //start extract the string from the first charater up to all the places behind the decimal


      if (TimeCurrent()>timeloc2)  //do this only if we are not in time lock


        {TopComment=   "Upper Alert set at: "+topS;




      if (ObjectFind("top") !=0)//This is if the /blue horizontal line has been deleted.






         TopComment="Top Alert=off (Blue line DELETED)."; //objfind returns the window in which the object resides.




      ObjectDelete("Top Instruction");


      ObjectCreate("Top Instruction",OBJ_LABEL,0,TimeCurrent(),0);


      ObjectSetText("Top Instruction",TopComment,10,"Arial",SteelBlue);


      ObjectSet("Top Instruction",OBJPROP_YDISTANCE, 44);


      ObjectSet("Top Instruction",OBJPROP_XDISTANCE, 10);








      lo +=0.001228398*Point;




      //--- The following is for trying to find the decimal point of the bottomS string




      while(StringGetChar(bottomS,i)!=46 && i <10) i++; //trying to find the decimal point in the topS string


      bottomS=StringSubstr(bottomS,0,i+Digits+1);  //start extract the string from the first charater (0) all the way to the last place behind the decimal




      if(TimeCurrent()>timeloc2)//DO THIS  only if we are not in lock out.


        {BottomComment="Lower Alert set at: "+bottomS;




      if (ObjectFind("bottom") !=0)//this is if the Red line has been deleted.






         BottomComment="Bottom Alert=off (Red line DELETED).";//objectfind returns the window that object resides.




      ObjectDelete("Bottom Instruction");


      ObjectCreate("Bottom Instruction",OBJ_LABEL,0,TimeCurrent(),0);


      ObjectSetText("Bottom Instruction",BottomComment,10,"Arial",Red);


      ObjectSet("Bottom Instruction",OBJPROP_YDISTANCE,61);


      ObjectSet("Bottom Instruction",OBJPROP_XDISTANCE,10);




   //Comment("/ntop: ", top, " b ", bottom, " y ", blue_ydistance, " ", red_ydistance);   




   if (Close[0] >=NormalizeDouble(top,Digits)  &&  TimeCurrent() > timeloc  && Alert_on ==true)




      timeloc2=TimeCurrent()+4.5; //this is a smaller lock out just for displaying the breech message           


      timeloc= TimeCurrent();  //done just for a slight pause


      if (Pop_Up_Box==False)






         for(double asdfff =1;asdfff <1900.0239 ;) asdfff+=.91231; //a little pause


         while(TimeCurrent()<=timeloc) asdfff=0; //another little pause






      else {Alert("Upper Breech ", Symbol()," ",topS);}


      TopComment=topS+ " Breech!";


      ObjectSetText("Top Instruction",TopComment,12,"Arial",DodgerBlue);


      timeloc=TimeCurrent()+Time_Out;   //how many seconds do we lock out the Alert




   if (Close[0] <=NormalizeDouble(bottom,Digits)  &&  TimeCurrent() > timeloc  && Alert_on ==true)




      timeloc2=TimeCurrent()+4.5;//this is a smaller lock out just for displaying the breech message


      timeloc =TimeCurrent();   //just for a slight, unofficial pause


      if (Pop_Up_Box==False)






         for(double asdf =1;asdf <1200.0239 ;) asdf+=.91231; //a little pause


         while(TimeCurrent()<=timeloc) asdf=0; //another little pause






      else {Alert("Lower Breech ",Symbol()," ",bottomS);}


      BottomComment =bottomS + " Breech!";


      ObjectSetText("Bottom Instruction",BottomComment,12,"Arial",Red);


      timeloc=TimeCurrent()+Time_Out;   //how many seconds do we lock out the Alert




   // Comment("timecurrent() ",TimeToStr(TimeCurrent(),TIME_SECONDS)," Lockout, ",TimeToStr(timeloc2,TIME_SECONDS)  );







本文标题:MT4指标:Chin Breakout Alert趋势线指标源码 - MT4平台MQL4编程学习


  • 编一个成功的EA全过程和所需注意事项

      从系统交易的观点看。从上到下形成交易策略思想比起从下到上形成交易策略思想有以下优点:   1. 有利于把握局部的挫折与全局的失败关系。   2. 有利于交易系统的风险控制。   3. 有利于对交易系统 的维护...

  • 外汇智能交易策略

      交易策略  所有的交易分类都是完全随意的。下面这种分类强调从交易的基本概念上分类  根据走势  根据走势的策略等待与所建仓位同方向的价位变化。这样,我们假设走势会保持这个方向变化。当根据走势交易...

  • MQL4基础:语法

    目录[hide] 注释 标识符 保留字 MQL4 的语法类似于C语言,除了以下这些特点:没有地址运算符; 没有 do &#8230; while 语句; 没有 goto &#8230; 语句; 没有 [条件][表达式 1]:[表达式 2] 语句; 没有复合数据...

  • 挂外汇EA需要什么样配置的电脑或服务器

    由于外汇EA需要24小时运行,所以需要稳定性强的电脑,不要运行着、运行着在关键时刻就死机了。 想想如果到了开仓信号出现时,电脑却死机了。或者是需要平仓时,电脑系统崩溃了。这是什么样的损失。 电脑的配置不要求高,但必...

  • 外汇智能交易MQL4语言教程(三)

    4.2. MetaQuotes 4 语言的指令结构4.2.1. 变量宣告和语句在计算过程中保存临时数据要求使用变量。变量在本程序的开头部分就用保留字、变量、排列和定义进行了叙述。他允许使用这些词语的负数形式,即 “ Variables,...