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

TradeInfo

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

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

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

О программе

TradeInfo — пользовательский индикатор для MetaTrader 4, отображающий на отдельном окне текстовую панель с информацией о торговом счёте и текущих позициях. Программа показывает баланс, эквити, маржу, свободную маржу, плечо, спред, а также статистику по открытым ордерам: количество, лоты, прибыль в деньгах и пипсах для лонг- и шорт-позиций.

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

В настройках можно включать и отключать отдельные блоки информации, задавать уровни риска для расчёта лотов, фильтровать ордера по символу, магическому числу и комментарию, а также настроить размер шрифта и цветовую схему отображения.

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

НастройкаОписание
ShowProfitInfo Переключатель отображения блока истории прибыли: данные за текущий день, вчера, последние дни, неделю, месяц и год.
ShowTodayRanges Переключатель отображения блока диапазонов цены: размах за текущий день, вчера, неделю и месяц в пипсах, а также таймер до следующей свечи.
ShowRiskInfo Переключатель отображения блока информации о риске ордеров, включая расчёт лотов по уровням риска.
RiskStopLoss Значение стоп-лосса в пунктах, используемое для расчёта размера лота по заданным уровням риска. При значении 0 расчёт выполняется по свободной марже.
RiskLevels Список уровней риска в процентах через запятую, используемый для расчёта соответствующих размеров лота (например, 1,5,10,20,40,50,60,80,100).
OnlyAttachedSymbol Переключатель: при активации отображаются только ордера по текущему привязанному символу.
MagicNumber Магическое число для фильтрации ордеров. Значение -1 означает отсутствие фильтра по магическому числу.
CommentFilter Фильтр ордеров по комментарию: отображаются только ордера, содержащие указанную подстроку в комментарии. Пустая строка — без фильтра.
StartDateFilter Фильтр ордеров по дате начала в формате строки даты. Ордера, закрытые до указанной даты, не учитываются.
FontSize Размер шрифта текстовых меток, отображаемых на графике.
WhiteMode Переключатель цветовой схемы отображения. При активации используется светлая тема, при неактивной — тёмная.
Получить полный код

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

#property version   "1.98"
#property strict

#property indicator_separate_window
#property indicator_buffers 0

input bool    ShowProfitInfo          = true;
input bool    ShowTodayRanges         = true;
input bool    ShowRiskInfo            = true;
input bool    ShowAccountOrderInfo    = true;
input int     RiskStopLoss            = 0;
input string  RiskLevels              = "1,5,10,20,40,50,60,80,100";

input bool    OnlyAttachedSymbol      = true;
input int     MagicNumber             = -1;
input string  CommentFilter           = "";
input string  StartDateFilter         = "";
input int     FontSize                = 10;
input bool    WhiteMode               = False;

int      windowIndex                   = 0;
string   preCurrSign                   = "";
string   postCurrSign                  = "";
double   pip_multiplier                = 1.0;
int      daySeconds                    = 86400;

double   MaxDD            = 0,
         MaxDDp           = 0,
         CurrentDD        = 0,
         CurrentDDp       = 0;

datetime maxDDDay;
datetime startDateFilter = 0;
datetime LastDrawProfitInfo = 0;

string   IndiName                      = "TradeInfo v1.9.8";

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

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

void DoWork()
  {

   windowIndex = WindowFind(IndiName);

   CalculateDailyDrawDown();

   if(ShowAccountOrderInfo)
      DrawAccountInfo();
   if(ShowAccountOrderInfo)
      DrawCurrentTrades();
   if(ShowTodayRanges)
      DrawTodayRange();
   if(ShowProfitInfo)
      DrawProfitHistory();
   if(ShowRiskInfo)
      DrawRiskInfo();
   DrawCopyright();
  }

int deinit()
  {

   DeleteAllObject();

   return(0);
  }

void CalculateDailyDrawDown()
  {

   double balance = AccountBalance();

   if(balance != 0)
     {

      CurrentDD = AccountEquity() - AccountBalance();
      CurrentDDp = MathDiv(CurrentDD, balance) * 100.0;

      if(CurrentDD < MaxDD || iTime(Symbol(), PERIOD_D1, 0) > maxDDDay)
        {
         MaxDD    = CurrentDD;
         MaxDDp   = CurrentDDp;
         maxDDDay = iTime(Symbol(), PERIOD_D1, 0);

         setGlobalVar("TRADEINFO_MAXDD",  MaxDD);
         setGlobalVar("TRADEINFO_MAXDDP", MaxDDp);
         setGlobalVar("TRADEINFO_DD_DAY", maxDDDay);
        }
     }
  }

double ND(double value, int decimal = -1)
  {

   if(decimal == -1)
      decimal = Digits();

   return (NormalizeDouble(value, decimal));
  }

string CutAt(string& str, string sep)
  {

   string res = "";

   int index = StringFind(str, sep, 0);
   if(index != -1)
     {
      if(index > 0)
         res = StringSubstr(str, 0, index);
      str = StringSubstr(str, index + StringLen(sep));
     }
   else
     {
      res = str;
      str = "";
     }
   return(res);
  }

color levelColors[10] = {Lime, SpringGreen, SpringGreen, LawnGreen, Gold, Gold, DarkSalmon, Tomato, Tomato, FireBrick};

void DrawRiskInfo()
  {

   SetPipMultiplier(Symbol());

   if(RiskStopLoss > 0)
      DrawText(1, 0, 0, "Order Risk (SL=" + IntegerToString(RiskStopLoss) + ")", WhiteMode?Black:White, FontSize);
   else
      DrawText(1, 0, 0, "Order Risk", WhiteMode?Black:White, FontSize);

   DrawText(1, 1, 0, "-------------------", WhiteMode?Black:White, FontSize);

   string levels = RiskLevels;
   int i = 0;

   while(StringLen(levels) > 0)
     {
      string c = StringTrimLeft(StringTrimRight(CutAt(levels, ",")));
      double value = StringToDouble(c);

      if(value != EMPTY_VALUE)
        {
         color clr = levelColors[ArraySize(levelColors) - 1];
         if(i < ArraySize(levelColors))
            clr = levelColors[i];

         DrawText(1, i + 2, 0, StringConcatenate(value, "%:   ", DTS(MM(value), 2) + " lot"), clr, FontSize);
         i++;
        }
     }
  }

void DrawAccountInfo()
  {

   SetPipMultiplier(Symbol());

   int row = 1;
   string text;
   int colWidth1 = 200;
   color c = WhiteMode?DarkBlue:LightCyan;
   text = StringConcatenate("Balance:  ", MTS(AccountBalance()));
   DrawText(0, row, 0, text, c, FontSize);

   double eqPercent = 0;
   if(AccountBalance() > 0)
      eqPercent = MathDiv(AccountEquity(), AccountBalance() * 100.0);

   text = StringConcatenate("Equity:  ", MTS(AccountEquity()), "  (", DTS(eqPercent, 2), "%)");
   DrawText(0, row, colWidth1, text, c, FontSize);
   row++;
   double marginLevel = 0;

   if(AccountMargin() > 0)
      marginLevel = MathDiv(AccountEquity(), AccountMargin() * 100.0);
   text = StringConcatenate("Margin: ", DTS(AccountMargin(), 2), "  (", DTS(marginLevel, 2), "%)");
   DrawText(0, row, 0, text, c, FontSize);

   if(AccountFreeMargin() < 0)
      c = Red;
   text = StringConcatenate("Free margin: ", DTS(AccountFreeMargin(), 2));
   DrawText(0, row, colWidth1, text, c, FontSize);
   row++;
   c = WhiteMode?DarkBlue:LightCyan;

   text = StringConcatenate("Leverage: 1:", AccountLeverage());
   DrawText(0, row, 0, text, c, FontSize);

   text = StringConcatenate("Swap  Long: ", MTS(MarketInfo(Symbol(), MODE_SWAPLONG), 2), "  Short: ", MTS(MarketInfo(Symbol(), MODE_SWAPSHORT), 2));
   DrawText(0, row, colWidth1, text, c, FontSize);
   row++;

   DrawText(0, row, 0, "------------------------------------------------------------------", Gray, FontSize);
  }

bool IsValidOrder()
  {

   if(!OnlyAttachedSymbol || OrderSymbol() == Symbol())
      if(MagicNumber == -1 || MagicNumber == OrderMagicNumber())
         if(CommentFilter == "" || StringFind(OrderComment(), CommentFilter) != -1)
            return(true);

   return(false);
  }

void DrawCurrentTrades()
  {

   int    buyCount   = 0;
   int    sellCount  = 0;
   double buyProfit  = 0;
   double sellProfit = 0;
   double buyLot     = 0;
   double sellLot    = 0;
   double buyPip     = 0;
   double sellPip    = 0;
   double slPip      = 0;
   double tpPip      = 0;
   double allTPPips  = 0;
   double allSLPips  = 0;
   double maxLoss    = 0;
   double maxProfit  = 0;
   color c = White;
   string text = "";
   int colWidth1 = 200;

   for(int i = OrdersTotal() - 1; i >= 0; i--)
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         if(IsValidOrder())
           {
            slPip = 0;
            tpPip = 0;
            if(OrderType() == OP_BUY)
              {
               buyCount++;
               buyProfit += OrderProfit() + OrderSwap() + OrderCommission();
               buyLot += OrderLots();
               buyPip += point2pip(MarketInfo(OrderSymbol(), MODE_BID) - OrderOpenPrice(), OrderSymbol());

               if(OrderStopLoss() > 0.0)
                  slPip = point2pip(OrderOpenPrice() - OrderStopLoss(), OrderSymbol());
               if(OrderTakeProfit() > 0.0)
                  tpPip = point2pip(OrderTakeProfit() - OrderOpenPrice(), OrderSymbol());
              }
            else
               if(OrderType() == OP_SELL)
                 {
                  sellCount++;
                  sellProfit += OrderProfit() + OrderSwap() + OrderCommission();
                  sellLot += OrderLots();
                  sellPip += point2pip(OrderOpenPrice() - MarketInfo(OrderSymbol(), MODE_BID), OrderSymbol());

                  if(OrderStopLoss() > 0.0)
                     slPip = point2pip(OrderStopLoss() - OrderOpenPrice(), OrderSymbol());
                  if(OrderTakeProfit() > 0.0)
                     tpPip = point2pip(OrderOpenPrice() - OrderTakeProfit(), OrderSymbol());
                 }
            if(slPip != 0)
              {
               maxLoss -= pip2money(slPip, OrderLots(), OrderSymbol());
               allSLPips -= slPip;
              }

            if(tpPip != 0)
              {
               maxProfit += pip2money(tpPip, OrderLots(), OrderSymbol()) + OrderSwap() + OrderCommission();
               allTPPips += tpPip;
              }
           }

   SetPipMultiplier(Symbol());

   int row = 5;

   double spread = MathDiv(MarketInfo(Symbol(), MODE_SPREAD), pip_multiplier);
   if(spread < 3)
      c = WhiteMode?DarkGreen:LawnGreen;
   else
      c = Crimson;
   text = StringConcatenate("Spread: ", DTS(spread, 2));
   DrawText(0, row, 0, text, c, FontSize);

   if(CurrentDD < 0)
      c = WhiteMode?Red:LightPink;
   else
      if(CurrentDD == 0.0)
         c = WhiteMode?Black:White;
      else
         c = WhiteMode?DarkGreen:LawnGreen;
   text = StringConcatenate("Current    DD: ", DTS(CurrentDD, 2), "   (" + DTS(CurrentDDp, 2), "%)");
   DrawText(0, row, colWidth1, text, c, FontSize);
   row++;

   if(MaxDD < 0)
      c = WhiteMode?Red:LightPink;
   else
      if(MaxDD == 0.0)
         c = WhiteMode?Black:White;
      else
         c = WhiteMode?DarkGreen:LawnGreen;
   text = StringConcatenate("Daily Max DD: ", DTS(MaxDD, 2), "   (" + DTS(MaxDDp, 2), "%)");
   DrawText(0, row, colWidth1, text, c, FontSize);
   row++;

   if(maxProfit < 0)
      c = FireBrick;
   else
      if(maxProfit > 0)
         c = WhiteMode?DarkGreen:LawnGreen;
      else
         c = WhiteMode?Black:White;
   text = StringConcatenate("Est. profit: ", MTS(maxProfit), "  (", DTS(allTPPips, 1), " pips)");
   DrawText(0, row, 0, text, c, FontSize);

   if(maxLoss < 0)
      c = Red;
   else
      if(maxLoss > 0)
         c = WhiteMode?DarkGreen:LawnGreen;
      else
         c = WhiteMode?Black:White;
   double maxLossp = 0;
   if(AccountBalance() > 0)
      maxLossp = MathDiv(maxLoss, AccountBalance() * 100);
   text = StringConcatenate("Max loss:  ", MTS(maxLoss), "  (", DTS(allSLPips, 1), " pips)  (", DTS(maxLossp, 2), "%)");
   DrawText(0, row, colWidth1, text, c, FontSize);
   row++;

   DrawText(0, row, 0, "------------------------------------------------------------------", Gray, FontSize);
   row++;

   c = WhiteMode?DimGray:Gainsboro;
   text = StringConcatenate("Long:  ", buyCount);
   DrawText(0, row, 0, text, c, FontSize);
   text = StringConcatenate("Short: ", sellCount);
   DrawText(0, row + 1, 0, text, c, FontSize);

   DrawText(0, row + 2, 0, "------------------------------------------------------------------", Gray, FontSize);
   text = StringConcatenate("Total:  ", buyCount + sellCount);
   DrawText(0, row + 3, 0, text, c, FontSize);

   text = StringConcatenate("LOT: ", DTS(buyLot, 2));
   DrawText(0, row, 65, text, c, FontSize);
   text = StringConcatenate("LOT: ", DTS(sellLot, 2));
   DrawText(0, row + 1, 65, text, c, FontSize);
   text = StringConcatenate("LOT: ", DTS(buyLot + sellLot, 2));
   DrawText(0, row + 3, 65, text, c, FontSize);

   if(buyProfit < 0)
      c = Crimson;
   else
      if(buyProfit == 0.0)
         c = WhiteMode?DimGray:Gainsboro;
      else
         c = WhiteMode?DarkGreen:LawnGreen;
   text = StringConcatenate("Profit: ", MTS(buyProfit), "   (", DTS(buyPip, 1), " pips)");
   DrawText(0, row, colWidth1, text, c, FontSize);

   if(sellProfit < 0)
      c = Crimson;
   else
      if(sellProfit == 0.0)
         c = WhiteMode?DimGray:Gainsboro;
      else
         c = WhiteMode?DarkGreen:LawnGreen;
   text = StringConcatenate("Profit: ", MTS(sellProfit), "   (", DTS(sellPip, 1), " pips)");
   DrawText(0, row + 1, colWidth1, text, c, FontSize);

   if(buyProfit + sellProfit < 0)
      c = Crimson;
   else
      if(buyProfit + sellProfit == 0.0)
         c = WhiteMode?DimGray:Gainsboro;
      else
         c = WhiteMode?DarkGreen:LawnGreen;
   text = StringConcatenate("Profit: ", MTS(buyProfit + sellProfit), "   (", DTS(buyPip + sellPip, 1), " pips)");
   DrawText(0, row + 3, colWidth1, text, c, FontSize);
  }

void DrawProfitHistory()
  {

   if(LastDrawProfitInfo > TimeCurrent() - 10)
      return;
   LastDrawProfitInfo = TimeCurrent();

   datetime day, 

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

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

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

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

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

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

Стоимость полного кода
1 762,10₽ ≈ $21.54