Here's a breakdown of how this trading script works, explained in a way that's easy to understand without needing technical programming knowledge.
Overall Goal
This script is designed to automatically open, manage, and close trading positions (buying or selling) based on a specific set of rules and indicators. It's like having a robot trader that follows a pre-defined strategy.
Initial Setup (the "extern" variables)
Before the script starts making decisions, it needs some basic information. These "extern" variables act like settings that you, the user, can adjust:
- Lots: This determines the size of each trade. Think of it as the amount of currency you're willing to risk on a single trade.
- TakeProfit: This is the profit level at which the script will automatically close a winning trade. It's a target for how much profit you want to make.
- TrailingStop: This is a clever tool that automatically adjusts the stop-loss order (see below) as the price moves in your favor. It helps to lock in profits.
- StopLoss: This is the maximum amount you're willing to lose on a trade. If the price moves against you and hits this level, the script will automatically close the trade to prevent further losses.
- Slippage: This allows a little bit of flexibility in the price at which a trade is executed. Sometimes the market moves so fast that the price changes slightly between when you place the order and when it's filled.
- MaximumRisk: If "UseMM" is set to true, this defines the maximum percentage of your account balance that the script will risk on any single trade. This helps manage overall risk.
- StartTrading/EndTrading: These set the hours of the day during which the script is allowed to trade.
- UseMM: If set to "true", the script will use money management, dynamically adjusting the "Lots" size based on your account balance and the "MaximumRisk" setting.
- MagicNumber: A unique identifier for the script's trades, preventing it from interfering with trades opened manually or by other scripts.
- ExpertComment: This is simply a comment that will be attached to each trade opened by the script, for identification purposes.
The Trading Logic
-
Time Check: The script first checks if the current time is within the specified trading hours (StartTrading and EndTrading). If not, it closes any open positions and does nothing.
-
Indicator Calculations: The script uses a combination of technical indicators to analyze the market. These indicators provide clues about potential price movements. Specifically, it uses:
- Moving Averages (MA): These smooth out price data to identify trends.
- Stochastic Oscillator: This measures the momentum of price, helping to identify overbought and oversold conditions.
- MACD (Moving Average Convergence Divergence): This indicator helps identify changes in the strength, direction, momentum, and duration of a trend in a stock's price.
- Parabolic SAR (SAR): This places dots on the chart and if the dots are below price, it indicates an uptrend and if the dots are above price, it indicates a downtrend.
-
Buy/Sell Conditions: Based on the values of these indicators, the script determines whether to buy, sell, or close existing positions.
- It looks for specific patterns or "signals" in the indicator values to decide if the price is likely to go up (buy) or down (sell).
- It also checks for conditions that suggest an existing trade should be closed, either to take profits or limit losses.
-
Order Management:
- Opening Orders: If the script detects a buy or sell signal and there are no open orders for the current symbol, it sends an order to the broker to open a new trade. It retries a few times if the order fails initially (due to market conditions).
- Closing Orders: If the script detects a condition to close an existing trade, it sends an order to the broker to close the trade.
- Trailing Stop: This is a dynamic stop-loss order. As the price moves in a favorable direction (profit), the stop-loss level is automatically adjusted to lock in profits.
-
Money Management (Optional): If the
UseMM
setting is enabled, the script calculates the appropriate trade size (Lots
) based on the account balance and theMaximumRisk
setting. This helps to control the amount of capital at risk on each trade.
In Plain Language
Imagine this script as a weather forecaster and a farmer working together. The indicators are like the weather forecast ? they give the script an idea of which way the "price winds" are blowing. Based on this forecast, the script (the farmer) decides whether to plant a seed (open a trade ? buy or sell) or harvest a crop (close a trade). The stop-loss is like an insurance policy ? it protects the farmer (you) in case of a sudden storm (unexpected price movement). The trailing stop is like a way to move the harvest (take profit) closer as the crop grows (price moves in your favor), ensuring a good yield.
//---- Trades limits
extern double Lots = 1;
extern double TakeProfit = 1500;
extern double TrailingStop = 2000;
extern double StopLoss = 200;
extern int Slippage = 5;
extern double MaximumRisk = 0.3;
extern int StartTrading = 0;
extern int EndTrading = 24;
extern bool UseMM=false;
//--- Global variables
extern int MagicNumber = 655321;
string ExpertComment = "SMARTASS";
int NumberOfTries = 5;
//+------------------------------------------------------------------
int init()
{
return(0);
}
int deinit()
{
return(0);
}
//+------------------------------------------------------------------
bool isNewSymbol(string current_symbol)
{
//loop through all the opened order and compare the symbols
int total = OrdersTotal();
for(int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
string selected_symbol = OrderSymbol();
if (current_symbol == selected_symbol && OrderMagicNumber()==MagicNumber)
return (False);
}
return (True);
}
//+------------------------------------------------------------------+
int start()
{
if (Hour()< StartTrading || Hour()>(EndTrading-1))
{
CloseOrder(OP_BUY);
CloseOrder(OP_SELL);
return(0);
}
int cnt, ticket, total,n,trend;
bool up1,up2,down1,down2,up3,down3;
bool BuyCondition = false , SellCondition = false , CloseBuyCondition = false , CloseSellCondition = false ;
double signal,signal1,signal2;
if(Bars<50) {Print("bars less than 50"); return(0);}
//Symbo settings:
RefreshRates();
Slippage = MarketInfo(Symbol(),MODE_SPREAD);
double ma1=iMA(NULL,0,5,0,MODE_EMA,PRICE_TYPICAL,1);
double ma2=iMA(NULL,0,12,0,MODE_EMA,PRICE_TYPICAL,1);
double ma1last=iMA(NULL,0,5,0,MODE_EMA,PRICE_TYPICAL,2);
double ma2last=iMA(NULL,0,12,0,MODE_EMA,PRICE_TYPICAL,2);
double stoch_main = iStochastic(NULL,0,20,6,16,MODE_EMA,0,MODE_MAIN,1);
double stoch_sig = iStochastic(NULL,0,20,6,16,MODE_EMA,0,MODE_SIGNAL,1);
double stoch_main1 = iStochastic(NULL,0,20,6,16,MODE_EMA,0,MODE_MAIN,2);
double stoch_sig1 = iStochastic(NULL,0,20,6,16,MODE_EMA,0,MODE_SIGNAL,2);
double macd_main=iMACD(NULL,0,13,21,8,PRICE_CLOSE,MODE_MAIN,1);
double macd_sig=iMACD(NULL,0,13,21,8,PRICE_CLOSE,MODE_SIGNAL,1);
double macd_main1=iMACD(NULL,0,13,21,8,PRICE_CLOSE,MODE_MAIN,2);
double macd_sig1=iMACD(NULL,0,13,21,8,PRICE_CLOSE,MODE_SIGNAL,2);
double sar1=iSAR(NULL,0,0.0026,0.5,1);
double sar2=iSAR(NULL,0,0.0026,0.5,2);
if ((stoch_main>stoch_sig && macd_main>macd_sig)) up1=true; else up1=false;
if ((stoch_main<stoch_sig && macd_main<macd_sig)) down1=true; else down1=false;
if ((stoch_main1>stoch_sig1 && macd_main1>macd_sig1)) up2=true; else up2=false;
if ((stoch_main1<stoch_sig1 && macd_main1<macd_sig1)) down2=true; else down2=false;
static int arrow;
if ((up1==true && up2!=true))
{signal=1;}
else if ((down1==true && down2!=true))
{signal=-1;}
if ((up2==true && up1!=true)) CloseBuyCondition=true;
if (down2==true && down1!=true) CloseSellCondition=true;
//Print(signal);
//--- Trading conditions
/* bool BuyCondition = false , SellCondition = false , CloseBuyCondition = false , CloseSellCondition = false ; */
if (signal==1)
BuyCondition = true;
if (signal==-1)
SellCondition = true;
if (BuyCondition)
CloseSellCondition = true;
if (SellCondition)
CloseBuyCondition = true;
total = OrdersTotal();
if (UseMM)
Lots=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
if(total < 1 || isNewSymbol(Symbol()))
{
if(BuyCondition) //<-- BUY condition
{
ticket = OpenOrder(OP_BUY); //<-- Open BUY order
return(0);
}
if(SellCondition) //<-- SELL condition
{
ticket = OpenOrder(OP_SELL); //<-- Open SELL order
return(0);
}
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) //<-- Long position is opened
{
if(CloseBuyCondition) //<-- Close the order and exit!
{
CloseOrder(OrderType());
}
TrailOrder(OrderType()); //<-- Trailling the order
}
if(OrderType()==OP_SELL) //<-- Go to short position
{
if(CloseSellCondition) //<-- Close the order and exit!
{
CloseOrder(OP_SELL);
}
TrailOrder(OrderType()); //<-- Trailling the order
}
}
}
return(0);
}
//+------------------------------------------------------------------+
int OpenOrder(int type)
{
int ticket=0;
int err=0;
int c = 0;
if(type==OP_BUY)
{
for(c = 0 ; c < NumberOfTries ; c++)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,Ask-StopLoss*Point,Ask+TakeProfit*Point,ExpertComment,MagicNumber,0,Green);
err=GetLastError();
if(err==0)
{
break;
}
else
{
if(err==4 || err==137 ||err==146 || err==136) //Busy errors
{
Sleep(5000);
continue;
}
else //normal error
{
break;
}
}
}
}
if(type==OP_SELL)
{
for(c = 0 ; c < NumberOfTries ; c++)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,Bid+StopLoss*Point,Bid-TakeProfit*Point,ExpertComment,MagicNumber,0,Red);
err=GetLastError();
if(err==0)
{
break;
}
else
{
if(err==4 || err==137 ||err==146 || err==136) //Busy errors
{
Sleep(5000);
continue;
}
else //normal error
{
break;
}
}
}
}
return(ticket);
}
bool CloseOrder(int type)
{
if(OrderMagicNumber() == MagicNumber)
{
if(type==OP_BUY)
return (OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet));
if(type==OP_SELL)
return (OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Violet));
}
}
void TrailOrder(int type)
{
if(TrailingStop>0)
{
if(OrderMagicNumber() == MagicNumber)
{
if(type==OP_BUY)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
}
}
}
if(type==OP_SELL)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
}
}
}
}
}
}
Comments