Nadaraya-Watson EA
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «nadaraya watson ea.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Представлен торговый советник для MetaTrader 5, основанный на методе сглаживания Надарая—Уотсона. Советник рассчитывает сглаженную ценовую серию и отслеживает изменение направления тренда для формирования торговых сигналов на открытие позиций.
При изменении направления сглаженной линии советник автоматически открывает покупку или продажу через торговый API MetaTrader. Поддерживаются два режима управления позициями: хедж (одновременное наличие BUY и SELL) и нет-хедж (запрет открытия противоположной позиции). Размер лота, магический номер и комментарий ордера настраиваются пользователем.
Встроена функция отладочного вывода для отслеживания расчётных значений и событий открытия сделок. Дополнительно реализована минимальная задержка в барах между сделками для контроля частоты входов. На открытые позиции не устанавливаются стоп-лосс и тейк-профит.
Настройки программы
| Настройка | Описание |
|---|---|
| Bandwidth (h) (InpBandwidth) | Bandwidth (h) — Параметр ширины полосы сглаживания, влияющий на степень сглаживания расчётной линии. |
| Price to smooth (InpPrice) | Price to smooth — Тип цены, используемой для расчёта сглаженной линии (закрытие, открытие, максимум, минимум и другие варианты). |
| Lookback Bars (InpLookback) | Lookback Bars — Количество баров, используемых для расчёта сглаженной линии. |
| Lot Size (InpLotSize) | Lot Size — Размер лота для каждой открытой позиции. |
| Magic Number (InpMagicNumber) | Magic Number — Магический номер, используемый для идентификации позиций, открытых данным советником. |
| Order Comment (InpComment) | Order Comment — Текстовый комментарий, присваиваемый каждому открытому ордеру. |
| Show Debug Prints (InpDebugMode) | Show Debug Prints — Включает или отключает вывод отладочной информации в журнал для отслеживания работы советника. |
| Min Bars Between Trades (InpMinBarsBetweenTrades) | Min Bars Between Trades — Минимальное количество баров, которое должно пройти между последней сделкой и следующим сигналом на открытие позиции. |
| Allow Hedge (BUY+SELL) (InpAllowHedge) | Разрешить хедж (BUY+SELL) — Разрешает одновременное наличие позиций BUY и SELL (хедж-режим). При отключённом хедже советник не открывает противоположную позицию, если она уже существует. |
Поиск по коду файла
#property version "1.01"
#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; // Lot Size
input int InpMagicNumber = 123456; // Magic Number
input string InpComment = "NW_EA"; // Order Comment
input bool InpDebugMode = true; // Show Debug Prints
input int InpMinBarsBetweenTrades = 1; // Min Bars Between Trades
input bool InpAllowHedge = true; // Allow Hedge (BUY+SELL)
CTrade trade;
datetime lastBarTime;
double lastNW = 0;
int barsSinceLastTrade = 999;
bool firstRun = true;
int OnInit()
{
// код доступен только после оплаты
}
void OnDeinit(const int reason)
{
Print("===== Nadaraya-Watson 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;
}
double w = GaussianKernel(j, InpBandwidth);
sum += price * w;
sumw += w;
}
return sum / sumw;
}
bool IsNewBar()
{
datetime currentBarTime = iTime(_Symbol, PERIOD_CURRENT, 0);
if(currentBarTime != lastBarTime)
{
lastBarTime = currentBarTime;
barsSinceLastTrade++;
return true;
}
return false;
}
int CountPositions(ENUM_POSITION_TYPE posType)
{
int count = 0;
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
if(PositionGetSymbol(i) == _Symbol)
{
if(PositionGetInteger(POSITION_MAGIC) == InpMagicNumber)
{
if(PositionGetInteger(POSITION_TYPE) == posType)
count++;
}
}
}
return count;
}
bool OpenBuy()
{
double price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
if(trade.Buy(InpLotSize, _Symbol, price, 0, 0, InpComment))
{
barsSinceLastTrade = 0;
return true;
}
return false;
}
bool OpenSell()
{
double price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
if(trade.Sell(InpLotSize, _Symbol, price, 0, 0, InpComment))
{
baПоказано первые 50% кода (символов: 5835)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.