Скачать MetaTrader 5

учусь программировать

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Справочник MQL5 доступен на 8 языках. Изучай MQL5 на удобном тебе языке!
Mikhail Lebedev
427
Mikhail Lebedev 2016.01.04 18:37 

 Line_Sell=NormalizeDouble(ObjectGetValueByShift("TL_Sell",0),5);
   Line_Buy=NormalizeDouble(ObjectGetValueByShift("TL_Buy",0),5);
   Comment( "Line_Buy:  " + DoubleToStr( Line_Buy,5)   +   " ,  Line_Sel: "  + DoubleToStr( Line_Sell,5)   ); 
//поверить есть ли открытые ордера Buy. если нет открываем ордер когда цена будет выше линии Buy
   if(CountBuy()==0 && Line_Buy<Ask)      
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,0,0,"",Magic,0,Blue);
//поверить есть ли открытые ордера Buy. если есть закрываем ордер когда цена будет ниже линии Sell                  
    if(CountBuy()==1&& Line_Sell>Bid )   
          
        {
         for(int i=OrdersTotal()-1; i>=0;i--)
           {
            if(OrderSelect(i,SELECT_BY_POS))
              {
               if(OrderMagicNumber()==Magic && OrderType()==OP_BUY)
                  bool a=OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Black);
              }
           }
        }

//   открытие и закрытие ордеров происходит не по тем условиям что я  хотел if(CountBuy()==0 && Line_Buy<Ask)

линия Line_Buy  и Line_Sell отображается,  параметры через comment  на  0 bar показаны правельно не могу понять почему открытие и закрытие происходит не правельно подскажите что надо сделать

Mikhail Filimonov
5931
Mikhail Filimonov 2016.01.04 18:41  

Что бы код был читаемым, перед тем как его опубликовать, нужно нажать кнопочку(вверху) SRC

 Line_Sell=NormalizeDouble(ObjectGetValueByShift("TL_Sell",0),5);
   Line_Buy=NormalizeDouble(ObjectGetValueByShift("TL_Buy",0),5);
   Comment( "Line_Buy:  " + DoubleToStr( Line_Buy,5)   +   " ,  Line_Sel: "  + DoubleToStr( Line_Sell,5)   );  
//поверить есть ли открытые ордера Buy. если нет открываем ордер когда цена будет выше линии Buy
   if(CountBuy()==0 && Line_Buy<Ask)       
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,0,0,"",Magic,0,Blue);
//поверить есть ли открытые ордера Buy. если есть закрываем ордер когда цена будет ниже линии Sell                   
    if(CountBuy()==1&& Line_Sell>Bid )    
           
        {
         for(int i=OrdersTotal()-1; i>=0;i--)
           {
            if(OrderSelect(i,SELECT_BY_POS))
              {
               if(OrderMagicNumber()==Magic && OrderType()==OP_BUY)
                  bool a=OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Black);
              }
           }
        }

//   открытие и закрытие ордеров происходит не по тем условиям что я  хотел if(CountBuy()==0 && Line_Buy<Ask)
Mikhail Lebedev
427
Mikhail Lebedev 2016.01.04 18:53  
Line_Sell=NormalizeDouble(ObjectGetValueByShift("TL_Sell",0),5);
   Line_Buy=NormalizeDouble(ObjectGetValueByShift("TL_Buy",0),5);
   Comment( "Line_Buy:  " + DoubleToStr( Line_Buy,5)   +   " ,  Line_Sel: "  + DoubleToStr( Line_Sell,5)   );  
//поверить есть ли открытые ордера Buy. если нет открываем ордер когда цена будет выше линии Buy
   if(CountBuy()==0 && Line_Buy<Ask)       
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,0,0,"",Magic,0,Blue);
//поверить есть ли открытые ордера Buy. если есть закрываем ордер когда цена будет ниже линии Sell                   
    if(CountBuy()==1&& Line_Sell>Bid )    
           
        {
         for(int i=OrdersTotal()-1; i>=0;i--)
           {
            if(OrderSelect(i,SELECT_BY_POS))
              {
               if(OrderMagicNumber()==Magic && OrderType()==OP_BUY)
                  bool a=OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Black);
              }
           }
        }

//   открытие и закрытие ордеров происходит не по тем условиям что я  хотел if(CountBuy()==0 && Line_Buy<Ask)

линия Line_Buy  и Line_Sell отображается,  параметры через comment  на  0 bar показаны правельно не могу понять почему открытие и закрытие происходит не правельно подскажите что надо сделать

Alexey Kozitsyn
6372
Alexey Kozitsyn 2016.01.04 18:59  
Mikhail Lebedev:

//   открытие и закрытие ордеров происходит не по тем условиям что я  хотел if(CountBuy()==0 && Line_Buy<Ask)

линия Line_Buy  и Line_Sell отображается,  параметры через comment  на  0 bar показаны правельно не могу понять почему открытие и закрытие происходит не правельно подскажите что надо сделать

Вот у Вас условие, насколько я понимаю, что (для покупки) ордеров на покупку быть не должно и линия бай меньше аск. Дак и проверьте количество ордеров и цену линии бай. И распринтуйте. Учитесь искать ошибки сами.
Mikhail Lebedev
427
Mikhail Lebedev 2016.01.04 19:09  
int CountBuy()
  {

   int count=0;
   for(int i= OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
функция для проверки ордеров у меня работает нормально у меня не срабатывает второе условие для открытия и закрытие ордера  цена  должна пересекать трендовую линию 
Alexey Kozitsyn
6372
Alexey Kozitsyn 2016.01.06 09:36  
Mikhail Lebedev:
функция для проверки ордеров у меня работает нормально у меня не срабатывает второе условие для открытия и закрытие ордера  цена  должна пересекать трендовую линию 

Line_Sell и Line_Buy принимают осмысленные значения? 

Mikhail Lebedev
427
Mikhail Lebedev 2016.01.06 13:02  
Alexey Kozitsyn:

Line_Sell и Line_Buy принимают осмысленные значения? 

Да значения осмысленные в Commente на мониторе значение этих линий на 0 баре соотвествуют с графиком   а ордера открываются и закрываются не в момент пересечения, перепроверил все  вроде правельно, в визуальном режиме заметил что сбой происходит во время перерисовки линий

выкладываю код полностью

Mikhail Lebedev
427
Mikhail Lebedev 2016.01.06 13:03  
//|                                                      фрактал.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
input color Resistance_Color=Red;
input ENUM_LINE_STYLE Resistance_Style;
input int Resistance_Width=1;
input color Support_Color=Red;
input ENUM_LINE_STYLE Support_Style;
input int Support_Width=1;
extern double Lots      = 0.1;
extern int TakeProfit   = 50;
extern int  StopLoss    = 50;
extern int ProfitSeriya = 5;
extern int Profit       = 5;
//extern int Step         = 50;
extern int filtr        =4;
extern int slippage     = 5;
double TP,price,lastlot,Pr,SL;
int ticket,Magic=123;


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(0,"TL_Resistance"); //удаляем линию сопротевления на текущем графике
   ObjectDelete(0,"TL_Support");    //удаляем линию поддержки на текущем графике
   ObjectDelete(0,"TL_Buy");    //удаляем линию поддержки на текущем графике
   ObjectDelete(0,"TL_Sell");    //удаляем линию поддержки на текущем графике
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---объявление переменных
   
   int n,UpperFractal_1=0,UpperFractal_2=0,LowerFractal_1=0,LowerFractal_2=0;
   double UpperPrice_1=0,UpperPrice_2=0,LowerPrice_1=0,LowerPrice_2=0,low_1,high_1 ,Line_Buy=0,Line_Sell=0;
   low_1=iLow(Symbol(),PERIOD_CURRENT,1);
   high_1=iHigh(Symbol(),PERIOD_CURRENT,1);
 
//--- находим индекс бара первого ближайшего верхнего фрактала
   for(n=0; n<(Bars-1);n++)
     {
      if(iFractals(Symbol(),PERIOD_CURRENT,MODE_UPPER,n)!=NULL)
         break;
      UpperFractal_1=n+1;
      UpperPrice_1=iHigh(Symbol(),PERIOD_CURRENT,UpperFractal_1);
      
     }
//--- находим индекс бара второго ближайшего верхнего фрактала
   for(n=UpperFractal_1+1; n<(Bars-1);n++)
     {
      if(iFractals(Symbol(),PERIOD_CURRENT,MODE_UPPER,n)!=NULL)
         break;
      UpperFractal_2=n+1;
      UpperPrice_2=iHigh(Symbol(),PERIOD_CURRENT,UpperFractal_2);
     }
//--- находим индекс бара первого ближайшего нижнего фрактала
   for(n=0; n<(Bars-1);n++)
     {
      if(iFractals(Symbol(),PERIOD_CURRENT,MODE_LOWER,n)!=NULL)
         break;
      LowerFractal_1=n+1;
      LowerPrice_1=iLow(Symbol(),PERIOD_CURRENT,LowerFractal_1);
     }
//--- находим индекс бара второго ближайшего нижнего фрактала
   for(n=LowerFractal_1+1; n<(Bars-1);n++)
     {
      if(iFractals(Symbol(),PERIOD_CURRENT,MODE_LOWER,n)!=NULL)
         break;
      LowerFractal_2=n+1;
      LowerPrice_2=iLow(Symbol(),PERIOD_CURRENT,LowerFractal_2);
     }
     
//-- Этап 1. Определение временного значения экстремума на  таймфрейме:     
//--- определение времени фракталов
   datetime UpFractalTime_1=iTime(Symbol(),PERIOD_CURRENT,UpperFractal_1);
   datetime UpFractalTime_2=iTime(Symbol(),PERIOD_CURRENT,UpperFractal_2);
   datetime LowFractalTime_1=iTime(Symbol(),PERIOD_CURRENT,LowerFractal_1);
   datetime LowFractalTime_2=iTime(Symbol(),PERIOD_CURRENT,LowerFractal_2);
   datetime time=iTime(Symbol(),PERIOD_CURRENT,0);
   datetime time_1=iTime(Symbol(),PERIOD_CURRENT,1);
   datetime time_2=iTime(Symbol(),PERIOD_CURRENT,2);
   

//--- создание линии поддержки

  // ObjectCreate(0,"TL_Support",OBJ_TREND,0,LowFractalTime_2,LowerPrice_2,
              //  LowFractalTime_1,LowerPrice_1);
   ObjectCreate(0,"TL_Buy",OBJ_TREND,0,LowFractalTime_2,LowerPrice_2,
                time_1,high_1);
               
//--- цвета линии поддержки             
   ObjectSet("TL_Buy",OBJPROP_COLOR,clrYellow);                          
   ObjectSet("TL_Support",OBJPROP_COLOR,Support_Color);
  // ObjectSet("TL_Support",OBJPROP_STYLE,Support_Style);
  // ObjectSet("TL_Support",OBJPROP_WIDTH,Support_Width);
//--- создание линии сопротивления
  // ObjectCreate(0,"TL_Resistance",OBJ_TREND,0,UpFractalTime_2,UpperPrice_2,
            //    UpFractalTime_1,UpperPrice_1);
   ObjectCreate(0,"TL_Sell",OBJ_TREND,0,UpFractalTime_2,UpperPrice_2,
                time_1,low_1);
//--- цвета линии сопротивления                
   ObjectSet("TL_Sell",OBJPROP_COLOR,clrYellow);                          
   ObjectSet("TL_Resistance",OBJPROP_COLOR,Resistance_Color);
  // ObjectSet("TL_Resistance",OBJPROP_STYLE,Resistance_Style);
  // ObjectSet("TL_Resistance",OBJPROP_WIDTH,Resistance_Width);
//--- перерисовка линии поддержки
//--- записываем значения временных координат линии поддержки в переменные
  // string TL_Suppor=(string)TL_Support;
   datetime TL_TimeLow2=(datetime)ObjectGet("TL_Support",OBJPROP_TIME2);// устанавливаем вторую координату времени линии поддержки
   datetime TL_TimeLow1=(datetime)ObjectGet("TL_Support",OBJPROP_TIME1); // устанавливаем первую координату времени линии поддержки
   datetime TL_Time1=(datetime)ObjectGet("TL_Buy",OBJPROP_TIME1);      // устанавливаем первую координату времени линии Buy
   datetime TL_Time2=(datetime)ObjectGet("TL_Buy",OBJPROP_TIME2);  // устанавливаем вторую координату времени линии Buy     
//---если координаты линии не совпадают с текущими
   if(TL_TimeLow2!=LowFractalTime_1 && TL_TimeLow1!=LowFractalTime_2)
   /*вторая координата времени линии поддержки не равно второму времени N-точки привязки
    и первая координату времени линии поддержки не равно первому времени N-точки привязки*/
   
     {
      //---удаляем линию
      ObjectDelete(0,"TL_Support");
     }
   if( TL_Time2!=time_1 )
    /*вторую координату времени линии поддержки не равно второму времени N-точки привязки*/
     {
      //---удаляем линию
      ObjectDelete(0,"TL_Buy");
     }  
//--- перерисовка линии сопротивления
//--- записываем значения временных координат линии сопротивления в переменные
   datetime TL_TimeUp2=(datetime)ObjectGet("TL_Resistance",OBJPROP_TIME2);
   datetime TL_TimeUp1=(datetime)ObjectGet("TL_Resistance",OBJPROP_TIME1);
   datetime TL_TimeS1=(datetime)ObjectGet("TL_Sell",OBJPROP_TIME1);
   datetime TL_TimeS2=(datetime)ObjectGet("TL_Sell",OBJPROP_TIME2);
//--- если координаты линии не совпадают с текущими
   if(TL_TimeUp2!=UpFractalTime_1 && TL_TimeUp1!=UpFractalTime_2)
     {
      //--- удаляем линию
      ObjectDelete(0,"TL_Resistance");
     }
    if(TL_TimeS2!=time_1 )
     {
      //--- удаляем линию
     ObjectDelete(0,"TL_Sell");
     }  
//--- контроль загруженности баров в истории
   if(UpperFractal_1==-1 || UpperFractal_2==-1
      || LowerFractal_1==-1 || LowerFractal_2==-1)
     {
      Alert("Для корректной работы недостаточно загружена история!");
     }
     
 
   
   Line_Sell=ObjectGetValueByShift("TL_Sell",0);
   Line_Buy=ObjectGetValueByShift("TL_Buy",0);
  Comment( "Line_Buy:  " + DoubleToStr( Line_Buy,5)   +   " ,  Line_Sel: "  + DoubleToStr( Line_Sell,5)   );  
//поверить есть ли открытые ордера Buy. если нет открываем ордер когда цена будет выше линии Buy
   if(CountBuy()==0 && Line_Buy<Ask )        
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,0,0,"",Magic,0,Blue);
         
//поверить есть ли открытые ордера Buy. если есть закрываем ордер когда цена будет ниже линии Sell                   
    if(CountBuy()==1  &&  Line_Sell>Bid )    
           
        {
         for(int i=OrdersTotal()-1; i>=0;i--)
           { 
            if(OrderSelect(i,SELECT_BY_POS))
              {
               if(OrderMagicNumber()==Magic && OrderType()==OP_BUY)
                  bool a=OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Black);
              }
           }
        }
     
   
  if(CountSell()==0&& Line_Sell>Bid )  
    
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,slippage,0,0,"",Magic,0,Red);
     
   
   if(CountSell()==1&& Line_Buy<Ask)
        
        {
         for(int i=OrdersTotal()-1; i>=0;i--)
           {
            if(OrderSelect(i,SELECT_BY_POS))
              {
               if(OrderMagicNumber()==Magic && OrderType()==OP_SELL)

                  bool x=OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Black);
              }
           }
        }
     

  }
//+------------------------------------------------------------------+



int CountBuy()
  {

   int count=0;
   for(int i= OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int CountSell()
  {

   int count=0;
   for(int i= OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_SELL)
               count++;
           }
        }
     }
   return(count);
  }

//+------------------------------------------------------------------+

Alexey Kozitsyn
6372
Alexey Kozitsyn 2016.01.06 16:13  
Mikhail Lebedev:
На словах, без кода, напишите, что Вы хотите увидеть. Как должен работать советник?
Mikhail Lebedev
427
Mikhail Lebedev 2016.01.06 16:36  

рисуем трендовую линию от верхнего фракала через минимум последнего закрытого бара линию селл 

на нулевом баре отслеживаем цену если цена пересекла опустилась ниже линии селл открываем ордер селл а ордер бай закрываем

аналогично и линией бай если цена пересекла поднялась выше линии бай открываем ордер бай а ордер  селл закрываем

вот и все без всяких дополнительных условий

Alexey Viktorov
6704
Alexey Viktorov 2016.01.06 18:06  
Mikhail Lebedev:

рисуем трендовую линию от верхнего фракала через минимум последнего закрытого бара линию селл 

на нулевом баре отслеживаем цену если цена пересекла опустилась ниже линии селл открываем ордер селл а ордер бай закрываем

аналогично и линией бай если цена пересекла поднялась выше линии бай открываем ордер бай а ордер  селл закрываем

вот и все без всяких дополнительных условий

Это называется "Игра в поддавки" Открываем Sell и когда сделка будет в минусе надо перевернуться и ждать когда Buy будет в минусе...
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий