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