Sie sind auf Seite 1von 10

PriceChannel_Signal_v1.2.

mq4 |

//| Copyright © 2007-08, TrendLaboratory |

//| http://finance.groups.yahoo.com/group/TrendLaboratory |

//| E-mail: igorad2003@yahoo.co.uk |

//+------------------------------------------------------------------+

#property copyright "Copyright © 2007-08, TrendLaboratory"

#property link "http://finance.groups.yahoo.com/group/TrendLaboratory"

//---- indicator settings

#property indicator_chart_window

#property indicator_buffers 4

#property indicator_color1 Blue

#property indicator_color2 Red

#property indicator_color3 Blue

#property indicator_color4 Red

#property indicator_width1 1

#property indicator_width2 1

#property indicator_width3 1

#property indicator_width4 1

//---- indicator parameters

input int Length = 9; // Price Channel Period

input int Applied_Price = 0; // Applied Price:0-C,1-O,2-H,3-L,4-Median,5-Typical,6-Weighted

input double Risk = 3; // Risk Factor in units (0...10)

input int UseReEntry = 1; // Re-Entry Mode: 0-off,1-on

input int AlertMode = 1; // Alert Mode: 0-off,1-on

input int WarningMode = 1; // Warning Mode: 0-off,1-on

input string WarningSound = "alert2.wav";

//---- indicator buffers

double UpSignal[];
double DnSignal[];

double UpEntry[];

double DnEntry[];

double smax[];

double smin[];

double trend[];

bool UpTrendAlert=false, DownTrendAlert=false;

datetime prevTime;

//+------------------------------------------------------------------+

//| Custom indicator initialization function |

//+------------------------------------------------------------------+

int init()

string short_name;

//---- drawing settings

//IndicatorBuffers(7);

SetIndexStyle(0,DRAW_ARROW);

SetIndexArrow(0,108);

SetIndexStyle(1,DRAW_ARROW);

SetIndexArrow(1,108);

SetIndexStyle(2,DRAW_ARROW);

//SetIndexArrow(2,108);

SetIndexStyle(3,DRAW_ARROW);

//SetIndexArrow(3,108);

IndicatorDigits(MarketInfo(_Symbol,12));

//---- indicator short name

IndicatorShortName("PriceChannel_Signal("+Length+")");
SetIndexLabel(0,"UpSignal");

SetIndexLabel(1,"DnSignal");

SetIndexLabel(2,"UpRe-Entry");

SetIndexLabel(3,"DnRe-Entry");

SetIndexDrawBegin(0,Length);

SetIndexDrawBegin(1,Length);

SetIndexDrawBegin(2,Length);

SetIndexDrawBegin(3,Length);

//---- indicator buffers mapping

SetIndexBuffer(0,UpSignal);

SetIndexBuffer(1,DnSignal);

SetIndexBuffer(2,UpEntry);

SetIndexBuffer(3,DnEntry);

SetIndexBuffer(4,smax);

SetIndexBuffer(5,smin);

SetIndexBuffer(6,trend);

//---- initialization done

return(0);

//+------------------------------------------------------------------+

//| Custom indicator iteration function |

//+------------------------------------------------------------------+

int start()

int limit;

if(Bars<=Length) return(0);

int CountedBars=IndicatorCounted();

//---- check for possible errors


if (CountedBars<0) return(-1);

//---- last counted bar will be recounted

if (CountedBars>0) CountedBars--;

limit=Bars-CountedBars;

//----

for(int i=limit; i>=0; i--)

double price = iMA(NULL,0,1,0,0,Applied_Price,i);

double price1 = iMA(NULL,0,1,0,0,Applied_Price,i+1);

double price2 = iMA(NULL,0,1,0,0,Applied_Price,i+2);

double hi = High[iHighest(NULL,0,2,Length,i)];

double lo = Low[iLowest(NULL,0,1,Length,i)];

smax[i] = hi - (33-Risk)*(hi-lo)/100;

smin[i] = lo + (33-Risk)*(hi-lo)/100;

trend[i]=trend[i+1];

if ( price > smax[i]) trend[i]=1;

if ( price < smin[i]) trend[i]=-1;

if(trend[i]>0)

if (trend[i+1]<0)

UpSignal[i] = Low[i]-0.5*iATR(NULL,0,Length,i);

if(WarningMode > 0 && i == 0) PlaySound(WarningSound);

}
if (UseReEntry > 0 && price > smax[i] && price1 <= smax[i+1])

UpEntry[i] = Low[i]-0.5*iATR(NULL,0,Length,i);

if(WarningMode > 0 && i == 0) PlaySound(WarningSound);

else UpEntry[i] = EMPTY_VALUE;

