MetaSignalsPro Free Expert Advisor
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «msp_freeea_alpha_1_1.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
MetaSignalsPro Free Expert Advisor — это советник для платформы MetaTrader 5, предназначенный для торговли на символе XAUUSD в таймфрейме M30. Советник построен на основе трёх экспоненциальных скользящих средних и анализирует пересечения быстрой и медленной EMA с учётом трендовой EMA как фильтра направления рынка.
Сигналы на открытие позиций формируются на закрытых барах: BUY-сигнал возникает при пересечении быстрой EMA сверху вверх через медленную при условии, что закрытие бара выше обеих EMA. SELL-сигнал — зеркальная ситуация. Логика оценивается один раз на новый бар, что исключает перерисовку.
Вход в сделки возможен только в заданное временное окно (по умолчанию 07:00–19:00 серверного времени). Ежедневно в указанное время (по умолчанию 20:00) все позиции закрываются. Советник допускает только одну открытую позицию одновременно и удаляет оставшиеся отложенные ордера при заполнении любого из своих ордеров.
Управление риском основано на проценте баланса, рискуемого на сделку, и процентном расстоянии до стоп-лосса. Перед отправкой каждого ордера выполняется предварительная проверка: проверка на наличие изменений, проверка маржи и допуск закрывающих сделок при недостаточном балансе.
Настройки программы
| Настройка | Описание |
|---|---|
| FastEmaPeriod | Период быстрой экспоненциальной скользящей средней, участвующей в сигнале пересечения. |
| SlowEmaPeriod | Период медленной экспоненциальной скользящей средней, участвующей в сигнале пересечения. |
| TrendEmaPeriod | Период трендовой экспоненциальной скользящей средней, используемой как фильтр направления рынка. |
| EntryStartHour | Час начала временного окна для входа в сделки (серверное время брокера). |
| EntryStartMinute | Минута начала временного окна для входа в сделки (серверное время брокера). |
| EntryEndHour | Час окончания временного окна для входа в сделки (серверное время брокера). |
| EntryEndMinute | Минута окончания временного окна для входа в сделки (серверное время брокера). |
| ExitHour | Час ежедневного закрытия всех позиций и остановки торгов на день (серверное время брокера). |
| ExitMinute | Минута ежедневного закрытия всех позиций и остановки торгов на день (серверное время брокера). |
| RiskPercent | Процент баланса, рискуемый на одну сделку при расчёте размера лота. |
| StopLossPercent | Процент от цены входа, задающий расстояние до стоп-лосса. |
Поиск по коду файла
#property version "1.0"
#property description "Asset: XAUUSD | Time Frame: M30"
#property description "MetaSignalsPro Free Expert Advisor"
#property description ""
#property description "MQL5.com is an authorized site to sell our products."
#property description "Sales on other sites not authorized by us are fraudulent, illegal and will be prosecuted by law."
#property description ""
#property description "Trade safe."
#property description ""
#property description "MetaSignalsPro | Making your trading easier, faster and safer."
#include <Trade/Trade.mqh>
bool MetaMindSingleReject(MqlTradeResult &result, uint code, string reason)
{
ZeroMemory(result);
result.retcode = code;
result.comment = reason;
static uint last_code = 0;
static string last_reason = "";
static datetime last_time = 0;
datetime now = TimeCurrent();
if(code != last_code || reason != last_reason || now - last_time >= 60)
{
PrintFormat("MetaMind trade skipped [%u]: %s", code, reason);
last_code = code;
last_reason = reason;
last_time = now;
}
return false;
}
bool MetaMindSingleReducesPosition(const MqlTradeRequest &request)
{
if(request.action != TRADE_ACTION_DEAL) return false;
ulong previous = (ulong)PositionGetInteger(POSITION_TICKET);
bool selected = false;
if(request.position > 0) selected = PositionSelectByTicket(request.position);
else if(AccountInfoInteger(ACCOUNT_MARGIN_MODE) != ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
selected = PositionSelect(request.symbol);
bool reducing = selected && PositionGetString(POSITION_SYMBOL) == request.symbol
&& request.volume > 0.0 && request.volume <= PositionGetDouble(POSITION_VOLUME)
&& ((request.type == ORDER_TYPE_BUY && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
|| (request.type == ORDER_TYPE_SELL && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY));
if(previous > 0 && !PositionSelectByTicket(previous)) return reducing;
return reducing;
}
bool MetaMindSingleUnchanged(const MqlTradeRequest &request)
{
if(request.action == TRADE_ACTION_SLTP)
{
ulong previous = (ulong)PositionGetInteger(POSITION_TICKET);
bool selected = request.position > 0 ? PositionSelectByTicket(request.position) : PositionSelect(request.symbol);
bool unchanged = selected && request.sl == PositionGetDouble(POSITION_SL) && request.tp == PositionGetDouble(POSITION_TP);
if(previous > 0 && !PositionSelectByTicket(previous)) return unchanged;
return unchanged;
}
if(request.action == TRADE_ACTION_MODIFY)
{
ulong previous = (ulong)OrderGetInteger(ORDER_TICKET);
bool selected = OrderSelect(request.order);
bool unchanged = selected && request.price == OrderGetDouble(ORDER_PRICE_OPEN)
&& request.sl == OrderGetDouble(ORDER_SL) && request.tp == OrderGetDouble(ORDER_TP)
&& request.stoplimit == OrderGetDouble(ORDER_PRICE_STOPLIMIT)
&& request.type_time == (ENUM_ORDER_TYPE_TIME)OrderGetInteger(ORDER_TYPE_TIME)
&& request.expiration == (datetime)OrderGetInteger(ORDER_TIME_EXPIRATION);
if(previous > 0 && !OrderSelect(previous)) return unchanged;
return unchanged;
}
return false;
}
bool MetaMindSinglePreflight(const MqlTradeRequest &request, MqlTradeResult &result)
{
bool reducing = request.action == TRADE_ACTION_REMOVE || request.action == TRADE_ACTION_CLOSE_BY
|| MetaMindSingleReducesPosition(request);
if(MetaMindSingleUnchanged(request)) return MetaMindSingleReject(result, TRADE_RETCODE_NO_CHANGES, "No change to order or position");
MqlTradeCheckResult check = {};
bool checked = OrderCheck(request, check);
if(reducing && check.retcode == TRADE_RETCODE_NO_MONEY) return true;
if(!checked || (check.retcode != 0 && check.retcode != TRADE_RETCODE_DONE))
return MetaMindSingleReject(result, check.retcode == 0 ? TRADE_RETCODE_ERROR : check.retcode,
check.comment == "" ? "Trade request preflight failed" : check.comment);
if(!reducing && (request.action == TRADE_ACTION_DEAL || request.action == TRADE_ACTION_PENDING) && check.margin_free < 0.0)
return MetaMindSingleReject(result, TRADE_RETCODE_NO_MONEY, "Insufficient free margin");
return true;
}
bool MetaMindSingleOrderSend(const MqlTradeRequest &request, MqlTradeResult &result)
{
if(!MetaMindSinglePreflight(request, result)) return false;
return ::OrderSend(request, result);
}
bool MetaMindSingleOrderSendAsync(const MqlTradeRequest &request, MqlTradeResult &result)
{
if(!MetaMindSinglePreflight(request, result)) return false;
return ::OrderSendAsync(request, result);
}
class MetaMindSingleTrade : public CTrade
{
protected:
virtual bool OrderSend(const MqlTradeRequest &request, MqlTradeResult &result)
{
if(!MetaMindSinglePreflight(request, result)) return false;
return CTrade::OrderSend(request, result);
}
};
#include <Trade/Trade.mqh>
MetaMindSingleTrade trade;
const int Magic = 568330;
const string StrategyComment = "EmaTrendCross_V1__XAUUSD_M30";
input int FastEmaPeriod = 20;
input int SlowEmaPeriod = 50;
input int TrendEmaPeriod = 200;
input int EntryStartHour = 7;
input int EntryStartMinute = 0;
input int EntryEndHour = 19;
input int EntryEndMinute = 0;
input int ExitHour = 20;
input int ExitMinute = 0;
input double RiskPercent = 1;
input double StopLossPercent = 1;
datetime lastBarTime = 0;
datetime lastExitExecution = 0;
int handleFastEma;
int handleSlowEma;
int handleTrendEma;
enum SignalDirection
{
SIGNAL_NONE = 0,
SIGNAL_BUY = 1,
SIGNAL_SELL = 2
};
int OnInit()
{
// код доступен только после оплаты
}
void OnDeinit(const int reason)
{Показано первые 50% кода (символов: 10934)