trend moving average.mq4
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.