DnSignal[i]=EMPTY_VALUE; DnEntry[i]=EMPTY_VALUE;

else

if(trend[i]<0)

if (trend[i+1]>0)

DnSignal[i] = High[i]+0.5*iATR(NULL,0,Length,i);

if(WarningMode > 0 && i == 0) PlaySound(WarningSound);

if (UseReEntry > 0 && price < smin[i] && price1 >= smin[i+1])

DnEntry[i] = High[i]+0.5*iATR(NULL,0,Length,i);

if(WarningMode > 0 && i == 0) PlaySound(WarningSound);

else DnEntry[i] = EMPTY_VALUE;

UpSignal[i]=EMPTY_VALUE; UpEntry[i]=EMPTY_VALUE;

//----------

if (i==0 && AlertMode > 0)

if (trend[i+1] > 0 && Volume[0]>0)


{

if (trend[i+2]<0 && !UpTrendAlert)

string Message = " "+_Symbol+" M"+Period()+": Signal for BUY";

Alert (Message);

UpTrendAlert=true; DownTrendAlert=false;

if (UseReEntry>0 && trend[i+2]>0 && price1 > smax[i+1] && price2 <= smax[i+2] &&
Time[i]!=prevTime)

Message = " "+_Symbol+" M"+Period()+": Re-Entry for BUY";

Alert (Message);

prevTime = Time[i];

else

if (trend[i+1] < 0 && Volume[0]>0)

if ( trend[i+2]>0 && !DownTrendAlert)

Message = " "+_Symbol+" M"+Period()+": Signal for SELL";

Alert (Message);

DownTrendAlert=true; UpTrendAlert=false;

if (UseReEntry>0 && trend[i+2]<0 && price1 < smin[i+1] && price2 >= smin[i+2] &&
Time[i]!=prevTime)

{
Message = " "+_Symbol+" M"+Period()+": Re-Entry for SELL";

Alert (Message);

prevTime = Time[i];

//---- done

return(0);

//+------------------------------------------------------------------+

//******************************************** Emulation
*******************************************

double Ask;

double Bid;

double Bars;

double Open[];

double Close[];

double High[];

double Low[];

datetime Time[];

long Volume[];

void Set_Values_to_variables()

MqlTick last_tick;

SymbolInfoTick(_Symbol,last_tick);

Ask=last_tick.ask;
Bid=last_tick.bid;

ArraySetAsSeries(Close,true);

CopyClose(_Symbol,_Period,0,Bars(_Symbol,_Period),Close);

ArraySetAsSeries(Open,true);

CopyOpen(_Symbol,_Period,0,Bars(_Symbol,_Period),Open);

ArraySetAsSeries(Low,true);

CopyLow(_Symbol,_Period,0,Bars(_Symbol,_Period),Low);

ArraySetAsSeries(High,true);

CopyHigh(_Symbol,_Period,0,Bars(_Symbol,_Period),High);

ArraySetAsSeries(Time,true);

CopyTime(_Symbol,_Period,0,Bars(_Symbol,_Period),Time);

ArraySetAsSeries(Volume,true);

CopyTickVolume(_Symbol,_Period,0,Bars(_Symbol,_Period),Volume);

void OnTick()

Set_Values_to_variables();

int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double
&open[], const double &high[],

const double &low[], const double &close[], const long &tick_volume[], const long &volume[],
const int &spread[])

Set_Values_to_variables();

void OnInit()

Set_Values_to_variables();
init();

ENUM_TIMEFRAMES TFMigrate(int tf)

switch(tf)

case 0: return(PERIOD_CURRENT);

case 1: return(PERIOD_M1);

case 5: return(PERIOD_M5);

case 15: return(PERIOD_M15);

case 30: return(PERIOD_M30);

case 60: return(PERIOD_H1);

case 240: return(PERIOD_H4);

case 1440: return(PERIOD_D1);

case 10080: return(PERIOD_W1);

case 43200: return(PERIOD_MN1);

case 2: return(PERIOD_M2);

case 3: return(PERIOD_M3);

case 4: return(PERIOD_M4);

case 6: return(PERIOD_M6);

case 10: return(PERIOD_M10);

case 12: return(PERIOD_M12);

case 16385: return(PERIOD_H1);

case 16386: return(PERIOD_H2);

case 16387: return(PERIOD_H3);

case 16388: return(PERIOD_H4);

case 16390: return(PERIOD_H6);

case 16392: return(PERIOD_H8);


case 16396: return(PERIOD_H12);

case 16408: return(PERIOD_D1);

case 32769: return(PERIOD_W1);

case 49153: return(PERIOD_MN1);

default: return(PERIOD_CURRENT);

Das könnte Ihnen auch gefallen