Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 114

 
Rewerpool:
Добрый день ! Как можно создать триггер ?  К примеру мне нужно это условие if(iClose(NULL,HTF,4)<BlueLine) если оно выполняется DayDown = 1! Вопрос: Как DayDown оставить в состоянии 1 и не опрашивать до следующего дня? 
int ДеньОпроса=0;
void OnTick()
{
  if(ДеньОпроса != Day())  // Если новый день - нужно опросить
  {
     if(iClose(NULL,HTF,4)<BlueLine) DayDown = 1;  // Опрос
     ДеньОпроса = Day();   // Запомнить день
  }
 
Спасибо! Попробую прикрутить)
 
Здравствуйте, прощу написать код на условие, что если удалить с графика 1 объект тогда и остальные(на выбор) удалятся

у меня к 1 объекту привязаны другие, и при удалении этого объекта, остальные просто висят на графике
 
STARIJ:

У меня вышло так: 

if(DayNext!= Day())  // Если новый день - нужно опросить

  {

    // Опрос

   if(iClose(NULL,1440,2)<BlueLine) 

   if(iOpen(NULL,1440,1)<BlueLine && iClose(NULL,HTF,1)>BlueLine)

   PROBOI1 = 1;Print("Закрылись Выше BlueLine = ",iClose(NULL,HTF,1));

   

   if(iClose(NULL,1440,2)>RedLine) 

   if(iOpen(NULL,1440,1)>RedLine && iClose(NULL,HTF,1)<RedLine)

   PROBOI1 = -1;Print("Закрылись ниже RedLine = ",iClose(NULL,HTF,1));

   

 DayNext = Day();   // Запомнить день

  } 

Поправите если что то не так! Далее если я хочу отслеживать что происходит сейчас на младшем ТФ мне нужно писать за пределами Опроса Day? Верно - STARIJ:

if(iClose(NULL,60,1)>RedLine&&iClose(NULL,1440,2)>RedLine) )  Sell = 1

 
Простите что так делаю, но пожалуйста ответьте:
https://www.mql5.com/ru/forum/226620#comment_6481536
 
Vladimir Karputov:

Для условия 1 выставляйте идентификатор magic number +1, для условия 2 magic number +2 и так далее. Таким образом потом можно понять, что эта позиция была открыта по условию 1 или по условию 2 ...

Добрый день. Получилось только для одной позиции БАЙ. Выставленный для СЕЛЛ  магик не работает почему-то. Всё абсолютно идентично, за исключением самого магика конечно. Что я сделал не так?

 

int total=OrdersTotal();

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

      {

        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

         {

         if(TimeCurrent()>OrderOpenTime()+100 && OrderTicket() && OrderType()==OP_BUY && (MathAbs(WPR1)<5))

         rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 

        

         if(TimeCurrent()>OrderOpenTime()+100 && OrderTicket() && OrderType()==OP_BUY && OrderMagicNumber==111 && MathAbs(WPR1)<20)

         rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);

      

         if(TimeCurrent()>OrderOpenTime()+100 && OrderTicket() && OrderType()==OP_SELL && OrderMagicNumber==222 && MathAbs(WPR1)>97.55)

         rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 

           

         if(TimeCurrent()>OrderOpenTime()+100 && OrderTicket() && OrderType()==OP_SELL && MathAbs(WPR1)>96)

         rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);               

         }

       continue;  

      }  
 
novichok2018:

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

извиняюсь, за то что не нашел начало переписки, но хотел бы сразу посоветовать избегать сложных условий и вычислений в них - это делает код нечитаемым и как следствие усложняет поиск логических ошибок, я бы Ваш код вот так записал бы:

int total=OrdersTotal();

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

      {

        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

         {

            if(TimeCurrent()>OrderOpenTime()+100)&& OrderTicket())

            {   

         if(OrderType()==OP_BUY && (MathAbs(WPR1)<5))

            rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 

         if(OrderType()==OP_BUY && OrderMagicNumber==111 && MathAbs(WPR1)<20)

            rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);

         if(OrderType()==OP_SELL && OrderMagicNumber==222 && MathAbs(WPR1)>97.55)

            rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 

         if(OrderType()==OP_SELL && MathAbs(WPR1)>96)

            rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);

            }

         }

       continue;  

      }

