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

Moving Average Cross with Exit EA

ma_cross_with_exit_ea.mq4

Похожие материалы по тегам

#1.mtf_collider_h4_close_13_v18bar.mq4MQL4 / MetaTrader 4 · 1 общих теговea robofibo source v.11.2.mq4MQL4 / MetaTrader 4 · 1 общих теговsma crossover scalper ea for mt4.mq4MQL4 / MetaTrader 4 · 1 общих теговr15 pivot points expert advisor by @fundedmillionairess.mq4MQL4 / MetaTrader 4 · 1 общих теговnewstrader.mq5MQL5 / MetaTrader 5 · 1 общих теговmm3.0_flip_codepro_v3.1_with_cooldown@lifeindreamsworld.mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

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

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

О программе

Данный продукт представляет собой торговый советник для MetaTrader 4, который автоматически открывает позиции Buy или Sell при пересечении двух скользящих средних. Восходящее пересечение MA1 над MA2 генерирует сигнал на покупку, а нисходящее — на продажу. Советник также отслеживает дополнительную линию MA3 для определения условий выхода из позиций.

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

Реализованы системы уведомлений: звуковые и email-оповещения о открытии и закрытии позиций. На графике отображается информационный комментарий с текущими значениями скользящих средних, состоянием позиций, прибылью и доступным риском. Советник требует установки внешнего индикатора Two_MA_Cross_Indicator для расчёта некоторых типов скользящих средних.

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

НастройкаОписание
Comment1 Комментарий 1 — Текстовый комментарий для раздела параметров стратегии
EA_Activated Активация EA — Включает или отключает работу советника
TimeFrame Таймфрейм — Таймфрейм, на котором работает советник
Order_Type Тип ордера — Тип разрешённых ордеров: оба, только покупка или только продажа
Maximum_Trades_Open Макс. открытых сделок — Максимальное количество одновременно открытых позиций
Wait_Mins_For_Next_Trade Ожидание между сделками — Время ожидания в минутах между последовательными сделками
MA1_Period Период MA1 — Период первой скользящей средней
MA1_Method Метод MA1 — Тип расчёта первой скользящей средней
MA1_Price_Type Цена MA1 — Тип цены для расчёта первой скользящей средней
MA2_Period Период MA2 — Период второй скользящей средней
MA2_Method Метод MA2 — Тип расчёта второй скользящей средней
MA2_Price_type Цена MA2 — Тип цены для расчёта второй скользящей средней
MA3_Period Период MA3 — Период третьей скользящей средней
MA3_Method Метод MA3 — Тип расчёта третьей скользящей средней
MA3_Price_type Цена MA3 — Тип цены для расчёта третьей скользящей средней
Max_Pips_Away_From_Cross Макс. расстояние от пересечения — Максимальное расстояние от точки пересечения в пипсах для открытия позиции
Comment2 Комментарий 2 — Текстовый комментарий для раздела магического номера ордера
Magic_N Магический номер — Магический номер ордера для идентификации позиций советника
Comment3 Комментарий 3 — Текстовый комментарий для раздела автоматического расчёта лотов
Risk_Management Управление рисками — Режим управления рисками: автоматический расчёт лота или ручной
Comment4 Комментарий 4 — Текстовый комментарий для раздела автоматического риска
Auto_Risk_Percent Процент риска — Процент риска от депозита на одну сделку при автоматическом расчёте лота
Auto_Max_Risk_in_Total_Orders Макс. совокупный риск — Максимальный совокупный риск в процентах от депозита при автоматическом управлении рисками
Comment5 Комментарий 5 — Текстовый комментарий для раздела ручных лотов
Manual_Lots Ручной лот — Ручное значение лота при ручном управлении рисками
Manual_Maximum_Lots Макс. ручные лоты — Максимальное количество лотов при ручном управлении рисками
Comment6 Комментарий 6 — Текстовый комментарий для раздела проскальзывания
Slippage Проскальзывание — Допустимое проскальзывание цены при открытии и закрытии позиций
Comment7 Комментарий 7 — Текстовый комментарий для раздела стоп-лосса
StopLoss Стоп-лосс — Уровень стоп-лосса в пипсах
Comment8 Комментарий 8 — Текстовый комментарий для раздела тейк-профита
TakeProfit Тейк-профит — Уровень тейк-профита в пипсах
Comment9 Комментарий 9 — Текстовый комментарий для раздела трейлинг-стопа
TrailingStop Трейлинг-стоп — Уровень трейлинг-стопа в пипсах
TrailingStep Шаг трейлинг-стопа — Шаг трейлинг-стопа в пипсах
Comment10 Комментарий 10 — Текстовый комментарий для раздела настроек оповещений
Sound_Alert Звуковой сигнал — Включает звуковой сигнал при срабатывании торговых событий
Email_Alert Email-оповещения — Включает отправку email-оповещений о событиях торговых позиций
Comment11 Комментарий 11 — Текстовый комментарий для раздела дополнительных действий
EASounds Звуковые оповещения EA — Включает звуковое оповещение при открытии и закрытии позиций
Show_Profit_Comments Показывать прибыль — Отображение информации о прибыли в комментариях на графике
Получить полный код

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

