Discusión sobre el artículo "Desarrollo de indicadores bursátiles con control de volumen tomando como ejemplo el indicador delta" - página 9

 
Aleksey Vyazmikin:

Si tomamos el interés abierto, ¿es este el tipo de código que tenía en mente?

Traded delta, me refiero al indicador, en el hilo donde está nuestro diálogo

Así que resume estos deltas en una ventana flotante (por ejemplo, los 100 últimos) o en orden ascendente (n+1 desde una fecha determinada, por ejemplo, desde la fecha de inicio del día actual), ¿para qué período? ¿Por qué para este periodo?

Pues sí, este código es aproximadamente Si en %, entonces * 100. Esto es más adecuado para los robots, visualmente es mejor mirar a los valores absolutos. IMHO.

Tengo varias ventanas para diferentes tácticas. Algo como esto:


 

Suponiendo que los futuros empiecen a negociarse activamente (y que para algunos mercados determinen globalmente los precios de los activos, como 6B,6E,RB,CL,GC) en cuanto se conviertan en los más próximos, la delta deberá resumirse a partir del inicio de esta fecha.

Si se trabaja con delta sobre acciones, es mucho más difícil determinar el punto de partida. En realidad, la mayoría de los sistemas (como ClusterDelta) toman una ventana móvil fija, por ejemplo, 90 barras. Sin embargo, si lo piensa detenidamente, probablemente sea más correcto tomar como punto de referencia algún extremo del precio en el pasado, por ejemplo, 30 días

 

Sr. Kozitsyn,

felicitaciones por el gran trabajo ! este es el mejor indicador Delta hasta ahora, muy rapido.

Trato de modificarlo para trazar sólo los valores positivos con color diferent a comprar / vender delta (mejor comparar el tamaño de las barras de histograma), sin éxito, Usted puede dar algunos tipe cómo hacerlo o post donde debe modificar el código original?

Otra pregunta, ¿es posible trazar un histograma vertical en lugar de horizontal? Intenté trazar un histograma vertical usando https://www.mql5.com/es/articles/2714 pero no trazó ningún valor, de hecho intenté trazar valores de volumen en el histograma vertical y no trazó ningún rey de volumen ( uso NormalizeDouble para convertir de long a double).

Muchas gracias.

Statistical distributions in the form of histograms without indicator buffers and arrays
Statistical distributions in the form of histograms without indicator buffers and arrays
  • www.mql5.com
Histograms allow researchers to visually evaluate the distribution of statistical data grouped by the frequency of their penetration into a certain (predetermined) interval. Histograms and their use in the statistical data analysis are a well-studied topic with multiple articles devoted to it [1, 2, 3, 4, 5, 6, 7] and a large number of CodeBase...
[Eliminado]  
frcardim:

sr. kozitsyn,

felicitaciones por gran trabajo ! este es el mejor indicador Delta hasta ahora, muy rápido.

¡Gracias!

Trate de modificarlo para que solo muestre valores positivos con diferente color al delta de compra/venta (mejor para comparar el tamaño de las barras del histograma), sin exito, Puedes dar alguna pista de como hacerlo o postear donde deberia modificarse el codigo original?

Reemplace la función DisplayValues() por esta:

//+------------------------------------------------------------------+
//| Отображение значений индикатора|
//+------------------------------------------------------------------+
void DisplayValues(const int index,// Номер свечи
                   const long sumVolBuy,// Суммарный объем покупок
                   const long sumVolSell,          // Суммарный объем продаж
                   const int line                  // Номер строки вызова функции
                   )
  {
//--- Проверяем корректность номера свечи
   if(index<0) // Если некорректный номер
     {
      Print(__FUNCTION__,": ¡ОШИБКА! Некорректный номер свечи '",index,"'");
      return;                                       // Выходим
     }
//--- Рассчитаем дельту
   const double delta=double(sumVolBuy-sumVolSell);
//--- Заносим значения в буферы
   //bufDelta[ index ]= delta; // Записываем значение дельты
   bufDelta[ index ]= (delta>0) ? delta : -delta;  // Записываем значение дельты
   bufDeltaColor[ index ] =(delta>0) ?  0 : 1;     // Записываем цвет значения
   bufBuyVol[ index ] = (double)sumVolBuy;         // Записываем сумму покупок
   bufSellVol[ index ]=(double)sumVolSell;         // Записываем сумму продаж
  }

