//+------------------------------------------------------------------------+ //+ Cтратегия ориентирована на вливание в хороший движняк. + //+ Открываем каждые несколько секунд отложенные стоп-ордера в обе стороны + //+ с учётом пробоя заданного уровня в течение отведённого времени. + //+ Самый старый ордер закрывается, вместо него открывается новый... + //+ Если ордер сработал остальные закрываются. + //+------------------------------------------------------------------------+ #define MAGIC 20101012 extern double Lots = 0.01; extern bool UseRisk = true; extern double MaximumRisk = 0.1; extern double DecreaseFactor = 3; extern double Proboy = 300; extern double StopLoss = 300; extern double TakeProfit = 300; extern double TrailingStop = 100; extern int OrdersTime = 20; // общий промежуток времени выставления ряда стоп-ордеров extern int SleepTime = 5; // через сколько секунд добавлять новый ордер extern int StartHour = 10; // время (час) начала внутридневной торговли extern int EndHour = 22; // время (час) окончания внутридневной торговли datetime t; bool flag=false; int arr[300,2]; int order = 0; int MaxOrders = 0; void init() { MaxOrders = MathRound(OrdersTime / SleepTime); Print("MaxOrders = ",MaxOrders); for (int i=0; i<300; i++) { arr[i,0]=0; arr[i,1]=0; } } //+------------------------------------------------------------------+ //| считаем количество отложенных стоп ордеров | //+------------------------------------------------------------------+ int CalculateCurrentOrders1(string symbol) { int buys=0,sells=0; //---- for(int i=0;i0) return(buys); else return(-sells); } //+------------------------------------------------------------------+ //| считаем размер лота | //+------------------------------------------------------------------+ double LotsOptimized() { double lot=Lots; int orders=HistoryTotal(); // history orders total int losses=0; // number of losses orders without a break if (!UseRisk) return(Lots); //---- select lot size lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,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,2); } //---- return lot size if(lot<0.01) lot=0.01; return(lot); } //+------------------------------------------------------------------+ //| выставляем отложенные стоп-ордера | //+------------------------------------------------------------------+ void StartOpen() { if((TimeLocal()-t)0) { if(Bid-OrderOpenPrice() > TrailingStop*Point) { if(OrderStopLoss()