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

 
Igor Makanu:

Intenta formular la pregunta de otra manera, puede que tu pregunta no sea clara

Intentaré explicarlo. Pero ten en cuenta que no soy un programador, prácticamente.

Tenemos un indicador de tick que construye una curva por valores de oferta.

#property  indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
double x[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(1);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,x);
   SetIndexDrawBegin(0,0);
   SetIndexLabel(0,"x");
   SetIndexShift(0,0);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double b=MarketInfo(Symbol(),MODE_BID);
   x[0]=b;
   for(int j=ArraySize(x)-1;j>=1;j--){x[j]=x[j-1];}
   return(0);
  }
//+------------------------------------------------------------------+

Ahora lo que quiero hacer.

Fijar el indicador en el gráfico. Obtiene el primer valor de bid1 en el primer tick. Recuérdalo (yo lo hice - introduzco el segundo buffer y[0] y registro su valor en init()).

En el segundo tick obtenemos el segundo valor de bid2.

Entonces tenemos que conseguir la diferencia de puntos. delta=bid1-bid2 (yo lo hice así: delta=x[0]-x[1]).

Ahora añade delta a y[0] y obtiene el valor de y[1], que en realidad corresponde al valor de bid2.

La curva del indicador debería ser idéntica a la que buscamos, pero se traza utilizando los valores calculados de las diferencias de oferta.

Este indicador es necesario como plantilla para los cálculos posteriores.

No tires piedras. Se lo expliqué lo mejor que pude.

Gracias.

 
Oleg Bondarev:

Intentaré explicarlo. Pero ten en cuenta que soy un programador novato, prácticamente.

Tenemos un indicador de tick, que construye una curva por valores de oferta.

Ahora lo que quiero hacer.

Fijar el indicador en el gráfico. Obtiene el primer valor de bid1 en el primer tick. Recuérdalo (yo lo hice: introduje el segundo buffer y[0] y prescribí su valor en init()).

En el segundo tick obtenemos el segundo valor de bid2.

Entonces tenemos que conseguir la diferencia de puntos. delta=bid1-bid2 (yo lo hice así: delta=x[0]-x[1]).

Ahora añade delta a y[0] y obtén el valor de y[1] que realmente corresponde al valor de bid2.

La curva del indicador debería ser idéntica a la que buscamos, pero se traza utilizando los valores calculados de las diferencias de oferta.

Este indicador es necesario como plantilla para los cálculos posteriores.

No tires piedras. Intenté explicarlo lo mejor que pude.

Gracias.

No está claro lo que quiere hacer

Este es el problema general - usted utiliza los buffers de los indicadores como un array para almacenar los ticks (Bid), el tamaño del buffer de los indicadores cambia el propio terminal, y además - el propio terminal desplaza los buffers de los indicadores al aparecer una nueva barra

debe utilizar un array para almacenar los ticks, y utilizar un buffer de indicador para dibujar

He creado un código similar al tuyo, donde guardo los ticks en un array

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      TickCount=10;  //Размер массива тиков
//--- indicator buffers
double         Label1Buffer[];
double TickArr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   ArrayResize(TickArr,TickCount);                                   //изменим размер массива
   ArrayInitialize(TickArr,SymbolInfoDouble(_Symbol,SYMBOL_BID));    // проинициализируем массив значением текущего Bid
//---
   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[])
  {
   for(int i=ArraySize(TickArr)-1;i>0;i--)
   {
      TickArr[i] = TickArr[i-1]; // сдвинули массив
   }
   TickArr[0] = SymbolInfoDouble(_Symbol,SYMBOL_BID); // в 0-й элемент массива запомнили новый Bid
   
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Ahora, debes añadir tu cálculo a este código y dibujarlo usando el buffer del indicador Label1Buffer según tu idea

 
Estaría bien que añadieran la posibilidad de cambiar las propiedades de otro indicador mediante programación. A grandes rasgos, después de añadir (mediante programación) otro indicador al gráfico, se puede establecer su color, estilo y grosor de las líneas
 
Igor Makanu:

no está claro lo que quiere hacer

aquí está el problema exacto - usted utiliza los búferes de los indicadores como una matriz para almacenar los ticks (Bid), el tamaño del búfer de los indicadores cambia el propio terminal, y además - el propio terminal cambia los búferes de los indicadores cuando aparece una nueva barra

debe utilizar un array para almacenar los ticks, y utilizar un buffer de indicador para dibujar

He creado un código similar al tuyo, donde guardo los ticks en un array

Ahora, tienes que añadir tu cálculo a este código y dibujarlo usando el buffer del indicador Label1Buffer, según tu idea

Gracias por responder. Te torturaré un poco más.

¿Agrego el cálculo aquí?

int OnCalculate()

Este es mi cálculo.

   if(TickArr[0]>TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1]+(TickArr[0]-TickArr[1]);
     }
   if(TickArr[0]<TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1]-(TickArr[0]-TickArr[1]);
     }
   if(TickArr[0]==TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1];
     }

