Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1339

 
Kira27 #:
Hola!!! Dime donde me he equivocado, yo tampoco lo entiendo)

De 275 herramientas, procesa 27 y luego se atasca, ocupa memoria y produce una cadena de error cuando el script es forzado a terminar.

Si esta matriz

   double bufer_MA[];  //Буфер для хендла

y luego usarla en

         CopyBuffer(MA200,0,TimeCurrent(),5,bufer_MA); // заполнение масива bufer_MA хендлом MA200 выбранного тайма

no está bien del todo.

¿O he entendido algo mal?

 
Alexey Viktorov #:

Si esta matriz

y luego usarla en

no está bien del todo.

¿O he entendido algo mal?

Hay muchas cosas que no funcionan.

 
Alexey Viktorov #:

Si esta matriz

y luego usarla en



Пример:



//+------------------------------------------------------------------+ 
//|                                              TestCopyBuffer3.mq5 | 
//|                        Copyright 2009, MetaQuotes Software Corp. | 
//|                                              https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "2009, MetaQuotes Software Corp." 
#property link      "https://www.mql5.com" 
#property version   "1.00"
 
#property indicator_separate_window 
#property indicator_buffers 1 
#property indicator_plots   1 
//---- plot MA 
#property indicator_label1  "MA" 
#property indicator_type1   DRAW_LINE 
#property indicator_color1  clrRed 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 
//--- input parameters 
input bool               AsSeries=true; 
input int                period=15; 
input ENUM_MA_METHOD     smootMode=MODE_EMA; 
input ENUM_APPLIED_PRICE price=PRICE_CLOSE; 
input int                shift=0; 
//--- indicator buffers 
double                   MABuffer[]; 
int                      ma_handle; 
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit() 
  { 
//--- indicator buffers mapping 
   SetIndexBuffer(0,MABuffer,INDICATOR_DATA); 
   Print("Параметр AsSeries = ",AsSeries); 
   Print("Индикаторный буфер после SetIndexBuffer() является таймсерией = ", 
         ArrayGetAsSeries(MABuffer)); 
//--- set short indicator name 
   IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries); 
//--- set AsSeries (depends on input parameter) 
   ArraySetAsSeries(MABuffer,AsSeries); 
   Print("Индикаторный буфер после ArraySetAsSeries(MABuffer,true); является таймсерией = ", 
         ArrayGetAsSeries(MABuffer)); 
//--- 
   ma_handle=iMA(Symbol(),0,period,shift,smootMode,price); 
   return(INIT_SUCCEEDED); 
  } 
//+------------------------------------------------------------------+ 
//| 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[]) 
  { 
//--- check if all data calculated 
   if(BarsCalculated(ma_handle)<rates_total) return(0); 
//--- we can copy not all data 
   int to_copy; 
   if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total; 
   else 
     { 
      to_copy=rates_total-prev_calculated; 
      //--- last value is always copied 
      to_copy++; 
     } 
//--- try to copy 
   if(CopyBuffer(ma_handle,0,0,to_copy,MABuffer)<=0) return(0); 
//--- return value of prev_calculated for next call 
   return(rates_total); 
  } 
//+------------------------------------------------------------------+
 

no está bien del todo.

¿O he entendido algo mal?

¿Por qué mal? Porque en el ejemplo de la función


CopyBuffer

y utilizar

 

Alexey Viktorov #:


¿O he entendido algo mal?

El objetivo del script es recorrer cada instrumento en el Market Watch en timeframes desde 1min hasta 4H para encontrar el precio por encima de la MA200 y si se detecta este hecho, generar una alerta con el nombre del símbolo con el precio por encima de la MA en los 6 timeframes.

 
Artyom Trishkin #:

Hay muchas cosas que no funcionan.

Sea más específico, si no le importa)

 
Kira27 #:

Sea más específico, si no le importa)

La indexación de matrices es simplemente espeluznante... Copiar los mismos datos en un bucle... Crear nuevas asas en un bucle - sin palabras...

No quiero ni mirar el resto, lo siento

 
Artyom Trishkin #:

La indexación de matrices es simplemente espeluznante... Copiar los mismos datos en un bucle... Crear nuevas asas en un bucle - sin palabras...

No quiero ni mirar el resto del código, lo siento

No entiendo lo de la indexación de los arrays, ¿qué arrays no te gustan? Los datos de la línea 43 de la función CopyBuffer copian los handles en diferentes timeframes, desde 1 minuto hasta 4H. Se copian los precios del indicador 5 MA, para las 5 primeras barras, y tanto el handle como el array con 5 barras se ponen a cero en cada iteración

ArrayFree(bufer_MA);


y la manilla se borra.

 IndicatorRelease(MA200); //Удаление хендла

Si puedes proponer un algoritmo para manejar 274 símbolos y cada uno de ellos en 6 marcos temporales de alguna otra manera, estaría encantado. Es que el hilo se llama... Preguntas de principiantes. Si fuera un profesional, probablemente no tendría ninguna pregunta.

 

lacreación de asas en diferentes situaciones no parece costosa, es sólo un puntero sin precarga... el trabajo principal se hace con CopyBuffer

Personalmente, tengo un problema constante sólo al crear el primero; se soluciona con Sleep() para cargar un gráfico o la función de precarga de cotizaciones

los desarrolladores deberían haberlo decidido ellos mismos, la velocidad no es importante en OnInit, me refería al primer indicador con 7 símbolos, el error siempre aparece en diferentes iteraciones

----------

¿cómo funciona la creación de un asa, en un bucle especial es necesario comprobar la disponibilidad o basta con otra creación (es decir, la sobreescritura)?

 
Fast235 #:

lacreación de asas en diferentes situaciones no parece costosa, es sólo un puntero sin precarga... el trabajo principal se hace con CopyBuffer

Personalmente, tengo un problema constante sólo al crear el primero; se soluciona con Sleep() para cargar un gráfico o con la función de precarga de cotizaciones

los desarrolladores deberían haberlo decidido ellos mismos, la velocidad no es importante en OnInit, me refería al primer indicador con 7 símbolos, el error siempre aparece en diferentes iteraciones

----------

¿cómo funciona la creación de un asa, en un bucle especial es necesario comprobar la disponibilidad o basta con otra creación (es decir, la sobrescritura)?

¿Me está hablando a mí o es una pregunta para los expertos locales)?

 
Kira27 #:

¿Me estás hablando a mí o es una pregunta para los expertos de aquí)?

Sobre la creación y eliminación de asas,

Funciona, me interesa la forma correcta, espero que los desarrolladores me digan.