This script is designed to automatically trade in the Forex market, aiming to profit from price movements. Here's a breakdown of its logic:
-
Initial Setup:
- The script starts by defining some basic information, like the author and a website.
- It also sets up a user-adjustable setting for the trade size ("Lots").
-
Checking for Readiness:
- Before doing anything, the script makes sure it has enough money in the account to place trades of the specified size. If not, it stops.
- It also checks if enough price data (called "bars") is available. If not, it stops.
- It keeps track of recent price changes and pauses if the price hasn't moved to avoid unnecessary calculations.
-
Calculating Key Price Levels:
- The script calculates potential profit targets ("TakeProfit") and stop-loss levels ("StopLoss") based on the current market prices. These values are configured as user inputs, representing the desired amount of profit or maximum loss for each trade. If the user inputs 0 for those parameters, the calculations are omitted.
-
Identifying Market Trends:
- The script uses moving averages of the OPEN price to identify potential trend changes.
-
Making Trading Decisions:
- The core of the script revolves around identifying "crosses". When the moving average indicates a shift in the market's direction (upwards or downwards), the script takes action.
- If the moving average crosses upwards, it's seen as a potential buy signal.
- If the moving average crosses downwards, it's seen as a potential sell signal.
- The core of the script revolves around identifying "crosses". When the moving average indicates a shift in the market's direction (upwards or downwards), the script takes action.
-
Managing Existing Trades:
- When a "cross" is detected, the script first closes any existing trades it has open for the same currency pair.
- Then, based on whether the "cross" was upwards or downwards, it opens a new trade (either buying or selling).
-
Adding to Winning Trades (Pyramiding):
- If the script already has an open trade and the market continues to move in the same direction, the script can add additional trades ("pyramiding"). This is done at set intervals (controlled by a variable called "Interval"). This can increase potential profits but also increases risk.
-
Repeating the Process:
- The script continuously runs, constantly monitoring the market and repeating the checks and actions described above.
/*-----------------------------+
| |
| 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;
// 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 ma5, ma10, ma15, dineg, dipos;
double slA=0, slB=0, tpA=0, tpB=0;
double p=Point();
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
ma5=iMA(Symbol(),0, 5,0,MODE_LWMA,PRICE_OPEN,0);
ma10=iMA(Symbol(),0, 5,0,MODE_LWMA,PRICE_OPEN,0);
ma15=iMA(Symbol(),0, 5,0,MODE_LWMA,PRICE_OPEN,0);
// 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=OrdersTotal();cnt>0;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=OrdersTotal();cnt>0;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