Author: Expert Advisor Builder
Profit factor:
0.61

This script is designed to automatically trade on the Forex market using the MetaTrader platform. Here's a breakdown of how it works:

Overall Goal:

The script aims to identify potential buying and selling opportunities based on the movements of moving averages, which are indicators that smooth out price data to show trends. When certain moving averages cross each other in specific ways, the script interprets this as a signal to either open or close a trade.

Key Components:

  1. Setup:

    • The script starts by defining some settings that you, the user, can adjust. These include:
      • A magic number: This is a unique identifier to help the script manage its own trades.
      • Sending email alerts: Choose whether or not to receive email notifications when a trade is made.
      • Trading frequency: Decide whether the script should check for trading opportunities on every price change ("Each Tick Mode") or only when a new time period (e.g., a new minute, hour, or day) begins.
      • Trade size: Specify how much money to put into each trade (Lots).
      • Slippage: Acceptable price difference when placing an order.
      • Stop Loss & Take Profit: Enable or disable automatic Stop Loss and Take Profit.
      • Trailing Stop: Enable or disable automatic Trailing Stop.
  2. Calculations:

    • The script calculates several different moving averages of the closing price. These moving averages use different time periods (e.g., 576, 288, 88, 56, and 24) and different calculation methods (SMMA and SMA).
    • It then compares the values of these moving averages to each other and also to the opening price of the current time period. These comparisons are the heart of the trading strategy.
  3. Trading Logic:

    • Checking Existing Trades: The script first checks if there are any open trades associated with it.
    • Closing Trades (Exiting):
      • If there's an open buy trade, it checks if the calculated moving averages meet specific conditions that indicate it's time to close the buy trade. If those conditions are met, the script closes the buy trade and sends an email alert (if enabled).
      • If there's an open sell trade, it does the same thing, but looks for conditions indicating it's time to close the sell trade.
      • Trailing Stop: If the user enabled the trailing stop functionality, and profit starts to increase, the script will adjust the stop loss, to lock profits as the price moves in a favorable direction.
    • Opening Trades (Entering):
      • If no trade exists, it checks whether the moving averages meet conditions that signal a buy opportunity. If these conditions are met, it opens a buy trade.
      • If no trade exists, it checks for sell conditions and opens a sell trade if those are met.
      • Margin Check: Before opening a trade, the script ensures that your account has enough available funds ("free margin") to cover the trade. If not, it prints a message and skips the trade.
      • Stop Loss and Take Profit: When opening a trade, the script can automatically set a "stop loss" (a price at which to automatically close the trade to limit potential losses) and a "take profit" (a price at which to automatically close the trade to lock in profits). These are optional, based on the user's settings.
  4. Important Considerations:

    • The script includes a check to avoid making trades too frequently when "Each Tick Mode" is enabled.
    • It also keeps track of the number of bars (time periods) to ensure that the calculations are based on the most up-to-date data.

In Simple Terms:

Imagine you're watching a race where different runners (moving averages) are moving around. This script is like a set of rules that tells you when to bet on the race:

  • Rules: These rules are based on the positions of the runners relative to each other and to the starting point (the opening price).
  • Betting: When the runners line up in a certain way (moving averages cross), the script automatically places a bet to buy (expecting the price to go up) or sell (expecting the price to go down).
  • Cutting Losses/Taking Profits: The script also has rules for when to cut your losses (stop loss) or take your profits (take profit) based on how the race is going.
  • Trailing Stop: Also has rules to secure the profit by moving the stop loss as price goes to your predicted direction.

Disclaimer: Trading Forex involves risk, and this script doesn't guarantee profits. You should understand the risks involved and carefully test the script before using it with real money.

Price Data Components
Series array that contains open prices of each bar
Orders Execution
Checks for the total of open ordersIt Closes Orders by itself It can change open orders parameters, due to possible stepping strategyIt automatically opens orders when conditions are reached
Indicators Used
Moving average indicator
Miscellaneous
It sends emails
2 Views
0 Downloads
0 Favorites
SpikesMA4x
//+------------------------------------------------------------------+
//| This MQL is generated by Expert Advisor Builder                  |
//|                http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/ |
//|                                                                  |
//|  In no event will author be liable for any damages whatsoever.   |
//|                      Use at your own risk.                       |
//|                                                                  |
//+------------------- DO NOT REMOVE THIS HEADER --------------------+

