Боковичок - USDCAD, AUDUSD правильная тактика

 

наблюдая за  USDCAD, AUDUSD часто вижу на малых ТФ боковое движение этих пар, вот код советника с графическим интерфейсом, но с незаконченными торговыми условиями

//+------------------------------------------------------------------+
//|                                                 bokovik v1.1.mq4 |
//|                      Copyright © 2010, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "IgorM"

extern double  PriceUp     = 0.0;
extern double  PriceDn     = 0.0;
extern double  StopLoss    = 300.0;
extern double  TakeProfit  = 0.0; // 5.0
extern double  Lot         = 0.1;
extern double  beginline   = 200;  // 20.0
extern color   col_SELL    = Red;
extern color   col_BUY     = Navy;
extern color   col_HALF    = LightGray;
extern string  Comments    = "bokovik";
extern int  Magic          = 12345;
extern double         Slippage    =30;

//_____________________________________________________________
bool HaveBuyOrder,HaveSellOrder,ready;
bool proboy_sell = false;
bool proboy_buy  = false;
bool    Sell     = true;
bool    Buy      = true;
double halfprice; 

int init()
  {
   bool proboy_sell = false;
   bool proboy_buy  = false;

   if (PriceUp == 0.0) PriceUp = Ask-beginline*Point;
   if (PriceDn == 0.0) PriceDn = Ask-2*beginline*Point;
   if(!ObjectCreate("Upline",OBJ_HLINE,0,0,0,0,0)) Print("error: can't create text_object! code #",GetLastError());
      else{
            ObjectSet("Upline",OBJPROP_PRICE1,PriceUp);
            ObjectSet("Upline",OBJPROP_PRICE2,PriceUp);
            ObjectSet("Upline",OBJPROP_COLOR,col_SELL);
           }
   if(!ObjectCreate("Dnline",OBJ_HLINE,0,0,0,0,0))Print("error: can't create text_object! code #",GetLastError());
      else{
            ObjectSet("Dnline",OBJPROP_PRICE1,PriceDn);
            ObjectSet("Dnline",OBJPROP_PRICE2,PriceDn);
            ObjectSet("Dnline",OBJPROP_COLOR,col_BUY);
           }
    halfprice  = PriceUp - ((PriceUp-PriceDn)/2);
    if(!ObjectCreate("Halfline",OBJ_HLINE,0,0,0,0,0))Print("error: can't create text_object! code #",GetLastError());
      else{
            ObjectSet("Halfline",OBJPROP_PRICE1,halfprice);
            ObjectSet("Halfline",OBJPROP_PRICE2,halfprice);
            ObjectSet("Halfline",OBJPROP_COLOR,col_HALF);
           } 
   
   
   if(!ObjectCreate("control", OBJ_LABEL, 0, 0, 0))Print("error: can't create text_object! code #",GetLastError());
      else{
            ObjectSet("control", OBJPROP_CORNER, 0 );
            ObjectSet("control",OBJPROP_XDISTANCE,30);
            ObjectSet("control",OBJPROP_YDISTANCE,40);
            ObjectSetText("control", "NO READY", 18, "Times New Roman", Red);
           }
    
   ready = false;
   orders();
   
   return(0);
  }

void orders(){
      int cnt, total = OrdersTotal();
      HaveBuyOrder  = false;
      HaveSellOrder = false;
      for(cnt = total - 1; cnt >= 0; cnt--) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {
         if (OrderType() == OP_BUY)  HaveBuyOrder = true;
         if (OrderType() == OP_SELL) HaveSellOrder = true;
      }
   }

}

int deinit()
  {
   return(0);
  }
  
  
  
int OpenBuyOrder() {
   if (!Buy) return(0);
   
   int ticket=-1;
   double SL, TP, PR;
   
   PR=NormalizeDouble(Ask,Digits);

   if(StopLoss==0){SL=0;}
  else{
    SL=PR-StopLoss*Point;
    SL=NormalizeDouble(SL,Digits);
  }
   if(TakeProfit==0){TP=0;}
  else{
    TP=PR+TakeProfit*Point;
    TP=NormalizeDouble(TP,Digits);
  }
   ticket = OrderSend(Symbol(),OP_BUY, Lot, PR, Slippage, SL, TP, Comments+"_"+TimeToStr(TimeLocal(),TIME_SECONDS ), Magic, 0, Blue);
   
   if (ticket > 0) {
      
      HaveBuyOrder = true;
      if (OrderSelect(ticket, SELECT_BY_TICKET,MODE_TRADES)) {
         Print("BUY order opened : ", OrderOpenPrice());
      }
   }
   else Print("Ошибка № ",  GetLastError(), " при открытиии BUY ордера ",MarketInfo(Symbol(),MODE_ASK));
   return(0);
}

//--------------------
int OpenSellOrder() {
   if (!Sell) return(0);
   
   int ticket=-1;
   double SL, TP, PR;
   
   PR=NormalizeDouble(Bid,Digits);
  if(StopLoss==0){SL=0;}
  else{
    SL=PR+StopLoss*Point;
    SL=NormalizeDouble(SL,Digits);
  }
  if(TakeProfit==0){TP=0;}
  else{
    TP=PR-TakeProfit*Point;
    TP=NormalizeDouble(TP,Digits);
  }
   ticket = OrderSend(Symbol(), OP_SELL, Lot, PR, Slippage, SL, TP, Comments+"_"+TimeToStr(TimeLocal(),TIME_SECONDS ), Magic, 0, Red);
   
   if (ticket > 0) {
      
      HaveSellOrder = true;
      if (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) {
         Print("SELL order opened : ", OrderOpenPrice());
      }
      
   }
   else Print("Ошибка № ",  GetLastError(), " при открытиии SELL ордера ",MarketInfo(Symbol(),MODE_ASK));
      
   
   return(0);
}

int start()
  {double TP;
   double Ycontrol   = ObjectGet("control",OBJPROP_YDISTANCE);
   double sellprice  = ObjectGet("Upline",OBJPROP_PRICE1);
   double buyprice   = ObjectGet("Dnline",OBJPROP_PRICE1);
   halfprice  = sellprice - ((sellprice-buyprice)/2); 
   if (TakeProfit == 0) TP = MathRound((sellprice-halfprice)/Point); else TP = TakeProfit;
   Comment("При пробое сверху ",sellprice, " ТР =",TP, " до ",halfprice," пробой сверху= ",proboy_sell," пробой снизу =",proboy_buy);
   ObjectSet("Halfline",OBJPROP_PRICE1,halfprice);
   ObjectSet("Halfline",OBJPROP_PRICE2,halfprice);
   if (Ycontrol <200) {ready = false; ObjectSetText("control", "NO READY", 18, "Times New Roman", Red);}
         else {ready = true; ObjectSetText("control", "START, Halfprice= "+DoubleToStr(halfprice,4), 18, "Times New Roman", Green);orders();}

   if (ready){
      
      // ждем пробоя или сверху или снизу:
      //1. если цена ниже линии Sell и цена выше линии Buy и цена выше середины пробой сверху
      //2. если цена выше линии Buy и цена ниже линии Sell и цена ниже середины пробой снизу
      if ((Ask < sellprice) && (Ask > buyprice) &&(Ask >halfprice)) {proboy_sell = true; proboy_buy = false;}
      if ((Ask > buyprice) && (Ask < sellprice) &&(Ask <halfprice)) {proboy_buy = true; proboy_sell = false;}
      
      // если нет выставленных ордеров то по пробою выставляем TakeProfit и открываем ордер
      if (!HaveSellOrder && !HaveBuyOrder ){
            if (!HaveSellOrder && Sell&& proboy_sell){ if (TakeProfit == 0) TakeProfit=TP; OpenSellOrder();}
            if (!HaveBuyOrder  && Buy && proboy_buy) { if (TakeProfit == 0) TakeProfit=TP; OpenBuyOrder(); }
      }   
      
      // если есть ордер то определяем в какую сторону был пробой
      if (HaveSellOrder || HaveBuyOrder ){
         // если пробой сверху то запрещаем Buy
         if (proboy_sell && !proboy_buy) Buy = false;
         //если пробой снизу то запрещаем Sell
         if (!proboy_sell && proboy_buy) Sell = false;
      
      }  
    }
    
   return(0);
  }

для работы советника необходимо выделить левым кликом линии цены и переместить на предполагаемый уровень, потом надпись  "NO READY" также кликнуть и переместить в нижнюю часть графика для начала работы советника - шаблон готов для 5-ти знака

ПРОБЛЕМА: выработка правильной ТС для   USDCAD, AUDUSD