This script is designed to automatically trade in the Forex market using the MetaTrader platform. It's based on a strategy that uses a technical indicator called the Commodity Channel Index, or CCI, to identify potential buying and selling opportunities. Here?s a breakdown of how it works:
-
Setup: The script starts by defining some user-adjustable settings. These include the amount of currency to trade per transaction ("Lots"), the profit target ("TakeProfit"), the acceptable loss level ("StopLoss"), and how frequently to add to a position ("Interval").
-
Initialization: When the script starts, it sets the "Interval" variable based on user input.
-
Trading Logic: The core of the script continuously checks for new trading opportunities with each new price movement.
-
Monitoring the CCI: The script watches the CCI, which is calculated based on the market's price. It specifically looks for instances when the CCI crosses the zero line. Crossing above zero is interpreted as a potential buy signal, and crossing below zero is seen as a potential sell signal.
-
Closing Existing Trades: When a CCI crossover occurs, the script first closes any existing trades for the currency pair it is monitoring. It closes all trades to start fresh.
-
Opening New Trades: After closing existing trades, the script opens a new trade based on the direction of the CCI crossover. If the CCI crossed above zero, it opens a buy order. If the CCI crossed below zero, it opens a sell order. These trades are automatically set with a target profit and a stop-loss level, based on the user-defined settings.
-
Adding to Winning Trades (Pyramiding): The script also has a feature to add to existing winning trades. If a trade is already open, it will wait for a specified number of price movements (defined by the "Interval" setting). If the price continues to move in a favorable direction, the script will open another trade in the same direction, thereby increasing the size of the position. It will reset the timer when it opens another trade.
-
-
Risk Management: The script also includes some basic risk management features. It checks if there is enough money in the account to place a trade. If the account has insufficient funds, the script will stop trading and display a message.
/*-----------------------------+
| |
| 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;
// 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,30,PRICE_OPEN,0);
cCI1=iCCI(Symbol(),0,30,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;
}
// 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