Otra pregunta, ¿es posible trazar un histograma vertical en lugar de horizontal?

No es posible en este indicador.
 

Sr. Kozitsyn,


En primer lugar, ¡¡¡felicidades!!! ¡Gran, gran, gran trabajo! Eso es lo que estoy buscando.

Sin embargo, este indicador es la mitad de mi deseo. Me gustaría dibujar una banda bolinger sobre el indicador delta para mostrarme donde el flujo de dinero es mayor que un comportamiento normal. Lo había intentado, pero no era capaz de ver las líneas bbands en la misma ventana. ¿Podrías ayudarme?

¡¡¡Muchas gracias!!!


Rodrigo Pimenta

[Eliminado]  
rpimentaf:

¿Podría ayudarme?

¡¡¡Muchas gracias!!!


Rodrigo Pimenta

Lo siento, pero no trabajo con BB.

Puedes usar Freelance para tu tarea.

 
Alexey Kozitsyn:

En general, en nuestro mercado usando garrapatas y cristal se pueden hacer cosas muy chulas.

Estoy de acuerdo contigo. He estado viendo Delta durante mucho tiempo, no lo uso a menudo

Tienes un gran indicador, ¡me funciona hasta los fines de semana!

Observo delta en timeframes menores a un minuto, cuando el precio rompe el máximo local y en lugar de stops (delta azul) hay ventas de mercado. Por lo general, después de una configuración de este tipo, el precio hace una corrección.

foto

Bueno, es así, sólo en el tema.

Mi pregunta es diferente. Recientemente he empezado a aprender a escribir indicadores. Poco a poco los estoy dominando, utilizando el método científico y copypaste.

Quería escribir un indicador de divergencia delta. Este es el código de delta venta delta de barras AP (rojo), y delta azul de barras hacia abajo.

Con la ayuda de su indicador, a través de iCustom mi indicador funciona normalmente.

