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

reversetrailing_virtual.mq5

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

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

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

О программе

ReverseTrailing Virtual — это торговый советник для MetaTrader 5, который управляет открытыми позициями с помощью виртуальной системы трейлинга без использования брокерных отложенных ордеров. Советник отслеживает движение цены и поддерживает виртуальный уровень стоп-лосса, который следует за ценой на заданном расстоянии.

Когда цена пробивает этот виртуальный уровень, запускается таймер подтверждения (debounce). Если пробой сохраняется в течение заданного времени, советник закрывает текущую позицию и открывает противоположную. Если цена восстанавливается до срабатывания таймера, пробой отбрасывается, что позволяет фильтровать кратковременные флуктуации.

В качестве страховки от аварийного отключения терминала может быть установлен реальный стоп-лосс на уровне входа. Состояние виртуального управления сохраняется в глобальных переменных терминала, что позволяет восстановить работу советника после перезагрузки или перезапуска.

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

НастройкаОписание
InpMMType Тип управления денежными средствами: фиксированный лот или процент от свободной маржи
InpLotSize Размер фиксированного лота при выборе типа управления «фиксированный лот»
InpRiskPercent Процент свободной маржи, используемый для расчёта размера лота при управлении по риску
InpDistancePips Расстояние виртуального трейлинга (в пунктах)
InpMagicNumber Магический номер для идентификации позиций, управляемых данным советником
InpDeviationPoints Допустимое проскальзывание для рыночных ордеров (в пунктах)
InpDebounceSeconds Время в секундах, в течение которого цена должна оставаться за виртуальным уровнем, прежде чем советник выполнит действие (реверс)
InpExtraPenetrationPoints Дополнительное расстояние за виртуальным уровнем, необходимое для запуска таймера подтверждения (0 — отключено)
InpUseCatastrophicStop Переключатель включения/отключения реального стоп-лосса для защиты от аварийного отключения терминала
InpCatastrophicDistancePips Расстояние аварийного стоп-лосса от точки входа (в пунктах); должно находиться значительно за пределами виртуального трейлинга
Получить полный код

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

#property version   "4.00"
#property strict

#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>

CTrade        m_trade;
CSymbolInfo   m_symbol;

enum ENUM_MM_TYPE
  {
   MM_FIXED_LOT   = 0, // Fixed lot
   MM_PERCENT_DEP = 1  // % of free margin
  };

input group "=== Trading Settings ==="
input ENUM_MM_TYPE InpMMType         = MM_FIXED_LOT;  // Money management type
input double       InpLotSize        = 0.1;           // Fixed lot
input double       InpRiskPercent    = 1.0;            // % of free margin
input int          InpDistancePips   = 100;            // Virtual trail distance (points)
input ulong        InpMagicNumber    = 123456;         // Magic number
input int          InpDeviationPoints = 20;             // Allowed slippage for market orders (points)

input group "=== Virtual Whipsaw Filter ==="
input int   InpDebounceSeconds        = 5;    // Price must stay beyond the virtual level this long before EA acts
input int   InpExtraPenetrationPoints = 0;    // Extra distance beyond the level required to even start the debounce timer (0 = off)

input group "=== Safety Net (recommended: keep ON) ==="
input bool  InpUseCatastrophicStop      = true;  // Attach a real broker-side disaster stop
input int   InpCatastrophicDistancePips = 350;   // Distance of the disaster stop from entry (points) - should be well beyond the virtual trail

double m_adjusted_distance = 0;

double   g_virtual_sl     = 0;
datetime g_breach_start   = 0;
ulong    g_state_ticket   = 0;
string   g_gv_prefix;

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

void OnDeinit(const int reason)
  {
  }

void LoadVirtualState()
  {
   g_state_ticket = GlobalVariableCheck(g_gv_prefix + "ticket") ? (ulong)GlobalVariableGet(g_gv_prefix + "ticket") : 0;
   g_virtual_sl   = GlobalVariableCheck(g_gv_prefix + "vsl")    ? GlobalVariableGet(g_gv_prefix + "vsl")          : 0;
   g_breach_start = GlobalVariableCheck(g_gv_prefix + "breach") ? (datetime)GlobalVariableGet(g_gv_prefix + "breach") : 0;
  }

void SaveVirtualState()
  {
   GlobalVariableSet(g_gv_prefix + "ticket", (double)g_state_ticket);
   GlobalVariableSet(g_gv_prefix + "vsl",    g_virtual_sl);
   GlobalVariableSet(g_gv_prefix + "breach", (double)g_breach_start);
  }

void ResetVirtualState(ulong new_ticket)
  {
   g_state_ticket = new_ticket;
   g_virtual_sl   = 0;
   g_breach_start = 0;
   SaveVirtualState();
  }

double CatastrophicDistance()
  {
   return InpCatastrophicDistancePips * _Point;
  }

void OpenInitialPosition()
  {
   double lot = CalculateLot();
   double sl  = 0;

   if(InpUseCatastrophicStop)
      sl = NormalizePrice(m_symbol.Ask() - CatastrophicDistance());

   if(m_trade.Buy(lot, _Symbol, m_symbol.Ask(), sl, 0, "Initial Buy (virtual)"))
     {
      ulong ticket = m_trade.ResultOrder(); // deal/position ticket from the result

      ResetVirtualState(ticket);
      Print("Initial BUY opened. Virtual management active.");
     }
   else
      Print("Initial entry failed: ", m_trade.ResultRetcodeDescription());
  }

void ExecuteVirtualReversal(ulong ticket, ENUM_POSITION_TYPE pos_type)
  {
   if(!m_trade.PositionClose(ticket))
     {
      Print("Virtual reversal: close failed, will retry next tick: ", m_trade.ResultRetcodeDescription());
      return; // has_position will still read true next tick, logic simply retries
     }

   double lot = CalculateLot();
   bool ok;

   if(pos_type == POSITION_TYPE_BUY)
     {
  

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

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

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

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

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

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

Стоимость полного кода
611,90₽ ≈ $7.50