//+------------------------------------------------------------------+ //| 4/8/2007 preBar.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ int MAGICMA=20070705; extern double Lots = 0.1; extern double MaximumRisk = 0.03; extern double stopFactor = 1; extern double TakeProfit1 = 150; double Stoploss1; extern bool takeProfit = true; extern bool sartrail = true; extern bool MoneyManagement = true; extern bool trendFilter = true; extern int trendThreshold = 15; extern int adxPeriod = 2; //+------------------------------------------------------------------+ //| Calculate open positions | //+------------------------------------------------------------------+ int CalculateCurrentOrders(string symbol) { int buys=0,sells=0; //---- for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderSymbol()==symbol && OrderMagicNumber()==MAGICMA) { if(OrderType()==OP_BUY) buys++; if(OrderType()==OP_SELL) sells++; } } //---- return orders volume if(buys>0) return(buys); else return(-sells); } double LotsOptimized() { //---- select lot size double lot; lot = NormalizeDouble( (AccountFreeMargin()*MaximumRisk)/( iATR(NULL,0,20,0)*(1/Point) )*0.1,1); //---- return lot size if(lot<0.1) lot=0.1; return(lot); } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ void CheckForOpen() { if(!NewBar()) return; int res; if(MoneyManagement) Lots = LotsOptimized(); double close1 = Close[1]; double open1 = Open[1]; double trendLine = iADX(NULL,0,adxPeriod,PRICE_WEIGHTED,MODE_MAIN,0); bool trendFilterRes = true; if(trendFilter==true) { if(trendLine>trendThreshold) trendFilterRes = true; else trendFilterRes = false; } if ( Close[2]>Open[2] && close1< open1 &&trendFilterRes) { openSell(); return; } //---- buy conditions if (Close[2]<Open[2] && close1> open1 && trendFilterRes) { openBuy(); return; } //---- } void openBuy(){ Print("Lots "+Lots); Stoploss1 = stopFactor * iATR(NULL,0,20,0)+ MarketInfo (Symbol(), MODE_SPREAD) * Point; int res; if(takeProfit) res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-Stoploss1,Ask+TakeProfit1*Point,"preBar",MAGICMA,0,Blue); else res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-Stoploss1,0,"preBar",MAGICMA,0,Blue); if(res>0) { if(OrderSelect(res,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); Comment("preBar opened buy order " + Ask); } else Print("Error opening SELL order : ",GetLastError()); } void openSell(){ Print("Lots "+Lots); Stoploss1 = stopFactor * iATR(NULL,0,20,0)+ MarketInfo (Symbol(), MODE_SPREAD) * Point; int res; if(takeProfit) res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+Stoploss1,Bid-TakeProfit1*Point,"preBar",MAGICMA,0,Red); else res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+Stoploss1,0,"preBar",MAGICMA,0,Red); if(res>0) { if(OrderSelect(res,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); Comment("preBar opened sell order " + Bid); } else Print("Error opening SELL order : ",GetLastError()); } //+------------------------------------------------------------------+ //| Check for close order conditions | //+------------------------------------------------------------------+ void CheckForClose() { //---- for(int i=0;i<OrdersTotal();i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && // check for opened position OrderSymbol()==Symbol()) // check for symbol { if(OrderType()==OP_BUY) // long position is opened { if(!takeProfit && NewBar() && Open[1]> Close[1]) { OrderClose(OrderTicket(),OrderLots(),Bid,3,White); openSell(); } // should it be closed? // Function version check Sell condition to exit Buy // check for trailing stop if ( sartrail && (iSAR(NULL,0,0.02,0.2,1) > OrderStopLoss()) && (Bid > iSAR(NULL,0,0.02,0.2,1)) && (OrderOpenPrice() < iSAR(NULL,0,0.02,0.2,1)) && (iSAR(NULL,0,0.02,0.2,1) > iSAR(NULL,0,0.02,0.2,2))) { OrderModify(OrderTicket(),OrderOpenPrice(),iSAR(NULL,0,0.02,0.2,1),OrderTakeProfit(),0,Blue); Print("Order # ",OrderTicket()," updated at ",Hour(),":",Minute(),":",Seconds()); return(0); } } if(OrderType()==OP_SELL) { if(!takeProfit && NewBar() && Open[1]< Close[1]) { OrderClose(OrderTicket(),OrderLots(),Ask,3,White); openBuy(); } // should it be closed? // Function version check Buy condition to exit Sell if (sartrail && (iSAR(NULL,0,0.02,0.2,1) < OrderStopLoss()) && (Ask < iSAR(NULL,0,0.02,0.2,1)) && (OrderOpenPrice() > iSAR(NULL,0,0.02,0.2,1)) && (iSAR(NULL,0,0.02,0.2,1) < iSAR(NULL,0,0.02,0.2,2))) { OrderModify(OrderTicket(),OrderOpenPrice(),iSAR(NULL,0,0.02,0.2,1),OrderTakeProfit(),0,Blue); Print("Order # ",OrderTicket()," updated at ",Hour(),":",Minute(),":",Seconds()); return(0); } } } } return(0); } // the end. //---- //+------------------------------------------------------------------+ //| Start function | //+------------------------------------------------------------------+ void start() { //---- check for history and trading if(Bars<100 || IsTradeAllowed()==false) return; setVariables(Symbol()); //---- calculate open orders by current symbol if(CalculateCurrentOrders(Symbol())==0) CheckForOpen(); else CheckForClose(); //---- } //+-------------------------------------------------------------- bool NewBar() { static datetime lastbar; datetime curbar = Time[0]; if(lastbar!=curbar){ lastbar=curbar; return (true); } else { return(false); } } void setVariables(string symbol){ //if ( symbol=="AUDNZD") {MAGICMA =550001; tragetProfit = 4; stopLossFactor = 3.5; bandSD = 3.6; pipCross = 30; ratioTarget = 0.4; TrailingStop = 50; TrailingStep = 20; } if ( symbol=="CHFJPY") {MAGICMA =240002; MaximumRisk = 0.01;stopFactor = 4;TakeProfit1 = 120;trendThreshold = 20;adxPeriod = 3; } if ( symbol=="GBPUSD") {MAGICMA =240003; MaximumRisk = 0.01;stopFactor = 3.2;TakeProfit1 = 350;trendThreshold =37;adxPeriod = 13; } //if ( symbol=="EURGBP") {MAGICMA =550003; tragetProfit = 9; stopLossFactor = 4;bandSD = 5; pipCross = 55; ratioTarget = 0.3; TrailingStop = 120; TrailingStep = 5; } }
Sample
Analysis
Market Information Used:
Series array that contains close prices for each bar
Series array that contains open prices of each bar
Series array that contains open time of each bar
Indicator Curves created:
Indicators Used:
Indicator of the average true range
Movement directional index
Parabolic Stop and Reverse system
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: