Indicators Used
2
Views
0
Downloads
0
Favorites
ChandelierExit_Candle
ÿþ//+------------------------------------------------------------------+
//| ChandelierExit_Candle.mq5 |
//| Copyright © 2009, MQLService |
//| scripts@mqlservice.com |
//+------------------------------------------------------------------+
//---- 02B>@AB2> 8=48:0B>@0
#property copyright "Copyright © 2009, MQLService"
#property link "scripts@mqlservice.com"
//---- =><5@ 25@A88 8=48:0B>@0
#property version "1.00"
//---- >B@8A>2:0 8=48:0B>@0 2 3;02=>< >:=5
#property indicator_chart_window
//---- 4;O @0AG5B0 8 >B@8A>2:8 8=48:0B>@0 8A?>;L7>20=> ?OBL 1CD5@>2
#property indicator_buffers 5
//---- 8A?>;L7>20=> 2A53> >4=> 3@0D8G5A:>5 ?>AB@>5=85
#property indicator_plots 1
//+----------------------------------------------+
//| 0@0<5B@K >B@8A>2:8 ;8=88 Sell StopLoss |
//+----------------------------------------------+
//---- 2 :0G5AB25 8=48:0B>@0 8A?>;L7>20=K F25B=K5 A25G8
#property indicator_type1 DRAW_COLOR_CANDLES
#property indicator_color1 clrMagenta,clrBrown,clrForestGreen,clrDarkTurquoise
//---- >B>1@065=85 <5B:8 8=48:0B>@0
#property indicator_label1 "ChandelierExitOpen;ChandelierExitHigh;ChandelierExitLow;ChandelierExitClose"
//+----------------------------------------------+
//| >1JO2;5=85 :>=AB0=B |
//+----------------------------------------------+
#define RESET 0 // :>=AB0=B0 4;O 2>72@0B0 B5@<8=0;C :><0=4K =0 ?5@5AGQB 8=48:0B>@0
//+----------------------------------------------+
//| 5@5G8A;5=85 4;O F5=>2>9 :>=AB0=BK |
//+----------------------------------------------+
enum ENUM_PRICE_MODE // "8? :>=AB0=BK
{
CLOSE_CLOSE= 1, //Close/Close
HIGH_LOW //High/low
};
//+----------------------------------------------+
//| E>4=K5 ?0@0<5B@K 8=48:0B>@0 |
//+----------------------------------------------+
input int RangePeriod=15;
input int Shift=1;
input int ATRPeriod=14;
input int MultipleATR=4;
input ENUM_PRICE_MODE PriceMode=CLOSE_CLOSE;
//+----------------------------------------------+
//---- >1JO2;5=85 48=0<8G5A:8E <0AA82>2, :>B>@K5 1C4CB 2 40;L=59H5< 8A?>;L7>20=K 2 :0G5AB25 8=48:0B>@=KE 1CD5@>2
double ExtOpenBuffer[];
double ExtHighBuffer[];
double ExtLowBuffer[];
double ExtCloseBuffer[];
double ExtColorBuffer[];
//---- 1JO2;5=85 F5;KE ?5@5<5==KE 4;O E5=4;>2 8=48:0B>@>2
int ATR_Handle;
//---- 1JO2;5=85 F5;KE ?5@5<5==KE =0G0;0 >BAGQB0 40==KE
int min_rates_total;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---- =8F80;870F8O ?5@5<5==KE =0G0;0 >BAGQB0 40==KE
min_rates_total=MathMax(ATRPeriod,RangePeriod+Shift);
//---- ?>;CG5=85 E5=4;0 8=48:0B>@0 ATR
ATR_Handle=iATR(NULL,0,ATRPeriod);
if(ATR_Handle==INVALID_HANDLE)
{
Print(" 5 C40;>AL ?>;CG8BL E5=4; 8=48:0B>@0 ATR");
return(INIT_FAILED);
}
//---- ?@52@0I5=85 48=0<8G5A:8E <0AA82>2 2 8=48:0B>@=K5 1CD5@K
SetIndexBuffer(0,ExtOpenBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ExtHighBuffer,INDICATOR_DATA);
SetIndexBuffer(2,ExtLowBuffer,INDICATOR_DATA);
SetIndexBuffer(3,ExtCloseBuffer,INDICATOR_DATA);
//---- ?@52@0I5=85 48=0<8G5A:>3> <0AA820 2 F25B>2>9, 8=45:A=K9 1CD5@
SetIndexBuffer(4,ExtColorBuffer,INDICATOR_COLOR_INDEX);
//---- 8=45:A0F8O M;5<5=B>2 2 1CD5@0E :0: 2 B09<A5@8OE
ArraySetAsSeries(ExtOpenBuffer,true);
ArraySetAsSeries(ExtHighBuffer,true);
ArraySetAsSeries(ExtLowBuffer,true);
ArraySetAsSeries(ExtCloseBuffer,true);
ArraySetAsSeries(ExtColorBuffer,true);
//---- 8=8F80;870F88 ?5@5<5==>9 4;O :>@>B:>3> 8<5=8 8=48:0B>@0
string shortname;
StringConcatenate(shortname,"ChandelierExit(",RangePeriod,", ",ATRPeriod,")");
//--- A>740=85 8<5=8 4;O >B>1@065=8O 2 >B45;L=>< ?>4>:=5 8 2> 2A?;K20NI59 ?>4A:07:5
IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//--- >?@545;5=85 B>G=>AB8 >B>1@065=8O 7=0G5=89 8=48:0B>@0
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- 7025@H5=85 8=8F80;870F88
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(
const int rates_total, // :>;8G5AB2> 8AB>@88 2 10@0E =0 B5:CI5< B8:5
const int prev_calculated,// :>;8G5AB2> 8AB>@88 2 10@0E =0 ?@54K4CI5< B8:5
const datetime &time[],
const double &open[],
const double& high[], // F5=>2>9 <0AA82 <0:A8<C<>2 F5=K 4;O @0AGQB0 8=48:0B>@0
const double& low[], // F5=>2>9 <0AA82 <8=8<C<>2 F5=K 4;O @0AGQB0 8=48:0B>@0
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[]
)
{
//---- ?@>25@:0 :>;8G5AB20 10@>2 =0 4>AB0B>G=>ABL 4;O @0AGQB0
if(BarsCalculated(ATR_Handle)<rates_total || rates_total<min_rates_total) return(RESET);
//---- >1JO2;5=8O ;>:0;L=KE ?5@5<5==KE
static int direction;
static double HH1,LL1;
int to_copy,limit,bar;
double ATR[],HH0,LL0,hi,lo,stop;
//---- @0AGQB AB0@B>2>3> =><5@0 limit 4;O F8:;0 ?5@5AGQB0 10@>2
if(prev_calculated>rates_total || prev_calculated<=0)// ?@>25@:0 =0 ?5@2K9 AB0@B @0AGQB0 8=48:0B>@0
{
limit=rates_total-1-min_rates_total; // AB0@B>2K9 =><5@ 4;O @0AGQB0 2A5E 10@>2
direction=0;
HH1=0;
LL1=999999999;
}
else limit=rates_total-prev_calculated; // AB0@B>2K9 =><5@ 4;O @0AGQB0 =>2KE 10@>2
//---- @0AGQB =5>1E>48<>3> :>;8G5AB20 :>?8@C5<KE 40==KE
to_copy=limit+1;
//---- :>?8@C5< 2=>2L ?>O282H85AO 40==K5 2 <0AA82 ATR[]
if(CopyBuffer(ATR_Handle,0,0,to_copy,ATR)<=0) return(RESET);
//---- 8=45:A0F8O M;5<5=B>2 2 <0AA820E :0: 2 B09<A5@8OE
ArraySetAsSeries(ATR,true);
ArraySetAsSeries(open,true);
ArraySetAsSeries(low,true);
ArraySetAsSeries(high,true);
ArraySetAsSeries(close,true);
//---- >A=>2=>9 F8:; @0AGQB0 8=48:0B>@0
for(bar=limit; bar>=0 && !IsStopped(); bar--)
{
ExtOpenBuffer[bar]=open[bar];
ExtHighBuffer[bar]=high[bar];
ExtLowBuffer[bar]=low[bar];
ExtCloseBuffer[bar]=close[bar];
ATR[bar]*=MultipleATR;
HH0=high[ArrayMaximum(high,bar+Shift,RangePeriod)]-ATR[bar];
LL0=low[ArrayMinimum(low,bar+Shift,RangePeriod)]+ATR[bar];
stop=close[bar];
if(PriceMode==CLOSE_CLOSE)
{
hi=close[bar+1];
lo=close[bar+1];
}
else
{
hi=high[bar+1];
lo=low[bar+1];
}
if(direction>=0)
{
if(hi<HH1)
{
if(bar) direction=-1;
stop=LL0;
}
else stop=HH0;
}
else
if(direction<=0)
{
if(lo>LL1)
{
if(bar) direction=+1;
stop=HH0;
}
else stop=LL0;
}
//----
if(stop<=close[bar])
{
if(close[bar]>=open[bar]) ExtColorBuffer[bar]=3;
else ExtColorBuffer[bar]=2;
}
//----
if(stop>=close[bar])
{
if(close[bar]<=open[bar]) ExtColorBuffer[bar]=0;
else ExtColorBuffer[bar]=1;
}
//----
if(bar)
{
HH1=HH0;
LL1=LL0;
}
}
//----
return(rates_total);
}
//+------------------------------------------------------------------+
Comments