//+------------------------------------------------------------------+ //| DojiTrader.mq4 | //| Alex | //| | //+------------------------------------------------------------------+ #property copyright "Alex" #property link "" #include #include //---- input parameters extern double Lots =0.1; extern int Slippage =1; extern double MaximumRisk =0.02; extern double DecreaseFactor =3; extern int TakeProfit =50; extern int StopLoss =50; extern int BarsTP =8; extern int BarsSL =13; extern int BarsTSL =3; extern int BarsShift =0; extern int TimeOpen =8; extern int TimeClose =10; double SPoint; // SPoint=MarketInfo(Symbol(), MODE_POINT); double Spread; // Spread=Ask-Bid; double SDigits; // SDigits=MarketInfo(Symbol(), MODE_DIGITS); int MagicNumber =89354658; string ExpertName ="Doji.11"; int dBar; //doji bar index double dHigh; //doji bar high double dLow; //doji bar low int eDirection = 0; //direction double ePrice,btsl,stsl; //entry price,trailing stops int spread; int ticket,tbt,tst; double CalcSlBuy() { return (MathMin((Low[Lowest(NULL,0,MODE_LOW,BarsSL,BarsShift)]-Spread),(Bid-(StopLoss*SPoint)))); } double CalcSlSell() { return (MathMax((High[Highest(NULL,0,MODE_HIGH,BarsSL,BarsShift)]+Spread),(Ask+(StopLoss*SPoint)))); } double CalcTpBuy() { return (MathMin((High[Highest(NULL,0,MODE_HIGH,BarsTP,BarsShift)]),(Ask+(TakeProfit*SPoint)))); } double CalcTpSell() { return (MathMax((Low[Lowest(NULL,0,MODE_LOW,BarsTP,BarsShift)]),(Bid-(TakeProfit*SPoint)))); } double LotsOptimized() { double lot=Lots; int orders=HistoryTotal(); // history orders total int losses=0; // number of losses orders without a break lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1); if(DecreaseFactor>0) { for(int i=orders-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; } if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue; if(OrderProfit()>0) break; if(OrderProfit()<0) losses++; } if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1); } if(lot<0.1) lot=0.1; return(lot); } void PrintComments() { Comment( "------------ Debugger -------------","\n", "dBar: ",dBar,"\n", "dBar Time: ",TimeHour(Time[dBar]), ":", TimeMinute(Time[dBar]), "\n", "Current Time: ",Hour(),":",Minute(),"\n", "dHigh: ",dHigh,"\n", "dLow: ",dLow,"\n", "eDirection: ",eDirection,"\n", "ePrice: ",ePrice,"\n"); } int init() {return(0);} int deinit(){return(0);} //--------------------------------- S T A R T ---------------------------- int start() { SPoint = MarketInfo(Symbol(), MODE_POINT); spread = MarketInfo(Symbol(),MODE_SPREAD); SDigits = MarketInfo(Symbol(), MODE_DIGITS); int orders = 0; int d = 0; //check if we have a current order, if we do select it for(d = 0; d < OrdersTotal(); d++ ) { OrderSelect(d,SELECT_BY_POS); if( OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) { orders ++; break; } } //check for open order if(orders > 0) { if(eDirection == 1) { //if last candle closed below the doji low if(Close[1] < dLow) { OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Red); } } if(eDirection == -1){ //if last candle closed higher then doji high if(Close[1] > dHigh){ OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red); } } } //trade EU and US sessions only if(Hour() < TimeOpen || Hour() >= TimeClose) return(0); //check that we don't already have an order going if(orders < 1) { for(int i = 1; i < Bars; i++ ) { // if we got a doji then save the high and low if(Open[i] == Close[i]) { dHigh = High[i]; dLow = Low[i]; dBar = i; break; } } //if we had a doji within the last 3 Bars if(dBar < 4 && dBar > 1) { //did we already determine the direction/entry price? if(eDirection == 0) { //if last candle closed higher than the doji high, long is our direction if(Close[1] > dHigh) { eDirection = 1; ePrice = Close[1]; } if(Close[1] < dLow) { eDirection = -1; ePrice = Close[1]; } } } else { eDirection = 0; } //-------------------------------------------- B U Y ---------------------------------+ if(eDirection == 1 && Ask > ePrice) { //buy OrderSend(Symbol(), OP_BUY, LotsOptimized(), Ask, Slippage, CalcSlBuy(), CalcTpBuy(), ExpertName, MagicNumber,0,Blue); } if(tbt==0) { ticket=OrderSend(Symbol(), OP_BUYSTOP, LotsOptimized(), NormalizeDouble(High[1],SDigits), Slippage, NormalizeDouble((Low[1]-Spread),SDigits), CalcTpBuy(), (" "+ExpertName), 666, 0, LimeGreen); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) { tbt=ticket; Print(ticket); } else Print("Error Opening BuyStop Order: ",GetLastError()); return(0); RefreshRates(); }//end if(ticket } //------------------------------------------------- S E L L ------------------------- if(eDirection == -1 && Bid < ePrice) { //sell OrderSend(Symbol(), OP_SELL, LotsOptimized(), Bid, Slippage, CalcSlSell(), CalcTpSell(), ExpertName,MagicNumber,0,Red); } if(tst==0) { ticket=OrderSend(Symbol(), OP_SELLSTOP, LotsOptimized(), NormalizeDouble((Low[1]),SDigits), Slippage, NormalizeDouble((High[1]+Spread),SDigits), CalcTpSell(), (""+ExpertName), 222, 0, Tomato); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) { tst=ticket; Print(ticket); } else Print("Error Opening SellStop Order: ",GetLastError()); return(0); RefreshRates(); }//end if(ticket } } //--------------------------------------------------------------- PrintComments(); int c; for(c = 0; c < OrdersTotal(); c++ ) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); btsl=(Low[Lowest(NULL,0,MODE_LOW,BarsTSL,BarsShift)]-Spread); stsl=(High[Highest(NULL,0,MODE_HIGH,BarsTSL,BarsShift)]+Spread); if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY && Bid>OrderOpenPrice() && btsl>OrderStopLoss()) { OrderModify(OrderTicket(), OrderOpenPrice(), btsl, OrderTakeProfit(), Slippage, LimeGreen); } if(OrderType()==OP_SELL && Ask