//+------------------------------------------------------------------+
//|                                                       MF_Bar.mq4 |
//|                      san, использовав signalTable Олега Антонюка |
//|                                                  san@openpage.ru |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2008, san"
#property link      "http://mydao.ru/2v1"

#property indicator_chart_window




             

extern string Symbols = ""; // символы через запятую. Если пусто - только для символа графика
extern string TimeFrames = "240, 15, 5, 1"; // таймфреймы через запятую, от старших. Если пусто - только для таймфрема графика
extern string MAPeriods= "233, 55, 21, 5";  // периоды MA или ЕМА, через запятую, от медленных
extern bool useEMA = true;  // при true используется экспоненциальная, при false - простая скользящая средняя
extern bool BottomPlace = true; // размещение в левом нижнем углу
extern int FontSize=11; // размер фонта для значков.


           
int scaleX=15,
           scaleY=20,
           offsetX=64,
           offsetY=0,
           symbolCodeMA=108,           
           symbolCodeFlat=224,
           symbolCodeUp=228,
           symbolCodeDown=230,
           symbolCodeRange=73;

color maUnknownColor=Silver,
             maFlatColor=Yellow,
             maUpColor=Lime,
             maDownColor=Red,
             maBadColor=White,             
             textColor=Gold;
             
// названия символов
string syms[10];
int num_symbols = 0;      

             
// таймфреймы             
int tfs[10];
int num_tfs = 0;

// периоды МА

int periods[10];
int num_periods = 0;
 



//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {

      
   int Corner = iif(BottomPlace,2,0);

   num_tfs = StrToIntValues(TimeFrames,10,tfs);
   num_periods = StrToIntValues(MAPeriods, 10, periods);
   num_symbols = StrToStringValues(Symbols, 10, syms);
   
   
   if(num_tfs == 0){
      num_tfs = 1;
      tfs[0] = Period();
   }

   
   if(num_symbols == 0){
      num_symbols = 1;
      syms[0] = Symbol();
   }

   if(num_periods == 0){
      num_periods = 1;
      periods[0] = 12;
   }
  
   
   
      
      
   // Строки валютных пар
   for(int sym=0;sym<num_symbols;sym++)
     {
      ObjectCreate("MF_Bar_"+syms[sym],OBJ_LABEL,0,0,0,0,0);
      // изменяем угол привязки      
      ObjectSet("MF_Bar_"+syms[sym],OBJPROP_CORNER,Corner);
      ObjectSet("MF_Bar_"+syms[sym],OBJPROP_XDISTANCE,8);
      ObjectSet("MF_Bar_"+syms[sym],OBJPROP_YDISTANCE,((num_symbols - sym - 1)*scaleY)+offsetY+8);
      color csym = maUpColor;
      if(StringSubstr(syms[sym],0,3) == "USD")
         csym = maDownColor;
      ObjectSetText("MF_Bar_"+syms[sym],syms[sym],FontSize - 2,"Tahoma",csym);

      // полоска для символа
      int sh = 0, bs = 0;
      for(int x=0;x<num_tfs;x++){
         for(int y=0;y<num_periods;y++) {
            ObjectCreate(GetMAName(sym,x,y),OBJ_LABEL,0,0,0,0,0);
            // изменяем угол привязки
            ObjectSet(GetMAName(sym,x,y),OBJPROP_CORNER,Corner);
            bs = sh + (x*num_periods + y)*scaleX+offsetX;
            ObjectSet(GetMAName(sym,x,y),OBJPROP_XDISTANCE,bs);
            ObjectSet(GetMAName(sym,x,y),OBJPROP_YDISTANCE,((num_symbols - sym - 1)*scaleY)+offsetY+6);
            ObjectSetText(GetMAName(sym,x,y),CharToStr(symbolCodeMA),
                          FontSize,"Wingdings",maUnknownColor);
           }
         sh += 8;
       }
      
     }
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){

   for(int nums = 0; nums < num_symbols;nums++)
      for(int numtf = 0; numtf < num_tfs;numtf++)
         SetMA(nums, numtf);

   return(0);
}
  
  
/*--------------------------------------------------------------------
   Присвоение кодов МА 
--------------------------------------------------------------------*/  
void SetMA(int sym, int tf){
   double point = MarketInfo(syms[sym], MODE_POINT);
   
   double prev_period;
   int code_0 = 0; // куда идёт старшая
   for(int numma = 0; numma < num_periods; numma++){
      double value = iMA(syms[sym],tfs[tf],periods[numma],0,iif(useEMA,MODE_EMA,MODE_SMA),PRICE_CLOSE,0); 
      double prev_value = iMA(syms[sym],tfs[tf],periods[numma],0,iif(useEMA,MODE_EMA,MODE_SMA),PRICE_CLOSE,1); 
      
      color col = maFlatColor;
      int arrow = symbolCodeFlat;
      
      if(MathAbs(value - prev_value) > 0){
         col = iif(value > prev_value, maUpColor, maDownColor);
         arrow = iif(value > prev_value, symbolCodeUp,symbolCodeDown);
         if(numma == 0)
            code_0 = iif(value > prev_value, 1,-1);
      }

      // если не в том месте относительно предыдущего периода и 
      // направления движения по самой старшей - крашу невеерным цветом
      if(numma > 0){
         col = iif(code_0 > 0 && value < prev_period, maBadColor, col);
         col = iif(code_0 < 0 && value > prev_period, maBadColor, col);         
      }
      
      ObjectSetText(GetMAName(sym,tf,numma),CharToStr(arrow),
                          FontSize,"Wingdings",col);   
                          
      prev_period = value;   
      
   }

}


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit() {
   // удаляем свои бяки:-)
   for(int sym=0;sym<num_symbols;sym++) {
      ObjectDelete("MF_Bar_"+syms[sym]);
      for(int x=0;x<num_tfs;x++)
         for(int y=0;y<num_periods;y++) 
            ObjectDelete(GetMAName(sym,x,y));
     }
   return(0);
}
  
/*====================================================
      Вспомогательные функции. Для удобства:-)
=====================================================*/
int iif(bool exp, int for_true, int for_false){
   if(exp)
      return (for_true);
   return (for_false);
}

string sif(bool exp, string for_true, string for_false){
   if(exp)
      return (for_true);
   return (for_false);
}

string GetMAName(int sym, int tf, int ma){
   return (""+syms[sym]+"_M"+tfs[tf]+"_"+sif(useEMA,"EMA","MA")+periods[ma]);
}

int StrToIntValues(string str, int max_values, int &array[],string sep = ","){
   int num = 0, ind = 0, size = 0;  
   int last_ind = 0;
   
   for(num = 0; num < max_values; num++) {
      ind = StringFind(str, sep, last_ind);

      string text = StringSubstr(str, last_ind, iif(ind < 0, StringLen(str), ind - last_ind));
      if(StringLen(text) > 0) {
         array[num] = StrToInteger(StringTrimLeft(StringTrimRight(text)));    
         size++;
      }
      if(ind < 0)
         break;         
      last_ind = ind+1;
   }
   
   return (size);
}

int StrToStringValues(string str, int max_values, string &array[], string sep = ","){
   int num = 0, ind = 0, size = 0;  
   int last_ind = 0;
   
   for(num = 0; num < max_values; num++) {
      ind = StringFind(str, sep, last_ind);

      string text = StringSubstr(str, last_ind, iif(ind < 0, StringLen(str), ind - last_ind));
      if(StringLen(text) > 0) {
            array[num] = StringTrimLeft(StringTrimRight(text));
            size++;
      }
      if(ind < 0)
         break;         
      last_ind = ind+1;
   }
   
   return (size);
}

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