This script is designed to automatically trade on the Forex market using the MetaTrader platform. It operates by analyzing price charts and predefined indicators to identify potential buying and selling opportunities.
Here's a breakdown of the script's logic:
-
Initialization:
- When the script starts, it sets up some initial values. It checks how many bars (periods of time) are currently displayed on the chart. It also determines whether it should analyze every price change ("tick") or only when a new bar forms.
-
Main Loop:
- The script continuously runs through a loop, checking for trading signals. In each cycle, it first determines the current trading signal (buy, sell, or none). It also counts the number of currently open trades.
-
Indicator Values:
- The script calculates the values of several technical indicators. These indicators use historical price data to find patterns and trends. The indicators used are:
- PSAR (Parabolic SAR): Helps identify potential trend reversals.
- AC (Accelerator Oscillator): Measures the acceleration and deceleration of the current price.
- AO (Awesome Oscillator): Gauges market momentum.
- RWI (Relative Volatility Index): Measures the range of price movement.
- It also calculates the middle price of the current and previous bars.
- The script calculates the values of several technical indicators. These indicators use historical price data to find patterns and trends. The indicators used are:
-
Managing Existing Trades:
-
The script then checks if any trades are already open. If so, it verifies if those trades match the criteria (currency pair, "magic number" to identify trades managed by this script). If a trade is found that matches, it checks whether to close the position.
-
Closing a Buy Order: The script examines conditions based on the indicator values. If the PSAR indicator suggests a downward trend, the RWI indicates sufficient volatility, and the AC and AO indicators also align to a downtrend, the script generates a "close buy" signal. This closes the existing buy trade.
-
Closing a Sell Order: Similarly, the script analyzes conditions for sell orders. If the PSAR suggests an upward trend, the RWI indicates sufficient volatility, and the AC and AO indicators also align to an uptrend, the script creates a "close sell" signal. This closes the existing sell trade.
-
Moving Stop Loss (Trailing Stop): The script also contains features to manage risk:
- MoveOnce: It can move the stop-loss order (an order to automatically close a trade if the price moves against you) to a more favorable level once the price has moved a certain distance in your favor.
- Trailing Stop: It can automatically adjust the stop-loss order as the price moves in your favor, locking in profits.
-
-
Generating New Trade Signals:
-
If there are no open positions or if it's time to open a new one, the script evaluates the indicator values to find new trading opportunities.
-
Buy Signal: A buy signal is generated when the PSAR indicator suggests an upward trend, RWI indicates sufficient volatility, and the AC and AO indicators align to an uptrend.
-
Sell Signal: A sell signal is generated when the PSAR indicator suggests a downward trend, the RWI indicates sufficient volatility, and the AC and AO indicators align to a downtrend.
-
-
Opening New Trades:
- If a buy or sell signal is triggered, the script checks if there is sufficient funds in the account.
- If there is, it sends an order to the broker to open a new trade. It can also automatically set a stop-loss and take-profit level (an order to automatically close a trade when it reaches a predetermined profit target).
- If the order is successfully placed, the script sends an email alert (if enabled).
-
Repetition:
- The script then repeats the loop, continuously monitoring the market and managing trades.
In summary, this script automates Forex trading based on technical indicators. It analyzes price data, generates buy and sell signals, manages existing trades, and implements risk management strategies such as stop-loss orders and trailing stops. The script continuously runs and adjusts its actions based on changing market conditions.
//+------------------------------------------------------------------+
#define SIGNAL_NONE 0
#define SIGNAL_BUY 1
#define SIGNAL_SELL 2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4
#property copyright "Ronald Raygun"
extern string Remark1 = "== Main Settings ==";
extern int MagicNumber = 0;
extern bool SignalMail = False;
extern bool EachTickMode = True;
extern double Lots = 0.1;
extern int Slippage = 5;
extern bool UseStopLoss = True;
extern int StopLoss = 100;
extern bool UseTakeProfit = False;
extern int TakeProfit = 60;
extern bool UseTrailingStop = False;
extern int TrailingStop = 30;
extern bool MoveStopOnce = False;
extern int MoveStopWhenPrice = 50;
extern int MoveStopTo = 1;
extern bool CloseOnOppositeSignal = True;
extern double Rwi_Level = 2.5;
//Version 2.01
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 PSAR = iSAR(NULL, 0, 0.02, 0.2, Current + 0);
double PSAR1 = iSAR(NULL, 0, 0.02, 0.2, Current + 1);
double AC1 = iAC(NULL, 0, Current + 0);
double AC2 = iAC(NULL, 0, Current + 1);
double AC3 = iAC(NULL, 0, Current + 2);
double AO1 = iAO(NULL, 0, Current + 0);
double AO2 = iAO(NULL, 0, Current + 1);
double AO3 = iAO(NULL, 0, Current + 2);
double Middle = (Open[0] + Close[0])/2;
double Middle1 = (Open[1] + Close[1])/2;
double RWI_long_array = iCustom(NULL, 0, "RWI", 0, Current + 0);
double RWI_short_array = iCustom(NULL, 0, "RWI", 1, 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() && OrderMagicNumber() == MagicNumber)
{
IsTrade = True;
if(OrderType() == OP_BUY)
{
//Close
//+------------------------------------------------------------------+
//| Signal Begin(Exit Buy) |
//+------------------------------------------------------------------+
if (PSAR1 < Middle1 && PSAR > Middle && RWI_short_array >= Rwi_Level &&
( ( (AC1 < AC2 && AC2 > AC1) || (AO1 < AO2 && AO2 > AO3) ) &&
((AC1 < AC2) || (AO1 < AO2))) &&
CloseOnOppositeSignal == True) 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;
}
//MoveOnce
if (MoveStopOnce && MoveStopWhenPrice > 0)
{
if (Bid - OrderOpenPrice() >= Point * MoveStopWhenPrice)
{
if (OrderStopLoss() < OrderOpenPrice() + Point * MoveStopTo)
{
OrderModify(OrderTicket(),OrderOpenPrice(),
OrderOpenPrice() + Point * MoveStopTo,
OrderTakeProfit(), 0, Red);
if (!EachTickMode) BarCount = Bars;
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 (PSAR1 > Middle1 && PSAR < Middle && RWI_long_array >= Rwi_Level &&
( ( (AC1 > AC2 && AC2 < AC1) || (AO1 > AO2 && AO2 < AO3) ) &&
((AC1 > AC2) || (AO1 > AO2))) &&
CloseOnOppositeSignal == True) 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;
}
//MoveOnce
if (MoveStopOnce && MoveStopWhenPrice > 0)
{
if (OrderOpenPrice() - Ask >= Point * MoveStopWhenPrice)
{
if (OrderStopLoss() > OrderOpenPrice() - Point * MoveStopTo)
{
OrderModify(OrderTicket(),OrderOpenPrice(),
OrderOpenPrice() - Point * MoveStopTo,
OrderTakeProfit(), 0, Red);
if (!EachTickMode) BarCount = Bars;
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 (PSAR1 > Middle1 && PSAR < Middle && RWI_long_array >= Rwi_Level &&
( ( (AC1 > AC2 && AC2 < AC1) || (AO1 > AO2 && AO2 < AO3) ) &&
((AC1 > AC2) || (AO1 > AO2))) ) Order = SIGNAL_BUY;
if (PSAR1 < Middle1 && PSAR > Middle && RWI_short_array >= Rwi_Level &&
( ( (AC1 < AC2 && AC2 > AC1) || (AO1 < AO2 && AO2 > AO3) ) &&
((AC1 < AC2) || (AO1 < AO2))) ) 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);
}
Comments