#property description "This EA triggers a Buy or Sell Order after two moving averages cross each other.\n"
#property description "- MA1 crossing above the MA2 triggers a Buy Order"
#property description "- MA1 crossing below the MA2 triggers a Sell Order\n"
#property description "It will Exit a trade:\n"
#property description "- If the MA1 crosses either the MA2 or MA3"
#property description "- Or after hitting Take Profit or Stop Loss\n"

enum e_cycles{  Min_1=1, Min_5=2, Min_15=3, Min_30=4, Min_60=5, Min_240=6, Daily=7, Weekly=8, Monthly=9 };
enum order_type{ Both=1, Only_Buy=2, Only_Sell=3 };
enum e_risk { Automatic=1, Manual=2 };

enum e_method{ SMA        =  1,
               EMA        =  2,
               Wilder     =  3,
               LWMA       =  4,
               SineWMA    =  5,
               TriMA      =  6,
               LSMA       =  7,
               SMMA       =  8,
               HMA        =  9,
               ZeroLagEMA = 10,
               ITrend     = 11,
               Median     = 12,
               GeoMean    = 13,
               REMA       = 14,
               ILRS       = 15,
               IE_2       = 16,
               TriMAgen   = 17
             };

enum e_price{ CLOSE=PRICE_CLOSE, OPEN=PRICE_OPEN, LOW=PRICE_LOW, HIGH=PRICE_HIGH, MEDIAN=PRICE_MEDIAN, TYPICAL=PRICE_TYPICAL, WEIGHTED=PRICE_WEIGHTED };

extern string     Comment1                      = "- Strategy Parameters -";
extern bool       EA_Activated                  = true;
input  e_cycles   TimeFrame                     = Min_60;
input  order_type Order_Type                    = Both;
extern int        Maximum_Trades_Open           = 3;
extern int        Wait_Mins_For_Next_Trade      = 30;
extern int        MA1_Period                    = 5;
extern e_method   MA1_Method                    = SMA;
extern e_price    MA1_Price_Type                = CLOSE;
extern int        MA2_Period                    = 30;
extern e_method   MA2_Method                    = SMA;
extern e_price    MA2_Price_type                = CLOSE;
extern int        MA3_Period                    = 10;
extern e_method   MA3_Method                    = SMA;
extern e_price    MA3_Price_type                = CLOSE;
extern double     Max_Pips_Away_From_Cross      = 10;
extern string     Comment2                      = "- Order magic number. May be used as user defined identifier -";
extern int        Magic_N                       = 123456;
extern string     Comment3                      = "- AutoLots True will calculate Lots automatically -";
input  e_risk     Risk_Management               = Automatic;
extern string     Comment4                      = "- Automatic Risk, For ex: 2.5 means 2.5% -";
extern double     Auto_Risk_Percent             = 2;
extern double     Auto_Max_Risk_in_Total_Orders = 7;
extern string     Comment5                      = "- Manual Number of Lots (if not Automatic Risk) -";
extern double     Manual_Lots                   = 0.3;
extern double     Manual_Maximum_Lots           = 3.0;
extern string     Comment6                      = "- Maximum price slippage for buy or sell orders -";
extern double     Slippage                      = 3;
extern string     Comment7                      = "- Stop loss in Pips -";
extern double     StopLoss                      = 10;
extern string     Comment8                      = "- Take profit in Pips -";
extern double     TakeProfit                    = 20;
extern string     Comment9                      = "- Trailing Stop in Pips -";
extern double     TrailingStop                  = 20;
extern double     TrailingStep                  = 5;
extern string     Comment10                     = "- Should the EA use alerts -";
extern bool       Sound_Alert                   = true;
extern bool       Email_Alert                   = false;
extern string     Comment11                     = "- Optional EA actions -";
extern bool       EASounds                      = true;
extern bool       Show_Profit_Comments          = true;

