AC+AO ea v3

Author: Expert Advisor Builder
Profit factor:
0.58

This script is designed to automatically trade on the Forex market, specifically the EURUSD currency pair based on a set of rules. Here's the breakdown:

  1. Initial Setup:
  • The script begins by setting up some basic parameters that the user can adjust. These include a "magic number" (used to identify trades made by this particular script), whether to send email alerts, the amount of currency to trade per transaction, how much price slippage to tolerate, and whether to use stop-loss, take-profit, and trailing-stop features to manage risk.
  • The script also keeps track of the most recent time it ran. This prevents it from executing the same trading logic multiple times on the same price bar.
  1. Decision-Making Process:
  • The script's main job is to decide when to open or close a trade. It makes these decisions by looking at the values of two technical indicators: the Accelerator Oscillator (AC) and the Awesome Oscillator (AO). These indicators are calculated based on historical price data.
  • Specifically, it compares the current and previous values of these indicators. The core trading strategy relies on comparing the current and past values of the AC and AO indicators to identify potential buying or selling opportunities.
  1. Trading Logic (Entry):
  • Buy Signal: It checks if the current value of the AC indicator is greater than its previous value, if the value of AC indicator 1 bar ago is less than the value of AC indicator 2 bars ago and the current value of the AO indicator is greater than its previous value. If all these conditions are true, the script interprets it as a signal to buy.
  • Sell Signal: Conversely, it checks if the current value of the AC indicator is less than its previous value, if the value of AC indicator 1 bar ago is greater than the value of AC indicator 2 bars ago, and the current value of the AO indicator is less than its previous value. If these conditions are met, the script interprets it as a signal to sell.
  1. Trading Logic (Exit):
  • If the script already has an open "buy" order, it checks for a "close buy" signal: The script look to close when the current value of the AC indicator is less than its previous value and the value of AC indicator 1 bar ago is greater than the value of AC indicator 2 bars ago.
  • Similarly, if it has an open "sell" order, it checks for a "close sell" signal: The script look to close when the current value of the AC indicator is greater than its previous value and the value of AC indicator 1 bar ago is less than the value of AC indicator 2 bars ago.
  1. Order Execution:
  • If a buy or sell signal is triggered, the script checks if there's enough available money in the account to make the trade. If there is, it sends an order to the broker to open a new position. It also sets stop-loss and take-profit levels if those features are enabled.
  • If a "close buy" or "close sell" signal is triggered, the script sends an order to the broker to close the existing position.
  1. Risk Management (Trailing Stop):
  • The script can also implement a trailing stop. If the price moves in a favorable direction after a trade is opened, the stop-loss level is automatically adjusted to lock in profits.
  1. Important Considerations:
  • The script is designed to only execute one trade per bar, ensuring that it doesn't open multiple positions based on the same price movement.
  • The script uses flags (like TickCheck and the check on Bars != BarCount) to prevent the same trading action from being triggered repeatedly within the same price bar. This is especially important when running in "EachTickMode," where the script evaluates the trading logic on every single price update.
  • Email alerts can be sent to notify the user of significant events, such as when a trade is opened or closed.
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
Bill Williams Accelerator/Decelerator oscillatorBill Williams Awesome oscillator
Miscellaneous
It sends emails
4 Views
0 Downloads
0 Favorites
AC+AO ea v3
//+------------------------------------------------------------------+
//| 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.                       |
//|  Changes by Barry Vincent                                        |
//|  8/14/08 AC+AO v1 Fix error in code and the stops and take profit|                                                                |
//|          optimized for the eurusd                                |  
//|          AC+AO v2                                                |
//|  8/14/08 Eben fixed so that it only trades one time per bar.     |
//|                                                                  |
//|  8/28/08 Robert removed extra calls to indicators                |
//|          Changed Use... booleans to ints for backtesting         |
//|                                                                  |
//+------------------- 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 int UseStopLoss = 1;
extern int StopLoss = 150;
extern int UseTakeProfit = 0;
extern int TakeProfit = 300;
extern int UseTrailingStop = 0;
extern int TrailingStop = 55;

static int LASTRUN;
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 ((LASTRUN == Time[0]))
   {
   return(0);                    // It's a no go, no new bar
   }
else
   {
   LASTRUN = Time[0];           // Finally a new bar!! Now execute the rest of the code
   }


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

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

double ac0 = iAC(NULL, 0, Current + 0);
double ac1 = iAC(NULL, 0, Current + 1);
double ac2 = iAC(NULL, 0, Current + 2);
double ao0 = iAO(NULL, 0, Current + 0);
double ao1 = iAO(NULL, 0, Current + 1);


double Buy1_1 = ac0;
double Buy1_2 = ac1;
double Buy2_1 = ac1;
double Buy2_2 = ac2;
double Buy3_1 = ao0;
double Buy3_2 = ao1;

double Sell1_1 = ac0;
double Sell1_2 = ac1;
double Sell2_1 = ac1;
double Sell2_2 = ac2;
double Sell3_1 = ao0;
double Sell3_2 = ao1;

double CloseBuy1_1 = ac0;
double CloseBuy1_2 = ac1;
double CloseBuy2_1 = ac1;
double CloseBuy2_2 = ac2;

double CloseSell1_1 = ac0;
double CloseSell1_2 = ac1;
double CloseSell2_1 = ac1;
double CloseSell2_2 = ac2;

   
   //+------------------------------------------------------------------+
   //| 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 == 1 && 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 == 1) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit == 1) 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 == 1) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit == 1) 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

USD/CHF Oct 2024 - Jan 2025
0.00
Total Trades 0
Won Trades 0
Lost trades 0
Win Rate 0.0 %
Expected payoff 0.00
Gross Profit 0.00
Gross Loss 0.00
Total Net Profit 0.00
-100%
-50%
0%
50%
100%
USD/CAD Oct 2024 - Jan 2025
0.73
Total Trades 124
Won Trades 40
Lost trades 84
Win Rate 32.26 %
Expected payoff -13.52
Gross Profit 4506.37
Gross Loss -6182.65
Total Net Profit -1676.28
-100%
-50%
0%
50%
100%
NZD/USD Oct 2024 - Jan 2025
0.58
Total Trades 103
Won Trades 32
Lost trades 71
Win Rate 31.07 %
Expected payoff -28.86
Gross Profit 4134.00
Gross Loss -7107.00
Total Net Profit -2973.00
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
1.00
Total Trades 108
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff -0.11
Gross Profit 7422.00
Gross Loss -7434.00
Total Net Profit -12.00
-100%
-50%
0%
50%
100%

Comments