Here's a breakdown of what this MetaTrader script does, explained in plain language:
This script is designed to automatically place buy and sell orders in the Forex market based on a simple strategy. Think of it as a robot trader that follows a set of rules.
1. Initial Setup and Checks:
- Account Verification: First, it checks if it's running on a demo account or a real (live) account. If it's a real account, it verifies if the account number you've entered matches the actual account number. This is a safety measure. If they don't match, the script stops.
- Environment Check: The script checks if trading is allowed. It makes sure there are enough data points available (at least 100 bars). It also checks if the take profit settings are valid.
- Margin Check: The script assesses your account's free margin (available money). If you don't have enough free margin to place trades based on the lot size you've selected, the script will stop and display a message.
2. Trading Logic:
- Moving Averages: The core of the strategy involves two "moving averages." A moving average is like a line that smooths out price data over a specific period, helping to identify trends. The script uses a special kind of moving average called an "EMA" (Exponential Moving Average). The script calculates an EMA of the open price for the past 5 periods and compares it with the current close price of the asset. If the current price is above or below the EMA, the script is ready to enter an operation.
- Buy/Sell Signals:
- The script looks at how the current price compares to a moving average. If the price is below the moving average, it considers this a potential "sell" signal (because prices may fall). Conversely, if the price is above the moving average, it sees it as a potential "buy" signal (because prices may rise).
- There's a setting called "reverseLogic."
- If
reverseLogicis set to "true," the script reverses the buy/sell signals. So, if the price is below the moving average, it would buy instead of sell. - If
reverseLogicis set to "false," the script follows the normal buy/sell signals.
- If
- Order Placement: Based on these signals (and whether
reverseLogicis on or off), the script places a buy or sell order. - Order Limits:
- The script checks if it's already reached the maximum number of allowed open orders across all currency pairs, or if it already has reached the maximum number of orders on a specific currency pair. If it has, it waits until an existing order closes before opening a new one.
3. Order Parameters:
- Lot Size: The script uses a pre-defined "lot size" which is the amount of currency you are buying or selling.
- Stop Loss: It sets a "stop loss" level for each order. This is a price point at which the order will automatically close if the market moves against you, limiting your potential losses.
- Take Profit: It also sets a "take profit" level. This is a price point at which the order will automatically close if the market moves in your favor, securing your profits.
- Slippage: This setting determines how much the price can move before the order is rejected.
- Magic Number: It uses a "magic number" to identify orders placed by this particular script, which can be useful for managing and tracking trades.
4. Additional Features:
- Sound Alert: The script can optionally play a sound alert when it opens a trade.
- Comments: It adds comments to the trade that help you identify it.
In Summary:
This script automates Forex trading based on a basic moving average strategy. It monitors market conditions, generates buy/sell signals, and places orders according to pre-defined rules and parameters.
//+------------------------------------------------------------------+
//| es_capelast_reversed_ECN_v1.01.mq4 |
//| Copyright © 2009, OGUZ BAYRAM |
//| es_cape77@hotmail.com |
//+------------------------------------------------------------------+
extern int YourAccountNumber = 123456;
extern double lTakeProfit = 10.0;
extern double sTakeProfit = 10.0;
extern double lStopLoss = 2000.0;
extern double sStopLoss = 2000.0;
extern int max_num_orders = 50;
extern int max_orders_per_symbol = 10;
extern color clOpenBuy = Green;
extern color clOpenSell = Red;
extern string Name_Expert = "es_capelast_reversed_ECN_v1";
extern int magic_number = 789667;
extern int Slippage = 1;
extern bool UseSound = FALSE;
extern string NameFileSound = "Alert.wav";
extern double Lots = 0.1;
extern bool reverseLogic = true;
int gi_ticket_number;
double gd_point;
double gd_digit;
bool gi_accountVerified = FALSE;
int init(){
if (IsDemo() == TRUE){
gi_accountVerified = TRUE;
Comment(Name_Expert + " trading on DEMO account");
}
else { //real trading Account
gi_accountVerified = CheckAccountNumber();
if (gi_accountVerified == FALSE) return (0);
Comment(Name_Expert + " trading on LIVE account");
}
gd_point = SetPoint();
gd_digit = SetDigit();
}
void deinit() {
Comment("");
}
int start() {
if (IsTradeAllowed() == FALSE) return (0);
if (Bars < 100) {
Print("bars less than 100");
return (0);
}
if (lTakeProfit < 1.0) {
Print("TakeProfit less than 1");
return (0);
}
if (sTakeProfit < 1.0) {
Print("TakeProfit less than 1");
return (0);
}
double diClose0 = iClose(NULL, PERIOD_M5, 0);
double diMA1 = iMA(NULL, PERIOD_M5, 5, 0, MODE_EMA, PRICE_OPEN, 1);
double diClose2 = iClose(NULL, PERIOD_M5, 0);
double diMA3 = iMA(NULL, PERIOD_M5, 4, 0, MODE_EMA, PRICE_OPEN, 1);
if (AccountFreeMargin() < 1000.0 * Lots) {
Print("We have no money. Free Margin = ", AccountFreeMargin());
return (0);
}
if (!ExistPositions()) {
if (diClose0 < diMA1) {
if (reverseLogic) OpenSell();
else OpenBuy();
return (0);
}
if (diClose2 > diMA3) {
if (reverseLogic) OpenBuy();
else OpenSell();
return (0);
}
}
return (0);
}
//Wait to exit positions if all order slots are full
bool ExistPositions() {
if ((OrdersTotal() >= max_num_orders ) || (OrderCount() >= max_orders_per_symbol))
return (TRUE);
else
return (FALSE);
}
//Count orders on current chart symbol
int OrderCount () {
int count=0;
for (int j=0; j<OrdersTotal(); j++) {
if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol() == Symbol()) count++;
}
return (count);
}
void OpenBuy() {
double ldLot = GetSizeLot();
double ldStop = GetStopLossBuy();
double ldTake = GetTakeProfitBuy();
string lsComm = GetCommentForOrder();
gi_ticket_number = OrderSend(Symbol(), OP_BUY, ldLot, Ask, Slippage, 0, 0, Name_Expert, magic_number, 0, clOpenBuy);
OrderSelect(gi_ticket_number, SELECT_BY_TICKET);
OrderModify(OrderTicket(), OrderOpenPrice(), ldStop, ldTake, 0, Blue);
if (UseSound) PlaySound(NameFileSound);
}
void OpenSell() {
double ldLot = GetSizeLot();
double ldStop = GetStopLossSell();
double ldTake = GetTakeProfitSell();
string lsComm = GetCommentForOrder();
gi_ticket_number = OrderSend(Symbol(), OP_SELL, ldLot, Bid, Slippage, 0, 0, Name_Expert, magic_number, 0, clOpenSell);
OrderSelect(gi_ticket_number, SELECT_BY_TICKET);
OrderModify(OrderTicket(), OrderOpenPrice(), ldStop, ldTake, 0, Red);
if (UseSound) PlaySound(NameFileSound);
}
string GetCommentForOrder() {
return (Name_Expert);
}
double GetSizeLot() {
return (Lots);
}
double SetPoint() {
double ld_point;
if (Digits < 4) ld_point = 0.01;
else ld_point = 0.0001;
return (ld_point);
}
double SetDigit() {
double ld_digit;
if (Digits < 4) ld_digit = 2;
else ld_digit = 4;
return (ld_digit);
}
double GetTakeProfitBuy() {
return (Ask + lTakeProfit * gd_point);
}
double GetTakeProfitSell() {
return (Bid - sTakeProfit * gd_point);
}
double GetStopLossBuy() {
return (Bid - lStopLoss * gd_point);
}
double GetStopLossSell() {
return (Ask + sStopLoss * gd_point);
}
bool CheckAccountNumber() {
if (YourAccountNumber == AccountNumber()) return (TRUE);
Alert("AccountNumber entered is incorrect.\n You entered ", YourAccountNumber);
return (FALSE);
}
Comments