[MT4指标]突破报警指标
主图指标
mt4指标类型:震荡指标
是否能用在mt4手机版上:否
是否含有未来函数:无
//+------------------------------------------------------------------+
//| 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=svbAXmkCTKE\"
#property link \"and 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;
extern bool Full_Voice_Support? = false;
extern string INSTURCTIONS____= \"The Above requires 20 additional Sound files.\";
//---- 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 asdf=-28347.23898,asdfff=-289349.832892;//couple of other counters
double iasdf=0; //just a counter. Probably not the most efficient way to use variables.
double sleep = 716.0989767; // this is an artificial sleep
double timecur = -1; //this is the time current for the pauses between movements
double timelock = -1;
double timelock2= -1;//this is a smaller lock out just for displaying the breech message
//double timelock3= -1;//this yet another time lock to make sure sounds are not piled up on each other. I probably could have been more efficient and just used one variable instead of 3.
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
string sym$ = \"nothing\"; //this is for the symbol();
int sym = -1; // this is going for case switch.
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 = TimeLocal();
ii=0;
while (TimeLocal()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;
}
*/
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if (Alert_on? == False)
{
ObjectDelete(\"Top Instruction\");
ObjectCreate(\"Top Instruction\",OBJ_LABEL,0,TimeLocal(),0);
ObjectSetText(\"Top Instruction\",\"Alert HAS been Turned OFF.\",10,\"Arial\",DodgerBlue);
ObjectSet(\"Top Instruction\",OBJPROP_YDISTANCE, 44);
ObjectSet(\"Top Instruction\",OBJPROP_XDISTANCE, 10);
ObjectSet(\"top\",OBJPROP_STYLE,STYLE_DASHDOT);
ObjectSet(\"top\",OBJPROP_COLOR,Yellow);
ObjectSet(\"bottom\",OBJPROP_STYLE,STYLE_DASHDOT);
ObjectSet(\"bottom\",OBJPROP_COLOR,Yellow);
return(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; //for any while loop or for loop, you want to give it two ways to break the loop (for safety).
while (StringGetChar(top$,i)!=46 && i<10) i+=1.01010101; //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 (TimeLocal()>timelock2) //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,TimeLocal(),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+=1.01010101; //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(TimeLocal()>timelock2)//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,TimeLocal(),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) && TimeLocal() > timelock && Alert_on? ==true)
{
timelock2=TimeLocal()+4.5; //this is a smaller lock out just for displaying the breech message
timelock= TimeLocal(); //done just for a slight pause
if (Pop_Up_Box == False && Full_Voice_Support? ==False) //if both of these choices are false, we default to just playing the sounds.
{
PlaySound(\"Alert2.wav\");
for (asdfff =-1.01012003 ; asdfff <1900.0239 ;) asdfff+=.91231; //a little pause
asdfff=0; //for a while loop, you always want to give it more than one way to break the loop.
while(TimeLocal()<=timelock && asdfff <990000000 ) asdfff+=1.01010101 ; //another little pause
PlaySound(\"Alert.wav\");
}
else
{
timelock = TimeLocal();
if (Full_Voice_Support? == true)
{
PlaySound(\"_upper.wav\");
asdfff=-10.2389; //always want to have a way to get out of the while loops. A redundancy to get out.
while(TimeLocal()<=timelock+2.9 && asdfff <990000000) asdfff+=1.01010101;
SoundFiles();
//(if pop up box is going to be shown, we need 3 seconds for the full voice to finish speaking.
if (Full_Voice_Support? == true) for(asdfff =0; asdfff <990000000 && TimeLocal()<=timelock+5.100; asdfff+=1.01010101) asdfff+=0; //if we get a pop up box, let\'s give them 2 seconds delay before we hit the full voice
//I have given this for loop two ways to break. Either when timelock is over or when loop is done.
}
if (Pop_Up_Box == true)
{
Alert(\"Upper Breech \",Symbol(),\" \",top$); //we will shoot an alert, but then go for a few seconds delay if full voice is on
}
}
TopComment = top$+ \" Breech!\";
ObjectSetText(\"Top Instruction\",TopComment,12,\"Arial\",DodgerBlue);
timelock = TimeLocal()+Time_Out; //how many seconds do we lock out the Alert
}
if (Close[0] <=NormalizeDouble(bottom,Digits) && TimeLocal() > timelock && Alert_on? ==true)
{
timelock2 = TimeLocal()+4.5;//this is a smaller lock out just for displaying the breech message
timelock = TimeLocal(); //just for a slight, unofficial pause
if (Pop_Up_Box == False && Full_Voice_Support? == False) //if both choices are false, we default to just playing the sound alone without pop box and no full voice support
{
PlaySound(\"Alert.wav\");
for (asdf =-0.02031 ; asdf <1200.0239 ;) asdf+=.91231; //a little pause
asdf=0;
while(TimeLocal()<=timelock && asdf < 990000000) asdf+=1.01010101; //another little pause
PlaySound(\"Alert2.wav\");
}
else
{
timelock = TimeLocal();
if (Full_Voice_Support? == true)
{
PlaySound(\"_lower.wav\");
asdf=0; //always want to have a way to get out of the while loops. A redundancy to get out.
while(TimeLocal()<=timelock+2.9 && asdf <990000000) asdf+=1.01010101;
SoundFiles();
//Comment(\"asdf \", asdf,\" asdfff \", asdfff,\" iasdf \",iasdf, \" i \", i, \" ii \",ii);
iasdf=0; //if the pop up box is going to be shown, let\'s give a few seconds for the full voice to finish up.
if (Pop_Up_Box == true) while(TimeLocal()<=timelock+4.99913400 && iasdf <990000000) iasdf+=1.01010101; //if we get a pop up box, let\'s give them 2 seconds delay before we hit the full voice
}
if (Pop_Up_Box == true)
{
Alert(\"Lower Breech \",Symbol(),\" \",bottom$);//we will shoot an alert, but then go for a few seconds delay if full voice is on
}
}
BottomComment =bottom$ + \" Breech!\";
ObjectSetText(\"Bottom Instruction\",BottomComment,12,\"Arial\",Red);
timelock = TimeLocal()+Time_Out; //how many seconds do we lock out the Alert
}
//for(asdfff=0;asdfff<99.293;asdfff +=1.020201021) asdfff+=0;
//while(asdf<99.299302 && asdfff <1000) asdf +=1.101001011;
// Comment(\"TimeLocal() \",TimeToStr(TimeLocal(),TIME_SECONDS),\" Lockout, \",TimeToStr(timelock2,TIME_SECONDS) );
//Comment(\"asdf \", asdf,\" asdfff \", asdfff,\" iasdf \",iasdf, \" i \", i, \" ii \",ii);
//----
return(0);
}
//+------------------------------------------------------------------+
int SoundFiles()
{
sym$=Symbol();
if (sym$== \"AUDCAD\" ) sym = 1 ;
if (sym$== \"AUDJPY\" ) sym = 2 ;
if (sym$== \"AUDUSD\" ) sym = 3 ;
if (sym$== \"CADJPY\" ) sym = 4 ;
if (sym$== \"CHFJPY\" ) sym = 5 ;
if (sym$== \"EURAUD\" ) sym = 6 ;
if (sym$== \"EURCAD\" ) sym = 7 ;
if (sym$== \"EURCHF\" ) sym = 8 ;
if (sym$== \"EURGBP\" ) sym = 9 ;
if (sym$== \"EURJPY\" ) sym = 10 ;
if (sym$== \"EURUSD\" ) sym = 11 ;
if (sym$== \"GBPCHF\" ) sym = 12 ;
if (sym$== \"GBPJPY\" ) sym = 13 ;
if (sym$== \"GBPUSD\" ) sym = 14 ;
if (sym$== \"NZDJPY\" ) sym = 15 ;
if (sym$== \"NZDUSD\" ) sym = 16 ;
if (sym$== \"USDCAD\" ) sym = 17 ;
if (sym$== \"USDCHF\" ) sym = 18 ;
if (sym$== \"USDJPY\" ) sym = 19 ;
switch(sym)
{
case 1:
PlaySound(\"AUDCAD.wav\");
break;
case 2:
PlaySound(\"AUDJPY.wav\");
break;
case 3:
PlaySound(\"AUDUSD.wav\");
break;
case 4:
PlaySound(\"CADJPY.wav\");
break;
case 5:
PlaySound(\"CHFJPY.wav\");
break;
case 6:
PlaySound(\"EURAUD.wav\");
break;
case 7:
PlaySound(\"EURCAD.wav\");
break;
case 8:
PlaySound(\"EURCHF.wav\");
break;
case 9:
PlaySound(\"EURGBP.wav\");
break;
case 10:
PlaySound(\"EURJPY.wav\");
break;
case 11:
PlaySound(\"EURUSD.wav\");
break;
case 12:
PlaySound(\"GBPCHF.wav\");
break;
case 13:
PlaySound(\"GBPJPY.wav\");
break;
case 14:
PlaySound(\"GBPUSD.wav\");
break;
case 15:
PlaySound(\"NZDJPY.wav\");
break;
case 16:
PlaySound(\"NZDUSD.wav\");
break;
case 17:
PlaySound(\"USDCAD.wav\");
break;
case 18:
PlaySound(\"USDCHF.wav\");
break;
case 19:
PlaySound(\"USDJPY.wav\");
break;
default:
if (Pop_Up_Box==false) Alert(\"Full Voice not supported for \",Symbol());
break;
}
return(0);
}