nadaraya_watson_aspri-fix.mq5
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «nadaraya_watson_aspri-fix.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Данный продукт представляет собой торгового советника (Expert Advisor) для платформы MetaTrader 5, написанный на языке MQL5. Советник использует метод ядерной сглаживающей регрессии для определения направления тренда и генерации сигналов на открытие позиций BUY или SELL при изменении направления движения цены. Поддерживается управление позициями через магический номер, а также работа с усреднением (добавление объёма к существующим позициям). Советник обрабатывает рыночные события в функции OnTick, управляет ордерами через встроенный класс CTrade и поддерживает вывод отладочной информации в журнал терминала.
Настройки программы
| Настройка | Описание |
|---|---|
| Bandwidth (h) (InpBandwidth) | Ширина полосы (h) — Определяет ширину ядра для расчёта сглаженной линии (параметр h). |
| Price to smooth (InpPrice) | Цена для сглаживания — Выбирает тип цены (Close, Open, High, Low и др.), используемой для расчёта. |
| Lookback Bars (InpLookback) | Количество баров для анализа — Максимальное количество баров, используемых для расчёта сглаживания. |
| Initial Lot Size (InpLotSize) | Начальный размер лота — Начальный объём позиции для новых сделок. |
| Order Comment (InpComment) | Комментарий к ордеру — Текстовый комментарий, добавляемый к открываемым позициям. |
| Show Debug Prints (InpDebugMode) | Режим отладки — Включает вывод дополнительных диагностических сообщений в журнал терминала. |
| Min Bars Between Trades (InpMinBarsBetweenTrades) | Минимум баров между сделками — Минимальное количество баров, которое должно пройти перед открытием новой позиции. |
| Allow Hedge (BUY+SELL) (InpAllowHedge) | Разрешить хеджирование — Разрешает одновременное открытие позиций BUY и SELL по одному символу. |
| Max Entri (InpMaxEntri) | Максимум входов — Максимальное количество позиций одного направления, допустимых для данного символа. |
| Pip Steps (points) (InpPipSteps) | Шаг в пунктах — Расстояние в пунктах, при превышении которого срабатывает условие для добавления позиции. |
| Martin Type (InpMartinType) | Тип мартингейла — Выбирает метод увеличения лота при усреднении: умножение или добавление фиксированной величины. |
| Multiplier / Lot Step (InpMultiplier) | Множитель / шаг лота — Коэффициент или величина, используемая для расчёта размера лота при усреднении. |
| TP Dollar Type (InpTPDollarType) | Тип Take Profit в долларах — Выбирает режим фиксации прибыли по долларовой стоимости: выключено, фиксированная сумма или процент от баланса. |
| Take Profit USD (InpTakeProfitUSD) | Take Profit в USD — Целевое значение прибыли в долларах или процентах для закрытия позиций. |
| Stoploss Type (All Pairs) (InpStoplossType) | Тип Stop Loss — Выбирает режим стоп-лосса по долларовой стоимости: выключен, фиксированная сумма или процент от баланса. |
| Stoploss in USD / Percent (InpStoplossValue) | Значение Stop Loss — Размер убытка в долларах или процентах, при достижении которого позиции закрываются. |
| Enable Take Profit Points (InpEnableTPPoints) | Включить Take Profit по пунктам — Включает или отключает фиксацию прибыли в пунктах для каждой отдельной позиции. |
| Take Profit Points (InpTPPoints) | Take Profit в пунктах — Расстояние в пунктах от цены открытия для установки уровня фиксации прибыли. |
| Enable Trailing (InpEnableTrailing) | Включить трейлинг-стоп — Включает или отключает автоматическое перемещение стоп-лосса в сторону прибыли. |
| Trailing Start Points (InpTrailingStart) | Начало трейлинга в пунктах — Прибыль в пунктах, начиная с которой активируется перемещение стоп-лосса. |
| Trailing Step Points (InpTrailingStep) | Шаг трейлинга в пунктах — Расстояние в пунктах, на которое сдвигается стоп-лосс при каждом срабатывании. |
| Magic Number (use 0 for Manual) (InpMagicNumber) | Магический номер — Идентификатор для группировки позиций советника; 0 означает ручное управление. |
Поиск по коду файла
#property version "2.00"
#property strict
#include <Trade\Trade.mqh>
input group "===== Indicator Settings ====="
input double InpBandwidth = 8.0; // Bandwidth (h)
input ENUM_APPLIED_PRICE InpPrice = PRICE_CLOSE; // Price to smooth
input int InpLookback = 300; // Lookback Bars
input group "===== EA Settings ====="
input double InpLotSize = 0.01; // Initial Lot Size
input string InpComment = "EA Nadaraya Watson"; // Order Comment
input bool InpDebugMode = false; // Show Debug Prints
input int InpMinBarsBetweenTrades = 1; // Min Bars Between Trades
input bool InpAllowHedge = true; // Allow Hedge (BUY+SELL)
input group "== Aspri Trade Function =="
enum ENUM_MARTIN_TYPE { Multiplier, Addition };
input int InpMaxEntri = 1000; // Max Entri
input int InpPipSteps = 2000; // Pip Steps (points)
input ENUM_MARTIN_TYPE InpMartinType = Multiplier; // Martin Type
input double InpMultiplier = 1.0; // Multiplier / Lot Step
input group "== Exit Tools =="
enum ENUM_TP_DOLLAR_TYPE { OFF, USD, Percent };
input ENUM_TP_DOLLAR_TYPE InpTPDollarType = OFF; // TP Dollar Type
input double InpTakeProfitUSD = 250.0; // Take Profit USD
enum ENUM_SL_TYPE { SL_OFF, SL_USD, SL_PERCENT };
input ENUM_SL_TYPE InpStoplossType = SL_OFF; // Stoploss Type (All Pairs)
input double InpStoplossValue = 0.0; // Stoploss in USD / Percent
input bool InpEnableTPPoints = true; // Enable Take Profit Points
input int InpTPPoints = 5000; // Take Profit Points
input bool InpEnableTrailing = false; // Enable Trailing
input int InpTrailingStart = 200; // Trailing Start Points
input int InpTrailingStep = 50; // Trailing Step Points
input int InpMagicNumber = 489471; // Magic Number (use 0 for Manual)
CTrade trade;
datetime lastBarTime;
double lastNW = 0;
int barsSinceLastTrade = 999;
bool firstRun = true;
int lastSignalDir = 0; // 1=BUY, -1=SELL, 0=none
int OnInit()
{
// код доступен только после оплаты
}
void OnDeinit(const int reason)
{
Print("===== Nadaraya-Watson Aspri EA Stopped =====");
}
double GaussianKernel(double x, double h)
{
return MathExp(-(MathPow(x, 2) / (h * h * 2)));
}
double CalculateNW(int shift)
{
double sum = 0;
double sumw = 0;
int maxBars = MathMin(InpLookback, Bars(_Symbol, PERIOD_CURRENT) - shift);
for(int j = 0; j < maxBars; j++)
{
double price = 0;
switch(InpPrice)
{
case PRICE_CLOSE: price = iClose(_Symbol, PERIOD_CURRENT, shift + j); break;
case PRICE_OPEN: price = iOpen(_Symbol, PERIOD_CURRENT, shift + j); break;
case PRICE_HIGH: price = iHigh(_Symbol, PERIOD_CURRENT, shift + j); break;
case PRICE_LOW: price = iLow(_Symbol, PERIOD_CURRENT, shift + j); break;
case PRICE_MEDIAN: price = (iHigh(_Symbol, PERIOD_CURRENT, shift + j) + iLow(_Symbol, PERIOD_CURRENT, shift + j)) / 2; break;
case PRICE_TYPICAL: price = (iHigh(_Symbol, PERIOD_CURRENT, shift + j) + iLow(_Symbol, PERIOD_CURRENT, shift + j) + iClose(_Symbol, PERIOD_CURRENT, shift + j)) / 3; break;
case PRICE_WEIGHTED: price = (iHigh(_Symbol, PERIOD_CURRENT, shift + j) + iLow(_Symbol, PERIOD_CURRENT, shift + j) + 2*iClose(_Symbol, PERIOD_CURRENT, shift + j)) / 4; break;
default: price = iClose(_Symbol, PERIOD_CURRENT, shift + j);
}
double w = GaussianKernel((double)j, InpBandwidth);
sum += price * w;
sumw += w;
}
return (sumw != 0) ? sum / sumw : 0;
}
int CountPositions(ENUM_POSITION_TYPE posType)
{
int count = 0;
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
ulong ticket = PositionGetTicket(i);
if(ticket > 0)
{
if(PositionGetString(POSITION_SYMBOL) == _Symbol)
{
if(InpMagicNumber == 0 || PositionGetInteger(POSITION_MAGIC) == InpMagicNumber)
{
if(PositionGetInteger(POSITION_TYPE) == posType)
count++;
}
}
}
}
return count;
}
int GetTotalPositions(ENUM_POSITION_TYPE posType)
{
return CountPositions(posType);
}
double GetAveragePrice(ENUM_POSITION_TYPE posType)
{
double totalLots = 0;
double totalValue = 0;
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
ulong ticket = PositionGetTicket(i);
if(ticket > 0)
{
if(PositionGetString(POSITION_SYMBOL) == _Symbol)
{
if(InpMagicNumber == 0 || PositionGetInteger(POSITION_MAGIC) == InpMagicNumber)
{
if(PositionGetInteger(POSITION_TYPE) == posType)
{
double lots = PositionGetDouble(POSITION_VOLUME);
double price = PositionGetDouble(POSITION_PRICE_OPEN);
totalLots += lots;
totalValue += lots * price;
}
}
}
}
}
return (totalLots > 0) ? totalValue / totalLots : 0;
}
double GetTotalLots(ENUM_POSITION_TYPE posType)
{
double totalLots = 0;
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
ulong ticket = PositionGetTicket(i);
if(ticket > 0)
{
if(PositionGetString(POSITION_SYMBOL) == _Symbol)
{
if(InpMagicNumber == 0 || PositionGetInteger(POSITION_MAGIC) == InpMagicNumber)
{
if(PositionGetInteger(POSITION_TYPE) == posType)
{
totalLots += PositionGetDouble(POSITION_VOLUME);
}
}
}
}
}
return totalLots;
}
double GetTotalProfit(ENUM_POSITION_TYPE posType)
{
double totalProfit = 0;
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
ulong ticket = PositionGetTicket(i);
if(ticket > 0)
{
if(PositionGetString(POSITION_SYMBOL) == _Symbol)
{
if(InpMagicNumber == 0 || PositionGetInteger(POSITION_MAGIC) == InpMagicNumber)
{
if(PositionGetInteger(POSITION_TYPE) == posType)
{
totalProfit += PositionGetDouble(POSITION_PROFIT) +
PositionGetDouble(POSITION_SWAP);
}
}
}
}
}
return totalProfit;
}
double GetLastPositionPrice(ENUM_POSITION_TYPE posType)
{
datetime lastTime = 0;
double lastPrice = 0;
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
ulong ticket = PositionGetTicket(i);
if(ticket > 0)
{
if(PositionGetString(POSITION_SYMBOL) == _Symbol)
{
if(InpMagicNumber == 0 || PositionGetInteger(POSITION_MAGIC) == InpMagicNumber)
{
if(PositionGetInteger(POSITION_TYPE) == posType)
{
datetime posTime = (datetime)PositionGetInteger(POSITION_TIME);
if(posTime > lastTime)
{
lastTime = posTime;
lastPrice = PositionGetDouble(POSITION_PRICE_OPEN);
}
}
}
}
}
}
return lastPrice;
}
double CalculateNextLot(int entryCount)
{
double nextLot = InpLotSize;
if(entryCount > 0)
{
if(InpMartinType == Multiplier)
{
nextLot = InpLotSize * MathPow(InpMultiplier, entryCount);
}
else // Addition
{
nextLot = InpLotSize + (InpMultiplier * entryCount);
}
}
double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
nextLot = MathMax(minLot, nextLot);
nextLot = MathMin(maxLot, nextLot);
nextLot = NormalizeDouble(MathRound(nextLot / lotStep) * lotStep, 2);
return nextLot;
}
bool CanAddAveraging(ENUM_POSITION_TYPE posType)
{
int count = CountPositions(posType);
if(count >= InpMaxEntri) return false;
if(count == 0) return false; // No position to average
double lastPrice = GetLastPositionPrice(posType);
if(lastPrice == 0) return false;
double currentPrice = (posType == POSITION_TYPE_BUY) ?
SymbolInfoDouble(_Symbol, SYMBOL_ASK) :
SymbolInfoDouble(_Symbol, SYMBOL_BID);
double distance = MathAbs(currentPrice - lastPrice) / _Point;
if(posType == POSITION_TYPE_BUY)
{
if(currentPrice < lastPrice && distance >= InpPipSteps)
return true;
}
else
{
if(currentPrice >Показано первые 50% кода (символов: 13301)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.