//+------------------------------------------------------------------+ //| 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 <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 top$=" "; //this is a string to convert the double top into a string string bottom$="."; //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()<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 Sleep(500); //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; //ObjectDelete("Vis1"); //ObjectCreate("Vis1",OBJ_TEXT,0,Time[x1],xx1);//lomin+(himax+lomin)/10); ObjectMove("Vis1",0,Time[x1],xx1); 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; //ObjectDelete("Vis2"); //ObjectCreate("Vis2",OBJ_TEXT,0,Time[x2],xx2);//himax-(himax+lomin)/10); ObjectSet("Vis2",OBJPROP_ANGLE, i/2); ObjectMove("Vis2",0,Time[x2],xx2); //ObjectSetText("Vis2","____________________________________________________________",10,"Arial",Red); //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); //ObjectDelete("Vis3"); //ObjectCreate("Vis3",OBJ_TEXT,0,Time[x3],xx3);//himax-(himax+lomin)/7); ObjectMove("Vis3",0,Time[x3],xx3); ObjectSet("Vis3",OBJPROP_ANGLE, i); ObjectSetText("Vis3","Visual",xxx3,"Arial",Purple); // 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); //ObjectDelete("Vis4"); //ObjectCreate("Vis4",OBJ_TEXT,0,Time[x4],xx4); ObjectMove("Vis4",0,Time[x4],xx4); ObjectSet("Vis4",OBJPROP_ANGLE, (720.0000000-i)/2); ObjectSetText("Vis4","Trader",xxx4,"Arial",Green); ObjectsRedraw(); //ObjectSet("Vis4",OBJPROP_TIME1, Time[x4]); //ObjectSet("Vis4",OBJPROP_PRICE1, xx4); xx3=3000.00234/720.2342; 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 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 (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. 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; top$ = NormalizeDouble(top,Digits); //--Let's find the decimal point to the top$ string. (we do this so we can truncate the string to shave off the extra zeros after the decimal point i=0; while (StringGetChar(top$,i)!=46 && i<10) i++; //trying to find the decimal point in the top$ string top$ = StringSubstr(top$,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: "+top$; } 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; bottom$ = NormalizeDouble(bottom,Digits); //--- The following is for trying to find the decimal point of the bottom$ string i=0; while (StringGetChar(bottom$,i)!=46 && i <10) i++; //trying to find the decimal point in the top$ string bottom$ = StringSubstr(bottom$,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: "+bottom$; } 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()," ",top$);} TopComment = top$+ " 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()," ",bottom$);} BottomComment =bottom$ + " 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); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains open time of each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains close prices for each bar
Indicator Curves created:
Implements a curve of type DRAW_LINE
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features:
It plays sound alerts
It issuies visual alerts to the screen