Wiseman Horizon





//+------------------------------------------------------------------+
//|                                              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: