FXI_Point&Figure-Adv





#property  copyright "Copyright © 2007, FXImpact"
#property  link "http://www.fximpact.com"

#property  indicator_separate_window
#property  indicator_buffers 8
#property  indicator_color1  Black
#property  indicator_color2  Lime
#property  indicator_color3  Lime
#property  indicator_color4  Yellow
#property  indicator_color5  Red
#property  indicator_color6  Red
#property  indicator_color7  Black
#property  indicator_color8  Black

//extern   string   pswd = "-- Please Input Password --";
//extern   string   Password = "";
extern   string   optns = "-- Options --";
extern   int      boxValue = 5;
extern   int      Multiply = 3;
extern   bool     ShowGrid = true;
extern   string   clrs = "-- Color Options --";
extern   color    ColorUp = Green;
extern   color    ColorDown = Red;
extern   color    PriceLevel = Red;
extern   color    GridColor = Gray;
bool     var_136 = false;
bool     var_140 = false;
bool     var_144 = true;
bool     var_148 = false;
bool     var_152 = false;
double   var_156 = 0;
double   var_164 = 0;
int      var_172 = 0;
int      var_176 = 0;
int      var_180 = 0;
double   arr_184[];
double   var_188 = 0;
bool     var_196 = true;
int      var_200 = 0;
int      var_204;
int      var_208;
int      var_212 = -1;
string   var_216;
int      FH;
int      var_228 = 0;
int      var_232 = 0;
double   arr_236[];
double   arr_240[];
double   var_244;
double   var_252;
double   arr_260[];
double   arr_264[];
double   arr_268[];
double   arr_272[];
double   arr_276[];
double   arr_280[];
int      var_284 = -1;
int      var_288;
bool     var_292 = false;

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

void drawPatterns(int i, int j)
{
double var_drawPatterns_8;
double var_drawPatterns_16;

if ((arr_236[i + 4] == arr_236[i + 2]) && (arr_236[i + 4] > arr_236[i + 3]) && (arr_236[i + 1] < arr_236[i + 2]))
   {
   if (isBufferEmpty(0,6,i))
      {
      arr_260[j + 5] = arr_236[i + 4];
      arr_260[j + 4] = arr_236[i + 4];
      arr_260[j + 3] = arr_236[i + 4];
      arr_260[j + 2] = arr_236[i + 4];
      arr_260[j + 1] = arr_236[i + 4];
      arr_260[j] = arr_236[i + 4];
      if (i == 0) doAlert("Triple Top","Look for a breakout above the resistance line",1,1);
      }
         else
      {
      if (var_232 == 0)
         {
         }
      }
   }

if ((arr_240[i + 4] == arr_240[i + 2]) && (arr_240[i + 4] < arr_240[i + 3]) && (arr_240[i + 1] > arr_240[i + 2]))
   {
   if (isBufferEmpty(1,6,i))
      {
      arr_272[j + 5] = arr_240[i + 4];
      arr_272[j + 4] = arr_240[i + 4];
      arr_272[j + 3] = arr_240[i + 4];
      arr_272[j + 2] = arr_240[i + 4];
      arr_272[j + 1] = arr_240[i + 4];
      arr_272[j] = arr_240[i + 4];
      if (i == 0) doAlert("Triple Bottom","Look for a breakout below the support line",2,0);
      }
         else
      {
      if (var_228 == 0)
         {
         }
      }
   }

if ((arr_236[i + 6] == arr_236[i + 4]) && (arr_236[i + 6] > arr_236[i + 5]) && (arr_236[i + 1] < arr_236[i + 5]) && (arr_236[i + 2] < arr_236[i + 4]))
   {
   if (isBufferEmpty(2,9,i))
      {
      arr_264[j + 7] = arr_236[i + 4];
      arr_264[j + 6] = arr_236[i + 4];
      arr_264[j + 5] = arr_236[i + 4];
      arr_264[j + 4] = arr_236[i + 4];
      arr_264[j + 3] = arr_236[i + 4];
      arr_264[j + 2] = arr_236[i + 4];
      arr_264[j + 1] = arr_236[i + 4];
      arr_264[j] = arr_236[i + 4];
      if (i == 0) doAlert("Spread Triple Top","Look for a breakout above the resistance line",3,1);
      }
         else
      {
      if (var_232 == 0)
         {
         }
      }
   }

if ((arr_240[i + 6] == arr_240[i + 4]) && (arr_240[i + 6] < arr_240[i + 5]) && (arr_240[i + 1] > arr_240[i + 5]) && (arr_240[i + 2] > arr_240[i + 4]))
   {
   if (isBufferEmpty(3,9,i))
      {
      arr_276[j + 7] = arr_240[i + 4];
      arr_276[j + 6] = arr_240[i + 4];
      arr_276[j + 5] = arr_240[i + 4];
      arr_276[j + 4] = arr_240[i + 4];
      arr_276[j + 3] = arr_240[i + 4];
      arr_276[j + 2] = arr_240[i + 4];
      arr_276[j + 1] = arr_240[i + 4];
      arr_276[j] = arr_240[i + 4];
      if (i == 0) doAlert("Spread Triple Bottom","Look for a breakout below the support line",4,0);
      }
         else
      {
      if (var_228 == 0)
         {
         }
      }
   }

if ((arr_236[i + 6] < arr_236[i + 4]) && (arr_236[i + 6] > arr_236[i + 5]) && (arr_236[i + 5] < arr_236[i + 4]) && (arr_236[i + 4] < arr_236[i + 2]) && (arr_236[i + 4] > arr_236[i + 3]) && (arr_236[i + 3] < arr_236[i + 2]) && (arr_236[i + 1] < arr_236[i + 2]) && ((arr_236[i + 4] - arr_236[i + 6]) / (boxValue * Point) <= 5))
   {
   var_drawPatterns_8 = (arr_236[i + 4] - arr_236[i + 6]) * 0.5;
   var_drawPatterns_16 = (arr_236[i + 2] - arr_236[i + 4]) * 0.5;
   if (var_drawPatterns_8 == var_drawPatterns_16)
      {
      if (isBufferEmpty(2,8,i))
         {
         arr_264[j + 7] = arr_236[i + 6];
         arr_264[j + 6] = arr_264[i + 7] + var_drawPatterns_8;
         arr_264[j + 5] = arr_264[i + 6] + var_drawPatterns_8;
         arr_264[j + 4] = arr_264[i + 5] + var_drawPatterns_8;
         arr_264[j + 3] = arr_264[i + 4] + var_drawPatterns_8;
         arr_264[j + 2] = arr_264[i + 3] + var_drawPatterns_8;
         arr_264[j + 1] = arr_264[i + 2] + var_drawPatterns_8;
         arr_264[j] = arr_264[i + 1] + var_drawPatterns_8;
         if (i == 0) doAlert("Bullish Resistance","Look for a breakout above the resistance line",5,1);
         }
            else
         {
         if (var_232 == 0)
            {
            }
         }
      }
   }

if ((arr_240[i + 6] > arr_240[i + 4]) && (arr_240[i + 6] < arr_240[i + 5]) && (arr_240[i + 5] > arr_240[i + 4]) && (arr_240[i + 4] > arr_240[i + 2]) && (arr_240[i + 4] < arr_240[i + 3]) && (arr_240[i + 3] > arr_240[i + 2]) && (arr_240[i + 1] > arr_240[i + 2]) && ((arr_240[i + 6] - arr_240[i + 4]) / (boxValue * Point) <= 5))
   {
   var_drawPatterns_8 = (arr_240[i + 6] - arr_240[i + 4]) * 0.5;
   var_drawPatterns_16 = (arr_240[i + 4] - arr_240[i + 2]) * 0.5;
   if (var_drawPatterns_8 == var_drawPatterns_16)
      {
      if (isBufferEmpty(3,8,i))
         {
         arr_276[j + 7] = arr_240[i + 6];
         arr_276[j + 6] = arr_276[i + 7] - var_drawPatterns_8;
         arr_276[j + 5] = arr_276[i + 6] - var_drawPatterns_8;
         arr_276[j + 4] = arr_276[i + 5] - var_drawPatterns_8;
         arr_276[j + 3] = arr_276[i + 4] - var_drawPatterns_8;
         arr_276[j + 2] = arr_276[i + 3] - var_drawPatterns_8;
         arr_276[j + 1] = arr_276[i + 2] - var_drawPatterns_8;
         arr_276[j] = arr_276[i + 1] - var_drawPatterns_8;
         if (i == 0) doAlert("Bearish Support","Look for a breakout below the support line",6,0);
         }
            else
         {
         if (var_228 == 0)
            {
            }
         }
      }
   }

if ((arr_236[i + 6] == arr_236[i + 5] + boxValue * Point) && (arr_236[i + 5] == arr_236[i + 4] + boxValue * Point) && (arr_236[i + 4] == arr_236[i + 3] + boxValue * Point) && (arr_236[i + 3] == arr_236[i + 2] + boxValue * Point) && (arr_236[i + 2] == arr_236[i + 1] + boxValue * Point))
   {
   if (isBufferEmpty(2,7,i))
      {
      arr_264[j + 6] = arr_236[i + 6];
      arr_264[j + 5] = arr_236[i + 5];
      arr_264[j + 4] = arr_236[i + 4];
      arr_264[j + 3] = arr_236[i + 3];
      arr_264[j + 2] = arr_236[i + 2];
      arr_264[j + 1] = arr_236[i + 1];
      arr_264[j] = arr_236[i + 1] - boxValue * Point;
      if (i == 0) doAlert("Stairstep Bullish Resistance","Look for a breakout above the resistance line",7,1);
      }
         else
      {
      if (var_232 == 0)
         {
         }
      }
   }

if ((arr_240[i + 6] + boxValue * Point == arr_240[i + 5]) && (arr_240[i + 5] + boxValue * Point == arr_240[i + 4]) && (arr_240[i + 4] + boxValue * Point == arr_240[i + 3]) && (arr_240[i + 3] + boxValue * Point == arr_240[i + 2]) && (arr_240[i + 2] + boxValue * Point == arr_240[i + 1]))
   {
   if (isBufferEmpty(3,7,i))
      {
      arr_276[j + 6] = arr_240[i + 6];
      arr_276[j + 5] = arr_276[i + 6] + boxValue * Point;
      arr_276[j + 4] = arr_276[i + 5] + boxValue * Point;
      arr_276[j + 3] = arr_276[i + 4] + boxValue * Point;
      arr_276[j + 2] = arr_276[i + 3] + boxValue * Point;
      arr_276[j + 1] = arr_276[i + 2] + boxValue * Point;
      arr_276[j] = arr_276[i + 1] + boxValue * Point;
      if (i == 0) doAlert("Stairstep Bullish Support","Look for a breakout below the support line",8,0);
      }
         else
      {
      if (var_228 == 0)
         {
         }
      }
   }

if ((arr_236[i + 2] - arr_240[i + 2] / (boxValue * Point) <= 7) && (arr_236[i + 6] == arr_236[i + 4]) && (arr_236[i + 6] > arr_236[i + 5]) && (arr_236[i + 5] < arr_236[i + 4]) && (arr_236[i + 4] > arr_236[i + 3]) && (arr_236[i + 4] < arr_236[i + 2]) && (arr_236[i + 3] < arr_236[i + 2]) && (arr_236[i + 2] > arr_236[i + 1]) && (arr_240[i + 2] < arr_240[i + 1]))
   {
   if (isBufferEmpty(0,4,i))
      {
      arr_260[i + 3] = arr_236[i + 2];
      arr_260[i + 2] = arr_236[i + 2];
      arr_260[i + 1] = arr_236[i + 2];
      arr_260[i] = arr_236[i + 2];
      if (i == 0) doAlert("Bullish Catapault","Look for a breakout above the resistance line",9,1);
      }
         else
      {
      if (var_232 == 0)
         {
         }
      }
   }

if ((arr_236[i + 2] - arr_240[i + 2] / (boxValue * Point) <= 7) && (arr_240[i + 6] == arr_240[i + 4]) && (arr_240[i + 6] > arr_240[i + 5]) && (arr_240[i + 5] < arr_240[i + 4]) && (arr_240[i + 4] > arr_240[i + 3]) && (arr_240[i + 4] < arr_240[i + 2]) && (arr_240[i + 3] < arr_240[i + 2]) && (arr_236[i + 2] > arr_236[i + 1]) && (arr_240[i + 2] < arr_240[i + 1]))
   {
   if (isBufferEmpty(1,4,i))
      {
      arr_272[i + 3] = arr_240[i + 2];
      arr_272[i + 2] = arr_240[i + 2];
      arr_272[i + 1] = arr_240[i + 2];
      arr_272[i] = arr_240[i + 2];
      if (i == 0) doAlert("Bearish Catapault","Look for a breakout below the support line",10,0);
      }
         else
      {
      if (var_228 == 0)
         {
         }
      }
   }

if ((arr_236[i + 4] > arr_236[i + 3]) && (arr_236[i + 3] > arr_236[i + 2]) && (arr_236[i + 2] > arr_236[i + 1]) && (arr_240[i + 4] < arr_240[i + 3]) && (arr_240[i + 3] < arr_240[i + 2]) && (arr_240[i + 2] < arr_240[i + 1]))
   {
   if (isBufferEmpty(2,5,i) && isBufferEmpty(3,5,i))
      {
      }
   }

if ((arr_236[i + 6] > arr_236[i + 5]) && (arr_236[i + 5] < arr_236[i + 4]) && (arr_236[i + 6] == arr_236[i + 4]) && (arr_236[i + 4] == arr_236[i + 2]) && (arr_236[i + 5] == arr_236[i + 3]) && (arr_236[i + 3] == arr_236[i + 1]) && (arr_240[i + 6] < arr_240[i + 5]) && (arr_240[i + 5] < arr_240[i + 4]) && (arr_240[i + 4] < arr_240[i + 3]) && (arr_240[i + 3] < arr_240[i + 2]) && (arr_240[i + 2] < arr_240[i + 1]) && (arr_240[i + 1] < arr_240[i]))
   {
   if ((arr_260[i + 8] == EMPTY_VALUE) && (arr_276[i + 7] == EMPTY_VALUE))
      {
      arr_260[i + 7] = arr_236[i + 6];
      arr_260[i + 6] = arr_236[i + 6];
      arr_260[i + 5] = arr_236[i + 6];
      arr_260[i + 4] = arr_236[i + 6];
      arr_260[i + 3] = arr_236[i + 6];
      arr_260[i + 2] = arr_236[i + 6];
      arr_260[i + 1] = arr_236[i + 6];
      arr_260[i] = arr_236[i + 6];
      arr_276[i + 6] = arr_240[i + 6];
      arr_276[i + 5] = arr_240[i + 5];
      arr_276[i + 4] = arr_240[i + 4];
      arr_276[i + 3] = arr_240[i + 3];
      arr_276[i + 2] = arr_240[i + 2];
      arr_276[i + 1] = arr_240[i + 1];
      arr_276[i] = arr_240[i];
      if (i == 0) doAlert("Ascending Triangle","Look for a breakout above the resistance line",12,1);
      }
         else
      {
      if (var_232 == 0)
         {
         }
      }
   }

if ((arr_240[i + 6] < arr_240[i + 5]) && (arr_240[i + 6] == arr_240[i + 4]) && (arr_240[i + 4] == arr_240[i + 2]) && (arr_240[i + 5] == arr_240[i + 3]) && (arr_240[i + 3] == arr_240[i + 1]) && (arr_236[i + 6] > arr_236[i + 5]) && (arr_236[i + 5] > arr_236[i + 4]) && (arr_236[i + 4] > arr_236[i + 3]) && (arr_236[i + 3] > arr_236[i + 2]) && (arr_236[i + 2] > arr_236[i + 1]) && (arr_236[i + 1] > arr_236[i]))
   {
   var_drawPatterns_8 = (arr_236[i + 5] - arr_236[i + 3]) * 0.5;
   var_drawPatterns_16 = (arr_236[i + 3] - arr_236[i + 1]) * 0.5;
   if ((arr_264[i + 7] == EMPTY_VALUE) && (arr_272[i + 8] == EMPTY_VALUE) && (var_drawPatterns_8 == var_drawPatterns_16))
      {
      arr_264[i + 5] = arr_236[i + 6];
      arr_264[i + 4] = arr_260[i + 5] - var_drawPatterns_8;
      arr_264[i + 3] = arr_260[i + 4] - var_drawPatterns_8;
      arr_264[i + 2] = arr_260[i + 3] - var_drawPatterns_8;
      arr_264[i + 1] = arr_260[i + 2] - var_drawPatterns_8;
      arr_264[i] = arr_260[i + 1] - var_drawPatterns_8;
      arr_272[i + 6] = arr_240[i + 6];
      arr_272[i + 5] = arr_240[i + 6];
      arr_272[i + 4] = arr_240[i + 6];
      arr_272[i + 3] = arr_240[i + 6];
      arr_272[i + 2] = arr_240[i + 6];
      arr_272[i + 1] = arr_240[i + 6];
      arr_272[i] = arr_240[i];
      if (i == 0) doAlert("Decending Triangle","Look for a breakout below the support line",13,0);
      }
         else
      {
      if (var_228 == 0)
         {
         }
      }
   }

if ((arr_236[i + 4] < arr_236[i + 2]) && (arr_236[i + 4] > arr_236[i + 3]) && (arr_236[i + 4] == arr_236[i + 1]) && (arr_236[i + 1] < arr_236[i + 2]))
   {
   if (isBufferEmpty(0,4,i))
      {
      arr_260[i + 3] = arr_236[i + 2];
      arr_260[i + 2] = arr_236[i + 2];
      arr_260[i + 1] = arr_236[i + 2];
      arr_260[i] = arr_236[i + 2];
      if (i == 0) doAlert("Ascending Triple Top","Look for a breakout above the resistance line",14,1);
      }
         else
      {
      if (var_232 == 0)
         {
         }
      }
   }

if ((arr_240[i + 4] > arr_236[i + 2]) && (arr_240[i + 4] < arr_236[i + 3]) && (arr_240[i + 4] == arr_240[i + 1]) && (arr_240[i + 1] > arr_240[i + 2]))
   {
   if (isBufferEmpty(1,6,i))
      {
      arr_272[i + 3] = arr_240[i + 2];
      arr_272[i + 2] = arr_240[i + 2];
      arr_272[i + 1] = arr_240[i + 2];
      arr_272[i] = arr_240[i + 2];
      if (i == 0) doAlert("Decending Triple Bottom","Look for a breakout below the support line",15,0);
      }
         else
      {
      if (var_228 == 0)
         {
         }
      }
   }
}

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

bool isBufferEmpty(int code, int max, int j)
{
int i;

switch (code)
   {
   case 0:
      for (i = 0; i <= max; i++)
         {
         if (arr_260[j + i] != EMPTY_VALUE) return(false);
         }
      return(true);
      break;
   case 1:
      for (i = 0; i <= max; i++)
         {
         if (arr_272[j + i] != EMPTY_VALUE) return(false);
         }
      return(true);
      break;
   case 2:
      for (i = 0; i <= max; i++)
         {
         if (arr_264[j + i] != EMPTY_VALUE) return(false);
         }
      return(true);
      break;
   case 3:
      for (i = 0; i <= max; i++)
         {
         if (arr_276[j + i] != EMPTY_VALUE) return(false);
         }
      return(true);
      break;
   case 4:
      for (i = 0; i <= max; i++)
         {
         if (arr_268[j + i] != EMPTY_VALUE) return(false);
         }
      return(true);
      break;
   case 5:
      for (i = 0; i <= max; i++)
         {
         if (arr_280[j + i] != EMPTY_VALUE) return(false);
         }
      return(true);
   }
}

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

void createHighLow(int code)
{
if (code != 0)
   {
   for (int i = var_208 - 5; i >= 0; i--)
      {
      if (arr_184[i + 1] < arr_184[i])
         {
         arr_236[i] = arr_184[i];
         arr_240[i] = arr_184[i + 1];
         }
      if (arr_184[i + 1] > arr_184[i])
         {
         arr_236[i] = arr_184[i + 1] - boxValue * Point;
         arr_240[i] = arr_184[i] - boxValue * Point;
         }
      }
   for (int j = var_208; j >= 0; j--)
      {
      drawPatterns(j,j);
      }
   }
      else
   {
   if (arr_184[code + 1] < arr_184[code])
      {
      arr_236[code] = arr_184[code];
      arr_240[code] = arr_184[code + 1];
      }
   if (arr_184[code + 1] > arr_184[code])
      {
      arr_236[code] = arr_184[code + 1] - boxValue * Point;
      arr_240[code] = arr_184[code] - boxValue * Point;
      }
   drawPatterns(0,0);
   }
}

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

void doAlert(string name, string descr, int inp_doAlert_16, int code)
{
if (code == 0) var_228 = inp_doAlert_16;
if (code == 1) var_232 = inp_doAlert_16;
Alert(Symbol() + " -- " + name + " Detected -- " + descr);
}

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

void doArrows(string descr, double price)
{
string type;

var_284++;
if (price == Bid)
   {
   type = "SELL";
   ObjectCreate("ArrowShort_" + var_212 + "_" + var_284,OBJ_ARROW,var_212,Time[0],arr_236[0] + boxValue * Point * 2);
   ObjectSet("ArrowShort_" + var_212 + "_" + var_284,OBJPROP_ARROWCODE,234);
   ObjectSet("ArrowShort_" + var_212 + "_" + var_284,OBJPROP_COLOR,Red);
   ObjectSet("ArrowShort_" + var_212 + "_" + var_284,OBJPROP_WIDTH,2);
   var_228 = 0;
   }

if (price == Ask)
   {
   type = "BUY";
   ObjectCreate("ArrowLong_" + var_212 + "_" + var_284,OBJ_ARROW,var_212,Time[0],arr_240[0] - boxValue * Point * 2);
   ObjectSet("ArrowLong_" + var_212 + "_" + var_284,OBJPROP_ARROWCODE,233);
   ObjectSet("ArrowLong_" + var_212 + "_" + var_284,OBJPROP_COLOR,Green);
   ObjectSet("ArrowLong_" + var_212 + "_" + var_284,OBJPROP_WIDTH,2);
   var_232 = 0;
   }
Alert(Symbol() + " -- " + descr + " Confirmed -- " + type + " at " + price);
}

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

int init()
{
var_288 = Bars;
SetIndexStyle(0,DRAW_NONE);
SetIndexDrawBegin(0,0);
SetIndexBuffer(0,arr_184);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,3);
SetIndexDrawBegin(1,0);
SetIndexBuffer(1,arr_260);
SetIndexLabel(1,"Resistance 1");
SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,3);
SetIndexDrawBegin(2,0);
SetIndexBuffer(2,arr_264);
SetIndexLabel(2,"Resistance 2");
SetIndexStyle(3,DRAW_LINE,STYLE_SOLID,3);
SetIndexDrawBegin(3,0);
SetIndexBuffer(3,arr_268);
SetIndexLabel(3,"Resistance 3");
SetIndexStyle(4,DRAW_LINE,STYLE_SOLID,3);
SetIndexDrawBegin(4,0);
SetIndexBuffer(4,arr_272);
SetIndexLabel(4,"Support 1");
SetIndexStyle(5,DRAW_LINE,STYLE_SOLID,3);
SetIndexDrawBegin(5,0);
SetIndexBuffer(5,arr_276);
SetIndexLabel(5,"Support 2");
SetIndexStyle(6,DRAW_NONE);
SetIndexDrawBegin(6,0);
SetIndexBuffer(6,arr_240);
SetIndexLabel(6,"Low");
SetIndexStyle(7,DRAW_NONE);
SetIndexDrawBegin(7,0);
SetIndexBuffer(7,arr_236);
SetIndexLabel(7,"High");
IndicatorShortName("Point and Figure (" + boxValue + "," + Multiply + ") | ForexImpact.com");

/*FH = FileOpen("pf.csv",FILE_CSV|FILE_READ);
if (FH < 1)
   {
   var_140 = chkPass(Password);
   if (var_140 == true)
      {
      Alert("Incorrect Password");
      }
         else
      {
      FH = FileOpen("pf.csv",FILE_WRITE,8);
      if (FH < 1)
         {
         Print("Cannot open password cache!");
         return(0);
         }
      FileWrite(FH,Password);
      FileClose(FH);
      return(0);
      }
   }
      else
   {
   string psw = FileReadString(FH);
   FileClose(FH);
   var_140 = chkPass(psw);
   if (var_140 == true)
      {
      var_140 = chkPass(Password);
      if (var_140 == true)
         {
         Alert("Password has expired, please input new password");
         FileDelete("pf.csv");
         }
      }
   }*/
}

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

int deinit()
{
ObjectsDeleteAll(var_212);
return(0);
}

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

void moveToFront(int limit)
{
int    var_moveToFront_4;
int    time1;
int    time2;
int    shift1;
int    shift2;
int    var_moveToFront_24;
int    i;
int    j;
int    k;

var_moveToFront_4 = var_200;
for (i = 0; i <= var_180; i++)
   {
   time1 = ObjectGet("BodyX" + var_212 + "_" + i,OBJPROP_TIME1);
   time2 = ObjectGet("BodyX" + var_212 + "_" + i,OBJPROP_TIME2);
   shift1 = iBarShift(NULL,0,time1);
   shift2 = iBarShift(NULL,0,time2);
   ObjectSet("BodyX" + var_212 + "_" + i,OBJPROP_TIME1,iTime(NULL,0,shift1 - var_moveToFront_4));
   ObjectSet("BodyX" + var_212 + "_" + i,OBJPROP_TIME2,iTime(NULL,0,shift2 - var_moveToFront_4));
   ObjectSet("BodyXO" + var_212 + "_" + i,OBJPROP_TIME1,iTime(NULL,0,shift1 - var_moveToFront_4));
   ObjectSet("BodyXO" + var_212 + "_" + i,OBJPROP_TIME2,iTime(NULL,0,shift2 - var_moveToFront_4));
   if ((iTime(NULL,0,shift1 - var_moveToFront_4) == 0) || (iTime(NULL,0,shift2 - var_moveToFront_4) == 0)) var_292 = true;
   }

for (j = var_284; j >= 0; j--)
   {
   time1 = ObjectGet("ArrowShort_" + var_212 + "_" + j,OBJPROP_TIME1);
   time2 = ObjectGet("ArrowLong_" + var_212 + "_" + j,OBJPROP_TIME1);
   shift1 = iBarShift(NULL,0,time1);
   shift2 = iBarShift(NULL,0,time2);
   ObjectSet("ArrowShort_" + var_212 + "_" + j,OBJPROP_TIME1,iTime(NULL,0,shift1 - 1));
   ObjectSet("ArrowLong_" + var_212 + "_" + j,OBJPROP_TIME1,iTime(NULL,0,shift2 - 1));
   if ((iTime(NULL,0,shift1 - 1) == 0) || (iTime(NULL,0,shift2 - 1) == 0)) var_292 = true;
   Print("Current Coord Long : ",time1);
   Print("Current Coord Short : ",time2);
   }

var_moveToFront_24 = 0;
if (var_196)
   {
   var_196 = false;
   var_208 = limit - var_176;
   for (k = var_176; k <= limit; k++)
      {
      arr_184[var_moveToFront_24] = arr_184[k];
      var_moveToFront_24++;
      }
   }
}

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

void moveAllBack()
{
int var_moveAllBack_0;
int time1;
int time2;
int shift1;
int shift2;
int var_moveAllBack_20;
int i;
int j;

var_moveAllBack_0 = var_200;
for (i = var_180; i >= 0; i--)
   {
   time1 = ObjectGet("BodyX" + var_212 + "_" + i,OBJPROP_TIME1);
   time2 = ObjectGet("BodyX" + var_212 + "_" + i,OBJPROP_TIME2);
   shift1 = iBarShift(NULL,0,time1);
   shift2 = iBarShift(NULL,0,time2);
   ObjectSet("BodyX" + var_212 + "_" + i,OBJPROP_TIME1,iTime(NULL,0,shift1 + 1));
   ObjectSet("BodyX" + var_212 + "_" + i,OBJPROP_TIME2,iTime(NULL,0,shift2 + 1));
   ObjectSet("BodyXO" + var_212 + "_" + i,OBJPROP_TIME1,iTime(NULL,0,shift1 + 1));
   ObjectSet("BodyXO" + var_212 + "_" + i,OBJPROP_TIME2,iTime(NULL,0,shift2 + 1));
   if ((iTime(NULL,0,shift1 + 1) == 0) || (iTime(NULL,0,shift2 + 1) == 0)) var_292 = true;
   }

for (j = var_208; j >= 0; j--)
   {
   arr_184[j + 1] = arr_184[j];
   arr_260[j + 1] = arr_260[j];
   arr_264[j + 1] = arr_264[j];
   arr_272[j + 1] = arr_272[j];
   arr_276[j + 1] = arr_276[j];
   arr_236[j + 1] = arr_236[j];
   arr_240[j + 1] = arr_240[j];
   }

arr_260[0] = EMPTY_VALUE;
arr_264[0] = EMPTY_VALUE;
arr_268[0] = EMPTY_VALUE;
arr_272[0] = EMPTY_VALUE;
arr_276[0] = EMPTY_VALUE;
}

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

int drawNewX(double price, int shift)
{
if (var_176 < 0) var_176 = 0;

ObjectCreate("BodyXO" + var_212 + "_" + var_180,OBJ_RECTANGLE,var_212,Time[var_176],price,Time[var_176 + 1],price + boxValue * Point);
ObjectSet("BodyXO" + var_212 + "_" + var_180,OBJPROP_STYLE,STYLE_SOLID);
ObjectSet("BodyXO" + var_212 + "_" + var_180,OBJPROP_BACK,1);
ObjectSet("BodyXO" + var_212 + "_" + var_180,OBJPROP_COLOR,ColorUp);
ObjectCreate("BodyX" + var_212 + "_" + var_180,OBJ_RECTANGLE,var_212,Time[var_176],price,Time[var_176 + 1],price + boxValue * Point);
ObjectSet("BodyX" + var_212 + "_" + var_180,OBJPROP_STYLE,STYLE_SOLID);
ObjectSet("BodyX" + var_212 + "_" + var_180,OBJPROP_BACK,0);
ObjectSet("BodyX" + var_212 + "_" + var_180,OBJPROP_COLOR,Blue);
var_180++;
}

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

int drawNewO(double price, int shift)
{
if (var_176 < 0) var_176 = 0;

ObjectCreate("BodyXO" + var_212 + "_" + var_180,OBJ_RECTANGLE,var_212,Time[var_176],price,Time[var_176 + 1],price - boxValue * Point);
ObjectSet("BodyXO" + var_212 + "_" + var_180,OBJPROP_STYLE,STYLE_SOLID);
ObjectSet("BodyXO" + var_212 + "_" + var_180,OBJPROP_BACK,1);
ObjectSet("BodyXO" + var_212 + "_" + var_180,OBJPROP_COLOR,ColorDown);
ObjectCreate("BodyX" + var_212 + "_" + var_180,OBJ_RECTANGLE,var_212,Time[var_176],price,Time[var_176 + 1],price - boxValue * Point);
ObjectSet("BodyX" + var_212 + "_" + var_180,OBJPROP_STYLE,STYLE_SOLID);
ObjectSet("BodyX" + var_212 + "_" + var_180,OBJPROP_BACK,0);
ObjectSet("BodyX" + var_212 + "_" + var_180,OBJPROP_COLOR,Blue);
var_180++;
}

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

int doReversal(int code, int shift)
{
double price;

if (var_176 < 0) var_176 = 0;

if (code == 0)
   {
   if (shift == 0) price = Bid; else price = High[shift];
   while (price > var_156 + boxValue * Point)
      {
      drawNewX(var_156,shift);
      var_156 = var_156 + boxValue * Point;
      arr_184[var_176] = var_156;
      }
   }

if (code == 1)
   {
   if (shift == 0) price = Bid; else price = Low[shift];
   while (price < var_156 - boxValue * Point)
      {
      var_156 = var_156 - boxValue * Point;
      drawNewO(var_156,shift);
      arr_184[var_176] = var_156;
      }
   }
}

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

int start()
{
int    counted_bars;
double var_start_4;
int    var_start_12;
int    var_start_16;
int    var_start_20;
int    var_start_24;
int    var_start_28;
int    limit;
int    i;
int    j;
double var_start_44;
double var_start_52;
double var_start_60;
int    k;

//if (var_140) return(0);

counted_bars = IndicatorCounted();
var_start_4 = boxValue * Point;
var_start_28 = 0;

limit = Bars - counted_bars;
if (limit > 0) limit--;
if (limit < 0) limit = 0;

var_212 = WindowFind("Point and Figure (" + boxValue + "," + Multiply + ") | ForexImpact.com");
if (var_212 == -1)
   {
   Alert("Can not select window with name \"Point and Figure (\"" + boxValue + "," + Multiply + ")\"! ");
   var_140 = true;
   return(0);
   }

if (var_196)
   {
   ObjectsDeleteAll(var_212);
   ObjectCreate("priceLine_" + var_212,OBJ_HLINE,var_212,0,Time[0],0,0);
   ObjectSet("priceLine_" + var_212,OBJPROP_PRICE1,Bid);
   ObjectSet("priceLine_" + var_212,OBJPROP_COLOR,PriceLevel);
   }

if (!var_196)
   {
   var_176 = 0;
   ObjectSet("priceLine_" + var_212,OBJPROP_PRICE1,Bid);
   if (var_292)
      {
      var_292 = false;
      var_288 = Bars - 5;
      }
   if ((MathAbs(var_288 - Bars) >= 2) && (var_204 > 0))
      {
      var_288 = Bars;
      Print("More than one bar fed to indicator -- ",Symbol());
      Print("Reloading indicator -- ",Symbol());
      ObjectsDeleteAll(var_212);
      ArrayInitialize(arr_260,EMPTY_VALUE);
      ArrayInitialize(arr_264,EMPTY_VALUE);
      ArrayInitialize(arr_268,EMPTY_VALUE);
      ArrayInitialize(arr_272,EMPTY_VALUE);
      ArrayInitialize(arr_276,EMPTY_VALUE);
      ArrayInitialize(arr_280,EMPTY_VALUE);
      ArrayInitialize(arr_236,EMPTY_VALUE);
      ArrayInitialize(arr_240,EMPTY_VALUE);
      limit = Bars - 1;
      ObjectCreate("priceLine_" + var_212,OBJ_HLINE,var_212,0,Time[0],0,0);
      ObjectSet("priceLine_" + var_212,OBJPROP_PRICE1,Bid);
      ObjectSet("priceLine_" + var_212,OBJPROP_COLOR,PriceLevel);
      var_172 = 0;
      var_144 = true;
      var_188 = 0;
      var_196 = true;
      }
         else
      {
      if (var_204 != Bars)
         {
         for (i = 1; i <= var_208; i++)
            {
            arr_184[i - 1] = arr_184[i];
            arr_260[i - 1] = arr_260[i];
            arr_264[i - 1] = arr_264[i];
            arr_272[i - 1] = arr_272[i];
            arr_276[i - 1] = arr_276[i];
            arr_236[i - 1] = arr_236[i];
            arr_240[i - 1] = arr_240[i];
            }
         var_204 = Bars;
         var_200 = 1;
         moveToFront(limit);
         }
      }
   }

var_288 = Bars;

for (j = limit; j >= 0; j--)
   {
   if (var_144)
      {
      if (Open[j] > Close[j])
         {
         var_156 = High[j];
         var_148 = false;
         var_152 = true;
         var_176 = iBarShift(Symbol(),0,Time[j]);
         }
      if (Open[j] < Close[j])
         {
         var_156 = Low[j];
         var_148 = true;
         var_152 = false;
         var_176 = iBarShift(Symbol(),0,Time[j]);
         }
      if (Open[j] == Close[j]) continue;
      var_144 = false;
      }
   if (Time[j] > var_172)
      {
      var_164 = var_156;
      var_172 = Time[j];
      }
   if (var_148)
      {
      if (j == 0) var_244 = Bid; else var_244 = High[j];
      while (var_244 >= var_156 + var_start_4)
         {
         drawNewX(var_156,j);
         var_156 = var_156 + var_start_4;
         arr_184[var_176] = var_156;
         }
      if (j == 0)
         {
         var_252 = var_156;
         var_244 = Bid;
         }
            else
         {
         var_252 = var_164;
         var_244 = Low[j];
         }
      if (var_252 - var_start_4 * Multiply >= var_244)
         {
         if (var_176 != 0) var_176--;
         if (!var_196)
            {
            var_208++;
            moveAllBack();
            }
         doReversal(1,j);
         var_148 = false;
         var_152 = true;
         continue;
         }
      }
   if (var_152)
      {
      if (j == 0) var_244 = Bid; else var_244 = Low[j];
      while (var_244 <= var_156 - var_start_4)
         {
         var_156 = var_156 - var_start_4;
         drawNewO(var_156,j);
         arr_184[var_176] = var_156;
         }
      if (j == 0)
         {
         var_252 = var_156;
         var_244 = Bid;
         }
            else
         {
         var_252 = var_164;
         var_244 = High[j];
         }
      if (var_252 + var_start_4 * Multiply <= var_244)
         {
         if (var_176 != 0) var_176--;
         if (!var_196)
            {
            var_208++;
            moveAllBack();
            }
         doReversal(0,j);
         var_148 = true;
         var_152 = false;
         }
      }
   }

if (var_196)
   {
   var_200 = var_176;
   var_204 = Bars;
   moveToFront(limit);
   if (ShowGrid)
      {
      var_start_44 = High[iHighest(NULL,0,MODE_HIGH,0,0)];
      var_start_52 = Low[iLowest(NULL,0,MODE_LOW,0,0)];
      var_start_60 = var_start_52 - boxValue * 4 * Point * 3.0;
      for (k = (var_start_44 - var_start_52) / Point / (boxValue * 4) + 6.0; k >= 0; k--)
         {
         ObjectCreate("GridLine_" + k + "_" + var_212,OBJ_HLINE,var_212,0,0,0,0);
         ObjectSet("GridLine_" + k + "_" + var_212,OBJPROP_PRICE1,var_start_60);
         ObjectSet("GridLine_" + k + "_" + var_212,OBJPROP_STYLE,STYLE_DOT);
         ObjectSet("GridLine_" + k + "_" + var_212,OBJPROP_COLOR,GridColor);
         var_start_60 = var_start_60 + boxValue * 4 * Point;
         }
      }
   createHighLow(1);
   }
      else
   {
   createHighLow(0);
   if (var_232 != 0)
      {
      switch (var_232)
         {
         case 1:
            if (arr_260[0] != EMPTY_VALUE)
               {
               if (arr_184[0] > arr_260[0]) doArrows("Triple Top",Ask);
               }
                  else
               {
               var_232 = 0;
               }
            break;
         case 3:
            if (arr_264[0] != EMPTY_VALUE)
               {
               if (arr_184[0] > arr_264[0]) doArrows("Spread Triple Top",Ask);
               }
                  else
               {
               var_232 = 0;
               }
            break;
         case 5:
            if (arr_264[0] != EMPTY_VALUE)
               {
               if (arr_184[0] > arr_264[0]) doArrows("Bullish Resistance",Ask);
               }
                  else
               {
               var_232 = 0;
               }
            break;
         case 7:
            if (arr_264[0] != EMPTY_VALUE)
               {
               if (arr_184[0] > arr_264[0]) doArrows("Bullish Resistance",Ask);
               }
                  else
               {
               var_232 = 0;
               }
            break;
         case 9:
            if (arr_260[0] != EMPTY_VALUE)
               {
               if (arr_184[0] > arr_260[0]) doArrows("Bullish Catapault",Ask);
               }
                  else
               {
               var_232 = 0;
               }
            break;
         case 12:
            if (arr_260[0] != EMPTY_VALUE)
               {
               if (arr_184[0] > arr_260[0]) doArrows("Ascending Triangle",Ask);
               }
                  else
               {
               var_232 = 0;
               }
            break;
         case 14:
            if (arr_260[0] != EMPTY_VALUE)
               {
               if (arr_184[0] > arr_260[0]) doArrows("Ascending Triple Top",Ask);
               }
                  else
               {
               var_232 = 0;
               }
         }
      }
   if (var_228 != 0)
      {
      switch (var_228)
         {
         case 2:
            if (arr_272[0] != EMPTY_VALUE)
               {
               if (arr_184[0] <= arr_272[0]) doArrows("Triple Bottom",Bid);
               }
                  else
               {
               var_228 = 0;
               }
            break;
         case 4:
            if (arr_276[0] != EMPTY_VALUE)
               {
               if (arr_184[0] <= arr_276[0]) doArrows("Spread Triple Bottom",Bid);
               }
                  else
               {
               var_228 = 0;
               }
            break;
         case 6:
            if (arr_276[0] != EMPTY_VALUE)
               {
               if (arr_184[0] <= arr_276[0]) doArrows("Bearish Support",Bid);
               }
                  else
               {
               var_228 = 0;
               }
            break;
         case 8:
            if (arr_276[0] != EMPTY_VALUE)
               {
               if (arr_184[0] <= arr_276[0]) doArrows("Bullish Support",Bid);
               }
                  else
               {
               var_228 = 0;
               }
            break;
         case 10:
            if (arr_272[0] != EMPTY_VALUE)
               {
               if (arr_184[0] <= arr_272[0]) doArrows("Bearish Catapault",Bid);
               }
                  else
               {
               var_228 = 0;
               }
            break;
         case 13:
            if (arr_272[0] != EMPTY_VALUE)
               {
               if (arr_184[0] <= arr_272[0]) doArrows("Decending Triangle",Bid);
               }
                  else
               {
               var_228 = 0;
               }
            break;
         case 15:
            if (arr_272[0] != EMPTY_VALUE)
               {
               if (arr_184[0] <= arr_272[0]) doArrows("Decending Triple Bottom",Bid);
               }
                  else
               {
               var_228 = 0;
               }
         }
      }
   }
}

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

