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

Ilan_mql5

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

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

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

О программе

Программа представляет собой торговый советник для платформы MetaTrader 5, обрабатывающий событие OnTick и выполняющий торговые операции через API OrderSend. Она управляет позициями на одном инструменте, открывая и закрывая сделки в зависимости от изменения цены и настроенных параметров.
Советник поддерживает торговлю с увеличением лотов при наращивании числа позиций, а также функцию Trailing Stop для перемещения StopLoss при благоприятном движении цены. При открытии новых позиций автоматически устанавливается уровень TakeProfit.
Дополнительно реализована возможность аварийного закрытия позиции при достижении лимита по времени нахождения в сделке. Все торговые операции выполняются через стандартный механизм OrderSend с учётом проскальзывания и магического номера.

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

НастройкаОписание
TakeProfit ? ??????? (TakeProfit) Тейк-профит — Уровень TakeProfit в пунктах для каждой новой сделки.
?????? ???? ???????? ????? (PipStep) Шаг в пунктах — Шаг в пунктах, при достижении которого открывается дополнительная сделка в противоположном направлении.
????????? ????? ???? (Lots) Размер лота — Начальный размер лота для первой сделки.
?????????? ?????? ????? ??????? ? ?????? ???? (LotDecimal) Число знаков лота — Количество знаков после запятой в размере лота для отображения и расчётов.
?????????? ?????????? ?????? ???? (LotExponent) Экспонент лота — Числовой коэффициент, определяющий степень увеличения размера лота при каждой новой позиции.
?????????? ????? ????????? (MagicNumber) Магический номер — Магический номер, идентифицирующий сделки, управляемые данным советником.
???????????? ?????????? ???????? ????? (MaxTrades) Максимум сделок — Максимальное количество одновременных сделок в рамках одной позиции.
??????????????? (Slip) Проскальзывание — Допустимое отклонение цены при выполнении торговых операций.
???????????? TrailingStop (UseTrailingStop) Использовать трейлинг-стоп — Переключатель, включающий или отключающий функцию автоматического перемещения StopLoss.
??????? ? ???????, ??????????? ??? ?????? ????? (TrailStart) Начало трейлинга — Прибыть в пунктах, при достижении которой активируется перемещение StopLoss.
StopLoss ? ???????, ???????????? ??? ????? (TrailStop) Трейлинг-стоп — Расстояние в пунктах от текущей цены до StopLoss при работе трейлинг-стопа.
Получить полный код

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

#property version   "1.00"

input     double  TakeProfit       = 10;          // TakeProfit ? ???????
input     double  PipStep          = 30;          // ?????? ???? ???????? ?????
input     double  Lots             = 0.10;        // ????????? ????? ????
input     int     LotDecimal       = 1;           // ?????????? ?????? ????? ??????? ? ?????? ????
input     double  LotExponent      = 1.70;        // ?????????? ?????????? ?????? ????
input     int     MagicNumber      = 70707;       // ?????????? ????? ?????????
input     int     MaxTrades        = 8;           // ???????????? ?????????? ???????? ?????
input     int     Slip             = 3;           // ???????????????

input     bool    UseTrailingStop  = false;       // ???????????? TrailingStop
input     int     TrailStart       = 10;          // ??????? ? ???????, ??????????? ??? ?????? ?????
input     int     TrailStop        = 10;          // StopLoss ? ???????, ???????????? ??? ?????

/*input*/ bool    UseEquityStop    = false;       // ???????????? ??????????? ?? ??????
/*input*/ double  TotalEquityRisk  = 50.0;        // ???????????? ?????? ? ????????? ?? ????????

/*input*/ bool    UseTimeOut       = false;       // ???????????? ??????????? ?? ????? ????? ???????
/*input*/ double  MaxTradeOpenHours = 48;         // ???????????? ????? ????? ??????? ? ?????

double     Spread;
string     ExpertName = "Ilan_mql5";
datetime   Expiration;
double     LotSize;
int        i = 0, Total;
bool       TradeNow = false, LongTrade = false, ShortTrade = false;
int        Ticket = 0;
bool       NewOrdersPlaced = false;
double     LastBuyPrice, LastSellPrice;
double     iTakeProfit, iPipStep;
int        iTrailStart, iTrailStop;
long       PositionID = 0;     // ????????????? ???????? ???????

bool       Position = false;   // true - ???? ???????? ???????, false - ???
double     OpenPrice;          // ???? ???????? ???????

double     OldOpenPrice = 0;   // ????????? ???? ???????? ???????

MqlTick          LastPrices;   // ????????? ??? ????????? ????????? ??????? ??????
MqlTradeRequest  Request;      // ????????? ??? ???????? ?????? ???????? OrderSend()
MqlTradeResult   Result;       // ????????? ? ??????????? ???????? ???????? ??????

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

void OnDeinit(const int reason)
  {
    return;
  }

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

    if (UseTrailingStop)
      TrailPosition(iTrailStart, iTrailStop);

    if (UseTimeOut && TimeCurrent() >= Expiration)
      {
        Print("????? ????? ??????? ???????, ?????????????? ???????? ???????");
        ClosePosition();  // ????????? ???????
      }

    long TickVolume[1];  // ?????? ??? ???????? ?????? ?????????? ????

    if (CopyTickVolume(_Symbol, _Period, 0, 1, TickVolume) != 1)
      {
        Print("?? ??????? ???????? ?????????? ????? ?? ??????? ????");
        return;
      }

    if (TickVolume[0] > 1) return;

    if (UseEquityStop)
      {

        double AccountEquity = AccountInfoDouble(ACCOUNT_EQUITY);
        double AccountBalance = AccountInfoDouble(ACCOUNT_BALANCE);

        if (AccountEquity <= AccountBalance * (1 - TotalEquityRisk / 100))
          {
            Print("???????? ", TotalEquityRisk, "% ????????, ?????????????? ???????? ???????");
            ClosePosition();
          }
      }

    if (!PositionSelect(_Symbol))    // ??? ????? ???????
      {
        Position = false;
      }
    else  // ???? ???? ???????
      {
        Position = true;
        PositionID = PositionGetInteger(POSITION_IDENTIFIER); // ????????????? ???????
      }

    if (Position)  // ???? ???? ???????? ???????
      {
        if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)  // ??????? Buy
          {
            LongTrade = true;
            ShortTrade = false;
          }
        if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)  // ??????? Sell
          {
            LongTrade = false;
            ShortTrade = true;
          }
      }

    if (Position) Total = CountTrades(PositionID);
    else Total = 0;

    if (Position && (Total > 0 && Total <= MaxTrades))
      {

        LastBuyPrice = FindLastBuyPrice(PositionID);
        LastSellPrice = FindLastSellPrice(PositionID);

        if (SymbolInfoTick(_Symbol, LastPrices))  // ??????? ? LastPrices ????????? ????
          {
            if (LongTrade && LastBuyPrice - LastPrices.ask >= iPipStep * _Point)  // ???? ???? ????
              TradeNow = true;

            if (ShortTrade && LastPrices.bid - LastSellPrice >= iPipStep * _Point) // ???? ???? ?????
              TradeNow = true;
          }
      }  // if (Total > 0 && Total <= MaxTrades)

    if (!Position)
      {
        ShortTrade = false;
        LongTrade = false;
        TradeNow = true;

      }

    if (Position && TradeNow)
      {

        LotSize = NormalizeDouble(Lots * MathPow(LotExponent, Total), LotDecimal);

        Request.action       = TRADE_ACTION_DEAL;  // ??????????? ?????????? ??????
        Request.symbol       = _Symbol;            // ???????? ??????????
        Request.volume       = LotSize;            // ????? ????
        Request.sl           = 0;                  // StopLoss
        Request.tp           = 0;                  // TakeProfit
        Request.deviation    = Slip;               // ???????????????
        Request.type_filling = ORDER_FILLING_AON;  // ??? ?????? ?? ??????????
        Request.magic        = MagicNumber;        // ?????????? ?????

        if (!SymbolInfoTick(_Symbol, LastPrices))
          {
            Print("?? ??????? ???????? ????????? ??????? ??????");
            return;
          }

        if (ShortTrade)  // Sell - ?????
          {
            Request.price = ND(LastPrices.bid);      // ???? ???????
            Request.type = ORDER_TYPE_SELL;          // ??? ??????

            if (!OrderSend(Request, Result))
              {
                Print("?? ??????? ??????? ????? Sell, ??? ?????? ", Result.retcode);
                return;
              }

            TradeNow = false;
            NewOrdersPlaced = true;  // ????? ????? ??????
          }
        else if (LongTrade)  // Buy - ?????
          {
            Request.price = ND(LastPrices.ask);     // ???? ???????
            Request.type = ORDER_TYPE_BUY;          // ??? ??????

            if (!OrderSend(Request, Result))
              {
                Print("?? ??????? ??????? ?????, ??? ?????? ", Result.retcode);
                return;
              }

            TradeNow = false;
            NewOrdersPlaced = true;  // ????? ????? ??????
          }
      }  // if (TradeNow)

   if (!Position && TradeNow)  // ???? ??? ???????? ???????
      {

        MqlRates Rates[1];

        if (CopyRates(_Symbol, _Period, 1, 1, Rates) != 1)
          {
            Print("?? ??????? ???????? ??????? ?????? ??? ?????????? ?????");
            return;
          }

        if (!ShortTrade && !LongTrade)
          {

            LotSize = NormalizeDouble(Lots * MathPow(LotExponent, Total), LotDecimal);

            Request.action       = TRADE_ACTION_DEAL;  // ??????????? ?????????? ??????
            Request.symbol       = _Symbol;            // ???????? ??????????
            Request.volume       = LotSize;            // ????? ????
            Request.sl           = 0;                  // StopLoss
            Request.tp           = 0;                  // TakeProfit
            Request.deviation    = Slip;               // ???????????????
            Request.type_filling = ORDER_FILLING_AON;  // ??? ?????? ?? ??????????
            Request.magic        = MagicNumber;        // ?????????? ?????

            if (!SymbolInfoTick(_Symbol, LastPrices))
              {
                Print("?? ??????? ???????? ????????? ??????? ??????");
                return;
              }

            if (Rates[0].open > Rates[0].close)  // ???? ????????? ????? ?????? - ???????
              {

                Request.price = ND(LastPrices.bid);      // ???? ???????
                Request.type = ORDER_TYPE_SELL;          // ??? ??????

                if (!OrderSend(Request, Result))
                  {
                    Print("?? ??????? ??????? ?????, ??? ?????? ", Result.retcode);
                    return;
                  }

                NewOrdersPlaced = true;  // ????? ????? ??????
              }
            else  // ???? ????????? ????? ????? - ????????
              {

                Request.price = ND(LastPrices.ask);     // ???? ???????
                Request.type = ORDER_TYPE_BUY;          // ??? ??????

                if (!OrderSend(Request, Result))
                  {
                    Print("?? ??????? ??????? ?????, ??? ?????? ", Result.retcode);
                    return;
                  }

                NewOrdersPlaced = true;  // ????? ????? ??????
              }
          }  // if (!ShortTrade && !LongTrade)

        if (NewOrdersPlaced)
          Expiration = (datetime)(TimeCurrent() + PeriodSeconds(PERIOD_H1) * MaxTradeOpenHours);

        TradeNow = false;
      }  // if (!Position && TradeNow)

    if (NewOrdersPlaced)
      {

        if (!PositionSelect(_Symbol)) return;  // ??? ????? ???????

        double CurrStopLoss = PositionGetDouble(POSITION_SL); // StopLoss ???????

        OpenPrice = Positi

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

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

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

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

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

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

Стоимость полного кода
1 279,90₽ ≈ $15.64