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

gold snap v1.0.mq5

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

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

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

О программе

В интерфейсе предусмотрена информационная панель с отображением статуса движка, текущего спреда, количества позиций и отложенных ордеров, а также настройка тёмной темы графика. Все торговые операции привязаны к магическому номеру, что позволяет безопасно использовать советника на одном счёте с другими экспертами.

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

НастройкаОписание
InpMagic Магический номер — Уникальный идентификатор ордеров и позиций советника для их фильтрации.
InpLotMode Режим лота — Способ расчёта размера лота: фиксированный или пропорционально риску от баланса.
InpFixedLot Фиксированный лот — Размер лота при фиксированном режиме расчёта.
InpRiskPercent Риск в процентах — Процент баланса, используемый для расчёта лота при режиме риска.
InpAllowBuy Разрешить покупку — Включает размещение отложенных ордеров на покупку BuyStop.
InpAllowSell Разрешить продажу — Включает размещение отложенных ордеров на продажу SellStop.
InpStructureTimeframe Таймфрейм анализа — Таймфрейм, на котором строится структура ценовых уровней.
InpPivotWing Ширина крыла пивота — Количество баров вокруг потенциального разворота для подтверждения уровня.
InpMaximumPivotAgeHours Максимальный возраст пивота — Максимальный возраст уровня в часах, после которого он считается устаревшим.
InpPendingExpiryHours Время жизни ордеров — Срок действия отложенных ордеров в часах до автоматического удаления.
InpEntryBufferPrice Буфер входной цены — Дополнительный ценовой сдвиг для уровня входа относительно пивота.
InpMinimumLevelDistance Минимальное расстояние до уровня — Минимальное расстояние в ценовых единицах от текущей цены до уровня входа.
InpMaximumLevelDistance Максимальное расстояние до уровня — Максимальное расстояние в ценовых единицах от текущей цены до уровня входа.
InpMaximumSpreadPrice Максимальный спред — Допустимый максимальный спред в ценовых единицах для размещения ордеров.
InpATRPeriod Период ATR — Период расчёта индикатора Average True Range для определения волатильности.
InpStopATRMultiplier Множитель стопа ATR — Множитель значения ATR для расчёта расстояния стоп-лосса.
InpMinimumStopPrice Минимальный стоп — Минимальное расстояние стоп-лосса в ценовых единицах.
InpMaximumStopPrice Максимальный стоп — Максимальное расстояние стоп-лосса в ценовых единицах.
InpRewardRisk Соотношение риска и прибыли — Коэффициент для расчёта расстояния тейк-профита относительно стоп-лосса.
InpTrailArmPrice Порог активации трейла — Уровень прибыли в ценовых единицах, при котором активируется трейлинг-стоп.
InpTrailDistancePrice Расстояние трейла — Расстояние трейл-стопа от текущей цены в ценовых единицах.
InpTrailStepPrice Шаг трейла — Минимальный шаг сдвига трейл-стопа в ценовых единицах.
InpUseTwoStageTrail Двухфазный трейлинг — Включает двухфазную схему трейлинга с промежуточной фиксацией безубыточности.
InpBreakEvenLockPrice Цена безубыточности — Смещение для фиксации безубыточности при двухфазном трейлинге.
InpRunnerArmPrice Порог второй фазы трейла — Уровень прибыли, при котором трейл переходит в основную фазу.
InpDeleteFriday Удалять в пятницу — Автоматическое удаление всех отложенных ордеров в пятницу.
InpFridayDeleteHour Час удаления в пятницу — Час начала удаления отложенных ордеров в пятницу.
InpShowPanel Показывать панель — Включает отображение информационной панели на графике.
InpDarkChart Тёмная тема графика — Применяет тёмную цветовую схему к графику при запуске.
Получить полный код

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

#property version   "1.00"

#property strict
#property description "Adaptive XAU support/resistance breakout with fast profit capture"

#include <Trade/Trade.mqh>

enum GS_LOT_MODE { GS_FIXED_LOT=0, GS_RISK_PERCENT=1 };

input group "===== GOLD SNAP CLEAN ROOM ====="
input long              InpMagic                 = 26981;
input GS_LOT_MODE       InpLotMode               = GS_FIXED_LOT;
input double            InpFixedLot              = 0.01;
input double            InpRiskPercent           = 1.00;
input bool              InpAllowBuy              = true;
input bool              InpAllowSell             = true;

input group "===== EMBEDDED BEST-PERFORMANCE LOGIC ====="
input ENUM_TIMEFRAMES   InpStructureTimeframe    = PERIOD_H1;
input int               InpPivotWing             = 2;
input int               InpMaximumPivotAgeHours  = 1440;
input int               InpPendingExpiryHours    = 18;
input double            InpEntryBufferPrice      = 0.00;
input double            InpMinimumLevelDistance  = 5.00;
input double            InpMaximumLevelDistance  = 180.00;
input double            InpMaximumSpreadPrice    = 0.50;

input group "===== ADAPTIVE PROTECTION ====="
input int               InpATRPeriod             = 14;
input double            InpStopATRMultiplier     = 0.60;
input double            InpMinimumStopPrice      = 7.50;
input double            InpMaximumStopPrice      = 9.20;
input double            InpRewardRisk            = 1.90;
input double            InpTrailArmPrice         = 1.60;
input double            InpTrailDistancePrice    = 0.30;
input double            InpTrailStepPrice        = 0.15;
input bool              InpUseTwoStageTrail      = false;
input double            InpBreakEvenLockPrice    = 0.20;
input double            InpRunnerArmPrice        = 5.00;
input bool              InpDeleteFriday          = true;
input int               InpFridayDeleteHour      = 20;

input group "===== DISPLAY ====="
input bool              InpShowPanel             = true;
input bool              InpDarkChart             = true;

CTrade trade;
int atr_handle=INVALID_HANDLE;
datetime last_scan_bar=0;
string ui_prefix="GSCR_";
string status_text="INITIALIZING";
bool render_panel=false;
const color C_BG=C'9,14,25',C_CARD=C'20,29,46',C_EDGE=C'198,156,69',C_TEXT=C'235,238,244',C_MUTED=C'142,156,181',C_GREEN=C'31,222,156',C_RED=C'255,79,112',C_CYAN=C'70,209,255',C_GOLD=C'241,190,76';

double TickSize()
{
   double value=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
   if(value<=0.0) value=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   return value;
}

double NormalizePrice(const double price)
{
   const double tick=TickSize();
   const int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
   if(tick<=0.0) return NormalizeDouble(price,digits);
   return NormalizeDouble(MathRound(price/tick)*tick,digits);
}

double Clamp(const double value,const double low,const double high)
{
   return MathMax(low,MathMin(high,value));
}

double BrokerMinimumDistance()
{
   const double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   const long stops=SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
   const long freeze=SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL);
   return MathMax((double)MathMax(stops,freeze)*point,TickSize()*2.0);
}

double CurrentSpread()
{
   MqlTick tick;
   if(!SymbolInfoTick(_Symbol,tick)) return DBL_MAX;
   return tick.ask-tick.bid;
}

bool IsGold()
{
   string upper=_Symbol;
   StringToUpper(upper);
   return StringFind(upper,"XAU")>=0 || StringFind(upper,"GOLD")>=0;
}

bool SpreadAllowed()
{
   return CurrentSpread()<=MathMax(BrokerMinimumDistance(),InpMaximumSpreadPrice);
}

double ATRValue()
{
   double value[1];
   if(atr_handle==INVALID_HANDLE || CopyBuffer(atr_handle,0,1,1,value)!=1) return 0.0;
   return value[0];
}

double NormalizeVolume(double lots)
{
   const double minimum=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   const double maximum=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   if(step<=0.0) step=minimum;
   lots=Clamp(lots,minimum,maximum);
   lots=MathFloor(lots/step+1e-8)*step;
   return NormalizeDouble(lots,8);
}

double EntryLots(const ENUM_ORDER_TYPE type,const double entry,const double sl)
{
   if(InpLotMode==GS_FIXED_LOT) return NormalizeVolume(InpFixedLot);
   const double budget=AccountInfoDouble(ACCOUNT_BALANCE)*Clamp(InpRiskPercent,0.05,10.0)/100.0;
   double loss=0.0;
   if(!OrderCalcProfit(type,_Symbol,1.0,entry,sl,loss) || loss>=0.0) return NormalizeVolume(InpFixedLot);
   return NormalizeVolume(budget/MathAbs(loss));
}

bool MarginAvailable(const ENUM_ORDER_TYPE type,const double lots,const double entry)
{
   double margin=0.0;
   if(!OrderCalcMargin(type,_Symbol,lots,entry,margin)) return false;
   return AccountInfoDouble(ACCOUNT_MARGIN_FREE)>margin*1.10;
}

