extern double lot = 3; extern double ts = 70; //65/65 //EUR/USD sl = 300 //extern double sl =350; extern double slSwitch = 1; extern double tp = 790; extern double tpSwitch = 0; extern double sp = 300; extern double ts1 = 800; extern double ts2 = 300; extern double slFactor = 1.8; extern int buckOffWindow = 30; extern int reEntriesAllowed = 4; extern int atrLength = 60; extern double letsBreakEvenFactor = 1.5; extern double tradeEstablishedFactor = 2.7; extern double solidTrendFactor = 4; extern double secureSolidTrendFactor = 3; extern double uFF = 0.05; extern double lFF = -0.05; double letsBreakEven; double tradeEstablished; double solidTrend; double atr; double macdLevel; bool buyMa, sellMa; bool buckOff = false; bool oncePerBar = true; bool openOrder = false; bool reEntryPossible = false; bool orderModified = false; bool reEntryTrade = false; bool secureProfit; bool beFlag; bool signalUsed; int reEntryCount; int barsSinceSignal; int barCountSinceOpen = 0; int lastTradeDirection; //1 for buy, 0 for sell datetime prevBar=0, curBar=0, openBarTime, closeBar; int init(){} int start() { double ma1 = iMA(Symbol(),0,2,0,MODE_EMA,PRICE_WEIGHTED,1); double ma2 = iMA(Symbol(),0,2,0,MODE_EMA,PRICE_WEIGHTED,2); double ma3 = iMA(Symbol(),0,60,0,MODE_SMMA,PRICE_TYPICAL,1); double ma4 = iMA(Symbol(),0,40,0,MODE_SMMA,PRICE_TYPICAL,1); if(OrdersTotal() < 1) openOrder = false; if (ma1 > ma2 && ma1 > ma3 && ma2 < ma3) { // Switch signals on at the point of crossing buyMa = true; sellMa = false; barsSinceSignal = 0; if (!openOrder) { signalUsed = false; reEntryCount = 0; reEntryTrade = false; } } if (ma1 < ma2 && ma1 < ma3 && ma2 > ma3) { sellMa = true; buyMa = false; barsSinceSignal = 0; if (!openOrder){ signalUsed = false; reEntryCount = 0; reEntryTrade = false; } } double ff1 = iForce(NULL, 0, 15, MODE_SMA, PRICE_CLOSE, 1); double ff2 = iForce(NULL, 0, 15, MODE_SMA, PRICE_CLOSE, 2); if (curBar != Time[0]) barsSinceSignal++; //Swich signals off after 2 bars. /* if (barsSinceSignal>=2) { buyMa = false; sellMa = false; } */ curBar = Time[0]; if (curBar != openBarTime && curBar != prevBar){ barCountSinceOpen++; prevBar = curBar; oncePerBar = true; /* Alert("BuySignal is: ",buyMa); Alert("SelSignal is: ",sellMa); Alert("SignalUsed is: ",signalUsed); Alert("ReEntryCount: ",reEntryCount); Alert("ReEntryTrade: ",reEntryTrade); */ } if (barCountSinceOpen > buckOffWindow) buckOff = true; else buckOff = false; atr = iATR(Symbol(),0,atrLength,1); // Alert("ATR: ", atr); double macd1, macd2; macd1 = iMACD(Symbol(), 0, 12, 26, 9,PRICE_TYPICAL, MODE_MAIN,1); macd2 = iMACD(Symbol(), 0, 12, 26, 9,PRICE_TYPICAL, MODE_MAIN,2); if ( buyMa && OrdersTotal()<1 && macd1 > macd2 && oncePerBar && Close[0] > ma4 && ff1 > uFF && ff1 > ff2 && reEntryCount < reEntriesAllowed) { if (!signalUsed) Alert("Reset Signal"); if (signalUsed && lastTradeDirection == 1 && Close[0]- atr/2 > ma4) { reEntryTrade = true; Alert(">>>>>>>>>>>>>>R-E-E-N-T-R-Y>>>>>>>>>>>>>>>>Order opened at ",Time[0]); Buy(); } else if (!signalUsed){ Alert(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Order opened at ",Time[0]); Buy(); } if (reEntryCount < reEntriesAllowed) reEntryPossible = true; } else if ( sellMa && OrdersTotal()<1 && macd1 < macd2 && oncePerBar && Close[0] < ma4 && ff1 < lFF && ff1 < ff2 && reEntryCount < reEntriesAllowed) { if (!signalUsed) Alert("Reset Signal"); if (signalUsed && lastTradeDirection == 0 && Close[0]+ atr/2 < ma4) { reEntryTrade = true; Alert(">>>>>>>>>>>>>>R-E-E-N-T-R-Y>>>>>>>>>>>>>>>>Order opened at ",Time[0]); Sell(); } else if (!signalUsed){ Alert(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Order opened at ",Time[0]); Sell(); } if (reEntryCount < reEntriesAllowed) reEntryPossible = true; } //&& macd1 > macdLevel //Exit for (int i=0; i= letsBreakEven && !orderModified) { Alert ("Price is ", Close[0], "Modifying to B/E"); OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Yellow); orderModified = true; beFlag = true; if (reEntryCount < reEntriesAllowed) reEntryPossible = true; } else if (OrderType()== OP_SELL && OrderOpenPrice() - Close[0] >= letsBreakEven && !orderModified) { Alert ("Price is ", Close[0], "Modifying to B/E"); OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Yellow); orderModified = true; beFlag = true; if (reEntryCount < reEntriesAllowed) reEntryPossible = true; } //SecureProfit by raising or lowering the stops once the trade is established else if (OrderType()==OP_BUY && Close[0] - OrderOpenPrice() >= tradeEstablished && !secureProfit){ Alert ("Price is ", Close[0], "Modifying to ",OrderOpenPrice()+atr/2); OrderModify(OrderTicket(),OrderOpenPrice(), OrderOpenPrice() + atr/2, OrderTakeProfit(),0,Yellow); secureProfit = true; } else if (OrderType()==OP_SELL && OrderOpenPrice() - Close[0] >= tradeEstablished && !secureProfit){ Alert ("Price is ", Close[0], "Modifying to ",OrderOpenPrice() - atr/2); OrderModify(OrderTicket(),OrderOpenPrice(), OrderOpenPrice() - atr/2, OrderTakeProfit(),0,Yellow); secureProfit = true; } // BreakEven if macd trend has changed. If it has and we're past buckoff, move to breakeven, setflag and let it run else if (OrderType()==OP_BUY && macd1 < macd2 && buckOff && Bid > OrderOpenPrice()+atr/2 && !orderModified){ OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Yellow); orderModified = true; beFlag = true; if (macd1 > macdLevel) macdLevel = macd2; if (reEntryCount < reEntriesAllowed) reEntryPossible = true; // If we get stopped out reEntry is possible if MACD repoints in the same direction } else if (OrderType()==OP_SELL && macd1 > macd2 && buckOff && Ask < OrderOpenPrice()-atr/2 && !orderModified){ OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Yellow); orderModified = true; beFlag = true; if (macd1 < macdLevel) macdLevel = macd2; if (reEntryCount < reEntriesAllowed) reEntryPossible = true; } // If this is a reEntryTrade (keyed off macd main levels and trend,) then either move to break even if winning // or close if losing if (OrderType()==OP_BUY && reEntryTrade && macd1 < macd2 && !secureProfit){ Alert("MACD1: ",macd1, " MACD2: ",macd2); if (Bid > OrderOpenPrice()) OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Yellow); else{ Alert("CLOSE1"); OrderClose(OrderTicket(),OrderLots(),Ask,0,Red); } } else if (OrderType()==OP_SELL && reEntryTrade && macd1 > macd2 && !secureProfit){ if (Ask < OrderOpenPrice()) OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Yellow); else OrderClose(OrderTicket(),OrderLots(),Bid,0,Red); } // Check close conditions else if (OrderType()==OP_BUY && (sellMa || (Close[0]+ atr < ma4 ) )){ Alert("CLOSE2"); OrderClose(OrderTicket(),OrderLots(),Bid,0,Red); openOrder = False; } else if (OrderType()==OP_SELL && (buyMa || (Close[0]- atr > ma4 ) )){ OrderClose(OrderTicket(),OrderLots(),Ask,0,Red); openOrder = False; } // Otherwise trail stops to capture 75% of large moves else if (OrderType()==OP_BUY && Bid-solidTrend>OrderStopLoss()) OrderModify(OrderTicket(),OrderOpenPrice(),Bid - secureSolidTrendFactor/solidTrendFactor*solidTrend,OrderTakeProfit(),0,Yellow); else if (OrderType()==OP_SELL && Ask+solidTrend