//+------------------------------------------------------------------+ #define MAGICCE 20131111 //--- Inputs input double Lots =0.01; input double MaximumRisk =0.0001; input double DecreaseFactor=3; input int PrPeriod = 5; double CEB, CER, CEY, CEX, O1, OE1, C1, CE1, O2, OE2, C2, CE2, O3, OE3, C3, CE3, O4, OE4, C4, CE4, O5, OE5, C5, CE5, PipFact = 1; //+------------------------------------------------------------------+ void init() { if(Digits == 3 || Digits ==5) PipFact = 10; return; } //+------------------------------------------------------------------+ void start() { if(Bars<100 || IsTradeAllowed()==false) return; O1 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,3,1); C1 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,2,1); O2 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,3,2); C2 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,2,2); O3 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,3,3); C3 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,2,3); O4 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,3,4); C4 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,2,4); O5 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,3,5); C5 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,2,5); OE1 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,3,1); CE1 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,2,1); OE2 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,3,2); CE2 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,2,2); OE3 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,3,3); CE3 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,2,3); OE4 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,3,4); CE4 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,2,4); OE5 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,3,5); CE5 = iCustom(NULL,PrPeriod,"AllHeikin-Ashi_v2.3 600+",0,40,23,0,true, "Alerts ",0,5,5,"alert.wav","alert2.wav",0,1,2,5); //--- calculate open orders by current symbol if(CalculateCurrentOrders(Symbol())==0) CheckForOpen(); else { CheckForClose(); CheckForOpen(); } //--- // Comment("B= ", DoubleToStr(CEB, 1), "\nR+ ", DoubleToStr(CER, 1), "\nY= ", DoubleToStr(CEY, 1)); return; } //+------------------------------------------------------------------+ void CheckForOpen() { int res; //--- go trading only for first tiks of new bar if(Volume[0]>1) return; //--- get Moving Average CEB =iCustom(NULL,PrPeriod,"Currencies_Enter Origin",0,2); CER =iCustom(NULL,PrPeriod,"Currencies_Enter Origin",1,2); CEY =iCustom(NULL,PrPeriod,"Currencies_Enter Origin",2,1); //--- buy conditions if (((O4>C4 && O3>C3 && O2C5 && O4C3 && O2C4 && O3>C3 && O2C5 && O4C3 && O2C2 && O1>C1) || (O5C4 && O3C2 && O1>C1)) && CEB==EMPTY_VALUE && CEY==EMPTY_VALUE) { res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,Ask-12*Point*PipFact,"",MAGICCE,0,clrRed); return; } if (((O4C2 && O1>C1) || (O5C4 && O3C2 && O1>C1)) && CEB ==EMPTY_VALUE && CEY !=EMPTY_VALUE) { res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,Ask-25*Point*PipFact,"",MAGICCE,0,clrRed); return; } } //+------------------------------------------------------------------+ void CheckForClose() { //--- go trading only for first tiks of new bar if(Volume[0]>1) return; //--- get Moving Average CEX =iCustom(NULL,PrPeriod,"Currencies_Enter Origin",0,0,0,2,0); //--- for(int i=0;iCE2 && OE1>CE1) || (OE5CE4 && OE3CE2 && OE1>CE1)) || CEX !=EMPTY_VALUE) { if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White)) Print("OrderClose error ",GetLastError()); } break; } if(OrderType()==OP_SELL) { if (((OE4>CE4 && OE3>CE3 && OE2CE5 && OE4CE3 && OE20) return(buys); else return(-sells); } //+------------------------------------------------------------------+ //| Calculate optimal lot size | //+------------------------------------------------------------------+ double LotsOptimized() { double lot=Lots; int orders=HistoryTotal(); // history orders total int losses=0; // number of losses orders without a break //--- select lot size lot = NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1); //--- calcuulate number of losses orders without a break 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); } //--- return lot size if(lot<0.01) lot=0.01; return(lot); }