bool OurPosition(ulong &ticket,long &type,double &open,double &sl,double &tp)
{
   for(int i=PositionsTotal()-1;i>=0;i--)
   {
      const ulong candidate=PositionGetTicket(i);
      if(candidate==0 || PositionGetString(POSITION_SYMBOL)!=_Symbol || PositionGetInteger(POSITION_MAGIC)!=InpMagic) continue;
      ticket=candidate; type=PositionGetInteger(POSITION_TYPE); open=PositionGetDouble(POSITION_PRICE_OPEN);
      sl=PositionGetDouble(POSITION_SL); tp=PositionGetDouble(POSITION_TP); return true;
   }
   return false;
}

int PendingCount(const int side)
{
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
   {
      const ulong ticket=OrderGetTicket(i);
      if(ticket==0 || OrderGetString(ORDER_SYMBOL)!=_Symbol || OrderGetInteger(ORDER_MAGIC)!=InpMagic) continue;
      const ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
      if((side>0 && type==ORDER_TYPE_BUY_STOP) || (side<0 && type==ORDER_TYPE_SELL_STOP)) count++;
   }
   return count;
}

void DeletePending(const string reason)
{
   trade.SetExpertMagicNumber(InpMagic);
   for(int i=OrdersTotal()-1;i>=0;i--)
   {
      const ulong ticket=OrderGetTicket(i);
      if(ticket==0 || OrderGetString(ORDER_SYMBOL)!=_Symbol || OrderGetInteger(ORDER_MAGIC)!=InpMagic) continue;
      const ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
      if(type!=ORDER_TYPE_BUY_STOP && type!=ORDER_TYPE_SELL_STOP) continue;
      if(!trade.OrderDelete(ticket)) PrintFormat("Gold Snap CR delete rejected %I64u (%u): %s",ticket,trade.ResultRetcode(),trade.ResultRetcodeDescription());
   }
   if(reason!="") status_text=reason;
}

bool FreshHigh(const MqlRates &rates[],const int shift)
{
   const double level=rates[shift].high;
   for(int i=1;i<=InpPivotWing;i++) if(rates[shift-i].high>=level || rates[shift+i].high>level) return false;
   for(int newer=0;newer<shift;newer++) if(rates[newer].high>=level) return false;
   return true;
}

bool FreshLow(const MqlRates &rates[],const int shift)
{
   const double level=rates[shift].low;
   for(int i=1;i<=InpPivotWing;i++) if(rates[shift-i].low<=level || rates[shift+i].low<level) return false;
   for(int newer=0;newer<shift;newer++) if(rates[newer].low<=level) return false;
   return true;
}

bool FindFreshLevels(double &buy_level,double &sell_level)
{
   buy_level=0.0; sell_level=0.0;
   MqlTick tick;
   if(!SymbolInfoTick(_Symbol,tick)) return false;
   const int bars=MathMax(200,InpMaximumPivotAgeHours*60/PeriodSeconds(InpStructureTimeframe)+InpPivotWing+10);
   MqlRates rates[];
   ArraySetAsSeries(rates,true);
   const int copied=CopyRates(_Symbol,InpStructureTimeframe,0,bars,rates);
   if(copied<InpPivotWing*2+20) return false;
   double newer_high=-DBL_MAX;
   double newer_low=DBL_MAX;
   for(int i=0;i<=InpPivotWing;i++)
   {
      newer_high=MathMax(newer_high,rates[i].high);
      newer_low=MathMin(newer_low,rates[i].low);
   }
   for(int shift=InpPivotWing+1;shift<copied-InpPivotWing;shift++)
   {
      const double age_hours=(double)(TimeCurrent()-rates[shift].time)/3600.0;
      if(age_hours>InpMaximumPivotAgeHours) break;
      bool older_high_ok=true,older_low_ok=true;
      for(int wing=1;wing<=InpPivotWing;wing++)
      {
         if(rates[shift+wing].high>rates[shift].high) older_high_ok=false;
         if(rates[shift+wing].low<rates[shift].low) older_low_ok=false;
      }
      if(buy_level==0.0 && rates[shift].high>newer_high && older_high_ok)
      {
         const double level=NormalizePri

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

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

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

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

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

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

Стоимость полного кода
1 422,40₽ ≈ $17.38