#define SIGNAL_NONE 0
#define SIGNAL_BUY   1
#define SIGNAL_SELL  2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4

#property copyright "Expert Advisor Builder"
#property link      "http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/"

extern int MagicNumber = 0;
extern bool SignalMail = False;
extern bool EachTickMode = True;
extern double Lots = 1.0;
extern int Slippage = 3;
extern bool UseStopLoss = False;
extern int StopLoss = 400;
extern bool UseTakeProfit = False;
extern int TakeProfit = 200;
extern bool UseTrailingStop = False;
extern int TrailingStop = 100;

int BarCount;
int Current;
bool TickCheck = False;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init() {
   BarCount = Bars;

   if (EachTickMode) Current = 0; else Current = 1;

   return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit() {
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start() {
   int Order = SIGNAL_NONE;
   int Total, Ticket;
   double StopLossLevel, TakeProfitLevel;



   if (EachTickMode && Bars != BarCount) TickCheck = False;
   Total = OrdersTotal();
   Order = SIGNAL_NONE;

   //+------------------------------------------------------------------+
   //| Variable Begin                                                   |
   //+------------------------------------------------------------------+

double Var1 = iMA(NULL, 0, 576, 0, MODE_SMMA, PRICE_CLOSE, Current + 0);
double Var2 = iMA(NULL, 0, 288, 0, MODE_SMMA, PRICE_CLOSE, Current + 0);
double Var3 = iMA(NULL, 0, 88, 0, MODE_SMMA, PRICE_CLOSE, Current + 0);
double Var4 = iMA(NULL, 0, 56, 0, MODE_SMMA, PRICE_CLOSE, Current + 0);
double Var5 = iMA(NULL, 0, 24, 0, MODE_SMA, PRICE_CLOSE, Current + 0);

double Buy1_1 = iMA(NULL, 0, 576, 0, MODE_SMMA, PRICE_CLOSE, Current + 0);
double Buy1_2 = iMA(NULL, 0, 288, 0, MODE_SMMA, PRICE_CLOSE, Current + 0);
double Buy2_1 = iMA(NULL, 0, 88, 0, MODE_SMMA, PRICE_CLOSE, Current + 0);
double Buy2_2 = iMA(NULL, 0, 56, 0, MODE_SMMA, PRICE_CLOSE, Current + 0);
double Buy3_1 = iOpen(NULL, 0, Current + 0);
double Buy3_2 = iMA(NULL, 0, 24, 0, MODE_SMA, PRICE_CLOSE, Current + 0);

double Sell1_1 = iMA(NULL, 0, 576, 0, MODE_SMMA, PRICE_CLOSE, Current + 0);
double Sell1_2 = iMA(NULL, 0, 288, 0, MODE_SMMA, PRICE_CLOSE, Current + 0);
double Sell2_1 = iMA(NULL, 0, 88, 0, MODE_SMMA, PRICE_CLOSE, Current + 0);
double Sell2_2 = iMA(NULL, 0, 56, 0, MODE_SMMA, PRICE_CLOSE, Current + 0);
double Sell3_1 = iOpen(NULL, 0, Current + 0);
double Sell3_2 = iMA(NULL, 0, 24, 0, MODE_SMA, PRICE_CLOSE, Current + 0);

double CloseBuy1_1 = iMA(NULL, 0, 88, 0, MODE_SMMA, PRICE_CLOSE, Current + 0);
double CloseBuy1_2 = iMA(NULL, 0, 56, 0, MODE_SMMA, PRICE_CLOSE, Current + 0);
double CloseBuy2_1 = iOpen(NULL, 0, Current + 0);
double CloseBuy2_2 = iMA(NULL, 0, 24, 0, MODE_SMA, PRICE_CLOSE, Current + 0);

double CloseSell1_1 = iMA(NULL, 0, 88, 0, MODE_SMMA, PRICE_CLOSE, Current + 0);
double CloseSell1_2 = iMA(NULL, 0, 56, 0, MODE_SMMA, PRICE_CLOSE, Current + 0);
double CloseSell2_1 = iOpen(NULL, 0, Current + 0);
double CloseSell2_2 = iMA(NULL, 0, 24, 0, MODE_SMA, PRICE_CLOSE, Current + 0);

   
   //+------------------------------------------------------------------+
   //| Variable End                                                     |
   //+------------------------------------------------------------------+

   //Check position
   bool IsTrade = False;

   for (int i = 0; i < Total; i ++) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) {
         IsTrade = True;
         if(OrderType() == OP_BUY) {
            //Close

            //+------------------------------------------------------------------+
            //| Signal Begin(Exit Buy)                                           |
            //+------------------------------------------------------------------+

                     if (CloseBuy1_1 >= CloseBuy1_2 && CloseBuy2_1 < CloseBuy2_2) Order = SIGNAL_CLOSEBUY;


            //+------------------------------------------------------------------+
            //| Signal End(Exit Buy)                                             |
            //+------------------------------------------------------------------+

            if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
               OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }
            //Trailing stop
            if(UseTrailingStop && TrailingStop > 0) {                 
               if(Bid - OrderOpenPrice() > Point * TrailingStop) {
                  if(OrderStopLoss() < Bid - Point * TrailingStop) {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         } else {
            //Close

            //+------------------------------------------------------------------+
            //| Signal Begin(Exit Sell)                                          |
            //+------------------------------------------------------------------+

                     if (CloseSell1_1 <= CloseSell1_2 && CloseSell2_1 > CloseSell2_2) Order = SIGNAL_CLOSESELL;


            //+------------------------------------------------------------------+
            //| Signal End(Exit Sell)                                            |
            //+------------------------------------------------------------------+

            if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
               OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }
            //Trailing stop
            if(UseTrailingStop && TrailingStop > 0) {                 
               if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {
                  if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         }
      }
   }

   //+------------------------------------------------------------------+
   //| Signal Begin(Entry)                                              |
   //+------------------------------------------------------------------+

   if (Buy1_1 < Buy1_2 && Buy2_1 < Buy2_2 && Buy3_1 > Buy3_2) Order = SIGNAL_BUY;

   if (Sell1_1 > Sell1_2 && Sell2_1 > Sell2_2 && Sell3_1 < Sell3_2) Order = SIGNAL_SELL;


   //+------------------------------------------------------------------+
   //| Signal End                                                       |
   //+------------------------------------------------------------------+

   //Buy
   if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {
         //Check free margin
         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }

         if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;

         Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
         if(Ticket > 0) {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
				Print("BUY order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");
			} else {
				Print("Error opening BUY order : ", GetLastError());
			}
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
         return(0);
      }
   }

   //Sell
   if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {
         //Check free margin
         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }

         if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;

         Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
         if(Ticket > 0) {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
				Print("SELL order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");
			} else {
				Print("Error opening SELL order : ", GetLastError());
			}
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
         return(0);
      }
   }

   if (!EachTickMode) BarCount = Bars;

   return(0);
}
//+------------------------------------------------------------------+

Profitability Reports

EUR/USD Jan 2025 - Jul 2025
3.40
Total Trades 6
Won Trades 3
Lost trades 3
Win Rate 50.00 %
Expected payoff 1384.33
Gross Profit 11773.00
Gross Loss -3467.00
Total Net Profit 8306.00
-100%
-50%
0%
50%
100%
AUD/USD Jan 2025 - Jul 2025
0.09
Total Trades 12
Won Trades 1
Lost trades 11
Win Rate 8.33 %
Expected payoff -460.08
Gross Profit 571.00
Gross Loss -6092.00
Total Net Profit -5521.00
-100%
-50%
0%
50%
100%
USD/CAD Oct 2024 - Jan 2025
0.00
Total Trades 2
Won Trades 2
Lost trades 0
Win Rate 100.00 %
Expected payoff 1236.75
Gross Profit 2473.50
Gross Loss 0.00
Total Net Profit 2473.50
-100%
-50%
0%
50%
100%
NZD/USD Oct 2024 - Jan 2025
0.00
Total Trades 2
Won Trades 2
Lost trades 0
Win Rate 100.00 %
Expected payoff 1383.50
Gross Profit 2767.00
Gross Loss 0.00
Total Net Profit 2767.00
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
0.00
Total Trades 2
Won Trades 2
Lost trades 0
Win Rate 100.00 %
Expected payoff 2394.50
Gross Profit 4789.00
Gross Loss 0.00
Total Net Profit 4789.00
-100%
-50%
0%
50%
100%
AUD/USD Oct 2024 - Jan 2025
2.98
Total Trades 2
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff 1131.00
Gross Profit 3403.00
Gross Loss -1141.00
Total Net Profit 2262.00
-100%
-50%
0%
50%
100%

Comments