//+------------------------------------------------------------------+ //| ross-exp.mq4 | //| Copyright 2005, Nick Bilak, beluck[AT]gmail.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2005, Nick Bilak" #property link "http://metatrader.50webs.com/" #include extern int myMagic = 20051203; extern double AllProfit = 100; extern double AllLoss = 50; extern double TakeProfit = 100; extern double StopLoss = 40; extern double TrailingStop = 15; extern int slippage=2; //slippage for market order processing extern int shift=0; //shift to current bar, extern double Lots = 0.1; extern int AOLongLevel=60; extern int AOShortLevel=-30; extern int OrderTriesNumber=5; bool buysig1,sellsig1,buysig2,sellsig2,buysig3,sellsig3,closeall,closeloss,closebuy,closesell; int lastsig,last,tries,a1,a2,a3,a4; double openPrice1,openPrice2,openPrice3; double openProfit,openLoss; //+------------------------------------------------------------------+ //| Calculate open positions | //+------------------------------------------------------------------+ int CalculateCurrentOrders() { int orders; openProfit=0; openLoss=0; for(int i=0;i0) openProfit+=OrderProfit(); else openLoss+=-OrderProfit(); } } return(orders); } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ void CheckForSignals() { double ao1=iAO(NULL,0,shift); double ao2=iAO(NULL,0,shift+1); double ao3=iAO(NULL,0,shift+2); double ao4=iAO(NULL,0,shift+3); double ao5=iAO(NULL,0,shift+4); buysig1=false; buysig2=false; buysig3=false; sellsig1=false; sellsig2=false; sellsig3=false; if ((ao1>AOLongLevel*Point && ao2<=AOLongLevel*Point) || (ao1>AOShortLevel*Point && ao2<=AOShortLevel*Point)) { if (a1!=Time[0]) { Alert(Symbol()+Period()+" 0.AO - level cross up"); a1=Time[0]; } } if ((ao2>AOLongLevel*Point && ao3<=AOLongLevel*Point) || (ao2>AOShortLevel*Point && ao3<=AOShortLevel*Point) && ao1>ao2) { if (a2!=Time[0]) { Alert(Symbol()+Period()+" 1.AO-enter long 1 lot"); a2=Time[0]; } buysig1=true; } if ((ao3>AOLongLevel*Point && ao4<=AOLongLevel*Point) || (ao3>AOShortLevel*Point && ao4<=AOShortLevel*Point) && ao2>ao3 && ao1>ao2 && Bid-openPrice1>0.0) { if (a3!=Time[0]) { Alert(Symbol()+Period()+" 2.AO-enter long 2 lots"); a3=Time[0]; } buysig2=true; } if ((ao4>AOLongLevel*Point && ao5<=AOLongLevel*Point) || (ao4>AOShortLevel*Point && ao5<=AOShortLevel*Point) && ao3>ao4 && ao2>ao3 && ao1>ao2 && Bid-openPrice2>0.0) { if (a4!=Time[0]) { Alert(Symbol()+Period()+" 3.AO-enter long 1 lot"); a4=Time[0]; } buysig3=true; } if ((ao1=AOLongLevel*Point) || (ao1=AOShortLevel*Point)) { if (a1!=Time[0]) { Alert(Symbol()+Period()+" 0.AO - level cross down"); a1=Time[0]; } } if ((ao2=AOLongLevel*Point) || (ao2=AOShortLevel*Point) && ao1=AOLongLevel*Point) || (ao3=AOShortLevel*Point) && ao20.0) { if (a3!=Time[0]) { Alert(Symbol()+Period()+" 2.AO-enter short 2 lots"); a3=Time[0]; } sellsig2=true; } if ((ao4=AOLongLevel*Point) || (ao4=AOShortLevel*Point) && ao30.0) { if (a4!=Time[0]) { Alert(Symbol()+Period()+" 3.AO-enter short 1 lot"); a4=Time[0]; } sellsig3=true; } closeall=false; closeloss=false; if (openProfit>AllProfit) closeall=true; if (openLoss>AllLoss) closeloss=true; } void CheckForOpen() { int res,tr; //---- buy conditions if(CalculateCurrentOrders()==0 && buysig1 && last!=Time[0]) { res=0; tries=0; while (res<=0 && tries0) { last=Time[0]; openPrice1=Ask; } return; } if(CalculateCurrentOrders()==1 && buysig2 && last!=Time[0]) { res=0; tries=0; while (res<=0 && tries0) { last=Time[0]; openPrice2=Ask; } return; } if(CalculateCurrentOrders()==2 && buysig3 && last!=Time[0]) { res=0; tries=0; while (res<=0 && tries0) { last=Time[0]; openPrice3=Ask; } return; } //---- sell conditions if(CalculateCurrentOrders()==0 && sellsig1 && last!=Time[0]) { res=0; tries=0; while (res<=0 && tries0) { last=Time[0]; openPrice1=Bid; } return; } if(CalculateCurrentOrders()==1 && sellsig2 && last!=Time[0]) { res=0; tries=0; while (res<=0 && tries0) { last=Time[0]; openPrice2=Bid; } return; } if(CalculateCurrentOrders()==2 && sellsig3 && last!=Time[0]) { res=0; tries=0; while (res<=0 && tries0) { last=Time[0]; openPrice3=Bid; } return; } } //+------------------------------------------------------------------+ //| Check for close order conditions | //+------------------------------------------------------------------+ void CheckForClose() { bool bres; int tr; for(int i=0;i 2 ) { for (int i = 0; i < OrdersTotal(); i++) { if ( OrderSelect (i, SELECT_BY_POS) == false ) continue; if ( OrderSymbol() != Symbol() || OrderMagicNumber() != myMagic ) continue; if ( OrderType() == OP_BUY ) { if ( Bid < OrderOpenPrice()+TrailingStop*Point ) continue; StopLoss = Bid-TrailingStop*Point; if ( StopLoss > OrderStopLoss() ) { tr=0; while(tr<7 && !IsTradeAllowed()) { tr++; Sleep(5000); } bres=OrderModify (OrderTicket(), OrderOpenPrice(), StopLoss, OrderTakeProfit(), 0, White); Sleep(3000); if (!bres) Print("Error Modifying BUY order : ",ErrorDescription(GetLastError())); } } if ( OrderType() == OP_SELL ) { if ( Ask > OrderOpenPrice()-TrailingStop*Point ) continue; StopLoss = Ask+TrailingStop*Point; if ( StopLoss < OrderStopLoss() ) { tr=0; while(tr<7 && !IsTradeAllowed()) { tr++; Sleep(5000); } bres=OrderModify (OrderTicket(), OrderOpenPrice(), StopLoss, OrderTakeProfit(), 0, Gold); Sleep(3000); if (!bres) Print("Error Modifying SELL order : ",ErrorDescription(GetLastError())); } } } } return; } void start() { //---- check for history and trading if(Bars<100 || IsTradeAllowed()==false) return; //---- check for signals CheckForSignals(); //---- calculate open orders by current symbol if (CalculateCurrentOrders()<3) CheckForOpen(); if (CalculateCurrentOrders()>0) CheckForClose(); TickTrailing(); TrailStop(); } //+------------------------------------------------------------------+