Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 114

 
Rewerpool:
¡Por ejemplo necesito esta condición if(iClose(NULL,HTF,4)<BlueLine) si se ejecuta DayDown = 1 ! P: ¿Cómo se puede dejar el DayDown en 1 y no ser consultado hasta el día siguiente?
int ДеньОпроса=0;
void OnTick()
{
  if(ДеньОпроса != Day())  // Если новый день - нужно опросить
  {
     if(iClose(NULL,HTF,4)<BlueLine) DayDown = 1;  // Опрос
     ДеньОпроса = Day();   // Запомнить день
  }
 
Gracias. Intentaré atornillarlo)
 
Hola, por favor escriba un código con la condición de que si se elimina 1 objeto del gráfico, entonces el resto (una elección) se eliminará

Tengo otros objetos unidos a 1 objeto, y cuando se elimina este objeto, el resto se queda colgado en el gráfico
 
STARIJ:

Lo tengo así:

if(DayNext!= Day()) // Si se trata de un nuevo día, hay que sondear

{

// Encuesta

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

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

PROBOI1 = 1;Print("Cerrado sobre 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("Cerrado por debajo de RedLine = ",iClose(NULL,HTF,1));

DayNext = Day(); // Recordar el día

}

¡Corregir si algo está mal! Además, si quiero seguir lo que ocurre ahora en una TF inferior, ¿tengo que escribir Día fuera de la Encuesta? Derecho -STARIJ:

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

 
Perdona por hacer esto, pero por favor, contesta:
https://www.mql5.com/ru/forum/226620#comment_6481536
 
Vladimir Karputov:

Establezca el número mágico +1 para la condición 1, el número mágico +2 para la condición 2 y así sucesivamente. De este modo, podrá ver si esta posición se ha abierto con la condición 1 o con la condición 2...

Por la tarde. Sólo he tenido éxito para una posición BAY. El set de magik para vender no funciona por alguna razón. Todo es absolutamente idéntico, excepto el propio magik, por supuesto. ¿Qué he hecho mal?

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:

¿Qué he hecho mal?

Me disculpo por no encontrar el principio de la correspondencia, pero me gustaría aconsejarle inmediatamente que evite condiciones y cálculos complejos en ellos - esto hace que el código sea ilegible y por lo tanto complica la búsqueda de errores lógicos, yo escribiría su código así:

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;  

      }

Si entiendes lo que quiero decir, puedes modificar un poco más el código que te he dado, me refiero a ponerlo en una condición aparteif(OrderType()==OP_BUY....

Entonces será mucho más fácil encontrar errores lógicos, imho

 
Igor Makanu:

Me disculpo por no encontrar el principio de la correspondencia, pero me gustaría aconsejarle inmediatamente que evite condiciones y cálculos complejos en ellos - esto hace que el código sea ilegible y como resultado complica la búsqueda de errores lógicos, yo escribiría su código así:

Si entiendes lo que quiero decir, puedes modificar un poco más el código que te he dado, me refiero a ponerlo en una condición aparteif(OrderType()==OP_BUY....

Entonces será mucho más fácil encontrar errores lógicos, imho

Entendido, gracias, pero por lo que entiendo no hay diferencia para la comprensión del código por parte de la plataforma, mientras que para mí, dividir una condición en varias más cortas me parece más complicado a la hora de buscar errores porque aumenta el número de ocurrencias de sentencias unas dentro de otras. Pero tal vez tengas razón y pronto me pase a tu lado. En cuanto a la lógica del código, no he encontrado ninguna diferencia entre el mío y el tuyo y sigo sin ver el error.

 
novichok2018:

En cuanto a la lógica del código, no he encontrado ninguna diferencia entre el mío y el tuyo y sigo sin ver el error.

Exactamente así - la lógica del código es la misma, pero si divides las condiciones, es más rápido encontrar dónde está el error lógico, y en tu caso, si lo quitas:

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

en una condición separada, obtenemos una optimización del código - la condición se comprobará una vez en lugar de 4 veces como en su ejemplo.

Compruebe la salida en el diario del Asesor Experto utilizando el

Print()

para el registro para ver qué fragmento de código se ejecuta y con qué parámetros

 

Chicos,

¿Cómo puedo leer el indicador Morning Flat en el código del Asesor Experto?

Lo estoy intentando de esta manera y no funciona.

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

El propio indicador

//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+
Razón de la queja: