//+------------------------------------------------------------------+
//|                                                    3perekosa.mq4 |
//+------------------------------------------------------------------+
#property copyright "Поручик & aka KimIV"
#property link      "http://www.kimiv.ru"

#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Aqua
#property indicator_color2 Blue
#property indicator_color3 Red
#property indicator_color4 Yellow

//------- Глобальные переменные --------------------------------------

//------- Внешние параметры индикатора -------------------------------
extern string NameCross    = "GBPCHF"; // Наименование кросса
extern string NameMain1    = "GBPUSD"; // Наименование основной пары 1
extern string NameMain2    = "USDCHF"; // Наименование основной пары 2
extern int    NumberOfBars = 1000;     // Количество баров обсчёта (0-все)
extern bool   Perevorot    = false;    // Переворачивает индюка относительно горизонтальной оси.
extern bool   ShowMain     = false;    // Отображает кривую цены по текущему инструменту

//------- Буферы индикатора ------------------------------------------
double buf0[], buf1[], buf2[], buf3[];
double P1=0,P2=0,P3=0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void init() {
  SetIndexBuffer(0, buf0);
  SetIndexLabel (0, NameCross);
  SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 2);
  SetIndexEmptyValue(0, 0);

  SetIndexBuffer(1, buf1);
  SetIndexLabel (1, NameMain1);
  SetIndexStyle (1, DRAW_LINE, STYLE_SOLID, 2);
  SetIndexEmptyValue(1, 0);

  SetIndexBuffer(2, buf2);
  SetIndexLabel (2, NameMain2);
  SetIndexStyle (2, DRAW_LINE, STYLE_SOLID, 2);
  SetIndexEmptyValue(2, 0);
    
  SetIndexBuffer(3, buf3);
  SetIndexLabel (3, Symbol());
  SetIndexStyle (3, DRAW_LINE, STYLE_DOT, 1);
  SetIndexEmptyValue(3, 0);
}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void deinit() {
  Comment("");
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
void start() {
  int LoopBegin, sh;

      if (NumberOfBars==0) LoopBegin=Bars-1;
  else LoopBegin=NumberOfBars-1;
  LoopBegin=MathMin(Bars-1, LoopBegin);

  for (sh=LoopBegin; sh>=0; sh--) {
    P1=iClose(NameMain1, 0, sh)*iClose(NameMain2, 0, sh)-iClose(NameCross, 0, sh);
    P2=iClose(NameMain1, 0, sh)-iClose(NameCross, 0, sh)/iClose(NameMain2, 0, sh);
    P3=iClose(NameMain2, 0, sh)-iClose(NameCross, 0, sh)/iClose(NameMain1, 0, sh);
    if (Perevorot) {P1=P1*(-1);P2=P2*(-1);P3=P3*(-1);}
    if (ShowMain) {P1=P1+iClose(Symbol(), 0, sh);P2=P2+iClose(Symbol(), 0, sh);P3=P3+iClose(Symbol(), 0, sh);}
    buf0[sh]=P1;
    buf1[sh]=P2;
    buf2[sh]=P3;
    if (ShowMain) buf3[sh]=iClose(Symbol(), 0, sh); else buf3[sh]=(P1+P2+P3)/3;
  }
}
//+------------------------------------------------------------------+