//============================================================================= // DeviantPush.mq4 // Copyright © 2006, Derk Wehler // derkwehler@gmail.com // //============================================================================= #property copyright "Copyright © 2006, Derk Wehler" #property link "www.ArrogantFxBastards.com" #include <LibOrderReliable_V1_1_2.mqh> #include <LibDerksUtils.mqh> // Input parameters extern string S1 = "== MONEY MANAGEMENT SETTINGS =="; extern bool MoneyManagement = true; extern bool BinaryMM = true; extern double TradeSizePercent = 3; // Change to whatever percent of equity you wish to risk. extern double Lots = 0.1; extern double MaxLots = 100.0; extern string S1z = " "; extern string S3 = "==== EA SETTINGS ===="; extern string S3a = "------ SL, TP AND TRAIL ------"; extern int TakeProfit = 15; extern int StopLoss = 15; extern string S3z = " "; extern string S4c = "------ GENERAL EA ------"; extern int MagicSeed = 17765; extern string ExpertName = "JMA_Binary"; extern int DebugLevel = 1; static int prevBars = -1; int MagicNumber; double SL; double TP; double InnerUpper; double InnerLower; double MidUpper; double MidLower; double OuterUpper; double OuterLower; //============================================================================= // expert initialization function //============================================================================= int init() { // Set up magic numbers: MagicNumber = MagicSeed + SymbolConst2Val(Symbol())*100 + TimeFrameConst2Val(Period()); return (0); // ------------------------------------------------ // Put code here to test indicators. Sample: // ------------------------------------------------ for (int i=0; i < 20; i++) { double OuterUpper = ObjectGetValueByShift("Reg_Outside2_upper1", i); double MidUpper = ObjectGetValueByShift("Reg_Outside_upper1", i); double InnerUpper = ObjectGetValueByShift("Reg_Inside_upper1", i); double InnerLower = ObjectGetValueByShift("Reg_Inside_lower1", i); double MidLower = ObjectGetValueByShift("Reg_Outside_lower1", i); double OuterLower = ObjectGetValueByShift("Reg_Outside2_lower1", i); Comment("\ni = ", i, "\nLine 1: ", OuterUpper, "\nLine 2: ", MidUpper, "\nLine 3: ", InnerUpper, "\nLine 4: ", InnerLower, "\nLine 5: ", MidLower, "\nLine 6: ", OuterLower); Sleep(2000); } } //============================================================================= // expert deinitialization function //============================================================================= int deinit() { return (0); } //============================================================================= // Expert start function //============================================================================= int start() { color clr = CLR_NONE; double price, priceA, priceB; int op, ticket; int cnt, openPos, pendPos; int pipsProfit; int type; double lotMM = Lots; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Get the values of the LSMA Channel lines (used in various places) // For our purposes, taking the value of these // lines 2 candles back should work best. InnerUpper = ObjectGetValueByShift("Reg_Inside_upper1", 0); InnerLower = ObjectGetValueByShift("Reg_Inside_lower1", 0); MidUpper = ObjectGetValueByShift("Reg_Outside_upper1", 0); MidLower = ObjectGetValueByShift("Reg_Outside_lower1", 0); OuterUpper = ObjectGetValueByShift("Reg_Outside2_upper1", 0); OuterLower = ObjectGetValueByShift("Reg_Outside2_lower1", 0); if (DebugLevel > 0) Comment("\nLine 1: ", OuterUpper, "\nLine 2: ", MidUpper, "\nLine 3: ", InnerUpper, "\nLine 4: ", InnerLower, "\nLine 5: ", MidLower, "\nLine 6: ", OuterLower); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Get total of all open positions openPos = NumOpenPositions(MagicNumber, OP_BOTH); pendPos = NumPendingOrders(MagicNumber, ALL_PENDING); // Print("Num of: Open: ", openPos, " Pending: ", pendPos); if (openPos > 0) return(0); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // From here on, only perform this code at the start of a new candle // if (prevBars == Bars) // return(0); // prevBars = Bars; // Get the minium SL (& TP(?)) level // Apparently for longs (reverse for shorts of course), // TP has to be minDist above Ask & // SL has to be minDist below Bid int minDist = MarketInfo(Symbol(), MODE_STOPLEVEL); minDist++; // Add one to be sure bool changeOrder = false; // Only one trade at a time - If trade open, check for adjusting Pending if (pendPos > 0) { for (cnt=OrdersTotal()-1; cnt >= 0; cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue; Print("Found pending... ticket = ", OrderTicket()); if (OrderType() == OP_BUYSTOP) { if (OrderOpenPrice() - (minDist*Point) > Ask) { Print("OrderOpenPrice() - (minDist*Point) > Ask"); changeOrder = true; price = Ask + (minDist*Point); SL = price - (StopLoss*Point); TP = price + (TakeProfit*Point); Print("NEW: Price: ", price, " SL: ", SL, " TP: ", TP); } } else if (OrderType() == OP_SELLSTOP) { if (OrderOpenPrice() + (minDist*Point) < Bid) { Print("OrderOpenPrice() + (minDist*Point) < Bid"); changeOrder = true; price = Bid - (minDist*Point); SL = price + (StopLoss*Point); TP = price - (TakeProfit*Point); Print("NEW: Price: ", price, " SL: ", SL, " TP: ", TP); } } if (changeOrder) { Print("CALLING OrderModify... "); // Check whether the price has moved in our favour and we should OrderModifyReliable(OrderTicket(), price, SL, TP, 0, CLR_NONE); } } } // Check to see if we should place new pending else { price = 0; if (Ask < MidLower - (minDist*Point)) { Print("Ask: ", Ask, " < midlower: ", MidLower); op = OP_BUYSTOP; price = MidLower; clr = Green; SL = price - (StopLoss*Point); TP = price + (TakeProfit*Point); } else if (Bid > MidUpper + (minDist*Point)) { Print("Bid: ", Bid, " > midupper: ", MidUpper); op = OP_SELLSTOP; price = MidUpper; clr = Green; SL = price + (StopLoss*Point); TP = price - (TakeProfit*Point); } // Open the new order if (price != 0) { Print("Lots begins at: ", lotMM); if (MoneyManagement) { lotMM = CalcLotsGivenRisk(TradeSizePercent, Lots, MaxLots, StopLoss); Print("Using MoneyManagement, lots becomes: ", lotMM); } if (BinaryMM) { lotMM = GetDualWinLots(lotMM, MagicNumber, TakeProfit, StopLoss); Print("Using Binary, lots becomes: ", lotMM); } ticket = OrderSendReliable(Symbol(), op, lotMM, price, 0, SL, TP, ExpertName, MagicNumber, 0, clr); } } return(0); }
Sample
Analysis
Market Information Used:
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
Other Features: