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

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 и перейдите к оплате.

Стоимость полного кода
956,60₽ ≈ $11.69