reversetrailing_virtual.mq5
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.