Pero como estoy aprendiendo, estoy interesado en escribir mi propio. Y mi propio indicador no funciona (. Es el tercer día que estoy golpeando sobre él, y no cede. Si no es difícil, por favor dígame cuál es el error.

La lógica para determinar el delta es la siguiente: como no necesito el delta en la barra actual, decidí que puedo calcular el delta utilizando el volumen de ticks de la barra anterior OnCalculate, tick_volume[] , como el número de ticks al copiar CopyTicks. El meta-editor compila, pero da una advertencia de que uso diferentes tipos de datos en tick volume long, y en CopyTicks es necesario especificar el número de ticks en uint. El tiempo de inicio de la copia se toma en el mismo time[],

Al probar en el tester da el error "Array out of range", y no puedo entender que límites sobrepasa y como determinar que cambiar para que el indicador no funcione, pero al menos eliminar este error.

Aquí esta el código del sumador, por favor no se rían mucho.

#property indicator_chart_window 
#property indicator_buffers 5 
#property indicator_plots   1
  
#property indicator_label1  "Diver_handl" 
#property indicator_type1   DRAW_COLOR_CANDLES 
//--- establece 2 colores para pintar velas (se almacenan en el buffer de color) 
#property indicator_color1  clrRed,clrBlue
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 // grosor de la línea de dibujo, no es realmente necesario aquí.

//--- parámetros de entrada 
//--- tampones indicadores
double         ColorCandlesBuffer1[];//tampones para velas
double         ColorCandlesBuffer2[];
double         ColorCandlesBuffer3[];
double         ColorCandlesBuffer4[];
double         ColorCandlesColors[]; // Tampón de color

string symbol;  //--- nombre del personaje 
double _Delta;
//+------------------------------------------------------------------+ 
//| Función de inicialización del indicador personalizada | 
//+------------------------------------------------------------------+ 
int OnInit()
  {
//--- asignación de búferes indicadores 
   SetIndexBuffer(0,ColorCandlesBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorCandlesBuffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorCandlesBuffer3,INDICATOR_DATA);
   SetIndexBuffer(3,ColorCandlesBuffer4,INDICATOR_DATA);
   SetIndexBuffer(4,ColorCandlesColors,INDICATOR_COLOR_INDEX);
   
//--- valor vacío (valor que no se dibujará) 
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   
//--- nombre del símbolo con el que se dibujan las barras 
   symbol=_Symbol;
   
//--- configurar la visualización de símbolos 
   PlotIndexSetString(0,PLOT_LABEL,symbol+" Open;"+symbol+" High;"+symbol+" Low;"+symbol+" Close");
   IndicatorSetString(INDICATOR_SHORTNAME,"Diver("+symbol+")");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+ 
//| Función de iteración del indicador personalizada | 
//+------------------------------------------------------------------+ 
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[])
  {
   int i,limit;
   int buf_size=rates_total-prev_calculated;
   if(rates_total<2)
      return(0);

   if(prev_calculated<3)
     {
      limit=1;
      // inicializar las matrices con valores vacíos
      ArrayInitialize(ColorCandlesBuffer1,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesBuffer2,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesBuffer3,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesBuffer4,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesColors,EMPTY_VALUE);
     }
   else limit=rates_total-1;

   MqlTick Ticks[];   //declarar un array que se rellenará con datos de tick
   
   for(i=limit; i<rates_total-1; i++)
     {
      CopyTicks(Symbol(),Ticks,COPY_TICKS_TRADE,0,tick_volume[i]);  // copia en la matriz Ticks los datos de ticks en la cantidad igual al volumen de ticks en la vela tick_volume[i]
      SetBarData(time[i],Ticks,i,_Delta,tick_volume[i]);// función en el sótano ↓

      if(open[i-1]<close[i-1] && _Delta<0)
        {
         ColorCandlesBuffer1[i-1]=open[i-1];
         ColorCandlesBuffer2[i-1]=high[i-1];
         ColorCandlesBuffer3[i-1]=low[i];
         ColorCandlesBuffer4[i-1]=close[i];
         ColorCandlesColors[i-1]=1;
        }
      else if(open[i]>close[i] && _Delta>0)
        {
         ColorCandlesBuffer1[i-1]=open[i-1];
         ColorCandlesBuffer2[i-1]=high[i-1];
         ColorCandlesBuffer3[i-1]=low[i];
         ColorCandlesBuffer4[i-1]=close[i];
         ColorCandlesColors[i-1]=0;
        }
      else
        {
         ColorCandlesBuffer1[i]=0.0;
         ColorCandlesBuffer2[i]=0.0;
         ColorCandlesBuffer3[i]=0.0;
         ColorCandlesBuffer4[i]=0.0;
        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
// Rellena la barra con los ticks apropiados
void SetBarData(const datetime TimeBar,const MqlTick &Ticks[],int &Pos,double &Delta,const long vol)
  {
  int i=0;
   while(i<vol)
     {
      MqlTick Tick=Ticks[Pos];  // copiar las lecturas del búfer de datos de ticks en la variable
      if(i>=vol)
         break;   // cuando i sanset es igual al volumen tick , vail †
      if((bool)(Tick.flags  &TICK_FLAG_BUY))  // si la bandera es comprar añadir al delta
         Delta+=(double)Tick.volume;
      else if((bool)(Tick.flags  &TICK_FLAG_SELL)) // si la bandera es Vender, restar del delta
         Delta-=(double)Tick.volume;
      i++;
     }
   return;
  }
//+------------------------------------------------------------------+
Experimenté mucho, así que puede haber artefactos de experimentos anteriores, en forma de variables declaradas pero no utilizadas.
[Eliminado]  
s22aa:

Si no es difícil, por favor dígame cuál es el error.

No puedo ver el lugar exacto con el error a primera vista, pero, para empezar, mira cómo CopyTicks() se maneja en mi indicador. En particular, la devolución del valor y el manejo de posibles errores.

Sí, si se produce un desbordamiento del array... mira cuántos valores hay en el array y a qué elemento estás accediendo. También puedes despintar el primer y último valor después de recibir los datos para ver si se recibieron todos los datos.

 
Alexey Kozitsyn:

ver cómo CopyTicks() se maneja en mi indicador.

Wow, es complicado. Los ticks se copian tanto por intervalo de tiempo como por número. En general, el sistema se duplica no peor que en cosmonauts))))

Encontré donde lo hice.

MqlTick Tick = Ticks[Pos];

Estoy intentando copiar un array en una variable. Es extraño porque el compilador no reacciona a ello, y cuando lo ejecutas en el tester, el tester se cuelga.

Intentaré pensar en otra cosa.
 
s22aa:

Estoy intentando copiar un array en una variable.


No, no lo estás haciendo. Es cierto. Estoy totalmente confundido. Voy a tener una mañana mejor. Mañana todo saldrá bien.