//+------------------------------------------------------------------+ //| Chin Breakout Alert.mq4 | //| Copyright © 2007, MetaQuotes Software Corp. | //| | //| Instructions for use | //| are in this video:http://www.youtube.com/watch?v=5Ds1BZl78xQ | //+------------------------------------------------------------------+ #property copyright "Chin Pip. Video instruction is@ youtube video below:" #property link "http://www.youtube.com/watch?v=5Ds1BZl78xQ" //---- #include //---- #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"); ObjectDelete("bottom"); ObjectDelete("Top Instruction"); ObjectDelete("Bottom Instruction"); ObjectDelete("Vis1"); ObjectDelete("Vis2"); ObjectDelete("Vis3"); ObjectDelete("Vis4"); //------------ SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); //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 lomin=WindowPriceMin(0); 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; xx1=WindowPriceMax(0); xx2=WindowPriceMin(0); Comment("winmax",WindowPriceMax(0), " xx1 ", xx1, " xx2 ", xx2, " xx3 ", xx3, " xx4 ", xx4); ObjectCreate("Vis1",OBJ_TEXT,0,Time[x1],xx1);//lomin+(himax+lomin)/10); ObjectCreate("Vis2",OBJ_TEXT,0,Time[x2],xx2);//himax-(himax+lomin)/10); ObjectCreate("Vis3",OBJ_TEXT,0,Time[x3],xx3);//himax-(himax+lomin)/7); ObjectCreate("Vis4",OBJ_TEXT,0,Time[x4],xx4); ObjectSetText("Vis1","____________________________________________________________",10,"Arial",Blue); //start at the middle and move towards the final location ObjectSetText("Vis2","____________________________________________________________",10,"Arial",Red); ObjectSetText("Vis3","Visual",30,"Arial",ForestGreen); ObjectSetText("Vis4","Trader",40,"Arial",ForestGreen); //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 i=0; 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(); ii=0; while (TimeCurrent()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 lomin=WindowPriceMin(0); //---- hi=High[iHighest(NULL,0,MODE_HIGH,windowbars*0.6,0)]; lo=Low[iLowest(NULL,0,MODE_LOW,windowbars*0.6,0)]; //---- hi5=High[iHighest(NULL,0,MODE_HIGH,15,0)]; lo5=Low[iLowest(NULL,0,MODE_LOW,15,0)]; //---- himax=WindowPriceMax(0); lomin=WindowPriceMin(0); //---- if (hi>himax) hi-=(hi+lo)/12; if (lolo5) lo=lo5; //if the scale is out of range, we just take the hi or low of the last 5 bars. //---- ObjectCreate("top",OBJ_HLINE,0,0,hi); ObjectSet("top",OBJPROP_COLOR,Blue); ObjectCreate("bottom",OBJ_HLINE,0,0,lo); ObjectSet("bottom",OBJPROP_COLOR,Red); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- ObjectDelete("top"); ObjectDelete("bottom"); ObjectDelete("Top Instruction"); ObjectDelete("Bottom Instruction"); ObjectDelete("Top Instruction2"); ObjectDelete("Bottom Instruction2"); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); //---- /* for (int akak =1 ; akak< 10; akak++) { for(int kkkk=1; kkkk<500000; ) kkkk++; Comment(akak); PlaySound("Alert2.wav"); kkkk=0; } */ 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; ii-=0.6; 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); ObjectSet("top",OBJPROP_COLOR,Blue); ObjectSet("bottom",OBJPROP_COLOR,Red); //this gets the price of the blue and red lines top=ObjectGet("top",OBJPROP_PRICE1); bottom=ObjectGet ("bottom",OBJPROP_PRICE1); if(top!=hi) { hi +=0.002932498*Point; topS=(string)NormalizeDouble(top,Digits); //--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 i=0; 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. { top=9999999; 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); } if(bottom!=lo) { lo +=0.001228398*Point; bottomS=(string)NormalizeDouble(bottom,Digits); //--- The following is for trying to find the decimal point of the bottomS string i=0; 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. { bottom=-9999999; 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) { PlaySound("Alert2.wav"); for(double asdfff =1;asdfff <1900.0239 ;) asdfff+=.91231; //a little pause while(TimeCurrent()<=timeloc) asdfff=0; //another little pause PlaySound("Alert.wav"); } 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) { PlaySound("Alert.wav"); for(double asdf =1;asdf <1200.0239 ;) asdf+=.91231; //a little pause while(TimeCurrent()<=timeloc) asdf=0; //another little pause PlaySound("Alert2.wav"); } 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) ); //---- return(0); } //+------------------------------------------------------------------+