Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 209

 
Alexey Viktorov:

El problema está en esta línea

Como quiero comprobar varias divisas en una barra, debería comprobar la hora y la divisa para evitar repetir la alerta en una barra y un símbolo pero permitir hacer una alerta en la misma barra con un símbolo diferente. A primera vista, necesitamos un array más con banderas de si el símbolo es visto o no.

En general, tenemos que añadir una comprobación de símbolos a esta línea, o repetir el bucle sólo cuando aparezca una nueva barra. Pero tengo el temor de que cuando aparezca una nueva barra en el símbolo con este indicador, aún no haya aparecido una nueva barra en otro símbolo.

La conclusión: debemos forzar los músculos de la cabeza para determinar si aparece una nueva barra en cada símbolo por separado, pero al mismo tiempo no estirar el número de líneas hasta el infinito. No tengo ninguna solución preparada. Y no me gusta sugerirlo escribiendo código...

¿Y no he resuelto su problema?

Tal vez se me haya pasado algo por alto en alguna parte: escribí el código en mi rodilla.

 
Artyom Trishkin:

¿Y no he resuelto su problema?

Tal vez me haya olvidado de algo en alguna parte - escribí el código en mi rodilla.

Artem, la última frase de mi post lo explica todo. Ni siquiera miré su código. Abierta la primera no leída, pregunta con una cita de mi respuesta anterior, respondí y luego vi otros consejos. No dudo de la corrección de su código, incluso desde mi rodilla...

 
Alexey Viktorov:

Artyom, la última frase de mi post lo explica todo. Ni siquiera miré su código. Abierta la primera no leída, pregunta con una cita de mi respuesta anterior, respondí y luego vi otros consejos. No dudo de la corrección de su código, incluso desde mi rodilla...

Habría dicho perezoso ;)

Incluso a primera vista se puede ver que el código depende de los ticks del símbolo actual. Y por lo tanto debemos eliminar el bucle de OnTick() y meterlo en un temporizador. Y modificar ligeramente la definición de las alertas de tiempo.

 

Hola a todos, hay un malentendido del proceso, en la función "start" en el ciclo mm++; y seguir los cambios en él a través de Print(); por lo que la pregunta: "¿Por qué en lugar de 1,2,3,4, etc. aparecen números de cuatro dígitos? "

el propio código

int start()

  {
   int    counted_bars=IndicatorCounted();
   int limit, i;
                                               int mm=0;     // ======= ПЕРВОЕ========
  

   if(counted_bars<0) return(-1);

   limit=(Bars-counted_bars)-1;

for (i=limit; i>=0;i--)
    { 
       if (TimeDayOfWeek(Time[i]) != 0)
       {if (High[i+1]>LastHigh) LastHigh=High[i+1];if (Low[i+1]<LastLow) LastLow=Low[i+1];}
 

if (TimeDay(Time[i])!=TimeDay(Time[i+1]) && TimeDayOfWeek(Time[i])!=0)
   {
      
                                                   mm++; // ==========ВТОРОЕ==========
       
   
   
                                                   Print(" TEST= ",mm);// ========ТРЕТЬЕ========
  
   LastLow=Open[i]; LastHigh=Open[i];

  /* ObjectMove("Pivot", 0, Time[i],P);
     ObjectMove("S1", 0, Time[i],S1);
     ObjectMove("R1", 0, Time[i],R1); */
   }
   
   // S1Buffer[i]=S1;
   // R1Buffer[i]=R1;

}

//----
   return(0);
  }
//+------------------------------------------------------------------+
 
виталик:

Hola a todos, hay un malentendido del proceso, en la función "start" en el ciclo mm++; y seguir los cambios en él a través de Print(); por lo que la pregunta: "¿Por qué en lugar de 1,2,3,4, etc. aparecen números de cuatro dígitos? "

el propio código


En la primera ejecución, 10 segundosIndicatorCounted()=0

 limit=(Bars-counted_bars)-1;

así quelímite= barras máximas en la historia-1

 
Alekseu Fedotov:


En la primera ejecución, durante 10 segundosIndicatorCounted()=0

significalímite= barras máximas en la historia-1

todavía no está claro, declaración e inicialización con cero fuera del bucle int mm=0; y colocado en el bucle mm++; print() muestra números de cuatro dígitos que cambian con una diferencia de una unidad sólo en sentido descendente por alguna razón
 
виталик:
todavía no está claro, declaración e inicialización con cero fuera del bucle int mm=0; y colocado en el bucle mm++; print() muestra números de cuatro dígitos que cambian con una diferencia de una unidad, sólo en sentido descendente por alguna razón
No todas las impresiones se imprimen en este registro. Mira en el archivo.
 

Alexey Viktorov:

...tienes que forzar los músculos de la cabeza...

Gracias a todos los que han respondido.

Artyom Trishkin: Así:

Artem, ¿por qué escribes que no lo has resuelto? Envía las señales para todas las herramientas, pero sólo carga el sistema de forma intensa. ¿Es posible reducir la carga?

Restringir la comprobación en una nueva barra no funcionará porque también habrá condiciones que deban comprobarse en cada tic.

Intento añadir OnTimer() a tu código. Funcionó en EA cuando OnTick() pero ¿cómo hacerlo con OnCalculate?

int OnInit()
  {
  EventSetMillisecondTimer(1);
//--- indicator buffers mapping
   IndicatorShortName("UP DN");
   ushort sz=SetSymbols(Symbols,symbols_array);
   if(sz==0) {
      Print("Список символов пуст!");
      return(INIT_FAILED);
      }
//---
   return(INIT_SUCCEEDED);
  }
  
  void OnDeinit(const int reason)
{// ---
        EventKillTimer();
 // ---
}
void OnTimer()
  {
   RefreshRates();
  // OnTick();
   OnCalculate();
  }

 
Ibragim Dzhanaev:

¿Pueden decirme por qué no se abren los pedidos?


Bien, se abrirá:
//пересечение вверх
bool PeresVverh()
  {//Объявление пересечения вверх
   //if(Ma(MaPer1,2)>Ma(MaPer2,2))
      if(Ma(MaPer1,1)>=Ma(MaPer2,1))
         if(Ma(MaPer1,0)<Ma(MaPer2,0))
            return(true);
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool PeresVniz()
  {//Объявление пересечения вниз
   //if(Ma(MaPer1,2)<Ma(MaPer2,2))
      if(Ma(MaPer1,1)<=Ma(MaPer2,1))
         if(Ma(MaPer1,0)>Ma(MaPer2,0))
            return(true);
   return(false);
  }

 
Sile Si:

Gracias a todos los que han respondido.

Artyom, ¿por qué escribes que no lo has resuelto? Está señalando en todos los instrumentos, pero está cargando mucho el sistema. ¿Hay alguna forma de reducir la carga?

El límite de comprobación en una nueva barra no servirá porque también habrá condiciones que tengan que ser comprobadas en cada tick.

En tu código, trato de añadir OnTimer(), funcionó en EA cuando OnTick() pero ¿cómo hacerlo con OnCalculate ?


Pruébalo con un temporizador de 200 milisegundos.

//+------------------------------------------------------------------+
//|                                                      Test_01.mq4 |
//|              Copyright 2017, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property indicator_chart_window

input string Symbols = "EURUSD, GBPUSD, USDJPY"; // Список символов, разделитель - запятая
//---
struct SSymbolsData
  {
   string   name;       // Имя символа
   datetime time_alert; // Время последнего алерта
  };
SSymbolsData symbols_array[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer(200);
   IndicatorShortName("UP DN");
   ushort sz=SetSymbols(Symbols,symbols_array);
   if(sz==0) {
      Print("Список символов пуст!");
      return(INIT_FAILED);
      }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   for(int i=0; i<ArraySize(symbols_array); i++) {
      if(Condition(symbols_array[i].name,1)==ORDER_TYPE_BUY) {
         datetime tm=iTime(symbols_array[i].name,PERIOD_CURRENT,0);;
         if(symbols_array[i].time_alert!=tm) {
            Alert("UP - " ,symbols_array[i].name,", time: ",TimeToString(tm,TIME_DATE|TIME_MINUTES));
            symbols_array[i].time_alert=tm;
            }
         }
      if(Condition(symbols_array[i].name,1)==ORDER_TYPE_SELL) {
         datetime tm=iTime(symbols_array[i].name,PERIOD_CURRENT,0);
         if(symbols_array[i].time_alert!=tm) {
            Alert("Down - " ,symbols_array[i].name,", time: ",TimeToString(tm,TIME_DATE|TIME_MINUTES));
            symbols_array[i].time_alert=tm;
            }
         }
      }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Condition(string symbol_name,int shift) {
   MqlRates array[];
   if(CopyRates(symbol_name,PERIOD_CURRENT,shift,2,array)==2){
      if(array[0].open<array[0].close && array[1].open>array[1].close) return(ORDER_TYPE_BUY);
      if(array[0].open>array[0].close && array[1].open<array[1].close) return(ORDER_TYPE_SELL);
      }
   return(WRONG_VALUE);
}
//+------------------------------------------------------------------+
ushort SetSymbols(string symbols_list,SSymbolsData &array[]){
   symbols_list+=","; // Добавим признак конца строки
   short beg=WRONG_VALUE, end=1, len=(short)StringLen(symbols_list);
   string sy="";
   Print(__FUNCTION__," > ",symbols_list); // Посмотрим символы в строке
   while(beg<len) {
      beg++;
      end=(short)StringFind(symbols_list,",",beg);
      if(end==beg || end<0) continue;
      sy=StringSubstr(symbols_list,beg,end-beg);
      if(CheckSymbol(sy,array) || !IsPresentSymbol(sy)) continue;
      ushort sz=(ushort)ArraySize(array);
      ArrayResize(array,sz+1);
      array[sz].name=sy;
      array[sz].time_alert=0;
      //--- Посмотрим корректность найденного символа и записи его в массив
      Print("beg=",IntegerToString(beg,2,'0'),", end=",IntegerToString(end,2,'0'),", sy=|",sy,"|",", in array[",sz,"]=",array[sz].name);
      }
   return((ushort)ArraySize(array));
}
//+------------------------------------------------------------------+
bool CheckSymbol(string symbol_name,SSymbolsData &array[]){
   for(short i=0; i<ArraySize(array); i++) if(array[i].name==symbol_name) return(true);
   return(false);
}
//+------------------------------------------------------------------+
bool IsPresentSymbol(string symbol_name){
   for(ushort i=0; i<SymbolsTotal(false); i++){
      if(SymbolName(i,false)==symbol_name) {
         SymbolSelect(symbol_name,true);
         return(true);
         }
      }
   return(false);
}
//+------------------------------------------------------------------+
Razón de la queja: