AutoHedge FX
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «autohedge_video_xauusd.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
AutoHedge FX — XAUUSD video-style hedge/grid EA — это торговый советник для MetaTrader 5, работающий с золотом (XAUUSD). Советник реализует стратегию направленной сетки (direction grid): при движении цены в сторону текущей позиции открываются дополнительные рыночные ордера того же направления с фиксированным шагом. Параллельно поддерживается противоположный стоп-ордер (BuyStop или SellStop) на заданном расстоянии от рынка.
Советник включает трейлинг-стоп для каждой открытой позиции: при достижении прибыли, превышающей заданный порог, стоп-лосс перемещается в направлении фиксации прибыли на заданном расстоянии от текущей цены. Также можно задать начальный стоп-лосс для всех новых позиций. Встроена фильтрация по спреду — торговля приостанавливается при превышении заданного уровня.
Параметр AutoStart управляет автоматическим возобновлением торгового цикла при отсутствии открытых позиций. MagicNumber обеспечивает идентификацию ордеров советника, а DeleteForeignPendings позволяет не трогать стоп-ордера других экспертов. Максимальное количество одновременных позиций ограничивается отдельным параметром.
Настройки программы
| Настройка | Описание |
|---|---|
| StartDirection | Направление начала торговли: BUY (покупка) или SELL (продажа) |
| InitialLot | Объём лота для каждой новой позиции |
| GridStepPrice | Шаг сетки — открытие дополнительного ордера того же направления каждые указанные единицы цены XAUUSD |
| PendingDistancePrice | Расстояние в цене от текущего рынка для размещения противоположного стоп-ордера |
| PendingMinMovePrice | Минимальное расстояние в цене, которое должен пройти стоп-ордер перед его модификацией |
| TrailingStartPrice | Размер прибыли в цене, при достижении которого начинается трейлинг стоп-лосса |
| TrailingDistancePrice | Расстояние стоп-лосса от текущей цены при активном трейлинге |
| InitialSLPrice | Начальный стоп-лосс: 0 означает отсутствие начального SL; любое другое значение задаёт расстояние в цене от цены открытия |
| MaxPositions | Максимальное количество одновременных открытых позиций советника |
| MaxSpreadPoints | Максимальный допустимый спред в пунктах брокера, при превышении которого торговля приостанавливается |
| AutoStart | Автоматическое начало нового торгового цикла при отсутствии открытых позиций советника |
| KeepOppositePending | При значении true советник всегда поддерживает один противоположный стоп-ордер на заданном расстоянии от рынка |
| DeleteForeignPendings | При значении true удалять стоп-ордера других экспертов с другим magic-номером; при false — не трогывать чужие ордера |
| MagicNumber | Идентификационный номер (magic number) для ордеров и позиций советника |
| OrderComment | Комментарий, добавляемый к ордерам и сделкам советника |
Поиск по коду файла
#property strict
#property version "1.00"
#property description "AutoHedge FX - XAUUSD video-style hedge/grid EA"
#property description "Direction grid + opposite trailing stop + per-position trailing SL"
#include <Trade/Trade.mqh>
CTrade trade;
enum ENUM_START_DIRECTION
{
START_SELL = -1,
START_BUY = 1
};
input ENUM_START_DIRECTION StartDirection = START_SELL; // First market direction
input double InitialLot = 2.00; // Lot per position
input double GridStepPrice = 0.10; // Add same-direction order every XAUUSD price units
input double PendingDistancePrice = 0.30; // Opposite stop distance from market
input double PendingMinMovePrice = 0.01; // Minimum pending modification distance
input double TrailingStartPrice = 0.30; // Start SL trailing after this profit
input double TrailingDistancePrice = 0.30; // SL distance from current price
input double InitialSLPrice = 0.00; // 0 = no initial SL; otherwise price distance
input int MaxPositions = 20; // Maximum market positions
input int MaxSpreadPoints = 300; // Maximum spread in broker points
input bool AutoStart = true; // Start a new cycle when no EA positions exist
input bool KeepOppositePending = true; // Always keep one opposite stop
input bool DeleteForeignPendings = false; // Never touch other-magic pending orders unless true
input long MagicNumber = 2738;
input string OrderComment = "EA-GOLD Hedge Video";
int g_lastDirection = 0; // 1 BUY, -1 SELL
double g_lastEntryPrice = 0.0; // last market entry in current direction
ulong g_pendingTicket = 0;
datetime g_lastAction = 0;
double NormalizePrice(const double p)
{
return NormalizeDouble(p,(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS));
}
double NormalizeVolume(double lots)
{
double vmin = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
double vmax = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
double step = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
lots = MathMax(vmin,MathMin(vmax,lots));
if(step > 0.0)
lots = MathFloor(lots/step + 1e-8)*step;
return NormalizeDouble(lots,2);
}
bool SpreadOK()
{
MqlTick t;
if(!SymbolInfoTick(_Symbol,t)) return false;
if(MaxSpreadPoints <= 0) return true;
double spreadPts=(t.ask-t.bid)/_Point;
return (spreadPts <= MaxSpreadPoints);
}
int CountOurPositions()
{
int n=0;
for(int i=PositionsTotal()-1;i>=0;i--)
{
ulong ticket=PositionGetTicket(i);
if(ticket==0) continue;
if(!PositionSelectByTicket(ticket)) continue;
if(PositionGetString(POSITION_SYMBOL)!=_Symbol) continue;
if((long)PositionGetInteger(POSITION_MAGIC)!=MagicNumber) continue;
n++;
}
return n;
}
int CountOurPending()
{
int n=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
ulong ticket=OrderGetTicket(i);
if(ticket==0) continue;
if(!OrderSelect(ticket)) continue;
if(OrderGetString(ORDER_SYMBOL)!=_Symbol) continue;
if((long)OrderGetInteger(ORDER_MAGIC)!=MagicNumber) continue;
ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
if(type==ORDER_TYPE_BUY_STOP || type==ORDER_TYPE_SELL_STOP) n++;
}
return n;
}
void GetLatestPosition(int &direction,double &price,datetime &tm,ulong &ticket)
{
direction=0; price=0; tm=0; ticket=0;
for(int i=PositionsTotal()-1;i>=0;i--)
{
ulong tk=PositionGetTicket(i);
if(tk==0 || !PositionSelectByTicket(tk)) continue;
if(PositionGetString(POSITION_SYMBOL)!=_Symbol) continue;
if((long)PositionGetInteger(POSITION_MAGIC)!=MagicNumber) continue;
datetime pt=(datetime)PositionGetInteger(POSITION_TIME);
if(pt>=tm)
{
tm=pt; ticket=tk;
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
direction=(type==POSITION_TYPE_BUY ? 1 : -1);
price=PositionGetDouble(POSITION_PRICE_OPEN);
}
}
}
bool GetNewestPositionOfDirection(const int direction,double &price,datetime &tm)
{
bool found=false; tm=0; price=0;
for(int i=PositionsTotal()-1;i>=0;i--)
{
ulong tk=PositionGetTicket(i);
if(tk==0 || !PositionSelectByTicket(tk)) continue;
if(PositionGetString(POSITION_SYMBOL)!=_Symbol) continue;
if((long)PositionGetInteger(POSITION_MAGIC)!=MagicNumber) continue;
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
int d=(type==POSITION_TYPE_BUY ? 1 : -1);
if(d!=direction) continue;
datetime pt=(datetime)PositionGetInteger(POSITION_TIME);
if(!found || pt>=tm)
{
found=true; tm=pt; price=PositionGetDouble(POSITION_PRICE_OPEN);
}
}
return found;
}
void DeleteOurPendingExcept(const ulong keepTicket=0)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
ulong tk=OrderGetTicket(i);
if(tk==0 || !OrderSelect(tk)) continue;
if(OrderGetString(ORDER_SYMBOL)!=_Symbol) continue;
if((long)OrderGetInteger(ORDER_MAGIC)!=MagicNumber) continue;
ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
if(type!=ORDER_TYPE_BUY_STOP && type!=ORDER_TYPE_SELL_STOP) continue;
if(keepTicket!=0 && tk==keepTicket) continue;
trade.OrderDelete(tk);
}
}
bool FindOurPending(ENUM_ORDER_TYPE wantedType,ulong &ticket,double &price)
{
ticket=0; price=0;
bool found=false;
for(int i=OrdersTotal()-1;i>=0;i--)
{
ulong tk=OrderGetTicket(i);
if(tk==0 || !OrderSelect(tk)) continue;
if(OrderGetString(ORDER_SYMBOL)!=_Symbol) continue;
if((long)OrderGetInteger(ORDER_MAGIC)!=MagicNumber) continue;
ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
if(type!=wantedType) continue;
ticket=tk; price=OrderGetDouble(ORDER_PRICE_OPENПоказано первые 50% кода (символов: 9566)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.