/*string dcrypt(int index)
{
string array[20] = {"ywjsi","qfl","rfwpjyk}","xnlsfqx","hyunux","ktrh","nskqfynts","hfww~","wj{jwxfq","nsyjwjxy","rtsj~","ymjhfgqj","~jsk}","ltfqx","xmfwuy","stskfwr","wnxpqt|","wjyfnqx",""};
int    length = StringLen(array[index]);
int    i;
int    char;

for (i = 0; i < length; i++)
   {
   char = StringGetChar(array[index],i);
   char -= 5;
   array[index] = StringSetChar(array[index],i,char);
   }
return(array[index]);
}*/

//+------------------------------------------------------------------+
/*
bool chkPass(string code)
{
int    var_chkPass_8 = D'2007.12.31';
int    var_chkPass_12 = D'2008.03.31';
int    var_chkPass_16 = D'2008.06.30';
int    var_chkPass_20 = D'2008.09.30';
int    var_chkPass_24 = D'2008.12.31';
int    var_chkPass_28 = D'2009.03.31';
int    var_chkPass_32 = D'2009.06.30';
int    var_chkPass_36 = D'2009.09.30';
int    var_chkPass_40 = D'2009.12.31';
int    var_chkPass_44 = D'2010.03.31';
int    var_chkPass_48 = D'2010.06.30';
int    var_chkPass_52 = D'2010.09.30';
int    var_chkPass_56 = D'2010.12.31';
int    var_chkPass_60 = D'2011.03.31';
int    var_chkPass_64 = D'2011.06.30';
int    var_chkPass_68 = D'2011.09.30';
int    var_chkPass_72 = D'2011.12.31';
int    var_chkPass_76 = D'2012.03.31';
string var_chkPass_80;

if (TimeCurrent() <= var_chkPass_8)
   {
   var_chkPass_80 = dcrypt(0);
   if (code == var_chkPass_80) return(false);
   return(true);
   }

if (TimeCurrent() <= var_chkPass_12)
   {
   var_chkPass_80 = dcrypt(1);
   if (code == var_chkPass_80) return(false);
   return(true);
   }

if (TimeCurrent() <= var_chkPass_16)
   {
   var_chkPass_80 = dcrypt(2);
   if (code == var_chkPass_80) return(false);
   return(true);
   }

if (TimeCurrent() <= var_chkPass_20)
   {
   var_chkPass_80 = dcrypt(3);
   if (code == var_chkPass_80) return(false);
   return(true);
   }

if (TimeCurrent() <= var_chkPass_24)
   {
   var_chkPass_80 = dcrypt(4);
   if (code == var_chkPass_80) return(false);
   return(true);
   }

if (TimeCurrent() <= var_chkPass_28)
   {
   var_chkPass_80 = dcrypt(5);
   if (code == var_chkPass_80) return(false);
   return(true);
   }

if (TimeCurrent() <= var_chkPass_32)
   {
   var_chkPass_80 = dcrypt(6);
   if (code == var_chkPass_80) return(false);
   return(true);
   }

if (TimeCurrent() <= var_chkPass_36)
   {
   var_chkPass_80 = dcrypt(7);
   if (code == var_chkPass_80) return(false);
   return(true);
   }

if (TimeCurrent() <= var_chkPass_40)
   {
   var_chkPass_80 = dcrypt(8);
   if (code == var_chkPass_80) return(false);
   return(true);
   }

if (TimeCurrent() <= var_chkPass_44)
   {
   var_chkPass_80 = dcrypt(9);
   if (code == var_chkPass_80) return(false);
   return(true);
   }

if (TimeCurrent() <= var_chkPass_48)
   {
   var_chkPass_80 = dcrypt(10);
   if (code == var_chkPass_80) return(false);
   return(true);
   }

if (TimeCurrent() <= var_chkPass_52)
   {
   var_chkPass_80 = dcrypt(11);
   if (code == var_chkPass_80) return(false);
   return(true);
   }

if (TimeCurrent() <= var_chkPass_56)
   {
   var_chkPass_80 = dcrypt(12);
   if (code == var_chkPass_80) return(false);
   return(true);
   }

if (TimeCurrent() <= var_chkPass_60)
   {
   var_chkPass_80 = dcrypt(13);
   if (code == var_chkPass_80) return(false);
   return(true);
   }

if (TimeCurrent() <= var_chkPass_64)
   {
   var_chkPass_80 = dcrypt(14);
   if (code == var_chkPass_80) return(false);
   return(true);
   }

if (TimeCurrent() <= var_chkPass_68)
   {
   var_chkPass_80 = dcrypt(15);
   if (code == var_chkPass_80) return(false);
   return(true);
   }

if (TimeCurrent() <= var_chkPass_72)
   {
   var_chkPass_80 = dcrypt(16);
   if (code == var_chkPass_80) return(false);
   return(true);
   }

if (TimeCurrent() <= var_chkPass_76)
   {
   var_chkPass_80 = dcrypt(17);
   if (code == var_chkPass_80) return(false);
   return(true);
   }
return(true);
}*/



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
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 prices of each bar


Indicator Curves created:

Implements a curve of type DRAW_NONE

Implements a curve of type DRAW_LINE

Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features:

It issuies visual alerts to the screen
Uses files from the file system
It writes information to file
It reads information from a file