если поняли о чем идет речь, то Вы можете приведенный мной код еще немного доработать, я про вынос в отдельное условие if(OrderType()==OP_BUY....

затем будет намного проще найти логические ошибки, имхо

 
Igor Makanu:

извиняюсь, за то что не нашел начало переписки, но хотел бы сразу посоветовать избегать сложных условий и вычислений в них - это делает код нечитаемым и как следствие усложняет поиск логических ошибок, я бы Ваш код вот так записал бы:

если поняли о чем идет речь, то Вы можете приведенный мной код еще немного доработать, я про вынос в отдельное условие if(OrderType()==OP_BUY....

затем будет намного проще найти логические ошибки, имхо

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

 
novichok2018:

Касательно логики кода - я не нашел разницы между моим и вашим и так и не вижу ошибки.

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

if(TimeCurrent()>OrderOpenTime()+100)&& OrderTicket())

в отдельное условие, получим оптимизацию кода - условие будет проверенно один раз, а не 4 раза как в Вашем примере.

Оформите вывод в журнал экспертов через

Print()

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

 

Парни,

как считать показания индикатора Morning Flat в коде эксперта?

Пробую так и не получается.

min=iCustom(Symbol(),0,"Morning Flat",StartHour,EndHour,TargetLevel,1,0);

Сам индикатор

//+------------------------------------------------------------------+
//| MorningFlat.mq4 |
//| Scriptong |
//| |
//+------------------------------------------------------------------+
#property copyright "Scriptong"
#property link ""

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Turquoise
#property indicator_color2 Red
#property indicator_color3 Gold
#property indicator_color4 Silver

extern int StartHour=0;
extern int EndHour=8;
extern double TargetLevel=161.8;
extern color UpColor = Turquoise;
extern color DnColor = Red;
extern color TargetUpColor = Gold;
extern color TargetDnColor = Silver;

//---- buffers
double Up[];
double Down[];
double TargetUp[];
double TargetDn[];
bool Activate=False;
datetime LastDay;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   if(Period()>PERIOD_H1)
     {
      Comment("Индикатор работает на таймфреймах меньше H4!");
      return(0);
     }
   if(StartHour<0 || EndHour<0 || StartHour>23 || EndHour>23 || StartHour>=EndHour)
     {
      Comment("Значения StartHour и EndHour должны лежать в диапазоне от 0 до 24 и StartHour < EndHour.");
      return(0);
     }

   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Up);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,Down);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,TargetUp);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3,TargetDn);
   SetIndexEmptyValue(0, 0.0);
   SetIndexEmptyValue(1, 0.0);
   SetIndexEmptyValue(2, 0.0);
   SetIndexEmptyValue(3, 0.0);

   Activate=True;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
  {
//----
// Удаление объектов-ценовых меток
   for(int i=ObjectsTotal()-1; i>=0; i--)
     {
      string Name=ObjectName(i);
      if(StringSubstr(Name,0,3)=="Lab")
         ObjectDelete(Name);
     }
   Comment("");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Ценовая метка со значением уровня |
//+------------------------------------------------------------------+
void DrawLabel(datetime TimeL,double Price,bool Upper,color Col,int Code)
  {
   if(Upper)
      string Name="Lab"+DoubleToStr(TimeL,0)+"U";
   else
      Name="Lab"+DoubleToStr(TimeL,0)+"D";

   if(ObjectCreate(Name,OBJ_ARROW,0,TimeL,Price))
     {
      ObjectSet(Name,OBJPROP_ARROWCODE,Code);
      ObjectSet(Name,OBJPROP_COLOR,Col);
     }
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
  {
//----
   if(!Activate) return(0);

   LastDay=0;
   int counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;
   for(int i=limit; i>=0; i--)
      if(TimeHour(Time[i])>=EndHour)
        {
         datetime BeginDay=iTime(Symbol(),PERIOD_D1,iBarShift(Symbol(),PERIOD_D1,Time[i])); // Расчет времени начала суток
         datetime NextDay=BeginDay+86400; // Расчет времени начала следующих суток
         if(LastDay>= BeginDay) continue; // Если в этот день уже рисовали уровни, то продолжаем основной цикл
         int StartBar=iBarShift(Symbol(),0,BeginDay+StartHour*3600); // Бар, соответсвующий началу суток плюс смещение в часах
         int FinishBar=iBarShift(Symbol(),0,BeginDay+(EndHour-1)*3600); // Бар, соответствующий последнему бару "утреннего флэта"
         double LowV=Low[iLowest(Symbol(),0,MODE_LOW,StartBar-FinishBar+1,FinishBar)]; // Нижняя граница
         double HighV=High[iHighest(Symbol(),0,MODE_HIGH,StartBar-FinishBar+1,FinishBar)]; // Верхняя граница
         double TargetU = (HighV-LowV)*(TargetLevel-100)/100+HighV;
         double TargetD = LowV-(HighV-LowV)*(TargetLevel-100)/100;
         // Канал "утреннего флэта"
         for(int j=StartBar; j>=FinishBar; j--)
           {
            Up[j]=HighV;
            Down[j]=LowV;
            //Есть такой индикатор
            // -----------------------
            // Ожидаемые цели при пробое флэта 
            for(j=FinishBar; Time[j]<NextDay && j>=0; j--)
              {
               TargetUp[j] = TargetU;
               TargetDn[j] = TargetD;
              }
            // ------------------- 

            DrawLabel(Time[iBarShift(Symbol(), 0, BeginDay)], HighV, True, UpColor, 5); // Рисуем верхнюю ценовую метку канала
            DrawLabel(Time[iBarShift(Symbol(), 0, BeginDay)], LowV, False, DnColor, 5); // Рисуем нижнюю ценовую метку канала
            DrawLabel(Time[FinishBar],TargetU,True,TargetUpColor,5); // Рисуем верхнюю ценовую метку цели
            DrawLabel(Time[FinishBar],TargetD,False,TargetDnColor,5); // Рисуем нижнюю ценовую метку цели
            LastDay=BeginDay; // Отмечаем, что в этот день уровни уже были нарисованы
           }
        }
   WindowRedraw();
//----
   return(0);
  }
//+------------------------------------------------------------------+
Причина обращения: