/*-----------------------------+ | | | Shared by www.Aptrafx.com | | | +------------------------------*/ //+-----------------------------------+ //| Use on EURUSD 1hour charts only!! | //+-----------------------------------+ #property copyright "Jan Vanman vanman@absamail.co.za" #property link "http://www.metaquotes.ru" //+------------------------------------------------------------------+ //| External Variables | //+------------------------------------------------------------------+ extern double TakeProfit = 200; extern double TrailingStop = 40; extern int MAFastPeriod=16; extern int MASlowPeriod=60; extern int Slippage=2; extern int back=15; int start() { int cnt=0; int mode=0; int FastMa=0, FastMa2=0, FastMa5=0; int SlowMa=0, SlowMa2=0, SlowMa5=0; double mini=0.1; int lot; double p=Point(); if (Bars<100) {Print("Bars less than 100"); return(0); } if (TrailingStop<10) {Print("TrailingStop less than 10"); return(0); } if (TakeProfit<10) {Print("TakeProfit less than 10"); return(0); } // setup values // Ron set these to PRICE_CLOSE, because it was unknown what mt3 used //FastMa =iMA(MAFastPeriod,MODE_EMA,0); //FastMa2=iMA(MAFastPeriod,MODE_EMA,2); //FastMa5=iMA(MAFastPeriod,MODE_EMA,5); FastMa =iMA(Symbol(), 0, MAFastPeriod, 0, MODE_EMA, PRICE_CLOSE, 0); FastMa2 =iMA(Symbol(), 0, MAFastPeriod, 0, MODE_EMA, PRICE_CLOSE, 2); FastMa5 =iMA(Symbol(), 0, MAFastPeriod, 0, MODE_EMA, PRICE_CLOSE, 5); //SlowMa =iMA(MASlowPeriod,MODE_EMA,0); //SlowMa2=iMA(MASlowPeriod,MODE_EMA,2); //SlowMa5=iMA(MASlowPeriod,MODE_EMA,5); SlowMa =iMA(Symbol(), 0, MASlowPeriod, 0, MODE_EMA, PRICE_CLOSE, 0); SlowMa2 =iMA(Symbol(), 0, MASlowPeriod, 0, MODE_EMA, PRICE_CLOSE, 2); SlowMa5 =iMA(Symbol(), 0, MASlowPeriod, 0, MODE_EMA, PRICE_CLOSE, 5); // Error checking if(Bars<100) {Print("Bars less than 100"); return(0);} if(AccountFreeMargin()<100) {Print("We have no money"); return(0);} // if there are no open positions and orders if (OrdersTotal()<1) { if (AccountFreeMargin()>5000) { lot=MathCeil((AccountFreeMargin()/3000)); } else { lot=MathCeil((AccountFreeMargin()/300)*mini); } // there are no open positions - check the BUY option // the opening condition: // if EMA(16) crosses EMA(60) upwards // and the current bar is bullish (Close>Open), we place // waiting order BUY LIMIT 15 pips below the execution // price for more optimal entering into the market //If FastMa>SlowMa and FastMa2<SlowMa2 and FastMa5<SlowMa5 and Close>Open then if (FastMa-SlowMa>=p && SlowMa2-FastMa2>=p && SlowMa5-FastMa5>=p && Close[0]>Open[0]) { // try to place a waiting order at the (Ask-15) points price // with maximum slippage 2 points, // while not setting Stop Loss and setting Take Profit // 200 points above the opening price. // at the chart an upward green arrow appears //SetOrder(OP_BUYLIMIT,Lot,Ask-back*Point,Slippage,0,Ask+(TakeProfit-back)*Point,RED); OrderSend(Symbol(),OP_BUYLIMIT,lot,Ask-(back*p),Slippage,0,Ask+((TakeProfit-back)*p),"4MA Buy",11123,0,White); return(0); // now we exit as we are not allowed to operate the account in the nearest 10 sec } // the opening SELL condition: // if EMA(16) crosses EMA(60) downwards // and the current bar is bearish (Close<Open), than we place // a waiting order SELL LIMIT 15 points above // the execution price for more optimal entering the market if ( SlowMa-FastMa>=p && FastMa2-SlowMa2>=p && FastMa5-SlowMa5>=p && Close[0]<Open[0]) { // try to place 1 lot order at Bid+15 points price // with 2 points maximum slippage, // when not setting Stop Loss and setting Take Profit // 200 points below opening price. // on the chart the downward red arrow will appear //SetOrder(OP_SELLLIMIT,Lot,Bid+back*Point,Slippage,0,Bid-(TakeProfit-back)*Point,RED); OrderSend(Symbol(),OP_SELLLIMIT,lot,Bid+(back*p),Slippage,0,Bid-((TakeProfit-back)*p),"4MA SELL",11321,0,Red); return(0); } // all we need to check in the empty terminal // we have checked already, now we exit return(0); } //if (OrdersTotal()<1) // here is the code of checking of the positions opened earlier // (the placed orders will be checked // in the other block, now we check the already opened positions) for (cnt=1; cnt<=OrdersTotal(); cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol()==Symbol()) { if (OrderType()==OP_BUY) // if the already opened position were BUY { // lets check if EMA(16) has crossed EMA(60) downwards? if (FastMa<SlowMa && FastMa2>SlowMa2 && FastMa5>SlowMa5) { // try to close the position at current Bid price //CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,Slippage,RED); OrderClose(OrderTicket(),OrderLots(),Bid,0,Red); return(0); } // Here we check the trailing stop at open position. // Trailing stop ( Stop Loss) of the BUY position is being // kept at level 40 points below the market. // If the profit (current Bid-OpenPrice) more than TrailingStop (40) pips if ( Bid-OrderOpenPrice()>TrailingStop*p ) { // we have won already not less than 'TrailingStop' pips! if ( OrderStopLoss()<Bid-(TrailingStop*p) ) { // move the trailing stop (Stop Loss) to the level 'TrailingStop' from the market //ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE), Bid-Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red); OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*p),OrderTakeProfit(),0,Red); return(0); } } //If (Bid-OrderValue(cnt,VAL_OPENPRICE))>(TrailingStop*Point) } //if(OrderSymbol()==Symbol()) } //If mode=OP_BUY then if (mode==OP_SELL) // if the already opened position were SELL { // check if EMA(16) has crossed already EMA(60) upwards? if (FastMa>SlowMa && FastMa2<SlowMa2 && FastMa5<SlowMa5) { // try to close the position at current Ask price //CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Ask,Slippage,RED); OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red); return(0); } // Here we check the trailing stop at open position. // Trailing stop ( Stop Loss) of the BUY position is being // kept at level 40 points below the market. // If the profit (current Bid-OpenPrice) more than TrailingStop (40) pips if ( OrderOpenPrice()-Ask>(TrailingStop*p) ) { // we have won already not less than 'TrailingStop' pips! if ( OrderStopLoss()>(Ask+(TrailingStop*p)) || OrderStopLoss()==0 ) { // move the trailing stop (Stop Loss) to the level 'TrailingStop' from the market //ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE), Ask+Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red); OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*p),OrderTakeProfit(),0,Red); return(0); } } //If (OrderValue(cnt,VAL_OPENPRICE)-Ask)>(TrailingStop*Point) } //If mode=OP_SELL // there is one very important point - the control // over the waiting orders. An order cannot be valid more than 0.5 hour. // After which It should be canceled // For that purpose we compare current time // and time the order is placed if (mode>OP_SELL) // this is a waiting order! { // check how long it exists in the trading terminal // time is counted in seconds: // 10 minutes = 600 seconds, 30 minutes = 1800, 1 hour = 3600, 1 day = 86400 if ( CurTime()-OrderOpenTime()>1800 ) { //DeleteOrder(OrderValue(cnt,VAL_TICKET),RED); OrderDelete(OrderTicket()); return(0); } } }//for cnt=1 to TotalTrades return(0); } // the end //Adapted from "Trend Follower" from InterbankFX.com //by JF van Niekerk
Sample
Analysis
Market Information Used:
Series array that contains close prices for each bar
Series array that contains open prices of each bar
Indicator Curves created:
Indicators Used:
Moving average indicator
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It automatically opens orders when conditions are reached
It Closes Orders by itself
It can change open orders parameters, due to possible stepping strategy
Other Features: