Preguntas de un "tonto" - página 53

 
No hay que confundir la recreación incondicional y estúpida (desde la ignorancia) de indicadores en cada tick con la creación inteligente (rara y necesaria) de un indicador. En el primer caso se obtiene un freno y una fuga de recursos centuplicados, y en el segundo se obtiene un rendimiento perfecto.
 
Renat:
No hay que confundir la recreación incondicional y estúpida (desde la ignorancia) de indicadores en cada tick con la creación inteligente (rara y necesaria) de un indicador. En el primer caso se obtiene un freno y una fuga de recursos cien veces mayor, y en el segundo - un trabajo perfecto.

Soy muy consciente de que Karlson ha cometido un error por ignorancia, y también entiendo la naturaleza de ese error.

Pero sugiere un esquema razonable para resolver su problema. ¿La persona necesita utilizar el código escrito en el indicador pero los parámetros de este código se determinan dinámicamente antes de cada acceso a los datos del indicador?

Tengo una solución, contiene dll, pero quieres usar mql puro, así que propón una solución en mql.

HZ Ya mencioné OnCalculate() y los cálculos en los eventos, pero puedes pasar tres parámetros a través del evento. En mi solución, una dll larga puede pasar la dirección de un array con parámetros y el indicador recibirá datos en esta dirección.

Si tiene una solución mql, sólo tiene que señalar con el dedo.

 
Urain:

Soy muy consciente de que Karlson ha cometido un error por ignorancia, y también entiendo la naturaleza de ese error.

Pero sugiere un esquema razonable para resolver su problema. La persona necesita utilizar el código escrito en el indicador, pero los parámetros de este código se determinan dinámicamente antes de cada referencia a los datos del indicador?

¿Cuántos indicadores diferentes hay que crear en realidad? Probablemente no más de 10, de lo contrario será un desperdicio de recursos sin sentido.

Como no hay cambios de parámetros, puede crear una colección de indicadores, y el necesario se añadirá a ella cuando sea necesario. Si hay menos de 10 indicadores y tienen un significado claro (inicial, de confirmación, de corrección, etc.), se pueden crear variables con nombre de asas con los parámetros necesarios.

 
Urain:

Pero sugiere un esquema razonable para resolver su problema. La persona necesita utilizar el código escrito en el indicador, pero los parámetros de este código se determinan dinámicamente antes de cada referencia a los datos del indicador?

Lo he pensado un poco. Si los parámetros del código se determinan dinámicamente antes de cada acceso a los datos del indicador, ¿por qué no incluir el procedimiento de determinación de estos parámetros en el código del indicador? En otras palabras, todos los cálculos deben implementarse en el indicador.

¿O hay situaciones en las que, en principio, este enfoque es imposible?

 
¿Podríais decirme por qué en un indicador tan sencillo no se calcula la barra cero (la primera por la derecha) en todas partes excepto en el gráfico semanal?

#include <MovingAverages.mqh>
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_color1 LightBlue
#property indicator_type1   DRAW_LINE
#property indicator_width1 2

input int PERIOD = 80;
input ENUM_MA_METHOD  method = MODE_SMA;
input ENUM_APPLIED_PRICE PRICE = PRICE_CLOSE;
double Uptrend[];
double ExtRsiArray_TF2[];
double mabuf[];
int handleMA,handleMA2;

int OnInit()
  {
   SetIndexBuffer(0, Uptrend);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);  
   ArraySetAsSeries(Uptrend,true);
   handleMA=iMA(NULL, 0, PERIOD, 0, method, PRICE);
   handleMA2=iMA(NULL, 0, PERIOD/2, 0, method, PRICE);
   return(0);
  }
  
double WMA(int ai_0,int a_period_4) {
int some;
if(a_period_4==PERIOD)
 if(CopyBuffer(handleMA,0,ai_0,1,ExtRsiArray_TF2)<=0)
  {Alert("Error",GetLastError());
   return(0);
  }
some=PERIOD/2;
if(a_period_4==some)
 if(CopyBuffer(handleMA2,0,ai_0,1,ExtRsiArray_TF2)<=0)
  {Alert("Error",GetLastError());
   return(0);
  }
return (ExtRsiArray_TF2[0]);
}

int OnCalculate (const int rates_total,      
                 const int prev_calculated, 
                 const int begin,          
                 const double& price[] 
   )
  { ArraySetAsSeries(price,true);
    int counted_bars = prev_calculated; 
    if(counted_bars < 0) return(-1); 
    int x = 0; 
    int p = MathSqrt(PERIOD);              
    int e = rates_total - counted_bars + PERIOD + 1; 
    double vect[], trend[]; 
    if(e > rates_total) e = rates_total;    
    ArrayResize(vect, e); 
    ArraySetAsSeries(vect, true);
    ArrayResize(trend, e); 
    ArraySetAsSeries(trend, true);
    ArrayResize(mabuf, e); 
    ArraySetAsSeries(mabuf, true);
    for(x = 0; x < e; x++)        vect[x] = 2*WMA(x, PERIOD/2) - WMA(x, PERIOD);
    if(method==MODE_SMA)
    SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf);

    for(x = 0; x < e-PERIOD; x++) Uptrend[x] = mabuf[x];
    return(rates_total);                
  }
 
Yedelkin:

He estado pensando durante un tiempo. Si los parámetros del código se determinan dinámicamente antes de cada acceso a los datos del indicador, ¿por qué no incluimos el procedimiento de determinación de estos parámetros en el código del indicador? En otras palabras, todos los cálculos deben implementarse en el indicador.

¿O hay situaciones en las que, en principio, ese enfoque es imposible?

Hay situaciones, cuando los parámetros son calculados por otro indicador y devueltos al Asesor Experto, y el Asesor Experto decide qué modelo usar basado en la neurona. No sabemos de antemano qué conjunto de parámetros se aplicará.

 
Expert:
¿Puede decirme por qué en un indicador tan sencillo no se calcula la barra cero (la primera de la derecha) en todas partes excepto en el gráfico semanal?


Oops) puse aquí:SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf); en lugar de e - rates_total y todo funciona)
 
Expert:
Oops) sustituido aquí:SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf); en lugar de e - rates_total y todo funcionó)

Arreglar los errores hombre con el apodo de Experto? debe estar en el tema de humor.
 

Estoy tratando de construir un Asesor Experto multidivisa. Hasta ahora me he decidido por el esquema propuesto por Nikolay Kositsin en su artículo"Creación de un Asesor Experto que opera con diferentes símbolos". Me encontré con el problema de que los resultados son diferentes cuando se ejecuta una prueba utilizando diferentes símbolos pero los mismos parámetros. He buscado en el foro y he encontrado que muchos han llegado a la conclusión de que este problema se puede resolver utilizando la función OnTimer(). Andrey Khatimlansky lo aconsejó aquí:

Отвяжитесь от тиков конкретного инструмента (OnTick) - это же мультивалютник! Работайте по таймеру или ловите момент образования бара на всех рабочих инструментах, это будет надежнее.

He intentado captar el momento de la formación de la barra en todos los instrumentos, pero no he conseguido el resultado deseado.

Por ejemplo:

En la función destinada a detectar una nueva barra, especifico explícitamente el instrumento y el marco temporal.

bool isNewBar(string Symbol_, ENUM_TIMEFRAMES Timeframe)
{
 // В статической переменной будем помнить время открытия последнего бара
 static datetime last_time = 0;
 // Текущее время
 datetime lastbar_time = (ENUM_SERIES_INFO_INTEGER)SeriesInfoInteger(Symbol_,Timeframe,SERIES_LASTBAR_DATE);

 // Если это первый вызов функции
 if(last_time == 0)
   {
    // Установим время и выйдем 
    last_time = lastbar_time;
    return(false);
   }

 // Если время отличается
 if(last_time != lastbar_time)
   {
    // Запомним время и вернем true
    last_time = lastbar_time;
    return(true);
   }
 // Дошли до этого места - значит бар не новый, вернем false
 return(false);
}

En la función OnTick(), el esquema sugerido por Nikolay Kositsin.

Por ejemplo:

void OnTick()
{ 
 // Объявление массивов переменных для торговых сигналов  
 static bool UpSignal[2], DnSignal[2];

 // Получение торговых сигналов
 TradeSignalCounter(0, остальные параметры);
 TradeSignalCounter(1, остальные параметры);

 // Совершение торговых операций
 TradePerformer(0, остальные параметры);
 TradePerformer(1, остальные параметры);
}


La función isNewBar(Symbol,Timeframe) se llama en la función en la que se ejecuta la operación, es decir, TradePerformer(parameters).

Por ejemplo:

bool TradePerformer(параметры)
{

...

 if(isNewBar(Symbol_,Timeframe))
   {
    Trailing_Stop(параметры);
   
    Open_Source_Position(параметры);
   }
 return(true);
}


Es decir, se comprueba una nueva barra para cada símbolo por separado. Si no hay ninguna barra nueva, comprobamos el siguiente símbolo. Y así sucede con cada garrapata. Pero esta variante no funciona.

Por favor, indique cómo implementar correctamente la comprobación de una nueva barra en un Asesor Experto multidivisa en el esquema dado.
 
Urain:
¿Debería estar en el hilo de humor para corregir los errores cometidos por alguien llamado Experto?
En este foro se pueden y se deben corregir los errores del código de los expertos, independientemente de la carrera o del tiempo :)
Razón de la queja: