#include <stdlib.mqh> #include <stderror.mqh> extern int volume=250; extern int StopLoss = 35; extern int ProfitTarget = 35; extern double TrailingStop = 20; // Change to whatever number of pips you wish to trail your position with. extern bool UseTrailingStop = true; extern int TrailingStopType = 1; // Type 1 moves stop immediately, Type 2 waits til value of TS is reached extern double Lots=0.1; extern int Slippage = 5; extern int SignalCandle=1; //set to 1 if you want to get the cangle close 0 for current //+---------------------------------------------------+ //|Money Management | //+---------------------------------------------------+ extern bool UseMoneyManagement = false; // Change to false to shutdown money management controls. extern int MM_Type = 1; //+---------------------------------------------------+ //|Money Management type 1 | //+---------------------------------------------------+ extern string StrSep1 = "-----MoneyManagementType 1 -----"; extern double MMRisk=0.15; // Risk Factor extern double LossMax=1000; // Maximum Loss by 1 Lot //+---------------------------------------------------+ //|Money Management type 2 | //+---------------------------------------------------+ extern string StrSep2 = "-----MoneyManagementType 2 -----"; extern bool AccountIsMini = true; // Change to true if trading mini account extern double TradeSizePercent = 15; // Change to whatever percent of equity you wish to risk. double MaxLots = 10; //+---------------------------------------------------+ int MagicNumber; // Magic number of the trades. must be unique to identify double Lotsi=0,mav=0; bool TradeAllowed=true; int init() { MagicNumber = 3000 + func_Symbol2Val(Symbol())*100 + func_TimeFrame_Const2Val(Period()); } int start() { int err; err=GetLastError(); //------------------Signal indicators go in here------------------------------// double v=iVolume(Symbol(),Period(),0)/2; //-------------------------------------------------------------------------// double dblMinStopDistance = MarketInfo(Symbol(),MODE_STOPLEVEL)*MarketInfo(Symbol(), MODE_POINT); Comment ("Min Stop Distance : ",dblMinStopDistance," ","Volume :",v); int NumTrades = 0; for (int i = 0; i < OrdersTotal(); i++) { OrderSelect(i, SELECT_BY_POS); if (OrderSymbol() == Symbol()) { if (OrderType() == OP_BUY ) NumTrades++; if (OrderType() == OP_SELL )NumTrades++; } } if (NumTrades == 0) { if (TradeAllowed) { if (MM_Type == 1) Lotsi = MoneyManagement ( UseMoneyManagement, Lots, MMRisk, LossMax); else Lotsi = GetLots(); //----------------------------------SIGNAL GENERATOR-------------------------------------// //----Long if (v > volume)// (mav > MAvolume..insert signal here..) { OrderSend(Symbol(), OP_BUY, Lotsi, Ask, Slippage, Ask - StopLoss * Point, Ask + ProfitTarget * Point, 0); } if (err>0) Print("error(",err,"): ",ErrorDescription(err)); else //----Short if (v > volume)// (mav > MAvolume..insert signal here..) { OrderSend(Symbol(), OP_SELL, Lotsi, Bid, Slippage, Bid + StopLoss * Point, Bid - ProfitTarget * Point, 0); } if (err>0) Print("error(",err,"): ",ErrorDescription(err)); else { return(0); } } } //------------------------------------------------TRAILING STOP FUNCTION-------------------------// if (UseTrailingStop) { for (i = 0; i < OrdersTotal(); i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if ( OrderSymbol() == Symbol() ) { if ( OrderType() == OP_BUY ) { HandleTrailingStop(OP_BUY,OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit()); } if ( OrderType() == OP_SELL) { HandleTrailingStop(OP_SELL,OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit()); } } } } return(0); } // --------------------------------------- Money Management, by Robert Hill--------------------// double MoneyManagement ( bool flag, double Lots, double risk, double maxloss) { Lotsi=Lots; if ( flag ) Lotsi=NormalizeDouble(Lots*AccountFreeMargin()*risk/maxloss,1); if (Lotsi<0.1) Lotsi=0.1; return(Lotsi); } //--------------------------------- Get number of lots for this trade --------------------// double GetLots() { double lot; if(UseMoneyManagement) { lot = LotsOptimized(); } else { lot = Lots; if(AccountIsMini) { if (lot < 0.1) lot = 0.1; } else { if (lot >= 1.0) lot = MathFloor(lot); else lot = 1.0; } if (lot > MaxLots) lot = MaxLots; } return(lot); } //------------------ Calculate optimal lot size based on percent of Account---------------------// double LotsOptimized() { double lot=Lots; //---- select lot size lot=NormalizeDouble(MathFloor(AccountFreeMargin()*TradeSizePercent/10000)/10,1); if(AccountIsMini) { lot = MathFloor(lot*10)/10; } return(lot); } //+------------------------------------------------------------------+ //| Modify Open Position Controls | //| Try to modify position 3 times | //+------------------------------------------------------------------+ bool ModifyOrder(int nOrderType, int ord_ticket,double op, double price,double tp, color mColor = CLR_NONE) { int cnt, err; double myStop; myStop = ValidStopLoss (nOrderType, price); cnt=0; if (OrderModify(ord_ticket,op,myStop,tp,0,mColor)) { return(true); } else { err=GetLastError(); if (err > 1) Print(cnt," Error modifying order : (", ord_ticket , ") " + ErrorDescription(err), " err ",err); if (err>0) cnt++; Sleep (10000); } return(false); } //---------------------------------Adjust stop loss so that it is legal------------------------// double ValidStopLoss(int cmd, double sl) { double v=iVolume(Symbol(),Period(),0); if (sl == 0) return(0.0); double mySL, myPrice; double dblMinStopDistance = MarketInfo(Symbol(),MODE_STOPLEVEL)*MarketInfo(Symbol(), MODE_POINT); mySL = sl; // Check if SlopLoss needs to be modified switch(cmd) { case OP_BUY: myPrice = MarketInfo(Symbol(), MODE_BID); if (myPrice - sl < dblMinStopDistance) mySL = myPrice - dblMinStopDistance; // we are long break; case OP_SELL: myPrice = MarketInfo(Symbol(), MODE_ASK); if (sl - myPrice < dblMinStopDistance) mySL = myPrice + dblMinStopDistance; // we are Short } return(NormalizeDouble(mySL,MarketInfo(Symbol(), MODE_DIGITS))); } //+------------------------------------------------------------------+ //| HandleTrailingStop | //| Type 1 moves the stoploss without delay. | //| Type 2 waits for price to move the amount of the trailStop | //| before moving stop loss then moves like type 1 | //| Type 3 uses up to 3 levels for trailing stop | //| Level 1 Move stop to 1st level | //| Level 2 Move stop to 2nd level | //| Level 3 Trail like type 1 by fixed amount other than 1 | | //+------------------------------------------------------------------+ int HandleTrailingStop(int type, int ticket, double op, double os, double tp) { double pt, TS=0, myAsk, myBid; double bos,bop,opa,osa; switch(type) { case OP_BUY: { myBid = MarketInfo(Symbol(),MODE_BID); switch(TrailingStopType) { case 1: pt = Point*StopLoss; if(myBid-os > pt) ModifyOrder(type, ticket,op,myBid-pt,tp, Aqua); break; case 2: pt = Point*TrailingStop; if(myBid-op > pt && os < myBid - pt) ModifyOrder(type, ticket,op,myBid-pt,tp, Aqua); break; } return(0); break; } case OP_SELL: { myAsk = MarketInfo(Symbol(),MODE_ASK); switch(TrailingStopType) { case 1: pt = Point*StopLoss; if(os - myAsk > pt) ModifyOrder(type, ticket,op,myAsk+pt,tp, Aqua); break; case 2: pt = Point*TrailingStop; if(op - myAsk > pt && os > myAsk+pt) ModifyOrder(type, ticket,op,myAsk+pt,tp, Aqua); break; } } return(0); } } //+------------------------------------------------------------------+ //| Time frame interval appropriation function | //+------------------------------------------------------------------+ int func_TimeFrame_Const2Val(int Constant ) { switch(Constant) { case 1: // M1 return(1); case 5: // M5 return(2); case 15: return(3); case 30: return(4); case 60: return(5); case 240: return(6); case 1440: return(7); case 10080: return(8); case 43200: return(9); } } int func_Symbol2Val(string symbol) { string mySymbol = StringSubstr(symbol,0,6); if(mySymbol=="AUDCAD") return(1); if(mySymbol=="AUDJPY") return(2); if(mySymbol=="AUDNZD") return(3); if(mySymbol=="AUDUSD") return(4); if(mySymbol=="CHFJPY") return(5); if(mySymbol=="EURAUD") return(6); if(mySymbol=="EURCAD") return(7); if(mySymbol=="EURCHF") return(8); if(mySymbol=="EURGBP") return(9); if(mySymbol=="EURJPY") return(10); if(mySymbol=="EURUSD") return(11); if(mySymbol=="GBPCHF") return(12); if(mySymbol=="GBPJPY") return(13); if(mySymbol=="GBPUSD") return(14); if(mySymbol=="NZDUSD") return(15); if(mySymbol=="USDCAD") return(16); if(mySymbol=="USDCHF") return(17); if(mySymbol=="USDJPY") return(18); Comment("unexpected Symbol"); return(19); }
Sample
Analysis
Market Information Used:
Series array that contains tick volumes of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It automatically opens orders when conditions are reached
It can change open orders parameters, due to possible stepping strategy
Other Features: