//+------------------------------------------------------------------+ //| Blessing Martingale_v5.mq4 | //| timbo | //| | //+------------------------------------------------------------------+ #property copyright "timbo" #property link "" //---- input parameters extern int levels = 8; extern int TP=40; extern double Lots=0.06; extern bool UseStopLoss=true; extern int magic=111; //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- int cmd = 2; double Lot = Lots; double price; int slippage = 4; double stoploss=0; double takeprofit; color colour; int BuyTicket = 0; int SellTicket = 0; BuyTicket = FixTakeProfit(magic,0); if(BuyTicket == 0) { CleanAllPendings(magic,2); cmd = 0; price = Ask; colour = Green; takeprofit = Ask + TP*Point; if(UseStopLoss == true) stoploss = Ask - levels*TP*Point; OpenOrder(cmd, Lot, price, slippage, stoploss, takeprofit, magic, colour); SetPendingOrders(2,Lot,price,slippage,stoploss,TP,magic,levels); return(0); } SellTicket = FixTakeProfit(magic,1); if(SellTicket == 0) { CleanAllPendings(magic,3); cmd = 1; price = Bid; colour = Red; takeprofit = Bid - TP*Point; if(UseStopLoss == true) stoploss = Bid + levels*TP*Point; OpenOrder(cmd, Lot, price, slippage, stoploss, takeprofit, magic, colour); SetPendingOrders(3,Lot,price,slippage,stoploss,(-TP),magic,levels); return(0); } //---- return(0); } //+------------------------------------------------------------------+ int OpenOrder(int cmd, double Lot, double price, int slippage, double stoploss, double takeprofit, int magic, color colour) { RefreshRates(); while(IsTradeAllowed() == false) Sleep(10000); int ticket = OrderSend(Symbol(), cmd, Lot, price, slippage, stoploss, takeprofit, NULL, magic, 0, colour); if(ticket < 0) { Print(price," == ",stoploss); Alert("!!! Error opening order !!! ", GetLastError()); ticket = 0; } return(ticket); } //+------------------------------------------------------- int FixTakeProfit(int magic, int cmd) { int ticket = 0; int i; datetime time = 0; for(i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic && OrderType() == cmd) { if(OrderOpenTime() > time) { time = OrderOpenTime();ticket = OrderTicket(); } } } if(ticket != 0) { OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES); double takeprofit = OrderTakeProfit(); for(i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic && OrderType() == cmd) { if(OrderTakeProfit() != takeprofit) { while(IsTradeAllowed() == false) Sleep(10000); OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),takeprofit,0,Yellow); } } } } return(ticket); } //+------------------------------------------------------ void CleanAllPendings(int magic,int cmd) { for(int i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic && OrderType() == cmd) { int ticket = OrderTicket(); while(IsTradeAllowed() == false) Sleep(10000); OrderDelete(ticket,CLR_NONE); } } } //+----------------------------------------------------- void SetPendingOrders(int cmd,double Lot,double price,int slippage,double stoploss,int TP,int magic, int levels) { for(int i=0;i<levels-1;i++) { while(IsTradeAllowed() == false) Sleep(10000); OpenOrder(cmd,Lot*MathPow(2,i),price-(i+1)*TP*Point,slippage,stoploss,price-i*TP*Point,magic,CLR_NONE); } return(0); } //+-----------------------------------------------------
Sample
Analysis
Market Information Used:
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
It automatically opens orders when conditions are reached
Checks for the total of open orders
It can change open orders parameters, due to possible stepping strategy
Other Features:
It issuies visual alerts to the screen