//+------------------------------------------------------------------+
//|                                                 FXDataExport.mq4 |
//|                                                      Piotr Karaœ |
//+------------------------------------------------------------------+
#property indicator_chart_window
#define ALLPAIRS 28

// external variables

extern int       TimeFrame     = PERIOD_H4;
extern int       tfr           = PERIOD_M1; // refreshing interval

extern int       KPeriod       =  8;
extern int       Slowing       =  3;
extern int       DPeriod       =  3;
extern int       MAMethod      =  2;
extern int       PriceField    =  0;
extern int       RPeriod       =  1;
extern int       ShortMAPeriod = 60;
extern int       LongMAPeriod  = 360;
extern bool      Comments      = true;
extern string    OutputFile    = "";

//Currency Pairs
extern string    Pair1         = "EURUSD";
extern string    Pair2         = "EURCAD";
extern string    Pair3         = "EURGBP";
extern string    Pair4         = "EURAUD";
extern string    Pair5         = "EURNZD";
extern string    Pair6         = "GBPUSD";
extern string    Pair7         = "GBPCAD";
extern string    Pair8         = "GBPAUD";
extern string    Pair9         = "GBPNZD";
extern string    Pair10        = "AUDUSD";
extern string    Pair11        = "AUDCAD";
extern string    Pair12        = "AUDNZD";
extern string    Pair13        = "NZDUSD";
extern string    Pair14        = "NZDCAD";
extern string    Pair15        = "USDCAD";
extern string    Pair16        = "EURJPY";
extern string    Pair17        = "USDJPY";
extern string    Pair18        = "CADJPY";
extern string    Pair19        = "GBPJPY";
extern string    Pair20        = "AUDJPY";
extern string    Pair21        = "NZDJPY";
extern string    Pair22        = "CHFJPY";
extern string    Pair23        = "EURCHF";
extern string    Pair24        = "USDCHF";
extern string    Pair25        = "CADCHF";
extern string    Pair26        = "GBPCHF";
extern string    Pair27        = "AUDCHF";
extern string    Pair28        = "NZDCHF";

//---- indicator buffers

double     Stochastic[];
double     StrengthST[];
double     StrengthLT[];
double     RateOfChange1[];
double     RateOfChange2[];
double     Volatility1[];
double     Volatility2[];

string     Pair_Name[ALLPAIRS];
datetime   prev_time     = -9999;

int current = 0; // variable points to the current bar

// File identificator
int handle;

//+------------------------------------------------------------------+
int init()  {
//+------------------------------------------------------------------+
  RefreshRates();
  IndicatorBuffers(8);
  SetIndexBuffer(0, Stochastic);
  SetIndexBuffer(1, StrengthST);
  SetIndexBuffer(2, StrengthLT);
  SetIndexBuffer(3, RateOfChange1);
  SetIndexBuffer(4, RateOfChange2);
  SetIndexBuffer(5, Volatility1);
  SetIndexBuffer(6, Volatility2);

  Pair_Name[0] = Pair1;
  Pair_Name[1] = Pair2;
  Pair_Name[2] = Pair3;
  Pair_Name[3] = Pair4;
  Pair_Name[4] = Pair5;
  Pair_Name[5] = Pair6;
  Pair_Name[6] = Pair7;
  Pair_Name[7] = Pair8;
  Pair_Name[8] = Pair9;
  Pair_Name[9] = Pair10;
  Pair_Name[10] = Pair11;
  Pair_Name[11] = Pair12;
  Pair_Name[12] = Pair13;
  Pair_Name[13] = Pair14;
  Pair_Name[14] = Pair15;
  Pair_Name[15] = Pair16;
  Pair_Name[16] = Pair17;
  Pair_Name[17] = Pair18;
  Pair_Name[18] = Pair19;
  Pair_Name[19] = Pair20;
  Pair_Name[20] = Pair21;
  Pair_Name[21] = Pair22;
  Pair_Name[22] = Pair23;
  Pair_Name[23] = Pair24;
  Pair_Name[24] = Pair25;
  Pair_Name[25] = Pair26;
  Pair_Name[26] = Pair27;
  Pair_Name[27] = Pair28;
    
//  Export();
  prev_time = -9999;
  return(0);
}

//+------------------------------------------------------------------+
int deinit()  {
//+------------------------------------------------------------------+
   return(0);
}

//+------------------------------------------------------------------+
int start()  {
//+------------------------------------------------------------------+
  if (prev_time != iTime(Symbol(),tfr,0))   {

//    Export();
//    prev_time = iTime(Symbol(),tfr,0); // the formula that makes the MT4 export the data at the tfr intervals - at the completion of the tfr bar
//  }
//  return(0);
//}

//+------------------------------------------------------------------+
//void Export()  {  
//+------------------------------------------------------------------+
  if (Comments)
    Comment("Starting data export to " + OutputFile);
  if (OutputFile == "")
    OutputFile = "FXDataExport.csv";
    handle = FileOpen(OutputFile,FILE_CSV|FILE_WRITE,",");
  if(handle < 1)   {
    Comment("Unable to open output file");
    return(0); 
  }  

// MultiPair Loop
  for (int k=0; k<ALLPAIRS; k++)   {
// Current Stochastic      
    Stochastic[k] = iStochastic(Pair_Name[k],TimeFrame,KPeriod,DPeriod,Slowing,MAMethod,PriceField,MODE_MAIN,0);
// Current Strength short-term
    StrengthST[k]= 10*( (MarketInfo(Pair_Name[k],MODE_ASK) + MarketInfo(Pair_Name[k],MODE_BID)) / 2  - iMA(Pair_Name[k],TimeFrame,ShortMAPeriod,0,MODE_SMA,PRICE_TYPICAL,0)) / iStdDev(Pair_Name[k],TimeFrame,ShortMAPeriod,0,MODE_SMA,PRICE_TYPICAL,0);
// Current Strength long-term
    StrengthLT[k]= 10*( (MarketInfo(Pair_Name[k],MODE_ASK) + MarketInfo(Pair_Name[k],MODE_BID)) / 2  - iMA(Pair_Name[k],TimeFrame,LongMAPeriod,0,MODE_SMA,PRICE_TYPICAL,0)) / iStdDev(Pair_Name[k],TimeFrame,LongMAPeriod,0,MODE_SMA,PRICE_TYPICAL,0);
  
//| Rate of Change of SMAs                                           |
    double ROC1, CurrentBar1, PrevBar1;
    double ROC2, CurrentBar2, PrevBar2;
    double VOLAT1, CurrentSD1, PrevSD1;
    double VOLAT2, CurrentSD2, PrevSD2;
//---- ROC calculation
    CurrentBar1 = iMA(Pair_Name[k],TimeFrame,ShortMAPeriod,0,MODE_SMA,PRICE_TYPICAL,0);
    PrevBar1 = iMA(Pair_Name[k],TimeFrame,ShortMAPeriod,0,MODE_SMA,PRICE_TYPICAL,0+RPeriod);
    CurrentBar2 = iMA(Pair_Name[k],TimeFrame,LongMAPeriod,0,MODE_SMA,PRICE_TYPICAL,0);
    PrevBar2 = iMA(Pair_Name[k],TimeFrame,LongMAPeriod,0,MODE_SMA,PRICE_TYPICAL,0+RPeriod);

    CurrentSD1 = iStdDev(Pair_Name[k],TimeFrame,ShortMAPeriod,0,MODE_SMA,PRICE_TYPICAL,0);
    PrevSD1 = iStdDev(Pair_Name[k],TimeFrame,ShortMAPeriod,0,MODE_SMA,PRICE_TYPICAL,0+RPeriod);
    CurrentSD2 = iStdDev(Pair_Name[k],TimeFrame,LongMAPeriod,0,MODE_SMA,PRICE_TYPICAL,0);
    PrevSD2 = iStdDev(Pair_Name[k],TimeFrame,LongMAPeriod,0,MODE_SMA,PRICE_TYPICAL,0+RPeriod);
    
    ROC1=CurrentBar1-PrevBar1;
    ROC2=CurrentBar2-PrevBar2;
    VOLAT1=CurrentSD1-PrevSD1;
    VOLAT2=CurrentSD2-PrevSD2;
    
    RateOfChange1[k] = 1000*100 * ROC1 / PrevBar1;
    Volatility1[k] = 10*100 * VOLAT1 / PrevSD1;
    RateOfChange2[k] = 1000*100 * ROC2 / PrevBar2;
    Volatility2[k] = 10*100 * VOLAT2 / PrevSD2;
      
    FileWrite(handle, 
      Pair_Name[k],
      TimeToStr(TimeLocal(),TIME_DATE|TIME_MINUTES), 
      Stochastic[k], 
      StrengthST[k], 
      StrengthLT[k],
      AccountBalance(), 
      AccountEquity(), 
      AccountMargin(), 
      AccountProfit(), 
      AccountCurrency(), 
      0.5*AccountMargin()/AccountEquity(),
      RateOfChange1[k], 
      Volatility1[k], 
      RateOfChange2[k], 
      Volatility2[k],
      (MarketInfo(Pair_Name[k],MODE_ASK) + MarketInfo(Pair_Name[k],MODE_BID)) / 2);
  }  

  FileClose(handle);
  if (Comments)
    Comment("Export complete to FXDataExport.csv at C:\Program Files\OANDA - MetaTrader\experts\files at "+TimeToStr(TimeLocal(),TIME_MINUTES));  
  return(0);
//}
  FileClose(handle);

  prev_time = iTime(Symbol(),tfr,0); // the formula that makes the MT4 export the data at the tfr intervals - at the completion of the tfr bar
  }
 return(0);
}

//+------------------------------------------------------------------+
// Glossary
//+------------------------------------------------------------------+
/*
//+------------------------------------------------------------------+
// MAMethod
//+------------------------------------------------------------------+

      case MODE_SMA:  answer = "SMA"  ; break;//0
      case MODE_EMA:  answer = "EMA"  ; break;//1
      case MODE_SMMA: answer = "SMMA" ; break;//2 - default: smoothed moving average
      case MODE_LWMA: answer = "LWMA" ; break;//3
      
//+------------------------------------------------------------------+
// PriceField
//+------------------------------------------------------------------+  
  
      case 0:  answer = "Low/High"    ; break; - default
      case 1:  answer = "Close/Close" ; break;
*/
//+------------------------------------------------------------------+