← К каталогу
Исходный код · ID 3851

display info all pairs.mq4

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Индикатор «Display Info All Pairs» для MetaTrader 4 отображает на графике информационные метки по комбинациям валют из заданного списка. Для каждой пары показываются данные, выбранные пользователем: цена Bid, дневное изменение, среднедневной диапазон (ADR), спред, тиковая стоимость и значения свопов. Информация обновляется на графике в виде текстовых объектов с настраиваемым шрифтом, цветом и позиционированием.

Индикатор перебирает пары валют, формируя символы вида «валюта1+валюта2+суффикс», и запрашивает рыночные данные через MarketInfo. ADR рассчитывается за настраиваемое количество дней с пропуском выходных. Частота обновления задаётся в минутах и ограничивается диапазоном от 1 до 240 минут. Объекты на графике удаляются и пересоздаются при каждом обновлении, а цвет строк чередуется для удобства чтения.

Уникальный идентификатор (UniqueID) используется для генерации имени индикатора и имён создаваемых объектов, что позволяет размещать несколько экземпляров на одном графике без конфликтов. Индикатор не выполняет торговых операций и предназначен исключительно для визуализации рыночной информации.

Настройки программы

НастройкаОписание
Currencies Список валютных кодов через запятую, используемых для формирования пар. Если пуст — используется текущий символ графика.
Suffix Суффикс, добавляемый к именам символов (например, для брокерских суффиксов типа _demo).
FontName Название шрифта для отображения информационных меток на графике.
FontSize Размер шрифта информационных меток в пунктах.
FontColorPrimary Основной цвет шрифта для первой информационной метки (чередуется со вторичным цветом).
FontColorSecondary Вторичный цвет шрифта, используемый чередованием с основным для каждой следующей строки.
Window Номер подокна графика, в котором размещаются информационные метки (0 — основное окно).
Corner Угол графика для размещения информационных меток (0 — верхний левый, 1 — верхний правый, 2 — нижний левый, 3 — нижний правый).
HorizPos Горизонтальное расстояние от указанного угла графика до информационных меток в пикселях.
VertPos Вертикальное расстояние от указанного угла графика до первой информационной метки в пикселях.
VertSpacing Вертикальное расстояние между строками информационных меток в пикселях.
UniqueID Уникальный идентификатор, используемый для генерации имени индикатора и имён создаваемых графических объектов.
ADRdays Количество дней для расчёта среднедневного диапазона (ADR).
RefreshEveryXMins Интервал обновления данных в минутах. Значения ограничиваются диапазоном от 1 до 240 минут. При значении 0 обновление происходит только при инициализации.
FullSymbolIDs Переключатель отображения полных идентификаторов символов (например, EURUSD) вместо сокращённых (например, EU).
ShowBidPrice Переключатель отображения цены Bid для каждой валютной пары.
ShowDailyMove Переключатель отображения дневного изменения цены (в пунктах и в процентах).
ShowADR Переключатель отображения данных о среднедневном диапазоне (ADR), дневном диапазоне и процентном соотношении.
ShowSpread Переключатель отображения спреда и процентного соотношения спреда к ADR.
ShowTickval Переключатель отображения тиковой стоимости для каждой валютной пары.
ShowSwapval Переключатель отображения значений свопов для длинных и коротких позиций.
Получить полный код

Поиск по коду файла

#property indicator_chart_window

#import "kernel32.dll"
   void OutputDebugStringA(string msg);
#import

extern string   Currencies            = "AUD,CAD,CHF,EUR,GBP,JPY,NZD,USD";
extern string   Suffix                = "";
extern string   FontName              = "Courier New";
extern int      FontSize              = 11;
extern color    FontColorPrimary      = White;
extern color    FontColorSecondary    = DarkGray;
extern int      Window                = 0;
extern int      Corner                = 3;
extern int      HorizPos              = 20;
extern int      VertPos               = 4;
extern int      VertSpacing           = 14;
extern string   UniqueID              = "0";
extern int      ADRdays               = 30;
extern int      RefreshEveryXMins     = 0;
extern bool     FullSymbolIDs         = false;
extern bool     ShowBidPrice          = true;
extern bool     ShowDailyMove         = false;
extern bool     ShowADR               = true;
extern bool     ShowSpread            = true;
extern bool     ShowTickval           = true;
extern bool     ShowSwapval           = true;

double   spr, pnt, tickval, bidp, askp, lswap, sswap;
int      dig, tf, ccC;
string   IndiName, ccy, sym, C[40];
datetime prev_time;

int init()  {
      // код доступен только после оплаты
   }

int deinit()  {

  del_obj();
  return(0);
}

int start()  {
      // код доступен только после оплаты
   }

void del_obj()
{
  int k=0;
  while (k<ObjectsTotal())   {
    string objname = ObjectName(k);
    if (StringSubstr(objname,0,StringLen(IndiName)) == IndiName)  
      ObjectDelete(objname);
    else
      k++;
  }    
  return(0);
}

void plot_obj()   {

  color colr = FontColorSecondary;      
  int c = 0;
  int xp = HorizPos;
  for (int i=0; i<40; i++)  {
    if (StringLen(C[i]) < 1)   continue;
    for (int j=0; j<40; j++)  {
      if (i==j)   continue;
      if (StringLen(C[j]) < 1)   continue;
      ccy     = C[i] + C[j] + Suffix;
      pnt     = MarketInfo(ccy,MODE_POINT);
      dig     = MarketInfo(ccy,MODE_DIGITS);
      spr     = MarketInfo(ccy,MODE_SPREAD);
      tickval = MarketInfo(ccy,MODE_TICKVALUE);
      lswap   = MarketInfo(ccy,MODE_SWAPLONG);
      sswap   = MarketInfo(ccy,MODE_SWAPSHORT);
      if (dig == 3 || dig == 5) {
        pnt     *= 10;
        spr     /= 10;
        tickval *= 10;
      }
      if (spr == 0)  continue;
      c++;

      double sum = 0;
      double cnt = 0;
      for (int k=1; k<=ADRdays; k++)   {
        datetime dt = iTime(ccy,PERIOD_D1,k);
        if (TimeDayOfWeek(dt) == 0)   continue;
        sum += (iHigh(ccy,PERIOD_D1,k) - iLow(ccy,PERIOD_D1,k))/pnt;
        cnt += 1;
      }
      double tdy    = (iHigh(ccy,PERIOD_D1,0) - iLow(ccy,PERIOD_D1,0))/pnt;
      double adr    = DivZero(sum,cnt);
      double pctadr = DivZero(100*tdy*cnt,sum);
      double pctspr = DivZero(100*spr*cnt,sum);
      string ast0 = " ", ast1 = " ", ast2 = " ", ast3 = " ";
      if (ccy == sym)    ast0 = "*";
      if (pctadr >= 75)  ast1 = "*";
      if (spr < 3)       ast2 = "*";
      if (pctspr < 2.5)  ast3 = "*";
      if (dig>3) string msk = "':'R2.4"; else msk = "':'R4.2";
      bidp    = MarketInfo(ccy,MODE_BID);
      askp    = MarketInfo(ccy,MODE_ASK);
      double dmove = (bidp-iOpen(ccy,PERIOD_D1,0))/pnt;
      double pmove = 100*(bidp-iOpen(ccy,PERIOD_D1,0))/iOpen(ccy,PERIOD_D1,0);

      string tstr1 = ast0 + ReduceCcy(ccy);
      if (FullSymbolIDs)    tstr1 = ast0 + ccy;
      if (ShowBidPrice)     tstr1 = tstr1 + NumberToStr(bidp,msk);
      if (ShowDailyMove)    tstr1 = tstr1 + NumberToStr(dmove,"R+4.1") + NumberToStr(pmove,"R+3.1'%'");
      if (ShowADR)          tstr1 = tstr1 + NumberToStr(tdy,"R5") + NumberToStr(adr,"':'R3") + NumberToStr(-pctadr,"R(4%") + ast1;
      if (ShowSpread)       tstr1 = tstr1 + NumberToStr(spr,"3.1") + ast2 + NumberToStr(-pctspr,"R(~2.1%") + ast3;
      if (ShowTickval)      tstr1 = tstr1 + NumberToStr(tickval,"R4.2");
      if (ShowSwapval)      tstr1 = tstr1 + NumberToStr(lswap,"R+3.2") + NumberToStr(sswap,"R+3.2");
      int yp = VertPos+c*VertSpacing;
      string objname = IndiName + NumberToStr(-i-1,"T-6") + NumberToStr(-j-1,"T-6") ;
      ObjectCreate(objname,OBJ_LABEL,Window,0,0);
      ObjectSet(objname,OBJPROP_CORNER,Corner);
      ObjectSet(objname,OBJPROP_XDISTANCE,xp);
      ObjectSet(objname,OBJPROP_YDISTANCE,yp);
      if (colr == FontColorPrimary)
        colr = FontColorSecondary;
      else
        colr = FontColorPrimary;

      ObjectSetText(objname,tstr1,FontSize,FontName,colr);
  } } 
  return(0);
}

void log(string s1, string s2="", string s3="", string s4="", string s5="", string s6="", string s7="", string s8="")   {

   string out = StringTrimRight(StringConcatenate(WindowExpertName(), ".mq4 ", Symbol(), " ", s1, " ", s2, " ", s3, " ", s4, " ", s5, " ", s6, " ", s7, " ", s8));
   OutputDebugStringA(out);
}

int BarConvert(int bar, string FromTF, string ToTF, string ccy)   {

  if (ccy == "")  ccy = Symbol();
  return(iBarShift(ccy,StrToTF(ToTF),iTime(ccy,StrToTF(FromTF),bar)));
}  

int StrToColor(string str)

{
  str = StringLower(str);
  if (str == "aliceblue")              return(0xFFF8F0);
  if (str == "antiquewhite")           return(0xD7EBFA);
  if (str == "aqua")                   return(0xFFFF00);
  if (str == "aquamarine")             return(0xD4FF7F);
  if (str == "beige")                  return(0xDCF5F5);
  if (str == "bisque")                 return(0xC4E4FF);
  if (str == "black")                  return(0x000000);
  if (str == "blanchedalmond")         return(0xCDEBFF);
  if (str == "blue")                   return(0xFF0000);
  if (str == "blueviolet")             return(0xE22B8A);
  if (str == "brown")                  return(0x2A2AA5);
  if (str == "burlywood")              return(0x87B8DE);
  if (str == "cadetblue")              return(0xA09E5F);
  if (str == "chartreuse")             return(0x00FF7F);
  if (str == "chocolate")              return(0x1E69D2);
  if (str == "coral")                  return(0x507FFF);
  if (str == "cornflowerblue")         return(0xED9564);
  if (str == "cornsilk")               return(0xDCF8FF);
  if (str == "crimson")                return(0x3C14DC);
  if (str == "darkblue")               return(0x8B0000);
  if (str == "darkgoldenrod")          return(0x0B86B8);
  if (str == "darkgray")               return(0xA9A9A9);
  if (str == "darkgreen")              return(0x006400);
  if (str == "darkkhaki")              return(0x6BB7BD);
  if (str == "darkolivegreen")         return(0x2F6B55);
  if (str == "darkorange")             return(0x008CFF);
  if (str == "darkorchid")             return(0xCC3299);
  if (str == "darksalmon")             return(0x7A96E9);
  if (str == "darkseagreen")           return(0x8BBC8F);
  if (str == "darkslateblue")          return(0x8B3D48);
  if (str == "darkslategray")          return(0x4F4F2F);
  if (str == "darkturquoise")          return(0xD1CE00);
  if (str == "darkviolet")             return(0xD30094);
  if (str == "deeppink")               return(0x9314FF);
  if (str == "deepskyblue")            return(0xFFBF00);
  if (str == "dimgray")                return(0x696969);
  if (str == "dodgerblue")             return(0xFF901E);
  if (str == "firebrick")              return(0x2222B2);
  if (str == "forestgreen")            return(0x228B22);
  if (str == "gainsboro")              return(0xDCDCDC);
  if (str == "gold")                   return(0x00D7FF);
  if (str == "goldenrod")              return(0x20A5DA);
  if (str == "gray")                   return(0x808080);
  if (str == "green")                  return(0x008000);
  if (str == "greenyellow")            return(0x2FFFAD);
  if (str == "honeydew")               return(0xF0FFF0);
  if (str == "hotpink")                return(0xB469FF);
  if (str == "indianred")              return(0x5C5CCD);
  if (str == "indigo")                 return(0x82004B);
  if (str == "ivory")                  return(0xF0FFFF);
  if (str == "khaki")                  return(0x8CE6F0);
  if (str == "lavender")               return(0xFAE6E6);
  if (str == "lavenderblush")          return(0xF5F0FF);
  if (str == "lawngreen")              return(0x00FC7C);
  if (str == "lemonchiffon")           return(0xCDFAFF);
  if (str == "lightblue")              return(0xE6D8AD);
  if (str == "lightcoral")             return(0x8080F0);
  if (str == "lightcyan")              return(0xFFFFE0);
  if (str == "lightgoldenrod")         return(0xD2FAFA);
  if (str == "lightgray")              return(0xD3D3D3);
  if (str == "lightgreen")             return(0x90EE90);
  if (str == "lightpink")              return(0xC1B6FF);
  if (str == "lightsalmon")            return(0x7AA0FF);
  if (str == "lightseagreen")          return(0xAAB220);
  if (str == "lightskyblue")           return(0xFACE87);
  if (str == "lightslategray")         return(0x998877);
  if (str == "lightsteelblue")         return(0xDEC4B0);
  if (str == "lightyellow")            return(0xE0FFFF);
  if (str == "lime")                   return(0x00FF00);
  if (str == "limegreen")              return(0x32CD32);
  if (str == "linen")                  return(0xE6F0FA);
  if (str == "magenta")                return(0xFF00FF);
  if (str == "maroon")                 return(0x000080);
  if (str == "mediumaquamarine")       return(0xAACD66);
  if (str == "mediumblue")             return(0xCD0000);
  if (str == "mediumorchid")           return(0xD355BA);
  if (str == "mediumpurple")           return(0xDB7093);
  if (str == "mediumseagreen")         return(0x71B33C);
  if (str == "mediumslateblue")        return(0xEE687B);
  if (str == "mediumspringgreen")      return(0x9AFA00);
  if (str == "mediumturquoise")        return(0xCCD148);
  if (str == "mediumvioletred")        return(0x8515C7);
  if (str == "midnightblue")           return(0x701919);
  if (str == "mintcream")              return(0xFAFFF5);
  if (str == "mistyrose")              return(0xE1E4FF);
  if (str == "moccasin")               return(0xB5E4FF);
  if (str == "navajowhite")            return(0xADDEFF);
  if (str == "navy")                   return(0x800000);
  if (str == "none")                   return(C'0x00,0x00,0x00');
  if (str == "oldlace")                return(0xE6F5FD);
  if (str == "olive")                  return(0x008080);
  if (str == "olivedrab")              return(0x238E6B);
  if (str == "orange")                 return(0x00A5FF);
  if (str == "orangered")              return(0x0045FF);
  if (str == "orchid")                 return(0xD670DA);
  if (str == "palegoldenrod")          return(0xAAE8EE);
  if (str == "palegreen")              return(0x98FB98);
  if (str == "paleturquoise")          return(0xEEEEAF);
  if (str == "palevioletred")          return(0x9370DB);
  if (str == "papayawhip")             return(0xD5EFFF);
  if (str == "peachpuff")              return(0xB9DAFF);
  if (str == "peru")                   return(0x3F85CD);
  if (str == "pink")                   return(0xCBC0FF);
  if (str == "plum")                   return(0xDDA0DD);
  if (str == "powderblue")             return(0xE6E0B0);
  if (str == "purple")                 return(0x800080);
  if (str == "red")                    return(0x0000FF);
  if (str == "rosybrown")              return(0x8F8FBC);
  if (str == "royalblue")              return(0xE16941);
  if (str == "saddlebrown")            return(0x13458B);
  if (str == "salmon")                 return(0x7280FA);
  if (str == "sandybrown")             return(0x60A4F4);
  if (str == "seagreen")               return(0x578B2E);
  if (str == "seashell")               return(0xEEF5FF);
  if (str == "sienna")                 return(0x2D52A0);
  if (str == "silver")                 return(0xC0C0C0);
  if (str == "skyblue")                return(0xEBCE87);
  if (str == "slateblue")              return(0xCD5A6A);
  if (str == "slategray")              return(0x908070);
  if (str == "snow")                   return(0xFAFAFF);
  if (str == "springgreen")            return(0x7FFF00);
  if (str == "steelblue")              return(0xB48246);
  if (str == "tan")                    return(0x8CB4D2);
  if (str == "teal")                   return(0x808000);
  if (str == "thistle")                return(0xD8BFD8);
  if (str == "tomato")                 return(0x4763FF);
  if (str == "turquoise")              return(0xD0E040);
  if (str == "violet")                 return(0xEE82EE);
  if (str == "wheat")                  return(0xB3DEF5);
  if (str == "white")                  return(0xFFFFFF);
  if (str == "whitesmoke")             return(0xF5F5F5);
  if (str == "yellow")                 return(0x00FFFF);
  if (str == "yellowgreen")            return(0x32CD9A);

  int t1 = StringFind(str,",",0);
  int t2 = StringFind(str,",",t1+1);
  if (t1>0 && t2>0) {
    int red   = StrToInteger(StringSubstr(str,0,t1));
    int green = StrToInteger(StringSubstr(str,t1+1,t2-1));
    int blue  = StrToInteger(StringSubstr(str,t2+1,StringLen(str)));
    return(blue*256*256+green*256+red);
  }  

  if (StringSubstr(str,0,2) == "0x")  {
    string cnvstr = "0123456789abcdef";
    string seq    = "234567";
    int    retval = 0;
    for(int i=0; i<6; i++)  {
      int pos = StrToInteger(StringSubstr(seq,i,1));
      int val = StringFind(cnvstr,StringSubstr(str,pos,1),0);
      if (val < 0)  return(val);
      retval = retval * 16 + val;
    }
    return(retval);
  }

  string cclr = "", tmp = "";
  red = 0;
  blue = 0;
  green = 0;
  if (StringFind("rgb",StringSubstr(str,0,1)) >= 0)  {
    for(i=0; i<StringLen(str); i++)  {
      tmp = StringSubstr(str,i,1);
      if (StringFind("rgb",tmp,0) >= 0)
        cclr = tmp;
      else {
        if (cclr == "b")  blue  = blue  * 10 + StrToInteger(tmp);
        if (cclr == "g")  green = green * 10 + StrToInteger(tmp);
        if (cclr == "r")  red   = red   * 10 + StrToInteger(tmp);
    } }  
    return(blue*256*256+green*256+red);
  }    

  return(0);
}  

bool StrToBool(string str)

{
  str = StringLower(StringSubstr(str,0,1));
  if (str == "t" || str == "y" || str == "1")   return(true);
  return(false);
}  

string BoolToStr(bool bval)

{
  if (bval)   return("true");
  return("false");
}  

int StrToTF(string str)

{
  str = StringUpper(str);
  if (str == "M1")   return(1);
  if (str == "M5")   return(5);
  if (str == "M15")  return(15);
  if (str == "M30")  return(30);
  if (str == "H1")   return(60);
  if (str == "H4")   return(240);
  if (str == "D1")   return(1440);
  if (str == "W1")   return(10080);
  if (str == "MN")   return(43200);
  return(0);
}  

string TFToStr(int tf)

{
  switch (tf)  {
    case     1 :  return("M1");
    case     5 :  return("M5");
    case    15 :  return("M15");
    case    30 :  return("M30");
    case    60 :  return("H1");
    case   240 :  return("H4");
    case  1440 :  return("D1");
    case 10080 :  return("W1");
    case 43200 :  return("MN");
  }  
  return(0);
}  

string err_msg(int e)

{
  switch (e)   {
    case 0:     return("Error 0000:  No error returned.");
    case 1:     return("Error 0001:  No error returned, but the result is unknown.");
    case 2:     return("Error 0002:  Common error.");
    case 3:     return("Error 0003:  Invalid trade parameters.");
    case 4:     return("Error 0004:  Trade server is busy.");
    case 5:     return("Error 0005:  Old version of the client terminal.");
    case 6:     return("Error 0006:  No connection with trade server.");
    case 7:     return("Error 0007:  Not enough rights.");
    case 8:     return("Error 0008:  Too frequent requests.");
    case 9:     return("Error 0009:  Malfunctional trade operation.");
    case 64:    return("Error 0064:  Account disabled.");
    case 65:    return("Error 0065:  Invalid account.");
    case 128:   return("Error 0128:  Trade timeout.");
    case 129:   return("Error 0129:  Invalid price.");
    case 130:   return("Error 0130:  Invalid stops.");
    case 131:   return("Error 0131:  Invalid trade volume.");
    case 132:   return("Error 0132:  Market is closed.");
    case 133:   return("Error 0133:  Trade is disabled.");
    case 134:   return("Error 0134:  Not enough money.");
    case 135:   return("Error 0135:  Price changed.");
    case 136:   return("Error 0136:  Off quotes.");
    case 137:   return("Error 0137:  Broker is busy.");
    case 138:   return("Error 0138:  Requote.");
    case 139:   return("Error 0139:  Order is locked.");
    case 140:   return("Error 0140:  Long positions only allowed.");
    case 141:   return("Error 0141:  Too many requests.");
    case 145:   return("Error 0145:  Modification denied because order too close to market.");
    case 146:   return("Error 0146:  Trade context is busy.");
    case 147:   return("Error 0147:  Expirations are denied by broker.");
    case 148:   return("Error 0148:  The amount of open and pending orders has reached the limit set by the broker.");
    case 4000:  return("Error 4000:  No error.");
    case 4001:  return("Error 4001:  Wrong function pointer.");
    case 4002:  return("Error 4002:  Array index is out of range.");
    case 4003:  return("Error 4003:  No memory for function call stack.");
    case 4004:  return("Error 4004:  Recursive stack overflow.");
    case 4005:  return("Error 4005:  Not enough stack for parameter.");
    case 4006:  return("Error 4006:  No memory for parameter string.");
    case 4007:  return("Error 4007:  No memory for temp string.");
    case 4008:  return("Error 4008:  Not initialized string.");
    case 4009:  return("Error 4009:  Not initialized string in array.");
    case 4010:  return("Error 4010:  No memory for array string.");
    case 4011:  return("Error 4011:  Too long string.");
    case 4012:  return("Error 4012:  Remainder from zero divide.");
    case 4013:  return("Error 4013:  Zero divide.");
    case 4014:  return("Error 4014:  Unknown command.");
    case 4015:  return("Error 4015:  Wrong jump (never generated error).");
    case 4016:  return("Error 4016:  Not initialized array.");
    case 4017:  return("Error 4017:  DLL calls are not allowed.");
    case 4018:  return("Error 4018:  Cannot load library.");
    case 4019:  return("Error 4019:  Cannot call function.");
    case 4020:  return("Error 4020:  Expert function calls are not allowed.");
    case 4021:  return("Error 4021:  Not enough memory for temp string returned from function.");
    case 4022:  return("Error 4022:  System is busy (never generated error).");
    case 4050:  return("Error 4050:  Invalid function parameters count.");
    case 4051:  return("Error 4051:  Invalid function parameter value.");
    case 4052:  return("Error 4052:  String function internal error.");
    case 4053:  return("Error 4053:  Some array error.");
    case 4054:  return("E

Показано первые 50% кода (символов: 29462)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
2 946,20₽ ≈ $36.01