Lo añadí y nada.

 
Yevhenii Levchenko:
Estaría bien que añadieran la posibilidad de cambiar las propiedades de otro indicador mediante programación. A grandes rasgos, tras añadir (mediante programación) otro indicador al gráfico, se puede establecer el color, el estilo y el grosor de las líneas

Utiliza Canvas y dibuja caricaturas.

 

Adjuntaré una foto más.

ind

 
Oleg Bondarev:

Añadido y nada.

no es así como funciona ))))

Para dibujar usando buffers de indicadores en MQL, significa poner un valor en el buffer de indicadores - en mi ejemplo, es Label1Buffer (asignar un valor)

¿en su ejemplo asigna valores sólo cuando se cumple una condición y si la condición no se cumple? - Así que no se imprimirá nada.


Y de nuevo, he creado una "plantilla" donde el array TickArr contiene los valores de los ticks Bid, pero en tus condiciones utilizas los valores anteriores del buffer del indicador - ¿y quién puso qué valores en estos buffers?


Trata de dibujar una línea por el buffer del indicador, entonces compararás los ticks.

 
Oleg Bondarev:

Adjuntaré una foto más.


¿Y si el ángulo se invierte? ¿Cómo se haría el cálculo?

 
Oleg Bondarev:

Adjuntaré una foto más.


Si dices que eres prácticamente un cero en programación, entonces ¿por qué te encargas de tareas tan poco habituales, quizás deberías empezar por las más sencillas? ¿O para mejorar su conocimiento de los fundamentos? Es más fácil que te lo hagan, sí.
 
Igor Makanu:

eso no va a funcionar ))))

Para dibujar usando buffers de indicadores en MQL, significa poner un valor (asignar un valor) al buffer de indicadores - en mi ejemplo, el Label1Buffer

¿en su ejemplo asigna valores sólo cuando se cumple una condición y si la condición no se cumple? - Así que no se imprimirá nada.


Y de nuevo, he creado una "plantilla" donde el array TickArr contiene los valores de los ticks Bid, pero en tus condiciones utilizas los valores anteriores del buffer del indicador - ¿y quién puso qué valores en estos buffers?


Trate de dibujar una línea por el buffer del indicador, y luego comparará los ticks.

Advertí que soy un hacker).

Lo hice así.

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      TickCount=100000;  //Размер массива тиков
input int      TickCountb=100000;
//--- indicator buffers
double Label1Buffer[];
double TickArr[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer);
   ArrayResize(TickArr,TickCount);
   ArrayResize(Label1Buffer,TickCountb);                                   //изменим размер массива
   ArrayInitialize(TickArr,MarketInfo(Symbol(),MODE_BID));    // проинициализируем массив значением текущего Bid

//---
   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[])
  {
   for(int i=ArraySize(TickArr)-1;i>0;i--)
   {
      TickArr[i] = TickArr[i-1]; // сдвинули массив
   }
   TickArr[0] = MarketInfo(Symbol(),MODE_BID); // в 0-й элемент массива запомнили новый Bid
   
   for(int j=ArraySize(TickArr)-1;j>0;j--)
   {
      Label1Buffer[j] = Label1Buffer[j-1]; // сдвинули массив
   }
   
   Label1Buffer[0]= TickArr[0];   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Ahora dibuja el gráfico de ticks pero hay algunos cortes de línea.

Voy a hacer un 4.