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

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)