//+------------------------------------------------------------------+ //| | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ extern double Lots = 0.1; extern double MaximumRisk = 0.2; extern double DecreaseFactor = 3; extern int SL = 100; extern int TP = 100; extern double PeriodRSI = 4; extern double StohK1 = 10; extern double StohD1 = 4; extern double StohSlow1 = 4; extern double StohK2 = 10; extern double StohD2 = 4; extern double StohSlow2 = 4; extern double Control_period = 60; extern int MAGICMA = 984184; //double st1,st2; //+------------------------------------------------------------------+ //| Calculate open positions | //+------------------------------------------------------------------+ int CalculateCurrentOrders(string symbol) { int buys=0,sells=0; //---- for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) buys++; if(OrderType()==OP_SELL) sells++; } } //---- return orders volume if(buys>0) 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,2); //---- 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.1) lot=0.1; return(lot); } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ void CheckForOpen() { int res; if(Volume[0]>1) return; {//---- ïîêóïàåì ----------------------- if (iStochastic(NULL,Control_period,StohK2,StohD2,StohSlow2,MODE_EMA,0,MODE_SIGNAL,0)>iStochastic(NULL,Control_period,StohK2,StohD2,StohSlow2,MODE_EMA,0,MODE_SIGNAL,1)) // if (iStochastic(NULL,0,StohK2,StohD2,StohSlow2,MODE_EMA,0,MODE_MAIN,0)>iStochastic(NULL,0,StohK2,StohD2,StohSlow2,MODE_EMA,0,MODE_SIGNAL,0)) if ((iRSI(NULL,0,PeriodRSI,PRICE_TYPICAL,0)<20)&&(iStochastic(NULL,0,StohK1,StohD1,StohSlow1,MODE_EMA,0,MODE_MAIN,0)>iStochastic(NULL,0,StohK1,StohD1,StohSlow1,MODE_EMA,0,MODE_MAIN,1))) if (MathAbs(iStochastic(NULL,0,StohK1,StohD1,StohSlow1,MODE_EMA,0,MODE_MAIN,0)-iStochastic(NULL,0,StohK1,StohD1,StohSlow1,MODE_EMA,0,MODE_SIGNAL,0))>5) { res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask-SL*Point,Ask+TP*Point,"",MAGICMA,0,Blue); return; } } //---- ïðîäàåì ------------------------ if (iStochastic(NULL,Control_period,StohK2,StohD2,StohSlow2,MODE_EMA,0,MODE_SIGNAL,0)<iStochastic(NULL,Control_period,StohK2,StohD2,StohSlow2,MODE_EMA,0,MODE_SIGNAL,1)) if ((iRSI(NULL,0,PeriodRSI,PRICE_TYPICAL,0)>70)&&(iStochastic(NULL,0,StohK1,StohD1,StohSlow1,MODE_EMA,0,MODE_MAIN,0)<iStochastic(NULL,0,StohK1,StohD1,StohSlow1,MODE_EMA,0,MODE_MAIN,1))) if (MathAbs(iStochastic(NULL,0,StohK1,StohD1,StohSlow1,MODE_EMA,0,MODE_MAIN,0)-iStochastic(NULL,0,StohK1,StohD1,StohSlow1,MODE_EMA,0,MODE_SIGNAL,0))>5) { res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid+SL*Point,Bid-TP*Point,"",MAGICMA,0,Red); return; } }//êîíåö ïðîöåäóðû //------------Çàêðûòèå ïîçèöèé---------------------------------------- void CheckForClose2() { if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,3,White); if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,3,Blue); //CheckForOpen(); } // //+------------------------------------------------------------------+ //| Check for close order conditions | //+------------------------------------------------------------------+ void CheckForClose1() { if(Volume[0]>1) return; for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue; //---- check order type if(OrderType()==OP_BUY) { if ((iRSI(NULL,0,PeriodRSI,PRICE_TYPICAL,0)>60)&&(iStochastic(NULL,0,StohK1,StohD1,StohSlow1,MODE_EMA,0,MODE_SIGNAL,0)<iStochastic(NULL,0,StohK1,StohD1,StohSlow1,MODE_EMA,0,MODE_SIGNAL,1))) CheckForClose2(); } if(OrderType()==OP_SELL) { if ((iRSI(NULL,0,PeriodRSI,PRICE_TYPICAL,0)<40)&&(iStochastic(NULL,0,StohK1,StohD1,StohSlow1,MODE_EMA,0,MODE_SIGNAL,0)>iStochastic(NULL,0,StohK1,StohD1,StohSlow1,MODE_EMA,0,MODE_SIGNAL,1))) CheckForClose2(); } } } //+------------------------------------------------------------------+ //| Start function | //+------------------------------------------------------------------+ void start() { //---- check for history and trading if (Bars<100 || IsTradeAllowed()==false) return; //---- calculate open orders by current symbol if(CalculateCurrentOrders(Symbol())==0) CheckForOpen(); else CheckForClose1(); //---- } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains tick volumes of each bar
Indicator Curves created:
Indicators Used:
Stochastic oscillator
Relative strength index
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
Other Features: