Jump to content
Sign in to follow this  
brokers14

Доработка советника

Recommended Posts

brokers14

Здравствуйте. Помогите прописать условие правильно:

 

- цена ниже нижней границы канала

- после пробития канала УЖЕ был должный сигнал

- цена достигла минимального Low после выхода из канала, отмеченного ранее сигналом

- границы канала (и центральная) не меняли направление 

 

Код советника:

 
#define MAGIC 29062006
 
//Параметры индикатора
extern string  Indicator_File = "3 in 1 Alert";      //Индикатор 3 in 1 Alert
extern int     HalfLength     = 48;                  //Период
//extern int   MA_MODE        = 0;
extern int     PRICE_MODE     = 0;                   //Тип цены
extern int     ATR_PERIOD     = 100;                 //Период ATR
extern double  K              = 2.0;                 //Ширина канала
//extern bool  ATR_MODE       = false;
 
//Параметры эксперта
extern string  Ekspert        = "ArrowK";            //Эксперт ArrowK
extern int     RiskMax        = 10;                  //Максимальный риск (%)
extern double  LotsMax        = 0.01;                //Максимальный размер лота  
extern int     DecreaseFactor = 6;
input bool     stoploss       = false;                //СтопЛосс разрешен
extern int     StopLoss       = 100;                 //СтопЛосс
input bool     trail          = false;                //Трейлингстоп разрешен
extern int     TrailingStop   = 200;                 //Размер стоп ордера 
extern int     TrailingStep   = 100;                 //Шаг перемещения 
extern bool   AutoClose =true;//выключатель
 
double Al_1,Al_2,Al_3,Al_4,Al_5,sl;
//+------------------------------------------------------------------+
//Расчет оптимального размера лота  
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);
}
//+------------------------------------------------------------------+
int start()
  {
   int cnt, ticket;
   int total=OrdersTotal();
 
   if(Bars<100)
     {
      Print("Количество баров меньше 100");
      return(0);  
     }
     
   Al_1=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,0,0);
   Al_2=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,1,0);
   Al_3=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,2,0);
   Al_4=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,3,0);
   Al_5=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,4,0);
   
   if(!symbolOrders())
     {
      if(AccountFreeMargin()<(1000*LotsOptimized()))
        {
         Print("У Вас недостаточно денег. Свободной маржи = ", AccountFreeMargin());
         return(0);
        }
      if(Al_1>=Al_2)
        {
         if(!IsTradeAllowed())
           {
            Print("BUY: Торговый поток занят.");
            return(0);
           } 
         if(!stoploss) sl=NULL; else sl=NormalizeDouble(Ask-StopLoss*Point,Digits); 
         {       
         ticket=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,sl,0,"",MAGIC,0,CLR_NONE);
         }
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
              {
               Print("Открыта позиция на покупку по сигналу BUY: ",OrderOpenPrice());
              }
            else
              {
               Print("Ошибка открытия позиции на покупку по сигналу BUY: ",GetLastError());
               return(0);
              }
           }         
        }
             
      if(Al_3<=Al_2)
        {
         if(!IsTradeAllowed())
           {
            Print("SELL: Торговый поток занят.");
            return(0);
           }
         if(!stoploss) sl=NULL; else sl=NormalizeDouble(Bid+StopLoss*Point,Digits);
         {   
         ticket=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,sl,0,"",MAGIC,0,CLR_NONE);
         }
         if(ticket>0)
           {
           if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
              {
               Print("Открыта позиция на продажу по сигналу SELL: ",OrderOpenPrice());
              }
            else
              {
               Print("Ошибка открытия позиции на продажу по сигналу SELL: ",GetLastError());
               return(0);
              }
           }
        }
     }
     
  //********* Закрытие позиций ****************************************
if (AutoClose) {  
//----переменные для закрытия позиций ----
   Al_1=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,0,0);
   Al_2=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,1,0);
   Al_3=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,2,0);
   Al_4=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,3,0);
   Al_5=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,4,0);
//----------------------------------------------------------------------
  for (int v=0; v<OrdersTotal(); v++)                             {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==MAGIC)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if
          (Al_3<=Al_2)     {
           OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим
                }       
     }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if  
          (Al_1>=Al_2)   {
                 OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим
                }       
     }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
//+------------------------------------------------------------------+
  if(trail==true)
     {
      Trailling();
     }
//+------------------------------------------------------------------+     
   return(0);
  }
 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×