double Emergency_SL = 2000;

string EA_Name = "Moving Average Cross with Exit EA";
string CommentOrder = EA_Name+" Order";

double Lots;

int Open_Long, Open_Short, Close_Long, Close_Short;
double Side, Open_Level, TP_Level, SL_Level, TSL_Level = 0;
double Profit;
string Calculation_Comments, Orders_Comments, Profit_Comments;
datetime LastClose, LastOpen;

double Equity_Risked=0;
double Order_SL;
double Orders_Lots;

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

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

void EA_Calculations(){

   Open_Long = 0;
   Open_Short = 0;
   Close_Long = 0;
   Close_Short = 0;

   int period     = Get_TimeFrame(TimeFrame);
   int multiplier = Get_TimeFrame(TimeFrame, true)/Period();
   int limit      = MA2_Period*multiplier*2;

   int iMA1_Method = -1;
   int iMA2_Method = -1;
   int iMA3_Method = -1;

   double MA1_0, MA2_0, MA3_0, MA1_1, MA2_1, MA3_1;

   if (MA1_Method==1) iMA1_Method = ENUM_MA_METHOD(0);
   if (MA1_Method==2) iMA1_Method = ENUM_MA_METHOD(1);
   if (MA1_Method==8) iMA1_Method = ENUM_MA_METHOD(2);
   if (MA1_Method==4) iMA1_Method = ENUM_MA_METHOD(3);
   if (MA2_Method==1) iMA2_Method = ENUM_MA_METHOD(0);
   if (MA2_Method==2) iMA2_Method = ENUM_MA_METHOD(1);
   if (MA2_Method==8) iMA2_Method = ENUM_MA_METHOD(2);
   if (MA2_Method==4) iMA2_Method = ENUM_MA_METHOD(3);
   if (MA3_Method==1) iMA3_Method = ENUM_MA_METHOD(0);
   if (MA3_Method==2) iMA3_Method = ENUM_MA_METHOD(1);
   if (MA3_Method==8) iMA3_Method = ENUM_MA_METHOD(2);
   if (MA3_Method==4) iMA3_Method = ENUM_MA_METHOD(3);

   if (iMA1_Method != -1){

      MA1_0 = iMA(NULL,period,MA1_Period,0,iMA1_Method,ENUM_APPLIED_PRICE(MA1_Price_Type),0);
      MA1_1 = iMA(NULL,period,MA1_Period,0,iMA1_Method,ENUM_APPLIED_PRICE(MA1_Price_Type),1);

   }else{

      MA1_0 = iCustom(NULL,period,"Two_MA_Cross_Indicator",MA1_Period,MA1_Method,MA1_Price_Type,MA2_Period,MA2_Method,MA2_Price_type,0,0);
      MA1_1 = iCustom(NULL,period,"Two_MA_Cross_Indicator",MA1_Period,MA1_Method,MA1_Price_Type,MA2_Period,MA2_Method,MA2_Price_type,0,1);

   }

   if (iMA2_Method != -1){

      MA2_0 = iMA(NULL,period,MA2_Period,0,iMA2_Method,ENUM_APPLIED_PRICE(MA2_Price_type),0);
      MA2_1 = iMA(NULL,period,MA2_Period,0,iMA2_Method,ENUM_APPLIED_PRICE(MA2_Price_type),1);

   }else{

      MA2_0 = iCustom(NULL,period,"Two_MA_Cross_Indicator",MA1_Period,MA1_Method,MA1_Price_Type,MA2_Period,MA2_Method,MA2_Price_type,1,0);
      MA2_1 = iCustom(NULL,period,"Two_MA_Cross_Indicator",MA1_Period,MA1_Method,MA1_Price_Type,MA2_Period,MA2_Method,MA2_Price_type,1,1);

   }

   if (iMA3_Method != -1){

      MA3_0 = iMA(NULL,period,MA3_Period,0,iMA3_Method,ENUM_APPLIED_PRICE(MA3_Price_type),0);
      MA3_1 = iMA(NULL,period,MA3_Period,0,iMA3_Method,ENUM_APPLIED_PRICE(MA3_Price_type),1);

   }else{

      MA3_0 = iCustom(NULL,period,"Two_MA_Cross_Indicator",MA1_Period,MA1_Method,MA1_Price_Type,MA3_Period,MA3_Method,MA3_Price_type,1,0);
      MA3_1 = iCustom(NULL,period,"Two_MA_Cross_Indicator",MA1_Period,MA1_Method,MA1_Price_Type,MA3_Period,MA3_Method,MA3_Price_type,1,1);

   }

   double PP=MarketInfo(OrderSymbol(), MODE_POINT);
   double Distance = MathAbs(MA2_0 - Close[0]);

   if (  (Risk_Management==1 && Auto_Max_Risk_in_Total_Orders-Equity_Risked > Auto_Risk_Percent)
      || (Risk_Management==2 && Manual_Maximum_Lots-Orders_Lots > Manual_Lots)
      )
      bool Risk_Allowed = true;
   else
      Risk_Allowed = false;

   if (Digits==3||Digits==5) Max_Pips_Away_From_Cross*=10;

   if (EA_Activated && Risk_Allowed && MA1_0 > MA2_0 && MA1_1 < MA2_1 && Distance <= Max_Pips_Away_From_Cross*PP && TimeCurrent() > (LastOpen+(Wait_Mins_For_Next_Trade*60))){
      Open_Long = 1;
      LastOpen = TimeCurrent();
   }

   if (EA_Activated && Risk_Allowed && MA1_0 < MA2_0 && MA1_1 > MA2_1 && Distance <= Max_Pips_Away_From_Cross*PP && TimeCurrent() > (LastOpen+(Wait_Mins_For_Next_Trade*60))){
      Open_Short = 1;
      LastOpen = TimeCurrent();
   }

   if (EA_Activated && ((MA1_0 < MA2_0 && MA1_1 > MA2_1)||(MA1_0 < MA3_0 && MA1_1 > MA3_1))){
      Close_Long = 1;
   }

   if (EA_Activated && ((MA1_0 > MA2_0 && MA1_1 < MA2_1)||(MA1_0 > MA3_0 && MA1_1 < MA3_1))){
      Close_Short = 1;
   }

   if (MA1_0 > MA2_0) string next_trade = "SELL"; else next_trade = "BUY";
   Calculation_Comments = "MA1: "+DoubleToStr(MA1_0,4)+" | MA2: "+DoubleToStr(MA2_0,4)+" | MA3: "+DoubleToStr(MA3_0,4)+"\n";
   Calculation_Comments = "Max Pips: "+(Max_Pips_Away_From_Cross*PP)+" | Distance: "+(Distance)+"\n";
   Calculation_Comments+= "Waiting for MA cross to "+next_trade;

}

void Set_Levels(){

   double PP=MarketInfo(OrderSymbol(), MODE_POINT);
   double BID=MarketInfo(OrderSymbol(), MODE_BID);
   double ASK=MarketInfo(OrderSymbol(), MODE_ASK);
   double TP = PP*TakeProfit;
   double SL = PP*StopLoss;
   double BUY_TSL  = BID - (TrailingStop*PP);
   double SELL_TSL = ASK + (TrailingStop*PP);

   if(Side == -1) return;

   if (StopLoss==0) StopLoss = Emergency_SL;

   if(TakeProfit > 0){

      if(Side == OP_BUY  ) TP_Level = Open_Level + TP;
      if(Side == OP_SELL ) TP_Level = Open_Level - TP;

   }

   if(StopLoss > 0){

      if(Side == OP_BUY  ) SL_Level = Open_Level - SL;
      if(Side == OP_SELL ) SL_Level = Open_Level + SL;

   }

   bool Order_Modified = false;
   if ((OrderTakeProfit()==0 && TakeProfit > 0) || (OrderStopLoss()==0 && StopLoss > 0)){
      if (OrderModify(OrderTicket(),0,SL_Level,TP_Level,0,clrBlue)){ Order_Modified = true; }
   }

   if(TrailingStop){

      if(Side == OP_BUY){
         if ((BID-OrderOpenPrice())>TrailingStop*PP){
            if (OrderStopLoss()<BID-(TrailingStop+TrailingStep-1)*PP && BID-TrailingStop*PP>SL_Level) {
               if (OrderModify(OrderTicket(),OrderOpenPrice(),BID-TrailingStop*PP,OrderTakeProfit(),0,clrMagenta)){ Order_Modified = true; }
            }
         }
      }

      if(Side == OP_SELL){
         if (OrderOpenPrice()-ASK>TrailingStop*PP) {
            if (OrderStopLoss()>ASK+(TrailingStop+TrailingStep-1)*PP && ASK+TrailingStop*PP<SL_Level) {
               if (OrderModify(OrderTicket(),OrderOpenPrice(),ASK+TrailingStop*PP,OrderTakeProfit(),0,clrMagenta)){ Order_Modified = true; }
            }
         }
      }

   }

   return;
}

