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

RSI Averaging EA

rsi_averaging_ea.mq5

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

#ultimate macd divergence.mq5MQL5 / MetaTrader 5 · 1 общих теговdynamic keltner rsi rebound v3.pineTradingView · 1 общих теговle van do® - swing signals & overlays private.pineTradingView · 1 общих тегов#pallada_assistant_nrw.mq5MQL5 / MetaTrader 5 · 1 общих тегов#pallada_assistant.mq5MQL5 / MetaTrader 5 · 1 общих тегов#mtf_rsi.mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

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

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

О программе

RSI Averaging EA — торговый советник для MetaTrader 5, который использует индикатор RSI для определения зон перекупленности и перепроданности. При достижении RSI заданных уровней советник открывает первую позицию (BUY или SELL), а затем усредняет убыток, добавляя дополнительные слои с увеличенным лотом при неблагоприятном движении цены.

Советник работает только по новым барам и отслеживает текущий спред — при превышении порога MaxSpread вход в рынок блокируется. Позиции открываются через торговый API CTrade без индивидуальных стоп-лоссов и тейков-профитов; управление закрытием полностью возложено на советника.

Закрытие всех позиций одного типа происходит при достижении RSI обратного уровня, возврате цены к цене первого входа (если включён CloseAtFirstEntry) или при срабатывании жёсткого глобального стоп-лосса. После перезапуска советник восстанавливает количество активных слоёв и цены входа по открытым позициям.

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

НастройкаОписание
RSI_Period Период расчёта индикатора RSI.
RSI_Sell_Entry Уровень RSI, при пересечении вверх которого открывается первая SELL-позиция.
RSI_Buy_Entry Уровень RSI, при пересечении вниз которого открывается первая BUY-позиция.
RSI_Sell_Close Уровень RSI, при достижении которого все SELL-позиции закрываются.
RSI_Buy_Close Уровень RSI, при достижении которого все BUY-позиции закрываются.
BaseLot Размер лота для первого входа в позицию.
LotMultiplier Множитель лота для каждого последующего слоя усреднения (например, 2 означает удвоение лота).
AvgStep_Pips Расстояние в пунктах, на которое цена должна сместиться в неблагоприятном направлении для открытия следующего слоя усреднения.
MaxLayers Максимальное количество слоёв усреднения, включая первый вход.
CloseAtFirstEntry При включении все позиции одного типа закрываются также при возврате цены к уровню первого входа.
GlobalStopLoss Жёсткий стоп-лосс в пунктах (0 — отключён). При достижении убытка заданного размера все позиции закрываются.
MagicNumber Магический номер для идентификации позиций, открытых данным советником.
TradeComment Комментарий, присваиваемый каждой открытой позиции.
MaxSpread Максимально допустимый спред в пунктах. При превышении советник не открывает новые позиции.
Получить полный код

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

#property version   "2.00"
#property strict

#include <Trade\Trade.mqh>

input group "=== RSI Settings ==="
input int    RSI_Period      = 19;      // RSI Period
input double RSI_Sell_Entry  = 70.0;   // RSI level to open first SELL
input double RSI_Buy_Entry   = 30.0;   // RSI level to open first BUY
input double RSI_Sell_Close  = 60.0;   // RSI level to close all SELLs
input double RSI_Buy_Close   = 40.0;   // RSI level to close all BUYs

input group "=== Averaging Settings ==="
input double BaseLot         = 0.01;   // Base lot size (first entry)
input double LotMultiplier   = 2.0;    // Lot multiplier per layer (e.g. 2 = double)
input double AvgStep_Pips    = 10.0;   // Pips to add next layer (adverse move)
input int    MaxLayers       = 5;      // Maximum number of averaging layers

input group "=== Exit Settings ==="
input bool   CloseAtFirstEntry = true; // Also close when price returns to 1st entry
input double GlobalStopLoss  = 500.0;  // Hard stop loss in pips (0 = disabled)

input group "=== Trade Settings ==="
input int    MagicNumber     = 789101; // Magic Number
input string TradeComment    = "RSI_AVG";
input int    MaxSpread       = 60;     // Max spread in points

CTrade trade;
int    rsiHandle;
double rsiBuffer[];

double firstEntryPrice_Sell = 0;
double firstEntryPrice_Buy  = 0;
double lastLayer_Sell_Price = 0;
double lastLayer_Buy_Price  = 0;
int    sellLayers           = 0;
int    buyLayers            = 0;

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

void OnDeinit(const int reason)
  {
   if(rsiHandle != INVALID_HANDLE) IndicatorRelease(rsiHandle);
  }

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

   if((int)SymbolInfoInteger(_Symbol, SYMBOL_SPREAD) > MaxSpread) return;

   if(CopyBuffer(rsiHandle, 0, 0, 3, rsiBuffer) < 3) return;
   double rsiNow  = rsiBuffer[1]; // last closed bar
   double rsiPrev = rsiBuffer[2];

   double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double pip = 10 * _Point; // 1 pip in price units

   SyncLayerCounts();

   if(sellLayers == 0 && rsiPrev < RSI_Sell_Entry && rsiNow >= RSI_Sell_Entry)
     {
      double lot = BaseLot;
      if(OpenSell(lot, bid))
        {
         firstEntryPrice_Sell = bid;
         lastLayer_Sell_Price = bid;
         sellLayers = 1;
         Print("SELL Layer 1 opened @ ", bid, " | Lot: ", lot, " | RSI: ", rsiNow);
        }
     }

   if(sellLayers > 0 && sellLayers < MaxLayers)
     {
      double nextLayerPrice = lastLayer_Sell_Price + AvgStep_Pips * pip;
      if(ask >= nextLayerPrice)
        {
         double lot = NormalizeLot(BaseLot * MathPow(LotMultiplier, sellLayers));
         if(OpenSell(lot, bid))
           {
            lastLayer_Sell_Price = bid;
            sellLayers++;
            Print("SELL Layer ", sellLayers, " opened @ ", bid, " | Lot: ", lot, " | RSI: ", rsiNow);
           }
        }
     }

   if(sellLayers > 0)
     {
      bool rsiExit   = (rsiNow <= RSI_Sell_Close);
      bool priceExit = (CloseAtFirstEntry && ask <= firstEntryPrice_Sell);
      bool stopExit  = (GlobalStopLoss > 0 && ask >= firstEntryPrice_Sell + GlobalStopLoss * pip);

      if(rsiExit || priceExit || stopExit)
        {
         string reason = rsiExit ? "RSI reached " + DoubleToString(RSI_Sell_Close,0) :
                         priceExit ? "Price returned to first entry" : "Global Stop Loss hit";
         Print("Closing all SELL positions. Reason: ", reason);
         CloseAllByType(ORDER_TYPE_SELL);
         firstEntryPrice_Sell = 0;
         lastLayer_Sell_Price = 0;
         sellLayers = 0;
        }
     }

   if(buyLayers == 0 && rsiPrev > RSI_Buy_Entry && rsiNow <= RSI

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

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

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

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

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

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

Стоимость полного кода
586₽ ≈ $7.30