10hrCross

extern double Lots=10.0; // lots to trade (fractional values ok)
extern int Trigger=22; // pips above crossover to trigger order
extern int Slippage=3; // pips slippage allowed
extern int TrailingStop=70; // pips to trail both orders
extern int TakeProfit1=210; // pips take profit order #1
extern int TakeProfit2=320; // pips take profit order #2
extern int MA1Period=1; // EMA(1) acts as trigger line to gauge
immediate price action
extern int MA1Shift=0; // Shift
extern int MA1Method=MODE_EMA; // Mode
extern int MA1Price=PRICE_CLOSE; // Method
extern int MA2Period=10; // SMA(10) acts as base line
extern int MA2Shift=2; // Shift
extern int MA2Method=MODE_SMA; // Mode
extern int MA2Price=PRICE_CLOSE; // Method
bool flag_check=true; // flag to gauge order status
int magic1=1234; // order #1's magic number
int magic2=4321; // order #2's magic number
datetime lasttime=0; // stores current bar's time to trigger MA
calculation
datetime crosstime=0; // stores most recent crossover time
double crossprice; // stores price at crossover, calculate 4
point average
double fast1; // stores MA values up to 3 completed bars
ago
double fast2; // fast = current price action,
approximated by EMA(1)
double fast3; // slow = base line, SMA(10)
double slow1;
double slow2;
double slow3;
int init()
{
// hello world
return(0);
}
int deinit()
{
// goodbye world
return(0);
}
//===========================================================================================
//===========================================================================================
int start() // main cycle
{
OrderStatus(); // Check order status
if(flag_check)
CheckTrigger(); // Trigger order execution
else
MonitorOrders(); // Monitor open orders
}
//===========================================================================================
//===========================================================================================
void OrderStatus() // Check order status
{
int trade; // dummy variable to cycle through trades
int trades=OrdersTotal(); // total number of pending/open orders
flag_check=true; // first assume we have no open/pending orders
for(trade=0;trade<trades;trade++)
{
OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&(OrderMagicNumber()==magic1||OrderMagicNumber()==magic2))
flag_check=false; // deselect flag_check if there are open/pending
orders for this pair
}
return(0);
}
//===========================================================================================
//===========================================================================================
void CheckTrigger() // Trigger order execution
{
double triggerprice; // price to trigger order execution
double StopLoss; // stop-loss price
bool flag; // flag to indicate whether to go long or go
short
if(lasttime==Time[0]) // only need to calculate MA values at the start
of each bar
{
//Calculate Indicators
// up to 3 completed bars ago:
fast1=iMA(NULL,0,MA1Period,MA1Shift,MA1Method,MA1Price,1);
fast2=iMA(NULL,0,MA1Period,MA1Shift,MA1Method,MA1Price,2);
fast3=iMA(NULL,0,MA1Period,MA1Shift,MA1Method,MA1Price,3);
slow1=iMA(NULL,0,MA2Period,MA2Shift,MA2Method,MA2Price,1);
slow2=iMA(NULL,0,MA2Period,MA2Shift,MA2Method,MA2Price,2);
slow3=iMA(NULL,0,MA2Period,MA2Shift,MA2Method,MA2Price,3);
//Check for MA cross
if(fast1>slow1 && fast2<slow2) // cross up 1 bar ago
{
flag=true;
crossprice=(fast1+fast2+slow1+slow2)/4.0;
crosstime=Time[1];
triggerprice=crossprice+(TriggerPoint); } else if(fast2>slow2 && fast3Point);
}
if(fast1slow2) // cross down 1 bar ago
{
flag=false;
crossprice=(fast1+fast2+slow1+slow2)/4.0;
crosstime=Time[1];
triggerprice=crossprice-(TriggerPoint); } else if(fast2slow3) // cross down 2 bars ago { flag=false; crossprice=(fast2+fast3+slow2+slow3)/4.0; crosstime=Time[2]; triggerprice=crossprice-(TriggerPoint);
}
}
lasttime=Time[0];
//Display countdown timer (seconds left)
int countdown = (2Period()60)-(CurTime()-crosstime);
if (countdown>=0)
{
double triggerpips=((Ask+Bid)/2.0-crossprice)/Point;
Comment("Minutes in window of opportunity = ", countdown/60,".
Cross-Price = ", crossprice, ". Pips from Trigger = ", triggerpips , ".");
}
//
//Enter Long
//
if(Ask>=triggerprice&&flag==true&&countdown>=0)
{
StopLoss = iLow(NULL,0,1);
OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,StopLoss,TakeLong(Ask,TakeProfit1),NULL,magic1,0,Blue);
OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,StopLoss,TakeLong(Ask,TakeProfit2),NULL,magic2,0,Blue);
}//Long
//
//Enter Short
//
if(Bid<=triggerprice&&flag==false&&countdown>=0)
{
StopLoss = iHigh(NULL,0,1);
OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,StopLoss,TakeShort(Bid,TakeProfit1),NULL,magic1,0,Red);
OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,StopLoss,TakeShort(Bid,TakeProfit2),NULL,magic2,0,Red);
}//Shrt
return(0);
}
//===========================================================================================
//===========================================================================================
void MonitorOrders() //Monitor open orders
{
//
// More sophisticated exit monitoring system may be needed here
//
TrailingAlls(TrailingStop); //Trailing Stop
return(0);
}
//===========================================================================================
//===========================================================================================
double TakeLong(double price,int take) // function to calculate takeprofit
if long
{
if(take==0)
return(0.0); // if no take profit
return(price+(take*Point));
// plus, since the take profit is above us for long positions
}
//===========================================================================================
//===========================================================================================
double TakeShort(double price,int take) // function to calculate takeprofit
if short
{
if(take==0)
return(0.0); // if no take profit
return(price-(take*Point));
// minus, since the take profit is below us for short positions
}
//===========================================================================================
//===========================================================================================
void TrailingAlls(int trail) // client-side trailing stop
{
if(trail==0)
return;
double stopcrnt;
double stopcal;
int trade;
int trades=OrdersTotal();
for(trade=0;trade<trades;trade++)
{
OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()!=Symbol())
continue;
//Long
if(OrderType()==OP_BUY&&(OrderMagicNumber()!=magic1||OrderMagicNumber()!=magic2))
{
stopcrnt=OrderStopLoss();
stopcal=Bid-(trail*Point);
if(stopcrnt==0)
{
OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Blue);
}
else
{
if(stopcal>stopcrnt)
{
OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Blue);
}
}
}//Long
//Short
if(OrderType()==OP_SELL&&(OrderMagicNumber()!=magic1||OrderMagicNumber()!=magic2))
{
stopcrnt=OrderStopLoss();
stopcal=Ask+(trail*Point);
if(stopcrnt==0)
{
OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Red);
}
else
{
if(stopcal<stopcrnt)
{
OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Red);
}
}
}//Short
} //for
}