newstrader.mq5
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «newstrader.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
NewsTrader — торговый советник для MetaTrader 5, предназначенный для открытия сделок за несколько секунд до выхода важных экономических новостей. Поддерживаются направления: покупка, продажа, обе стороны или случайный выбор. Советник устанавливает стоп-лосс и тейк-профит, а также непрерывно корректирует их до момента публикации новости.
Программа позволяет переводить стоп-лосс на уровень безубыточности или использовать ATR-трейлинг-стоп. После выхода новости сделка может быть закрыта автоматически по истечении заданного времени. Встроена функция защиты от слишком широкого спреда.
Советник включает систему управления капиталом с расчётом размера позиции на основе допустимого риска, а также отображение таймера до и после новостного события прямо на графике.
Настройки программы
| Настройка | Описание |
|---|---|
| NewsTime | Дата и время выхода новости, вокруг которых советник управляет сделками. |
| StopLoss | Стоп-лосс в пунктах брокера, используется как базовый уровень при расчёте ATR-уровней и управлении капиталом. |
| TakeProfit | Тейк-профит в пунктах брокера, используется как базовый уровень при расчёте ATR-уровней и управлении капиталом. |
| Direction | Направление открытия сделки: покупка, продажа, обе стороны или случайный выбор. |
| TrailingStop | Тип трейлинг-стопа: безубыточность, полное следование за ценой или отключено. |
| PreAdjustSLTP | При включении стоп-лосс и тейк-профит корректируются до момента выхода новости. |
| SecondsBefore | Количество секунд до выхода новости, через которое советник открывает сделку. |
| CloseAfterSeconds | Количество секунд после выхода новости, через которое сделка закрывается автоматически. Значение 0 отключает функцию. |
| SpreadFuse | При включении открытие позиций блокируется, если текущий спред превышает значение стоп-лосса. |
| UseATR | При включении уровни стоп-лосса и тейк-профита рассчитываются на основе индикатора ATR вместо фиксированных значений. |
| ATR_Period | Период индикатора ATR, используемый для расчёта уровней стоп-лосса и тейк-профита. |
| ATR_Multiplier_SL | Множитель ATR для расчёта уровня стоп-лосса. Используется, когда включён расчёт уровней на основе ATR. |
| ATR_Multiplier_TP | Множитель ATR для расчёта уровня тейк-профита. Используется, когда включён расчёт уровней на основе ATR. |
| Lots | Фиксированный объём сделки в лотах, используется при отключённом управлении капиталом. |
| MM | При включении размер позиции рассчитывается автоматически на основе стоп-лосса и допустимого риска. |
| Risk | Допустимый риск в процентах от баланса (или указанного баланса), используемый при расчёте размера позиции. |
| FixedBalance | Если больше нуля, используется как баланс для расчёта размера позиции при управлении капиталом. |
| MoneyRisk | Допустимый риск в денежном выражении (в валюте счёта), используется вместо процентного расчёта при включённом соответствующем параметре. |
| UseMoneyInsteadOfPercentage | При включении риск задаётся в денежном выражении, а не в процентах от баланса. |
| UseEquityInsteadOfBalance | При включении для расчёта размера позиции используется собственный капитал (эквити) вместо баланса. |
| ShowTimer | При включении на графике отображается таймер до выхода новости и время после неё. |
| FontSize | Размер шрифта текста таймера на графике. |
| Font | Шрифт текста таймера на графике. |
| FontColor | Цвет текста таймера на графике. |
| Corner | Угол графика, в котором располагается таймер и текстовые объекты. |
| X_Distance | Расстояние в пикселях от указанного угла графика до текстового объекта таймера по горизонтальной оси. |
| Y_Distance | Расстояние в пикселях от указанного угла графика до текстового объекта таймера по вертикальной оси. |
| Slippage | Допустимое отклонение цены исполнения от запрашиваемой цены в пунктах. |
| Magic | Магический номер для идентификации сделок, открытых данным советником. |
| Commentary | Текстовое описание сделки (например, название новости), добавляемое к сделке в комментарии. |
Поиск по коду файла
#property version "1.10"
#property description "Opens a buy/sell trade (random, chosen direction, or both directions) seconds before news release."
#property description "Sets SL and TP. Keeps updating them until the very release."
#property description "Can set SL to breakeven when unrealized profit = SL."
#property description "Alternatively, adds ATR based trailing stop."
#property description "Closes trade after given time period passes."
#include <Trade/Trade.mqh>
#include <Trade/OrderInfo.mqh>
#include <Trade/PositionInfo.mqh>
enum dir_enum
{
Buy,
Sell,
Both,
Random
};
enum trailing_enum
{
Breakeven,
Full,
None
};
input group "Trading"
input datetime NewsTime = __DATE__; // News date/time.
input int StopLoss = 15; // Stop-loss in broker's pips.
input int TakeProfit = 75; // Take-profit in broker's pips.
input dir_enum Direction = Both; // Direction of the trade to open.
input trailing_enum TrailingStop = None; // Trailing stop type.
input bool PreAdjustSLTP = false; // Preadjust SL/TP until news is out.
input int SecondsBefore = 18; // Seconds before the news to open a trade.
input int CloseAfterSeconds = 3600; // Close trade X seconds after the news, 0 - turn the feature off.
input bool SpreadFuse = true; // SpreadFuse - prevent trading if spread >= stop-loss.
input group "ATR"
input bool UseATR = false; // Use ATR-based stop-loss and take-profit levels.
input int ATR_Period = 14; // ATR Period.
input double ATR_Multiplier_SL = 1; // ATR multiplier for SL.
input double ATR_Multiplier_TP = 5; // ATR multiplier for TP.
input group "Money management"
input double Lots = 0.01;
input bool MM = true; // Money Management, if true - position sizing based on stop-loss.
input double Risk = 1; // Risk - Risk tolerance in percentage points.
input double FixedBalance = 0; // FixedBalance: If > 0, trade size calc. uses it as balance.
input double MoneyRisk = 0; // MoneyRisk: Risk tolerance in account currency.
input bool UseMoneyInsteadOfPercentage = false; // Use money risk instead of percentage.
input bool UseEquityInsteadOfBalance = false; // Use equity instead of balance.
input group "Timer"
input bool ShowTimer = true; // Show timer before and after news.
input int FontSize = 18;
input string Font = "Arial";
input color FontColor = clrRed;
input ENUM_BASE_CORNER Corner = CORNER_LEFT_UPPER;
input int X_Distance = 10; // X-axis distance from the chart corner.
input int Y_Distance = 130; // Y-axis distance from the chart corner.
input group "Miscellaneous"
input int Slippage = 3;
input int Magic = 794823491;
input string Commentary = "NewsTrader"; // Comment - trade description (e.g. "US CPI", "EU GDP", etc.).
bool HaveLongPosition, HaveShortPosition;
bool HaveBuyPending = false, HaveSellPending = false;
bool ECN_Mode, Hedging_Mode;
int news_time;
bool CanTrade = false;
bool Terminal_Trade_Allowed = true;
double SL, TP;
string AccountCurrency = "";
string ProfitCurrency = "";
string BaseCurrency = "";
ENUM_SYMBOL_CALC_MODE CalcMode;
string ReferencePair = NULL;
bool ReferenceSymbolMode;
CTrade *Trade;
CPositionInfo PositionInfo;
void OnInit()
{
// код доступен только после оплаты
}
void OnDeinit(const int reason)
{
ObjectDelete(ChartID(), "NewsTraderTimer");
delete Trade;
}
void OnTimer()
{
string text;
int difference = (int)TimeCurrent() - news_time;
if (difference <= 0) text = "Time to news: " + TimeDistance(-difference);
else text = "Time after news: " + TimeDistance(difference);
ObjectSetString(0, "NewsTraderTimer", OBJPROP_TEXT, text + ".");
ObjectSetInteger(0, "NewsTraderTimer", OBJPROP_FONTSIZE, FontSize);
ObjectSetString(0, "NewsTraderTimer", OBJPROP_FONT, Font);
ObjectSetInteger(0, "NewsTraderTimer", OBJPROP_COLOR, FontColor);
ChartRedraw(0);
}
string TimeDistance(int t)
{
if (t == 0) return("0 seconds");
string s = "";
int y = 0;
int d = 0;
int h = 0;
int m = 0;
y = t / 31536000;
t -= y * 31536000;
d = t / 86400;
t -= d * 86400;
h = t / 3600;
t -= h * 3600;
m = t / 60;
t -= m * 60;
if (y) s += IntegerToString(y) + " year";
if (y > 1) s += "s";
if (d) s += " " + IntegerToString(d) + " day";
if (d > 1) s += "s";
if (h) s += " " + IntegerToString(h) + " hour";
if (h > 1) s += "s";
if (m) s += " " + IntegerToString(m) + " minute";
if (m > 1) s += "s";
if (t) s += " " + IntegerToString(t) + " second";
if (t > 1) s += "s";
StringTrimLeft(s);
return s;
}
void OnTick()
{
// код доступен только после оплаты
}
void GetPositionStates()
{
HaveLongPosition = false;
HaveShortPosition = false;
int total = PositionsTotal();
for (int cnt = 0; cnt < total; cnt++)
{
if (PositionGetSymbol(cnt) != Symbol()) continue;
if (PositionGetInteger(POSITION_MAGIC) != Magic) continue;
if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) HaveLongPosition = true;
else if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) HaveShortPosition = true;
}
}
void ControlPosition()
{
int total = PositionsTotal();
for (int cnt = total - 1; cnt >= 0; cnt--)
{
if (!Hedging_Mode)
{
if (!PositionSelect(PositionGetSymbol(cnt))) continue;
if (PositionGetInteger(POSITION_MAGIC) != Magic) continue;
}
else
{
if (PositionGetSymbol(cnt) != Symbol()) continue;
}
double Ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
double Bid = SymbolInfoDouble(Symbol(), SYMBOL_BID);
ulong ticket = PositionGetInteger(POSITION_TICKET);
int time = (int)TimeCurrent();
if (time < news_time)
{
double new_sl = 0, new_tp = 0;
if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
{
new_sl = NormalizeDouble(Ask - SL * Point(), Digits());
new_tp = NormalizeDouble(Ask + TP * Point(), Digits());
}
else if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
{
new_sl = NormalizeDouble(Bid + SL * Point(), Digits());
new_tp = NormalizeDouble(Bid - TP * Point(), Digits());
}
if ((((new_sl != NormalizeDouble(PositionGetDouble(POSITION_SL), Digits())) || (new_tp != NormalizeDouble(PositionGetDouble(POSITION_TP), Digits()))) && (PreAdjustSLTP)) ||
(((PositionGetDouble(POSITION_SL) == 0) || (PositionGetDouble(POSITION_TP) == 0)) && (ECN_Mode)))
{
Print("Adjusting SL: ", new_sl, " and TP: ", new_tp, ".");
for (int i = 0; i < 10; i++)
{
bool result = Trade.PositionModify(ticket, new_sl, new_tp);
if (result) return;
else Print("Error modifying position: ", GetLastError());
}
}
}
else
{
if ((TrailingStop == Breakeven) && ((((PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) && (Ask - PositionGetDouble(POSITION_PRICE_OPEN) >= SL * Point())) || ((PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) && (PositionGetDouble(POSITION_PRICE_OPEN) - Bid >= SL * Point())))))
{
double new_sl = NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN), Digits());
if (new_sl != NormalizeDouble(PositionGetDouble(POSITION_SL), Digits()))
{
Print("Moving SL to breakeven: ", new_sl, ".");
for (int i = 0; i < 10; i++)
{
bool result = Trade.PositionModify(ticket, new_sl, PositionGetDouble(POSITION_TP));
if (result) breakПоказано первые 50% кода (символов: 18355)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.