Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1347

 

Никак не могу допилить советника. Суть простая - черчу сначала один прямоугольник, который является триггером на покупку, в случае попадания цены в его область, рисую второй - попала туда цена - сделка должна закрыться.

А выходит следующее - цена начинает открываться и закрываться внутри области. Что я делаю не так?


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

//|                                         RECTANGLES OP_BUY.mq4 |

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

#property copyright ""

#property link      ""

#property version   "1.00"

#property strict


extern int Magic = 777701;

extern double Lot = 0.01;

extern int Slippage = 3;



 int ticket;

 int OrderOfSymbol;




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

//| Expert initialization function                                   |

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

int OnInit()

  {  

//---

   return(INIT_SUCCEEDED);

  }

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

  {

//---

  }

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

//| Expert tick function                                             |

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

void OnTick()

  {

  

//---

   //Проверим что есть ли прямоугольник :

   if(ObjectsTotal(OBJ_RECTANGLE)==0)

   {Comment("Нарисуйте прямоугольник для открытия сделки по покупке!");}


  

   //Получим ИМЯ прямоугольника:

   for(int n=0;n<ObjectsTotal();n++)

     {

     

      string name=ObjectName(n);

       if(ObjectType(name)==OBJ_RECTANGLE)

        {

        

         

          

         datetime t1a = (datetime) ObjectGet(name,OBJPROP_TIME1);

         datetime t2a = (datetime) ObjectGet(name,OBJPROP_TIME2);


         double p1a=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE1),Digits);

         double p2a=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE2),Digits);

 

         

     

      

 

         

   

         

         OrderOfSymbol=CounterOrderTradeType(-1); 

           if (OrderOfSymbol<1)

          if (Close[1]>Open[1])    

         if(TimeCurrent()>t1a && TimeCurrent()< t2a &&

            Bid < p1a  && Bid > p2a   )    

        {

         ticket = OrderSend(Symbol(),OP_BUY, Lot, Ask, Slippage, 0, 0, "открыт ордер на покупку", Magic, 0, Blue);

        } 

       

         

         

         

           }

           

           

           

        

           

           

           

     }

     

      //Проверим что есть ли уже второй прямоугольник :

   if(ObjectsTotal(OBJ_RECTANGLE)==1)

   {Comment("Нарисуйте второй прямоугольник для закрытия сделки по покупке!");}


    //Получим ИМЯ прямоугольника:

   for(int n=0;n<ObjectsTotal();n++)

     {

      string name=ObjectName(n);

   

       if(ObjectType(name)==OBJ_RECTANGLE)

        {

          

          

          

         datetime t1b = (datetime) ObjectGet(name,OBJPROP_TIME1);

         datetime t2b = (datetime) ObjectGet(name,OBJPROP_TIME2);


         double p1b=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE1),Digits);

         double p2b=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE2),Digits);


         

      

         

   

       

         if(TimeCurrent()>t1b && TimeCurrent()< t2b &&

            Bid < p1b  && Bid > p2b   )   

         CloseBuyPositions1(); 

         

         

         

         

         

         }

     }

     

   

        //Проверим что есть ли уже 2 прямоугольник :

   if(ObjectsTotal(OBJ_CHANNEL)==2)

   {Comment("Области  по открытию и закрытию ордеров по покупке выставлены - идет торговля!");}


    

    

     

     

 

  }

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

void CloseBuyPositions1()

      {

      

       for(int i = OrdersTotal() - 1; i >= 0; i--)

      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

         if(OrderMagicNumber() == Magic)

            if(OrderSymbol() == Symbol())

              {



          

          if(OrderType()==OP_BUY)

             {

              if(OrderClose(OrderTicket(), OrderLots(), Bid, 3, NULL)){Print("Order Close");}

             }

          }

       } 

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

//| Подсчет ордеров потекущему символу                               |

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

int CounterOrderTradeType(ENUM_ORDER_TYPE order_type)

   {

   int cnt=0;

   //----

   for(int pos=OrdersTotal()-1;pos>=0;pos--)

      {

      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)==false) continue;

      if(OrderSymbol()!=_Symbol) continue;

      if(order_type == OrderType() || order_type == -1) cnt++;

      }

   //----

   return(cnt);

   }   

 
Порт-моне тв:

Есть вот такая функция для размещения кода, всем будет удобнее читать твой код чтобы помочь.

 
MakarFX:

Есть вот такая функция для размещения кода, всем будет удобнее читать твой код чтобы помочь.

Ему это не поможет. Пустые строки читают только такие как он сам.

 

Порт-моне тв:

Что я делаю не так?

Нет уникальности имени квадрата, у тебя любой квадрат - условие для покупки и продажи

 
Порт-моне тв:

Это тоже тебе поможет


 

Подскажите, пожалуйста, как исправить ошибку

//+------------------------------------------------------------------+
#property copyright   "Copyright 2020,"
#property version     "1.0"
#property strict

//--- Inputs
int   side_position                    = 1;
input ENUM_BASE_CORNER  CornerInfo     = CORNER_RIGHT_UPPER; 
input ENUM_BASE_CORNER  CornerInfo1    = CORNER_LEFT_UPPER; 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(side_position == 2)
   {
   CornerInfo  = CORNER_RIGHT_LOWER; 
   CornerInfo1 = CORNER_LEFT_LOWER;
   }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+

Вот ошибка

'CornerInfo' - constant cannot be modified      Wa.mq4  22      1
'CornerInfo1' - constant cannot be modified     Wa.mq4  23      1
2 errors, 0 warnings            3       1
 
Forallf:

Спасибо!

Не за что )

MakarFX:

Подскажите, пожалуйста, как исправить ошибку

Вот ошибка

input переменные нельзя изменять.

 Можно так:

input ENUM_BASE_CORNER  CornerInfo     = CORNER_RIGHT_UPPER; 

ENUM_BASE_CORNER  MyCornerInfo     = CornerInfo; 


.......

if(side_position == 2)
   {
   MyCornerInfo  = CORNER_RIGHT_LOWER; 



 
Aleksei Stepanenko:

Не за что )

input переменные нельзя изменять.

 Можно так:

Спасибо понял

 
MakarFX:

Это тоже тебе поможет


не помогло. И я понял что значения квадрата берутся не из двух как надо, а из последнего. Я это и не знаю как победить. Неужели бы я не догадался сам в этом. А вот инструментом mql в совершенстве не владею, собственно поэтому тут и спрашиваю, а вы мне тут расчески предлагаете. 

 
Порт-моне тв:

не помогло. И я понял что значения квадрата берутся не из двух как надо, а из последнего. Я это и не знаю как победить. Неужели бы я не догадался сам в этом. А вот инструментом mql в совершенстве не владею, собственно поэтому тут и спрашиваю, а вы мне тут расчески предлагаете. 

Я тебе расчески предлагаю, для того чтобы твой код был удобно читаемым для тех к кому ты обращаешься(здесь нет никакого злого умысла)

Что касается твоих квадратов, то для того чтобы их правильно определить надо понимать их происхождение, т.е. ты их рисуешь или советник

Причина обращения: