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

trend moving average.mq4

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Данный продукт представляет собой торговый советник для платформы MetaTrader 4, основанный на стратегии пересечения двух экспоненциальных скользящих средних (EMA). При пересечении быстрой EMA сверху вниз медленной открывается позиция на продажу, а при пересечении снизу вверх — на покупку. Советник автоматически рассчитывает объём позиции и управляет ордерами на основе заданных параметров.

Продукт включает систему управления денежными средствами с настраиваемым уровнем риска и тремя режимами прогрессии лотов (отсутствие, нарастающая, мартингейл). Взятие прибыли и стоп-лосс настраиваются отдельно и могут включаться или выключаться. Доступна функция фиксации прибыли, которая частично блокирует доход при достижении определённого уровня.

Советник использует надёжные функции исполнения ордеров с механизмом повторных попыток при возникновении ошибок. При отключённом управлении прибылью/стоп-лоссом позиция закрывается при развороте сигнала EMA, обеспечивая автоматическое управление открытой позицией.

Настройки программы

НастройкаОписание
magic Магический номер — Магический номер для идентификации ордеров, размещённых данным советником.
CommonSettings Общие настройки — Текстовый разделитель для группы общих настроек.
user_slippage Проскальзывание — Допустимое отклоние цены (проскальзывание) при исполнении ордеров.
user_tp Тейк-профит пользователя — Расстояние тейк-профита в пунктах от цены открытия позиции.
user_sl Стоп-лосс пользователя — Расстояние стоп-лосса в пунктах от цены открытия позиции.
use_tp_sl Использовать тейк-профит и стоп-лосс — Переключатель использования тейк-профита и стоп-лосса: 0 — отключено, 1 — включено.
profit_lock Коэффициент фиксации прибыли — Коэффициент фиксации прибыли, определяющий долю прибыли для блокировки при достижении максимального дохода.
MoneyManagementSettings Настройки управления капиталом — Текстовый разделитель для группы настроек управления денежными средствами.
money_management Управление капиталом — Переключатель системы управления денежными средствами: 0 — фиксированный лот, 1 — расчёт по риску.
min_lots Минимальный лот — Минимальный размер лота для расчёта объёма позиции.
risk Процент риска — Процент риска, используемый при расчёте размера лота от свободного маржа.
progression Прогрессия лотов — Режим прогрессии лотов: 0 — без прогрессии, 1 — нарастающая, 2 — мартингейл.
IndicatorSettings Настройки индикатора — Текстовый разделитель для группы настроек индикатора.
ema_fast Период быстрой EMA — Период быстрой экспоненциальной скользящей средней для формирования торгового сигнала.
ema_slow Период медленной EMA — Период медленной экспоненциальной скользящей средней для формирования торгового сигнала.
shift Сдвиг — Сдвиг бара, на котором рассчитываются значения индикатора для формирования сигнала.
Получить полный код

Поиск по коду файла

#include <stdlib.mqh>
#include <stderror.mqh> 

extern int magic = 161556;

extern string CommonSettings = "---------------------------------------------";
extern int user_slippage = 2; 
extern int user_tp = 40;
extern int user_sl = 40;
extern int use_tp_sl = 1;
extern double profit_lock = 0.90;
extern string MoneyManagementSettings = "---------------------------------------------";

extern int money_management = 1;
extern double min_lots = 0.1;
extern int risk=1;
extern int progression = 0; // 0=none | 1:ascending | 2:martingale

extern string IndicatorSettings = "---------------------------------------------";
extern int ema_fast = 10;
extern int ema_slow = 60;
extern int shift = 1;

string key = "*** ***** ** ****";

int order_tickets;

double order_lots;

double order_price;

double order_profit;

int order_time;

double signal=0;

int orders = 0;
int direction= 0;
double max_profit=0, close_profit=0;
double last_order_profit=0, last_order_lots=0;

color c=Black;

double balance, equity;
int slippage=0;

int retry_attempts = 10; 
double sleep_time = 4.0;
double sleep_maximum	= 25.0;  // in seconds
string OrderReliable_Fname = "OrderReliable fname unset";
static int _OR_err = 0;
string OrderReliableVersion = "V1_1_1"; 

int start()
{
      // код доступен только после оплаты
   }

void InicializarVariables()
{

  orders=0;
  direction=0;

  order_tickets = 0;
  order_lots = 0;
  order_price = 0;
  order_time = 0;
  order_profit = 0;

  last_order_profit = 0;
  last_order_lots = 0;

}

void ActualizarOrdenes()
{
  int ordenes=0;

  for(int i=0; i<OrdersTotal(); i++)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)
    {
      if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
      {
        order_tickets = OrderTicket();
        order_lots = OrderLots();
        order_price = OrderOpenPrice();
        order_time = OrderOpenTime();
        order_profit = OrderProfit();
        ordenes++;
        if (OrderType()==OP_BUY) direction=1;
        if (OrderType()==OP_SELL) direction=2;
      }
    }
  }

  orders = ordenes;
}

double CalcularVolumen()
{ 
  double aux; 
  int n;

  if (money_management==0)
  {
    aux=min_lots;
  }
  else
  {    
    if (progression==0) 
    { 
      aux = risk*AccountFreeMargin();
      aux= aux/100000;
      n = MathFloor(aux/min_lots);

      aux = n*min_lots;                   
    }  

    if (progression==1)
    {
      if (last_order_profit<0)
      {
        aux = last_order_lots+min_lots;
      }
      else 
      {
        aux = last_order_lots-min_lots;
      }  
    }        

    if (progression==2)
    {
      if (last_order_profit<0)
      {
        aux = last_order_lots*2;
      }
      else 
      {
         aux = risk*AccountFreeMargin();
         aux= aux/100000;
         n = MathFloor(aux/min_lots);

         aux = n*min_lots;         
      }  
    }     

    if (aux<min_lots)
        aux=min_lots;

    if (aux>MarketInfo(Symbol(),MODE_MAXLOT))
      aux=MarketInfo(Symbol(),MODE_MAXLOT);

    if (aux<MarketInfo(Symbol(),MODE_MINLOT))
      aux=MarketInfo(Symbol(),MODE_MINLOT);
  }

  return(aux);
}

double CalculaValorPip(double lotes)
{ 
   double aux_mm_valor=0;

   double aux_mm_tick_value = MarketInfo(Symbol(), MODE_TICKVALUE);
   double aux_mm_tick_size = MarketInfo(Symbol(), MODE_TICKSIZE);
   int aux_mm_digits = MarketInfo(Symbol(),MODE_DIGITS);   
   double aux_mm_veces_lots = 1/lotes;

   if (aux_mm_digits==5)
   {
     aux_mm_valor=aux_mm_tick_value*10;
   }
   else if (aux_mm_digits==4)
   {
     aux_mm_valor = aux_mm_tick_value;
   }

   if (aux_mm_digits==3)
   {
     aux_mm_valor=aux_mm_tick_value*10;
   }
   else if (aux_mm_digits==2)
   {
     aux_mm_valor = aux_mm_tick_value;
   }

   aux_mm_valor = aux_mm_valor/aux_mm_veces_lots;

   return(aux_mm_valor);
}

int CalculaTakeProfit()
{ 
  int aux_take_profit;      

  aux_take_profit=MathRound(CalculaValorPip(order_lots)*user_tp);  

  return(aux_take_profit);
}

int CalculaStopLoss()
{ 
  int aux_stop_loss;      

  aux_stop_loss=-1*MathRound(CalculaValorPip(order_lots)*user_sl);

  return(aux_stop_loss);
}

int CalculaSignal(int ema_fast, int ema_slow, int aux_shift)
{
  int aux=0;   

  double ema_fast_1=iMA(Symbol(),0,ema_fast,0,MODE_EMA,PRICE_CLOSE,aux_shift);
  double ema_fast_2=iMA(Symbol(),0,ema_fast,0,MODE_EMA,PRICE_CLOSE,aux_shift+1);
  double ema_slow_1=iMA(Symbol(),0,ema_slow,0,MODE_EMA,PRICE_CLOSE,aux_shift);
  double ema_slow_2=iMA(Symbol(),0,ema_slow,0,MODE_EMA,PRICE_CLOSE,aux_shift+1);

  if (ema_fast_1>ema_slow_1 && ema_fast_2<ema_slow_2) aux=1;
  if (ema_fast_1<ema_slow_1 && ema_fast_2>ema_slow_2) aux=2;

  return(aux);  
}

