//+------------------------------------------------------------------+ //| EMA.mq4 | //| Âèêòîð ×åáîòàð¸â | //| http://www.chebotariov.co.ua/ | //+------------------------------------------------------------------+ #property copyright "Âèêòîð ×åáîòàð¸â" #property link "http://www.chebotariov.co.ua/" #define MAGIC 31052006 extern int ShortEma = 4; // Ïåðèîä êîðîòêîé MA extern int ShortEma2 = 11; // Ïåðèîä âòîðîé êîðîòêîé MA extern int LongEma = 16; // Ïåðèîä äëèííîé MA extern int ShiftEma = 1; extern int RiskMax=45; extern double LotsMax=90.0; extern int DecreaseFactor=6; extern int TakeProfit=60; extern int StopLoss=80; extern int TrailingStop=40; //+------------------------------------------------------------------+ //| Ðàñ÷åò îïòèìàëüíîãî ðàçìåðà ëîòà | //+------------------------------------------------------------------+ double LotsOptimized() { //---- double Lots=NormalizeDouble(AccountBalance()*RiskMax/(100000.0*Ask),1); if(AccountFreeMargin()<(1000*Ask*Lots)) { Lots=NormalizeDouble(AccountFreeMargin()*RiskMax/(100000.0*Ask),1); } if(Lots>LotsMax) { Lots=LotsMax; Print("Ïðåâûøåí ìàêñèìàëüíûé ðàçìåð ëîòà. Ðàçìåð ëîòà èçìåíåí íà ",LotsMax); } int orders=HistoryTotal(); int losses=0; if(DecreaseFactor>0) { for(int i=orders-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Îøèáêà â èñòîðèè!"); break; } if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGIC || OrderType()>OP_SELL)continue; if(OrderProfit()>0) break; if(OrderProfit()<0) losses++; } if(losses>1) { Lots=NormalizeDouble(Lots/(DecreaseFactor*losses),1); } } if(Lots<MarketInfo(Symbol(),MODE_MINLOT)) { Lots=MarketInfo(Symbol(),MODE_MINLOT); } double raznica = MathMod(Lots,MarketInfo(Symbol(),MODE_LOTSTEP)); if(raznica>0.0) { Lots -= raznica; } //---- return(Lots); } //+------------------------------------------------------------------+ bool symbolOrders() { //---- int orders = OrdersTotal(); for(int i=orders-1; i>=0; i--) { if(!OrderSelect(i, SELECT_BY_POS )) { Print("OrderSelect( ", i, ", SELECT_BY_POS ) - Error #", GetLastError()); continue; } if(OrderSymbol()==Symbol()) { if(OrderMagicNumber()==MAGIC) { return(true); } } } //---- return(false); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- int cnt, ticket; int total=OrdersTotal(); if(Bars<100) { Print("Êîëè÷åñòâî áàðîâ ìåíüøå 100"); return(0); } if(TakeProfit<10 && TakeProfit>0) { TakeProfit=10; Print("Ðàçìåð TakeProfit áûë ìåíüøå 10, ïîýòîìó èçìåíåí íà 10"); } double SEma0 = iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,0); double SEma1 = iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,ShiftEma); double SEma02 = iMA(NULL,0,ShortEma2,0,MODE_EMA,PRICE_CLOSE,0); double SEma12 = iMA(NULL,0,ShortEma2,0,MODE_EMA,PRICE_CLOSE,ShiftEma); double LEma0 = iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,0); double LEma1 = iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,ShiftEma); if(!symbolOrders()) { if(AccountFreeMargin()<(1000*LotsOptimized())) { Print("Ó Âàñ íåäîñòàòî÷íî äåíåã. Ñâîáîäíîé ìàðæè = ", AccountFreeMargin()); return(0); } if(SEma0>LEma0 && SEma02<SEma0 && SEma12>SEma1) { if(!IsTradeAllowed()) { Print("AD BUY: Òîðãîâûé ïîòîê çàíÿò."); return(0); } ticket=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"EMA BUY",MAGIC,0,CLR_NONE); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) { Print("Îòêðûòà ïîçèöèÿ íà ïîêóïêó ïî ñèãíàëó EMA BUY: ",OrderOpenPrice()); } else { Print("Îøèáêà îòêðûòèÿ ïîçèöèè íà ïîêóïêó ïî ñèãíàëó EMA BUY: ",GetLastError()); return(0); } } } if(SEma0<LEma0 && SEma02>SEma0 && SEma12<SEma1) { if(!IsTradeAllowed()) { Print("EMA SELL: Òîðãîâûé ïîòîê çàíÿò."); return(0); } ticket=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"EMA SELL",MAGIC,0,CLR_NONE); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) { Print("Îòêðûòà ïîçèöèÿ íà ïðîäàæó ïî ñèãíàëó EMA SELL: ",OrderOpenPrice()); } else { Print("Îøèáêà îòêðûòèÿ ïîçèöèè íà ïðîäàæó ïî ñèãíàëó EMA SELL: ",GetLastError()); return(0); } } } } for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) { if(OrderType()==OP_BUY) { if(SEma0<LEma0 && SEma02>SEma0 && SEma12<SEma1) { if(!IsTradeAllowed()) { Print("Order ñlose: Òîðãîâûé ïîòîê çàíÿò."); return(0); } OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE); return(0); } if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { if(!IsTradeAllowed()) { Print("Trailing stop: Òîðãîâûé ïîòîê çàíÿò."); return(0); } OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,CLR_NONE); return(0); } } } } else { if(SEma0>LEma0 && SEma02<SEma0 && SEma12>SEma1) { if(!IsTradeAllowed()) { Print("Order ñlose: Òîðãîâûé ïîòîê çàíÿò."); return(0); } OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE); return(0); } if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { if(!IsTradeAllowed()) { Print("Trailing stop: Òîðãîâûé ïîòîê çàíÿò."); return(0); } OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,CLR_NONE); return(0); } } } } } } //---- return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Indicator Curves created:
Indicators Used:
Moving average indicator
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It automatically opens orders when conditions are reached
It Closes Orders by itself
It can change open orders parameters, due to possible stepping strategy
Other Features: