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

newstrader.mq5

Похожие материалы по тегам

#1.mtf_collider_h4_close_13_v18bar.mq4MQL4 / MetaTrader 4 · 1 общих теговea robofibo source v.11.2.mq4MQL4 / MetaTrader 4 · 1 общих теговsma crossover scalper ea for mt4.mq4MQL4 / MetaTrader 4 · 1 общих теговr15 pivot points expert advisor by @fundedmillionairess.mq4MQL4 / MetaTrader 4 · 1 общих теговmm3.0_flip_codepro_v3.1_with_cooldown@lifeindreamsworld.mq5MQL5 / MetaTrader 5 · 1 общих теговmm3.0_flip_codepro_v3.1_with_cooldown.mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

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

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

О программе

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 и перейдите к оплате.

Стоимость полного кода
1 835,50₽ ≈ $22.43