Okay, here's a breakdown of what this trading script does, explained in a way that avoids technical jargon and is easy for someone without programming knowledge to understand.
Overall Purpose:
This script is designed to automatically place buy and sell orders on a specific currency pair in the MetaTrader platform. It attempts to identify potential trading opportunities based on a couple of simple moving average calculations. The script also includes basic risk management features like stop-loss and take-profit levels.
Here's a Step-by-Step Explanation:
-
Setup and Configuration:
- External Variables: The script starts by defining several settings that you can adjust. These include:
- Your account number (to ensure it's trading on the correct account).
- Take-profit levels (how much profit to aim for on each trade).
- Stop-loss levels (how much loss to tolerate before exiting a trade).
- Maximum number of total orders and orders per symbol at once.
- Lot size (the amount of currency to trade in each order).
- Colors for visualizing trades on the chart.
- A "magic number" (a unique identifier for orders placed by this script).
- Slippage: The acceptable price variation for order execution.
- Reverse logic: a setting to inverse buy and sell.
- Sound alerts: to notify when an order is opened.
- External Variables: The script starts by defining several settings that you can adjust. These include:
-
Initialization (One-Time Setup):
- The
init()function runs when the script is first loaded. It does a few things:- Checks if you're trading on a demo account. If so, it flags that the account is verified.
- Verifies the account number to ensure the script is attached to the intended trading account.
- Calculates the "point size" (smallest price increment) and the number of decimal places for the current currency pair.
- The
-
The Main Loop (Start Function):
- The
start()function runs repeatedly, constantly checking for trading opportunities. Here's what it does in each cycle:- Checks Trading Status: First, it ensures that automated trading is enabled and that it has enough historical price data.
- Basic Checks: Verifies enough money in the account and also the settings, like minimum values for Take Profit.
- Calculates Moving Averages:
- It calculates two simple moving averages (MAs) of the opening price over a specific period (5 periods and 4 periods) on a 5-minute timeframe. Moving averages smooth out price fluctuations, making it easier to identify trends.
- Checks for Open Positions:
- The script checks if the maximum number of allowed orders has already been reached. If so, it does nothing and waits for existing trades to close.
- Trading Logic (Buy/Sell Signals):
- The "Heart" of the Script: The script uses these moving averages to generate buy or sell signals.
- If the current closing price is less than the 5-period MA, it considers this a potential sell signal.
- If the current closing price is greater than the 4-period MA, it considers this a potential buy signal.
- If the
reverseLogicsetting is enabled, then the opposite happens: the first rule generates a buy signal, and the second rule generates a sell signal.
- Placing Orders:
- If a buy or sell signal is triggered, the script calculates the appropriate lot size, stop-loss level, and take-profit level based on your settings.
- It then sends an order to the broker to open a new position.
- If the order is placed successfully, it modifies the order to add the stop-loss and take-profit levels, protecting against excessive losses and automatically taking profits at the desired level.
- Sound Alert: If enabled, it plays a sound to notify the user when an order is opened.
- The
-
Helper Functions:
- The script uses several "helper" functions to make the main logic easier to read and manage. These functions include:
ExistPositions(): Checks if the maximum number of allowed orders has been reached.OrderCount(): Counts the number of orders for the current currency pair.OpenBuy(): Opens a buy order.OpenSell(): Opens a sell order.GetCommentForOrder(): Returns a comment to identify orders from this script.GetSizeLot(): Determines the lot size.SetPoint(): Determines the point size for the pair.SetDigit(): Determines the number of decimal places for the pair.GetTakeProfitBuy(): Calculates the take-profit level for a buy order.GetTakeProfitSell(): Calculates the take-profit level for a sell order.GetStopLossBuy(): Calculates the stop-loss level for a buy order.GetStopLossSell(): Calculates the stop-loss level for a sell order.CheckAccountNumber(): Checks if the account number is correct.
- The script uses several "helper" functions to make the main logic easier to read and manage. These functions include:
In Simple Terms:
Imagine this script as a robot that watches the price movements of a currency pair. It looks at two different moving averages to get a sense of the trend. If the current price crosses these moving averages in a specific way, the robot will either place a buy order (betting the price will go up) or a sell order (betting the price will go down). The robot also sets a stop-loss to limit potential losses and a take-profit to automatically close the trade when a certain profit is reached. The "reverse logic" setting makes the robot do the opposite of what it would normally do.
Important Notes:
- Risk: This script, like all automated trading systems, involves risk. It's crucial to understand the settings and test the script thoroughly on a demo account before using it with real money.
- Strategy: The trading strategy used in this script is very basic. It relies on simple moving averages, which may not be effective in all market conditions.
- Customization: The script allows for a decent amount of customization, which is useful to adapt the settings to your personal trading preferences and risk tolerance.
- No Guarantee: This explanation is for informational purposes only. There is no guarantee that this script will generate profits.
//+------------------------------------------------------------------+
//| es_capelast_reversed_ECN_v1.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");
}
if (gi_accountVerified == FALSE) gi_accountVerified = CheckAccountNumber();
if (gi_accountVerified == TRUE) {
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