//+------------------------------------------------------------------+ //| Wiseman Horizon.mq4 | //| Bill Williams Wiseman Divergent bars | //| Copyright © 2007, GwadaTradeBoy | //| gwadatradeboy@yahoo.fr | //+------------------------------------------------------------------+ //| Author: David Thomas | //| MQ4 Conversion: Pavel Kulko | //| polk@alba.dp.ua | //+------------------------------------------------------------------+ //| Shape Drawing: GwadaTradeBoy | //| gwadatradeboy@yahoo.fr | //+------------------------------------------------------------------+ /*[[ Name := Wiseman 1 Author := David Thomas, Basileus@Moneytec Notes := Bill Williams Wiseman 1 Divergent bars. ver. 3. Notes := the changes of Basileus@Moneytec have been corrected and simplified. Separate Window := No First Color := LimeGreen First Draw Type := Histogram First Symbol := 217 Use Second Data := Yes Second Color := Red Second Draw Type := Histogram Second Symbol := 218 ]]*/ #property copyright "Copyright © 2007, GwadaTradeBoy" #property link "gwadatradeboy@yahoo.fr" #property copyright "David Thomas" #property link "Basileus@Moneytec" #property copyright "Copyright © 2005, Pavel Kulko" #property link "polk@alba.dp.ua" #define Buy "Buy" #define Sell "Sell" #property indicator_chart_window #property indicator_buffers 4 #property indicator_color1 GreenYellow #property indicator_color2 Red #property indicator_color3 Green #property indicator_color4 Red //---- Variables Externes extern int Method = 1; extern bool Debug = True; //---- Variables //--- Methode 1 int LastTradeTime; double PriceHighSell,PriceHighBuy,PriceLowSell,PriceLowBuy; int shift = 0; double prevbars = 0; bool first = True; double lips = 0; double teeth = 0; double loopbegin = 0; double median = 0; double jaws = 0; //--- Methode 2 int result, counted_bars, limit, i; int nShift; //---- Shapes extern int NumberOfDays = 50; //Ammener à disparaitre counted_bars extern color BuyColor = MediumAquamarine; extern color SellColor = Tomato; datetime DateTrade; datetime TimeBeginObject, TimeEndObject; datetime TimeBeginBuySignal, TimeBeginSellSignal, TimeEndBuySignal, TimeEndSellSignal; datetime TimeBeginBuyShape, TimeBeginSellShape, TimeEndBuyShape, TimeEndSellShape; double PriceHighObject, PriceLowObject; double ShapePriceHighSell,ShapePriceHighBuy,ShapePriceLowSell,ShapePriceLowBuy; double SignalPriceHighSell,SignalPriceHighBuy,SignalPriceLowSell,SignalPriceLowBuy; int BarBegin, BarEnd; //---- Buffers double ExtHistoBuffer[]; double ExtHistoBuffer2[]; double ExtMapBuffer3[]; double ExtMapBuffer4[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID); SetIndexBuffer(0, ExtHistoBuffer); SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID); SetIndexBuffer(1, ExtHistoBuffer2); //---- Styles et couleur des Fleches SetIndexStyle(2, DRAW_ARROW, 0, 1); // Fleche vers le haut SetIndexArrow(2, 233); SetIndexBuffer(2, ExtMapBuffer3); SetIndexStyle(3, DRAW_ARROW, 0, 1); // Fleche vers le bas SetIndexArrow(3, 234); SetIndexBuffer(3, ExtMapBuffer4); //--- Shapes /* Before Drawing Object, you have to Create It */ //DeleteObjects(); //for (int i=0; i<NumberOfDays; i++) for (i = Bars - 5 ;shift >= 0 ; shift--) { //CreateObjects("Buy"+shift, BuyColor); //CreateObjects("Sell"+shift, SellColor); ObjectDelete("Buy"+shift); ObjectDelete("Sell"+shift); } //---- switch(Period()) { case 1: nShift = 1; break; case 5: nShift = 3; break; case 15: nShift = 5; break; case 30: nShift = 10; break; case 60: nShift = 15; break; case 240: nShift = 20; break; case 1440: nShift = 80; break; case 10080: nShift = 100; break; case 43200: nShift = 200; break; } //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- for (i = Bars - 5 ;shift >= 0 ; shift--) { ObjectDelete("Buy"+shift); ObjectDelete("Sell"+shift); } //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { DateTrade = TimeCurrent(); //--- Methode 1 if (Method ==1) { // SetLoopCount(0); // check conditions are ok. if( Bars < 3 || Bars == prevbars ) return(0); // check for additional bars loading or total reloading if( Bars < prevbars || Bars-prevbars>1 ) first = True; prevbars = Bars; if( first ) { // loopbegin prevent counting of counted bars exclude current loopbegin = Bars-2; first = False; } // loop from first bar to current bar (with shift=0) for(shift=Bars-5;shift>=0 ;shift--) { result = 0; median = (High[shift]+Low[shift])/2; lips = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORLIPS, shift); teeth = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORTEETH, shift); jaws = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW, shift); //---- Test for BUY Signal Bar : test for bullish divergent bar : if( ((Close[shift] >= median) // close is in lower half of bar && (High[shift] < MathMin(MathMin(lips,teeth),jaws)) // bar is completely below alligator && (Low[shift] < Low[shift+1]) && (Low[shift] < Low[shift+2]) // low is moving down && (Low[shift] < Low[shift+3]) && (Low[shift] < Low[shift+4]) // ... && (iAO(NULL, 0, shift) < iAO(NULL, 0, shift+1)) // checking if it's right AO signal ) ) { result = 1; PriceHighBuy = High[shift]; PriceLowBuy = Low[shift]; } //---- Test for SELL Signal Bar : test for bearish divergent bar : if( ((Close[shift] <= median) // close is upper half of bar && (Low[shift] > MathMax(MathMax(lips,teeth),jaws)) // bar is completely above alligator && (High[shift] > High[shift+1]) && (High[shift] > High[shift+2]) // high is moving up && (High[shift] > High[shift+3]) && (High[shift] > High[shift+4]) // ... && (iAO(NULL, 0, shift) > iAO(NULL, 0, shift+1)) // checking if it's right AO signal ) ) { result = -1; PriceHighSell = High[shift]; PriceLowSell = Low[shift]; TimeBeginSellSignal = Time[shift]; } //---- // Portion de code ou il faudra chercher la validité du signal if(( result == 0 ) &&(High[shift]>PriceHighSell)) { PriceHighSell=0; PriceLowSell=0; //TimeEndSellSignal = TimeCurrent(); } if(( result == 0 ) &&(Low[shift]>PriceHighBuy)) { PriceHighBuy=0; PriceLowBuy=0; //TimeEndBuySignal = TimeCurrent(); } //---- BUY : GREEN bar. if(result > 0) { ExtHistoBuffer[shift] = PriceHighBuy; ExtHistoBuffer2[shift] = PriceLowBuy; ExtMapBuffer3[shift] = Low[shift] - nShift*Point; //---- First Parameters for the BUY Shape (TimeBeginBuyShape, ShapePriceHighBuy, ShapePriceLowBuy) TimeBeginBuyShape = TimeBeginBuySignal; ShapePriceHighBuy = PriceHighBuy; ShapePriceLowBuy = PriceLowBuy; } //---- SELL : RED bar. if(result < 0) { ExtHistoBuffer[shift] = PriceLowSell; ExtHistoBuffer2[shift] = PriceHighSell; ExtMapBuffer4[shift] = High[shift] + nShift*Point; //---- First Parameters for the SELL Shape (TimeBeginSellShape, ShapePriceHighSell, ShapePriceLowSell) TimeBeginSellShape = TimeBeginSellSignal; ShapePriceHighSell = PriceHighSell; ShapePriceLowSell = PriceLowSell; } //---- Test des conditions de validité du signal //--- Buy if ( (TimeCurrent() != TimeBeginBuySignal) //&& ( Ask < PriceHighBuy) ) //{ //if ( Ask < PriceHighBuy) //|| ( TimeEndBuyShape = Time[0]; else TimeEndBuyShape = Time[1]; //} //--- Sell if ( Bid < PriceLowSell) TimeEndSellShape = Time[0]; else TimeEndSellShape = Time[1]; //---- Dessin du rectangle //--- Buy //TimeEndBuyShape = TimeEndBuySignal; if (Debug) { Print("TimeBeginBuyShape ", TimeToStr(TimeBeginBuyShape,TIME_DATE|TIME_SECONDS)); Print("ShapePriceHighBuy ", ShapePriceHighBuy); Print("TimeEndBuyShape ", TimeToStr(TimeEndBuyShape,TIME_DATE|TIME_SECONDS)); Print("ShapePriceLowBuy ", ShapePriceLowBuy); } //DrawObjects(DateTrade, "Buy"+i, TimeBeginBuyShape, TimeEndBuyShape); //ObjectCreate("Buy"+shift, OBJ_RECTANGLE, 0, TimeBeginBuyShape, ShapePriceHighBuy, Time[0], ShapePriceLowBuy); ObjectCreate("Buy"+shift, OBJ_RECTANGLE, 0, TimeBeginBuyShape, ShapePriceHighBuy, TimeEndBuyShape, ShapePriceLowBuy); ObjectSet("Buy"+shift, OBJPROP_COLOR, BuyColor); //--- Sell TimeEndSellShape = TimeEndSellSignal; /* if (Debug) { Print("TimeBeginBuyShape ", TimeToStr(TimeBeginBuyShape,TIME_DATE|TIME_SECONDS)); Print("ShapePriceHighBuy ", ShapePriceHighBuy); Print("TimeEndBuyShape ", TimeToStr(TimeEndBuyShape,TIME_DATE|TIME_SECONDS)); Print("ShapePriceLowBuy ", ShapePriceLowBuy); } //DrawObjects(DateTrade, "Sell"+i, TimeBeginSellShape, TimeEndSellShape); ObjectCreate("Sell"+shift, OBJ_RECTANGLE, 0, TimeBeginSellShape, ShapePriceHighSell, TimeEndSellShape, ShapePriceLowSell); ObjectSet("Sell"+shift, OBJPROP_COLOR, SellColor); //---- /* DateTrade=decDateTradeDay(DateTrade); while (TimeDayOfWeek(DateTrade)>5) DateTrade=decDateTradeDay(DateTrade); */ } } //--- Methode 2 if (Method ==2) { counted_bars=IndicatorCounted(); limit = Bars-counted_bars-1; for(i=limit; i>=0; i--) { result = 0; median = (High[i]+Low[i])/2; if((Low[i] < Low[i+1]) && (Close[i] > median)) result = -1; if((High[i] > High[i+1]) && (Close[i] < median)) result = 1; //---- BUY : GREEN bar. if(result > 0) { ExtHistoBuffer[i] = Low[i]; ExtHistoBuffer2[i] = High[i]; TimeBeginBuyShape = TimeCurrent(); } //---- SELL : RED bar. if(result < 0) { ExtHistoBuffer[i] = High[i]; ExtHistoBuffer2[i] = Low[i]; TimeBeginSellShape = TimeCurrent(); } //---- Test des conditions de validité du signal /* //--- Buy if ( Ask < PriceHighBuy) TimeEndBuyShape = Time[0]; else TimeEndBuyShape = Time[1]; //--- Sell if ( Bid > PriceLowSell) TimeEndSellShape = Time[0]; else TimeEndSellShape = Time[1]; */ //---- Dessin du rectangle //--- Buy TimeBeginBuyShape = TimeBeginBuySignal; TimeEndBuyShape = TimeEndBuySignal; if (Debug) { Print("TimeBeginBuyShape ", TimeToStr(TimeBeginBuyShape,TIME_DATE|TIME_SECONDS)); Print("ShapePriceHighBuy ", ShapePriceHighBuy); Print("TimeEndBuyShape ", TimeToStr(TimeEndBuyShape,TIME_DATE|TIME_SECONDS)); Print("ShapePriceLowBuy ", ShapePriceLowBuy); } //DrawObjects(DateTrade, "Buy"+i, TimeBeginBuyShape, TimeEndBuyShape); ObjectCreate("Buy"+i, OBJ_RECTANGLE, 0, TimeBeginBuyShape, ShapePriceHighBuy, TimeEndBuyShape, ShapePriceLowBuy); ObjectSet("Buy"+i, OBJPROP_COLOR, BuyColor); //--- Sell TimeBeginSellShape = TimeBeginSellSignal; TimeEndSellShape = TimeEndSellSignal; /* if (Debug) { Print("TimeBeginBuyShape ", TimeBeginBuyShape); Print("ShapePriceHighBuy ", ShapePriceHighBuy); Print("TimeEndBuyShape ", TimeEndBuyShape); Print("ShapePriceLowBuy ", ShapePriceLowBuy); } //DrawObjects(DateTrade, "Sell"+i, TimeBeginSellShape, TimeEndSellShape); ObjectCreate("Sell"+i, OBJ_RECTANGLE, 0, TimeBeginSellShape, ShapePriceHighSell, Time[0], ShapePriceLowSell); ObjectSet("Sell"+i, OBJPROP_COLOR, SellColor); //---- /* DateTrade=decDateTradeDay(DateTrade); while (TimeDayOfWeek(DateTrade)>5) DateTrade=decDateTradeDay(DateTrade); */ } } //---- return(0); } //+------------------------------------------------------------------+ /* //---- IsNewBar bool NewBar() { dt = 0; if (dt != Time[0]) { dt = Time[0]; return(true); } return(false); } //---- CreateObjects void CreateObjects(string NameObject, color cl) { ObjectCreate(NameObject, OBJ_RECTANGLE, 0, 0, 0, 0, 0); ObjectSet(NameObject, OBJPROP_STYLE, STYLE_SOLID); ObjectSet(NameObject, OBJPROP_COLOR, cl); ObjectSet(NameObject, OBJPROP_BACK, True); } //---- DeleteObjects void DeleteObjects() { for (int i=0; i<NumberOfDays; i++) { ObjectDelete("Buy"+i); ObjectDelete("Sell"+i); } } //---- //void DrawObjects(datetime DateTrade, string NameObject, string TimeBegin, string TimeEnd) void DrawObjects(string NameObject, datetime TimeBegin, datetime TimeEnd) //void DrawObjects(string NameObject, string TimeBegin, string TimeEnd, double PriceHigh, double PriceLow) //void DrawObjects(string NameObject, datetime TimeBegin, datetime TimeEnd, double PriceHigh, double PriceLow) { // TimeBeginObject = StrToTime(TimeToStr(DateTrade, TIME_DATE)+" "+TimeBegin); // TimeEndObject = StrToTime(TimeToStr(DateTrade, TIME_DATE)+" "+TimeEnd); TimeBeginObject = TimeBegin; // TimeEndObject = TimeEnd; TimeEndObject = TimeCurrent(); BarBegin = iBarShift(NULL, 0, TimeBeginObject); BarEnd = iBarShift(NULL, 0, TimeEndObject); // PriceHighObject = High[iHighest(NULL, 0, MODE_HIGH, BarBegin - BarEnd, BarEnd)]; // PriceLowObject = Low [iLowest (NULL, 0, MODE_LOW , BarBegin - BarEnd, BarEnd)]; // Prendre les valeur High et Low de la barre signal, et ensuite faire une comparaisont avec les barres suivante PriceHighObject = High [BarBegin]; PriceLowObject = Low [BarBegin]; // PriceHighObject = PriceHigh; // PriceLowObject = PriceLow; if (Debug) { Print("TimeBeginObject ", TimeBeginObject); Print("PriceHighObject ", PriceHighObject); Print("TimeEndObject ", TimeEndObject); Print("PriceLowObject ", PriceLowObject); } //---- Dessin proprement parlé ObjectSet(NameObject, OBJPROP_TIME1 , TimeBeginObject); // type datetime ObjectSet(NameObject, OBJPROP_PRICE1, PriceHighObject); // type double ObjectSet(NameObject, OBJPROP_TIME2 , TimeEndObject); // type datetime ObjectSet(NameObject, OBJPROP_PRICE2, PriceLowObject); // type double } /*
Sample
Analysis
Market Information Used:
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
Series array that contains open time of each bar
Indicator Curves created:
Implements a curve of type DRAW_HISTOGRAM
Implements a curve of type DRAW_ARROW
Indicators Used:
Bill Williams Alligator
Bill Williams Awesome oscillator
Custom Indicators Used:
Order Management characteristics:
Other Features: