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

CurrencyExposure

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

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

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

О программе

CurrencyExposure — это пользовательский индикатор для MetaTrader 4, разработанный автором renexxxx. Индикатор отображает информацию о валютной экспозиции открытых торговых позиций прямо на графике в правом верхнем углу.

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

Результат отображается в виде цветных прямоугольных блоков с текстом: положительная экспозиция окрашивается в зелёный, отрицательная — в красный, интенсивность цвета зависит от относительной величины экспозиции. Обновление данных происходит через заданный интервал в секундах.

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

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

НастройкаОписание
MagicNumber MagicNumber — Магический номер ордеров, по которому фильтруются открытые позиции для расчёта экспозиции. Значение -1 означает учёт всех ордеров.
RefreshSeconds RefreshSeconds — Интервал обновления данных экспозиции в секундах. Индикатор пересчитывает и перерисовывает информацию через указанный промежуток времени.
Получить полный код

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

#property version   "1.00"
#property strict
#property indicator_chart_window
#define screenFont   "tahoma"
#define objectPrefix "CE_"

input int           MagicNumber          = -1;
input int           RefreshSeconds       = 60;

struct CURRINFO {
   string currency;
   double buyLots;
   double sellLots;
};

int sorted[];         // To sort the indices in currencyInfo

CURRINFO currencyInfo[];

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

void OnDeinit(const int reason) {

   deleteAllObjects();

   ArrayFree(sorted);
   ArrayResize(sorted,0);

   ArrayFree(currencyInfo);
   ArrayResize(currencyInfo,0);

}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]) {
      // код доступен только после оплаты
   }

bool isBasketOpen( int magic ) {

   bool exists = false;
   int allOrders = OrdersTotal();

   for (int i = 0; i < allOrders; i++) {
      if (OrderSelect(i, SELECT_BY_POS)) {
         if ( ( (magic == -1) || ( OrderMagicNumber() == magic ) ) && ( (OrderType() == OP_BUY) || (OrderType() == OP_SELL) ) ) {
            exists = true;
            break;
         }
      }
   } // for
   return(exists);
}

void currencyExposure( int magic, CURRINFO &info[] ) {

   double lots;
   string baseCUR, quoteCUR;
   int allOrders = OrdersTotal();

   ArrayFree(info);
   ArrayResize(info,0);

   for (int i = 0; i < allOrders; i++) {
      if (OrderSelect(i, SELECT_BY_POS)) {
         if ( ( (magic == -1) || ( OrderMagicNumber() == magic ) ) && ( (OrderType() == OP_BUY) || (OrderType() == OP_SELL) ) ) {
            lots = OrderLots();
            baseCUR = StringSubstr(OrderSymbol(),0,3);
            quoteCUR = StringSubstr(OrderSymbol(),3,3);
            if (OrderType() == OP_BUY) {
               addExposure( info, baseCUR, lots, 0.0 );
               addExposure( info, quoteCUR, 0.0, lots );
            }
            else if ( OrderType() == OP_SELL) {
               addExposure( info, baseCUR, 0.0, lots );
               addExposure( info, quoteCUR, lots, 0.0 );
            }
         }
      }
   } // for
}

void addExposure( CURRINFO &info[], string cur, double buyLots, double sellLots ) {

   int index = findCurrency(info, cur);

   if ( index == -1 ) {                // Can't find cur::create a new element in info
      index = ArraySize(info);
      ArrayResize(info, index+1);
      info[index].currency = cur;
      info[index].buyLots = buyLots;
      info[index].sellLots = sellLots;
   }
   else {
      info[index].buyLots += buyLots;
      info[index].sellLots += sellLots;
   }

}

int findCurrency( CURRINFO &info[], string cur ) {

   int index = -1;

   for(int iInfo=0; iInfo < ArraySize(info); iInfo++) {
      if ( info[iInfo].currency == cur ) {
         index = iInfo;
         break;
      }
   }
   return(index);
}

void sortExposure(CURRINFO &info[], int &sort[] ) {

   int count = ArraySize(info);
   if ( count == 0) return;    // Nothing to do

   int tempID;

   ArrayFree(sort);
   ArrayResize(sort, count);
   for (int id=0; id < count; id++) sort[id] = id;

   for (int id1=0; id1 < count-1; id1++ ) {
      for ( int id2=id1+1; id2 < count; id2++ ) {
         if ( (info[sort[id1]].buyLots - info[sort[id1]].sellLots)  < (info[sort[id2]].buyLots - info[sort[id2]].sellLots) ) {
            tempID = sort[id1];
            sort[id1] = sort[id2];
            sort[id2] = tempID;
         } // if
      } // for
   } // for
}

void drawExposure(CURRINFO &info[], int &sort[] ) {

   int count = ArraySize(info);
   if ( count == 0) return;    // Nothing to do

   deleteAllObjects();

   int xPos = 80, yPos = 25;

   double highest = info[sort[0]].buyLots - info[sort[0]].sellLots;
   double lowest  = info[sort[count-1]].buyLots - info[sort[count-1]].sellLots;
   string cur;
   double exposure;
   color  boxColor, textColor;

   for (int iInfo=0; iInfo < count; iInfo++) {

      cur = info[sort[iInfo]].currency;
      exposure = info[sort[iInfo]].buyLots - info[sort[iInfo]].sellLots;

      boxColor = clrBlack;
      textColor = clrWhite;
      if ( exposure > 0.0 && highest > 0.0 ) {
         boxColor = valueToColor( exposure / highest );
         textColor = ( (exposure / hi

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

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

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

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

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

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

Стоимость полного кода
686₽ ≈ $8.38