
#property copyright "Copyright © 2011.04.12, Zamanib"
#property link      ""

#property indicator_separate_window
#property indicator_minimum 0.0
#property indicator_maximum 1.0
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red


string gs_76 = "ZB-CloudMatrix";


extern int Tenkan = 9;
extern int Kijun = 26;
extern int Senkou = 52;

 bool Signal_Arrows = FALSE;
extern int TimeFrame = 15;
extern int maxBars = 500;
double g_ibuf_148[];

double g_ibuf_160[];

int g_window_176;
datetime g_time_188;
datetime g_time_192;
bool gi_196;
int gi_200;
int g_stoplevel_204;
int gi_208;
double gd_212;
double g_tickvalue_220;
double gd_228;
double gd_236;

int init() {
   string gs_144;
   int li_0 = 167;
   int li_4 = 167;
   int li_8 = 119;
   int li_12 = 233;
   int li_16 = 167;
   int li_20 = 119;
   int li_24 = 234;
   SetIndexBuffer(0, g_ibuf_148);
   SetIndexBuffer(1, g_ibuf_160);
   SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 3);
   SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID, 3);
    switch (TimeFrame) {
   case 1:
      gs_144 = "Period_M1";
      break;
   case 5:
      gs_144 = "Period_M5";
      break;
   case 15:
      gs_144 = "Period_M15";
      break;
   case 30:
      gs_144 = "Period_M30";
      break;
   case 60:
      gs_144 = "Period_H1";
      break;
   case 240:
      gs_144 = "Period_H4";
      break;
   case 1440:
      gs_144 = "Period_D1";
      break;
   case 10080:
      gs_144 = "Period_W1";
      break;
   case 43200:
      gs_144 = "Period_MN1";
      break;
   default:
      gs_144 = "Current Timeframe";
      TimeFrame = 0;
  }
   gs_76 = gs_76 + " (" + Tenkan + "," + Kijun + "," + Senkou + "," + gs_144 + ")";
   IndicatorShortName(gs_76);
   IndicatorDigits(Digits);
   Get_MarketInfos();
   return (0);
}

int start() {
   int li_12;
   if (g_window_176 == 0) g_window_176 = WindowFind(gs_76);
   if (gd_212 == 0.0) Get_MarketInfos();
   int li_8 = IndicatorCounted();
   if (li_8 > 0) li_8--;
   int li_4 = Bars - li_8;
   if (li_4 > maxBars) li_4 = maxBars;
   for (int li_0 = li_4; li_0 >= 0; li_0--) {
      li_12 = Get_KumoPrice_Breakout(li_0, Tenkan, Kijun, Senkou);
      if (Signal_Arrows == FALSE) {
         if (li_12 == 3) li_12 = 1;
         else
            if (li_12 == -3) li_12 = -1;
      }
   if(li_12 == 1)g_ibuf_148[li_0] = 1; else g_ibuf_148[li_0] = 0;
   if(li_12 == -1)g_ibuf_160[li_0] = 1; else g_ibuf_160[li_0] = 0;
    
   }
  return(0);
}

void Get_MarketInfos() {
   gi_200 = MarketInfo(Symbol(), MODE_SPREAD);
   g_stoplevel_204 = MarketInfo(Symbol(), MODE_STOPLEVEL);
   gd_212 = MarketInfo(Symbol(), MODE_POINT);
   g_tickvalue_220 = MarketInfo(Symbol(), MODE_TICKVALUE);
   gi_208 = MarketInfo(Symbol(), MODE_DIGITS);
   gd_228 = gi_200 * Point;
   gd_236 = g_stoplevel_204 * Point;
   if (gi_208 == 3 || gi_208 == 5) {
      gi_208--;
      gd_212 = 10.0 * gd_212;
      gi_200 = MathRound(gi_200 / 10.0);
      if (gi_200 < 1) gi_200 = 1;
   }
   gd_228 = gi_200 * gd_212;
}

int Get_KumoPrice_Breakout(int ai_0, int ai_4, int ai_8, int ai_12) {
   double l_ichimoku_16 = iIchimoku(Symbol(), TimeFrame, ai_4, ai_8, ai_12, MODE_SENKOUSPANA, ai_0);
   double l_ichimoku_24 = iIchimoku(Symbol(), TimeFrame, ai_4, ai_8, ai_12, MODE_SENKOUSPANB, ai_0);
   double l_ichimoku_32 = iIchimoku(Symbol(), TimeFrame, ai_4, ai_8, ai_12, MODE_SENKOUSPANA, ai_0 + 1);
   double l_ichimoku_40 = iIchimoku(Symbol(), TimeFrame, ai_4, ai_8, ai_12, MODE_SENKOUSPANB, ai_0 + 1);
   double ld_48 = MathMin(l_ichimoku_16, l_ichimoku_24);
   double ld_56 = MathMax(l_ichimoku_16, l_ichimoku_24);
   double ld_64 = MathMin(l_ichimoku_32, l_ichimoku_40);
   double ld_72 = MathMax(l_ichimoku_32, l_ichimoku_40);
   double l_iclose_80 = iClose(Symbol(), TimeFrame, ai_0);
   double l_iclose_88 = iClose(Symbol(), TimeFrame, ai_0 + 1);
   int li_ret_96 = 0;
   if (l_iclose_80 > ld_56) {
      if (l_iclose_88 <= ld_72) {
         li_ret_96 = 3;
         return (li_ret_96);
      }
      li_ret_96 = 1;
      return (li_ret_96);
   }
   if (l_iclose_80 < ld_48) {
      if (l_iclose_88 >= ld_64) {
         li_ret_96 = -3;
         return (li_ret_96);
      }
      li_ret_96 = -1;
      return (li_ret_96);
   }
   return (li_ret_96);
}