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