This script is designed to automatically trade on the Forex market using the MetaTrader platform. It looks at the price fluctuations of a currency pair and tries to make profitable trades based on a specific indicator. Here's the breakdown:
-
Initial Setup: The script starts by defining some settings that the user can adjust. These settings include:
- Lots: The amount of currency to trade in each transaction. Think of it as the size of the bet.
- TakeProfit: The amount of profit, in points, the script aims to make on each trade. When the price reaches this level, the trade is automatically closed, securing the profit.
- StopLoss: The maximum amount of loss, in points, the script is willing to accept on each trade. If the price moves against the trade and hits this level, the trade is automatically closed to limit losses.
- Interval: a bar (period) counter to increment order count.
- myCCI: this variable is the period length for the CCI indicator.
-
Checking Conditions Before Trading: Before placing any trades, the script performs some checks:
- Sufficient Funds: It verifies that the trading account has enough available money to cover the potential cost of the trade.
- Sufficient Data: It ensures that there is enough historical price data available to make informed decisions.
- Bar Movement: It determines if the price has moved since the last time the script checked, to avoid redundant calculations.
-
Calculating Profit and Loss Levels: The script calculates the
TakeProfit
andStopLoss
price levels based on the current market price and the user-defined settings. These levels determine when a trade will be automatically closed for profit or to prevent further losses. -
CCI Indicator: The script employs the Commodity Channel Index (CCI) indicator, which is a tool used to identify overbought or oversold conditions in the market. In this code, CCI is used to find crossing points.
-
Making Trading Decisions Based on Indicator Crossings: This is the heart of the script's logic. It looks for points where the CCI crosses above or below zero.
- Rising Cross: When the CCI crosses above zero, it's interpreted as a potential buy signal.
- Falling Cross: When the CCI crosses below zero, it's interpreted as a potential sell signal.
-
Opening and Closing Trades:
- Closing Existing Orders: When a CCI cross occurs, the script first closes any existing open trades for that currency pair.
- Opening New Orders: Based on whether the cross is rising or falling, the script opens a new buy or sell order, respectively. It also sets the
TakeProfit
andStopLoss
levels for the new trade.
-
Pyramiding
- Pyramiding: If the current order is already open, more orders are created after some price intervals. This creates layers of new orders when the trend is already in place.
In essence, this script is a simple automated trading system that uses the CCI indicator to identify potential buying and selling opportunities, automatically opening and closing trades based on pre-defined rules and risk management settings.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| 1MA Expert |
//+------------------------------------------------------------------+
#property copyright "Ron Thompson"
#property link "http://www.lightpatch.com/forex"
// User Input
extern double Lots = 0.1;
extern int TakeProfit=92;
extern int StopLoss=0;
extern int Interval=4;
extern int myCCI=28;
// Global scope
double barmove0 = 0;
double barmove1 = 0;
int itv = 0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//|------------------------------------------------------------------|
int init()
{
itv=Interval;
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
bool found=false;
bool rising=false;
bool falling=false;
bool cross=false;
double slA=0, slB=0, tpA=0, tpB=0;
double p=Point();
double cCI0;
double cCI1;
int cnt=0;
// Error checking
if(AccountFreeMargin()<(1000*Lots)) {Print("-----NO MONEY"); return(0);}
if(Bars<100) {Print("-----NO BARS "); return(0);}
if(barmove0==Open[0] && barmove1==Open[1]) { return(0);}
// bars moved, update current position
barmove0=Open[0];
barmove1=Open[1];
// interval (bar) counter
// used to pyramid orders during trend
itv++;
// since the bar just moved
// calculate TP and SL for (B)id and (A)sk
tpA=Ask+(p*TakeProfit);
slA=Ask-(p*StopLoss);
tpB=Bid-(p*TakeProfit);
slB=Bid+(p*StopLoss);
if (TakeProfit<=0) {tpA=0; tpB=0;}
if (StopLoss<=0) {slA=0; slB=0;}
// get CCI based on OPEN
cCI0=iCCI(Symbol(),0,myCCI,PRICE_OPEN,0);
cCI1=iCCI(Symbol(),0,myCCI,PRICE_OPEN,1);
// is it crossing zero up or down
if (cCI1<=0 && cCI0>=0) { rising=true; cross=true; Print("Rising Cross");}
if (cCI1>=0 && cCI0<=0) {falling=true; cross=true; Print("Falling Cross");}
// close then open orders based on cross
// pyramid below based on itv
if (cross)
{
// Close ALL the open orders
for(cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol())
{
if (OrderType()==0) {OrderClose(OrderTicket(),Lots,Bid,3,White);}
if (OrderType()==1) {OrderClose(OrderTicket(),Lots,Ask,3,Red);}
itv=0;
}
}
// Open new order based on direction of cross
if (rising) OrderSend(Symbol(),OP_BUY,Lots,Ask,3,slA,tpA,"ZZZ100",11123,0,White);
if (falling) OrderSend(Symbol(),OP_SELL,Lots,Bid,3,slB,tpB,"ZZZ100",11321,0,Red);
// clear the interval counter
itv=0;
return(0);
}
// Only pyramid if order already open
found=false;
for(cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol())
{
if (OrderType()==0) //BUY
{
if (itv >= Interval)
{
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,slA,tpA,"ZZZ100",11123,0,White);
itv=0;
}
}
if (OrderType()==1) //SELL
{
if (itv >= Interval)
{
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,slB,tpB,"ZZZ100",11321,0,Red);
itv=0;
}
}
found=true;
break;
}
}
return(0);
}
Comments