//+------------------------------------------------------------------+
//| TrendLines_Auto.mq4 |
//| Copyright © 2011, dken |
//| http://dken.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, dken"
#property link "http://dken.ru"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Black
extern string _s0="Íàñòðîéêè îáùèå";
extern bool Break=true;//ðèñóåì ñòðåëêè ñîãëàñíî ïðîáîþ èëè îòáîþ
extern bool Expand=true;// ðèñîâàòü ïî óìîë÷àíèþ ðàñøèðÿþùèåñÿ òðåóãîëüíèêè
extern bool UseAlert=true;
extern bool alertDebug=true;
extern bool alertSound=true;
extern bool alertMessage=false;
extern string fileSound="alert2.wav";
//öâåòà ëèíèé
extern string TrendUpName="TrendlineUp";
extern string TrendDnName="TrendlineDn";
extern color TrendUp=Blue;
extern color TrendDn=Red;
extern int otstup=0;//îòñòóï ñòðåëêè îò ñâå÷è pips
extern string _s1="Íàñòðîéêè ZZ";
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
double buy[],sell[],stop[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
// 2 áóôåðà äëÿ îòîáðàæåíèÿ ñòðåëîê
// áóôåð äëÿ õðàíåíèÿ ñòîïà
IndicatorShortName("Trend Lines Signal");
IndicatorBuffers(3);
SetIndexBuffer(0,buy);
SetIndexBuffer(1,sell);
SetIndexBuffer(2,stop);
SetIndexStyle(0,DRAW_ARROW);
SetIndexStyle(1,DRAW_ARROW);
SetIndexStyle(2,DRAW_NONE);
SetIndexArrow(0,233);//buy
SetIndexArrow(1,234);//sell
SetIndexLabel(0,"buy");
SetIndexLabel(1,"sell");
SetIndexLabel(2,"stop");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//óäàëèòü îáúåêòû
ObjectDelete(TrendUpName);
ObjectDelete(TrendDnName);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
ArrayInitialize(buy,EMPTY_VALUE);
ArrayInitialize(sell,EMPTY_VALUE);
ArrayInitialize(stop,EMPTY_VALUE);
//----
//ÇÇ îïðåäåëÿåì 2 ïîñëåäíèå âåðøèíêè è 2 íèçèíêè
// åñëè âåðøèíêè èäóò âíèç, òî ñòðîèì òðåíäîâóþ ëèíèþ, åñëè íåò, òî óäàëÿåì åå
// åñëè íèçèíêè èäóò ââåðõ òî ñòðîèì ëèíèþ, åñëè âíèç òî óäàëÿåì (îïöèîíàëüíî, äëÿ îïðåäåëåíèÿ ðàñøèðÿþùèõçñÿ òðåóãîëüíèêîâ
//êîãäà îïðåäåëèëè êóäà èäåò òðåíä, æäåì ïåðåñå÷åíèÿ è ñèãíàëèì êîãäà çàêðûëèñü âûøå à äî ýòîãî áûëè íèæå (low - close)
//ðèñóåì â ýòîé òî÷êå ñòðåëêó ñ îòñòóïîì îò ñâå÷êè íà Í ïóíêòîâ è ñîõðàíÿåì â ïàìÿòü òî÷êó äëÿ ñòîïà
//ñèãíàë ëîâèì îïöèîíàëüíî ëèáî íà ïðîáîé ëèáî íà îòáîé ïî óìîë÷àíèþ ïðîáîé
double zzUp1=0,zzUp2=0;
double zzDn1=0,zzDn2=0;
int iUp1,iUp2,iDn1,iDn2;
double zzCurrent=0,zzTmp;
int j=0,trend=0;
for(int i=0;i<Bars;i++){
zzTmp=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,i);//current
if(zzTmp>0.0 && j==0) {zzCurrent=zzTmp; j=1;}
if(zzTmp>0.0 && j==1 && zzTmp<zzCurrent && zzDn1==0) {zzDn1=zzTmp; j=2; iDn1=i; trend=-1;}
if(zzTmp>0.0 && j==1 && zzTmp>zzCurrent && zzUp1==0) {zzUp1=zzTmp; j=2; iUp1=i; trend=1; }
if(trend==-1){
if(zzTmp>0.0 && j==2 && zzTmp>zzDn1 && zzUp1==0) {zzUp1=zzTmp; iUp1=i; j=3;}
if(zzTmp>0.0 && j==3 && zzTmp<zzUp1 && zzDn2==0) {zzDn2=zzTmp; iDn2=i; j=4;}
if(zzTmp>0.0 && j==4 && zzTmp>zzDn2 && zzUp2==0) {zzUp2=zzTmp; iUp2=i; j=5; break;}
}
if(trend==1){
if(zzTmp>0.0 && j==2 && zzTmp<zzUp1 && zzDn1==0) {zzDn1=zzTmp; iDn1=i; j=3;}
if(zzTmp>0.0 && j==3 && zzTmp>zzDn1 && zzUp2==0) {zzUp2=zzTmp; iUp2=i; j=4;}
if(zzTmp>0.0 && j==4 && zzTmp<zzUp2 && zzDn2==0) {zzDn2=zzTmp; iDn2=i; j=5; break;}
}
}
if(zzUp1!=0.0 && zzUp2!=0.0 && zzDn1!=0.0 && zzDn2!=0.0){
if(zzUp2>zzUp1 || Expand){
if(ObjectFind(TrendDnName)==-1) {
if(ObjectCreate(TrendDnName,OBJ_TREND,0,iTime(NULL,0,iUp2),zzUp2,iTime(NULL,0,iUp1),zzUp1)){
ObjectSet(TrendDnName,OBJPROP_COLOR,TrendDn);
ObjectSet(TrendDnName,OBJPROP_WIDTH,2);
ObjectSet(TrendUpName,OBJPROP_RAY,TRUE);
}
}
else {
ObjectSet(TrendDnName,OBJPROP_TIME1,iTime(NULL,0,iUp2));
ObjectSet(TrendDnName,OBJPROP_PRICE1,zzUp2);
ObjectSet(TrendDnName,OBJPROP_TIME2,iTime(NULL,0,iUp1));
ObjectSet(TrendDnName,OBJPROP_PRICE2,zzUp1);
}
}
if(zzDn2<zzDn1 || Expand){
if(ObjectFind(TrendUpName)==-1) {
if(ObjectCreate(TrendUpName,OBJ_TREND,0,iTime(NULL,0,iDn2),zzDn2,iTime(NULL,0,iDn1),zzDn1)){
ObjectSet(TrendUpName,OBJPROP_COLOR,TrendUp);
ObjectSet(TrendUpName,OBJPROP_WIDTH,2);
ObjectSet(TrendUpName,OBJPROP_RAY,TRUE);
}
}
else {
ObjectSet(TrendUpName,OBJPROP_TIME1,iTime(NULL,0,iDn2));
ObjectSet(TrendUpName,OBJPROP_PRICE1,zzDn2);
ObjectSet(TrendUpName,OBJPROP_TIME2,iTime(NULL,0,iDn1));
ObjectSet(TrendUpName,OBJPROP_PRICE2,zzDn1);
}
}
//check cross
is_Signal(TrendUpName,iUp1,1,1);
is_Signal(TrendDnName,iDn1,1,-1);
if(buy[1]!=EMPTY_VALUE) doAlert("BUY",UseAlert,alertDebug,alertSound,alertMessage,false,false);
if(sell[1]!=EMPTY_VALUE) doAlert("SELL",UseAlert,alertDebug,alertSound,alertMessage,false,false);
}
}
//+------------------------------------------------------------------+
void is_Signal(string n,int ist,int ien,int trend){
for(int j=ien;j<=ist;j++){
double price=ObjectGetValueByShift(n,j);
if(price==0) break;
if(Break && trend==1 && iHigh(NULL,0,j)>price && iClose(NULL,0,j)<price){ sell[j]=iHigh(NULL,0,j+1)+otstup*Point; stop[j]=iHigh(NULL,0,j+1);}
if(Break && trend==-1 && iLow(NULL,0,j)<price && iClose(NULL,0,j)>price){ buy[j]=iLow(NULL,0,j+1)-otstup*Point; stop[j]=iLow(NULL,0,j+1);}
if(!Break && trend==-1 && iOpen(NULL,0,j)>price && iClose(NULL,0,j)<price) {sell[j]=iHigh(NULL,0,j+1)+otstup*Point; stop[j]=iHigh(NULL,0,j+1);}
if(!Break && trend==1 && iOpen(NULL,0,j)<price && iClose(NULL,0,j)>price){buy[j]=iLow(NULL,0,j+1)-otstup*Point; stop[j]=iLow(NULL,0,j+1);}
}
}
void doAlert(
string doWhat,
bool UseAlert=false,
bool alertDebug=false,
bool alertSound=false,
bool alertMessage=false,
bool alertMail=false,
bool alertPhone=false)
{
if(UseAlert==false) return;
//int pause=5*60;
static string previousAlert="nothing";
static datetime previousTime=0;
string message;
//----
if(Time[1]==previousTime) return ;
if (previousAlert!=doWhat || Time[1]!=previousTime)
{
previousAlert =doWhat;
previousTime =Time[1];
//----
string sPeriod="";
switch(Period()){
case PERIOD_M1: sPeriod="M1"; break;
case PERIOD_M5: sPeriod="M5"; break;
case PERIOD_M15: sPeriod="M15"; break;
case PERIOD_M30: sPeriod="M30"; break;
case PERIOD_H1: sPeriod="H1"; break;
case PERIOD_H4: sPeriod="H4"; break;
case PERIOD_D1: sPeriod="D1"; break;
case PERIOD_W1: sPeriod="W1"; break;
case PERIOD_MN1: sPeriod="MN1"; break;
}
//message= StringConcatenate(name," Period: ",sPeriod," signal is ",doWhat);
if (alertMessage) Alert(doWhat);
if (alertSound){ PlaySound(fileSound); }//"news.wav"
if (alertDebug) Print(doWhat);
if (alertMail) SendMail("signal",doWhat);
//if (alertPhone) SendMail("signal","Channel: ss7/89504991199\r\nCallerid: 3452230009\r\nMaxRetries: 100\r\nRetryTime: 120\r\nWaitTime: 50\r\nContext: alpari\r\nExtension: s\r\nPriority: 1\r\nArchive: Yes");
}
}//+-------------------------------------------------------------
Comments