void Robot()
{
  int ticket=-1, i;
  bool cerrada=FALSE;  

  if (orders==0 && direction==0)
  {     
    signal = CalculaSignal(ema_fast,ema_slow,shift);

    if (signal==1)
      ticket = OrderSendReliable(Symbol(),OP_BUY,CalcularVolumen(),MarketInfo(Symbol(),MODE_ASK),slippage,0,0,key,magic,0,Blue); 

    if (signal==2)
      ticket = OrderSendReliable(Symbol(),OP_SELL,CalcularVolumen(),MarketInfo(Symbol(),MODE_BID),slippage,0,0,key,magic,0,Red);         

  }

  if (orders>0 && direction==1 && use_tp_sl==1)
  {

    if (order_profit > CalculaTakeProfit() && max_profit==0)
    {
      max_profit = order_profit;
      close_profit = profit_lock*order_profit;      
    } 

    if (max_profit>0)
    {
      if (order_profit>max_profit)
      {      
        max_profit = order_profit;
        close_profit = profit_lock*order_profit; 
      }
    }   

    if (max_profit>0 && close_profit>0 && max_profit>close_profit && order_profit<close_profit) 
    {
      cerrada=OrderCloseReliable(order_tickets,order_lots,MarketInfo(Symbol(),MODE_BID),slippage,Blue);
      max_profit=0;
      close_profit=0;  
    }

    if (order_profit <= CalculaStopLoss())
    {
      cerrada=OrderCloseReliable(order_tickets,order_lots,MarketInfo(Symbol(),MODE_BID),slippage,Blue);
      max_profit=0;
      close_profit=0;  
    }   

  }

  if (orders>0 && direction==2 && use_tp_sl==1)
  {

    if (order_profit > CalculaTakeProfit() && max_profit==0)
    {
      max_profit = order_profit;
      close_profit = profit_lock*order_profit;      
    } 

    if (max_profit>0)
    {
      if (order_profit>max_profit)
      {      
        max_profit = order_profit;
        close_profit = profit_lock*order_profit; 
      }
    }   

    if (max_profit>0 && close_profit>0 && max_profit>close_profit && order_profit<close_profit) 
    {
      cerrada=OrderCloseReliable(order_tickets,order_lots,MarketInfo(Symbol(),MODE_ASK),slippage,Red);
      max_profit=0;
      close_profit=0;  
    }

    if (order_profit <= CalculaStopLoss())
    {
      cerrada=OrderCloseReliable(order_tickets,order_lots,MarketInfo(Symbol(),MODE_ASK),slippage,Red);
      max_profit=0;
      close_profit=0;  
    }   
  }

  if (orders>0 && direction==1 && use_tp_sl==0)
  {
    signal = CalculaSignal(ema_fast,ema_slow,shift);
    if (signal==2)
    {
      cerrada=OrderCloseReliable(order_tickets,order_lots,MarketInfo(Symbol(),MODE_BID),slippage,Blue);
      max_profit=0;
      close_profit=0;    
    }  
  }

  if (orders>0 && direction==2 && use_tp_sl==0)
  {
    signal = CalculaSignal(ema_fast,ema_slow,shift);
    if (signal==1)
    {
      cerrada=OrderCloseReliable(order_tickets,order_lots,MarketInfo(Symbol(),MODE_ASK),slippage,Red);
      max_profit=0;
      close_profit=0;   
    }  
  }    

}

int OrderSendReliable(string symbol, int cmd, double volume, double price,
					  int slippage, double stoploss, double takeprofit,
					  string comment, int magic, datetime expiration = 0, 
					  color arrow_color = CLR_NONE) 
{

	OrderReliable_Fname = "OrderSendReliable";
	OrderReliablePrint(" attempted " + OrderReliable_CommandString(cmd) + " " + volume + 
						" lots @" + price + " sl:" + stoploss + " tp:" + takeprofit); 

	if (IsStopped()) 
	{
		OrderReliablePrint("error: IsStopped() == true");
		_OR_err = ERR_COMMON_ERROR; 
		return(-1);
	}

	int cnt = 0;
	while(!IsTradeAllowed() && cnt < retry_attempts) 
	{
		OrderReliable_SleepRandomTime(sleep_time, sleep_maximum); 
		cnt++;
	}

	if (!IsTradeAllowed()) 
	{
		OrderReliablePrint("error: no operation possible because IsTradeAllowed()==false, even after retries.");
		_OR_err = ERR_TRADE_CONTEXT_BUSY; 

		return(-1);  
	}

	int digits = MarketInfo(symbol, MODE_DIGITS);
	if (digits > 0) 
	{
		price = NormalizeDouble(price, digits);
		stoploss = NormalizeDouble(stoploss, digits);
		takeprofit = NormalizeDouble(takeprofit, digits); 
	}

	if (stoploss != 0) 
		OrderReliable_EnsureValidStop(symbol, price, stoploss); 

	int err = GetLastError(); // clear the global variable.  
	err = 0; 
	_OR_err = 0; 
	bool exit_loop = false;
	bool limit_to_market = false; 

	int ticket=-1;

	if ((cmd == OP_BUYST

Показано первые 50% кода (символов: 15804)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
1 580,40₽ ≈ $19.32