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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.