double LotSize() {

    double minlot    = MarketInfo(Symbol(), MODE_MINLOT);
    double maxlot    = MarketInfo(Symbol(), MODE_MAXLOT);
    double tickVal   = MarketInfo(Symbol(), MODE_TICKVALUE);

    double Equity = AccountInfoDouble(ACCOUNT_EQUITY);
    double _Risk = Auto_Risk_Percent / 100;
    double Risk_per_Trade   = Equity * _Risk;
    double Pips_Risked = StopLoss  * tickVal;

    if(Risk_per_Trade > 0 && Pips_Risked > 0 && (Risk_per_Trade / Pips_Risked) > 0) {
        double lots = (Risk_per_Trade / Pips_Risked);
        if(lots < minlot) {
            lots = minlot;
        } else if(lots > maxlot) {
            lots = maxlot;
        }
        Lots = lots;
    }
    return(0);
}

void EA_Notes(){

   if (Digits==3||Digits==5){
      double sl = StopLoss/10;
      double tp = TakeProfit/10;
      double tsl = TrailingStop/10;
   }
   else{
      sl = StopLoss/10;
      tp = TakeProfit/10;
      tsl = TrailingStop/10;
   }
   string Currency = AccountCurrency();

   string Note = EA_Name+"\n";
   Note = Note + "Account Equity: "+AccountInfoDouble(ACCOUNT_EQUITY)+" "+Currency+"\n";
   Note = Note + "Risk per SL Pip: "+DoubleToStr(((AccountInfoDouble(ACCOUNT_EQUITY)*(Auto_Risk_Percent/100))/sl),2)+" "+Currency+"\n";
   Note = Note + "Total Risk per Trade: "+DoubleToStr((AccountInfoDouble(ACCOUNT_EQUITY)*(Auto_Risk_Percent/100)),2)+" "+Currency+"\n";
   Note = Note + "Lots: " + DoubleToStr(Lots,2);
   if(Risk_Management==1) Note = Note + " (Automatic "+Auto_Risk_Percent+"%)"; else Note = Note + " (Set Manually)";
   Note = Note + "\n";
   Note = Note + "SL:" + DoubleToStr(sl,0) + " pips | "; 
   Note = Note + "TP:" + DoubleToStr(tp,0) + " pips | ";
   Note = Note + "TSL:" + DoubleToStr(tsl,0) + " pips\n";   
   Note = Note + "=======================\n";  
   if (Show_Profit_Comments){
      Note = Note + "Trades Results:\n";
      Note = Note + Profit_Comments;
   }
   Note = Note + "-----------------------\nTotal Profit: " + DoubleToStr(Profit,2) + "\n";
   Note = Note + "=======================\n"; 
   Note = Note + Calculation_Comments+"\n";
   Note = Note + "=======================\n"; 
   Note = Note + Orders_Comments;

   Comment(Note);
}

int OpenPos(int direction){

   int    attempts = 0;
   int    order = 0;
   double price;
   string string_direction = "";

   for(attempts=0;attempts<3;attempts++){

      if (IsTradeContextBusy()){
         Sleep(1000);

      }else{

         RefreshRates();         

         if(direction == OP_BUY){
            price = Ask;
            string_direction = "Long";
         }else{
            price = Bid;
            string_direction = "Short";
         }        

         if(EASounds) PlaySound("alert.wav");

         order = OrderSend(Symbol(),direction,Lots,price,Slippage,0,0,CommentOrder,Magic_N,0,Red);

         if(order<=0) {

            Print("Error Occured : "+Errors(GetLastError()));

         }else{

            attempts = 3;
            Print("Order opened : "+Symbol()+" Price @ "+price+" SL @ "+StopLoss+" TP @"+TakeProfit+" order ="+orde

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

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

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

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

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

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

Стоимость полного кода
2 316,20₽ ≈ $28.31