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

 

Saludos a todos los miembros del foro.

Por favor, ayúdenme a conseguir que el indicador funcione con un símbolo específico, independientemente del gráfico en el que esté configurado.

Sé que se utiliza un parámetro externo para cambiar el símbolo

input string   Symb   ="GBPJPY";
No sé qué hacer a continuación

Adjunto el indicador

Archivos adjuntos:
Fisher.mq4  3 kb
 

Por favor, me pueden decir cómo restablecer el buffer cuando aparece una nueva barra, pero para que no se borren los datos anteriores y se muestren en el gráfico. Poralguna razón no puedo poner el buffer a cero y cuando apareceuna nueva barra, los nuevos datos se superponen a los antiguos datos acumulados. ¿En qué me equivoco en mi código? Gracias por la aclaración.

void OnInit()
{
   IndicatorDigits(0);
   SetIndexBuffer(0,Buf_1);
   SetIndexBuffer(1,Buf_2);
   Bid1=Bid;
  
   
}
 
 
//+------------------------------------------------------------------+
//| 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[])
{
   datetime Вр=Time[0];   // Время текущего бара
   if(Вр>Время)           // Если новый бар
   {
      Время=Вр;           // Запомнить
      Buf_1[0]=0;         // и обнулить последний элемент буфера
      Buf_2[0]=0;
   }
   
      
   if(Bid > Bid1) 
   {
   V1 = iVolume(NULL, 0, 0);
   V2 = V1 + V2;
   Buf_1[0]= V2;
   }                             
   else 
   {
   V3 = iVolume(NULL, 0, 0);
   V4 = V3 + V4;
   Buf_2[0]= (V4*-1);
   }
   Bid1=Bid;
   
   
  return(rates_total);
}
 
Alekseu Fedotov:

Así son las cosas


Tengo una duda con el código, resulta que la vela actual no cerrada tiene la hora de Cierre y hasta que no se cierra la vela, el indicador dibuja el precio de cierre del periodo, en el que el indicador se pone rojo en la zona de la pantalla que no debería dibujarse porque la vela de la hora no está cerrada , ese es el tiempo de compilación y luego después de la compilación viene el dibujo de cada vela cerrada, por supuesto que se puede resolver de otra manera mediante la búsqueda de las barras de la hora, pero yo quería una manera más fácil, escribí antes así
for(i=limit; i>0; i--)
{
yesterday_weekday = TimeHour(iTime(Symbol(),0,i+1))-TimeHour(iTime(Symbol(),0,i));
if(yesterday_weekday!=0)

cualquier otra solución al problema? Me gustaría verlo en la compilación, pero quería tener una solución más fácil.

 
MakarFX: Por favor, ayúdenme a hacer que el indicador funcione con un determinado símbolo, independientemente del gráfico en el que esté configurado.

Es necesario escribir este parámetro en las llamadas Higest, Lowest - son obsoletas, mejor iHigest, iLowest y elogiado notorio Fisher inmediatamente acordó un empate (V.Vysotsky)

 
PokrovMT5:
Tengo una duda con el código, resulta que la vela de una hora actual no cerrada tiene el tiempo de Cierre y hasta que la vela no se cierra, el indicador dibuja el cierre del precio del periodo en el que se encuentra el indicador, se supone que la zona roja de la pantalla no se dibuja porque la vela de una hora no está cerrada , ese es el momento de la compilación y luego después de la compilación viene el dibujo de cada vela cerrada, por supuesto que se puede resolver de otra manera mediante la búsqueda de las barras de la hora, pero yo quería una manera más fácil, escribí antes así

¿Hay otra solución al problema? Gracias.

Si lo he entendido bien, ¿quieres marcar el cierre horario en el gráfico?

// (только для TF меньше часа) для всех свечей внутри часа поставить HourCloseBuff=цена закрытия часа

// предполагается что close индексирован как тайм-серия

for(int back=i+1;back<=limit && TimeHour(time[back]==TimeHour(time[i+1]);back++) {

  HourCloseBuff[back]=close[i+1];

}

 
STARIJ:

Deberíamos escribir este parámetro en las llamadas Higest, Lowest - son obsoletas, mejor iHigest, iLowest y el elogiado y notorio Fischer acordó inmediatamente unas tablas (V.Vysotsky)

#property  copyright "Copyright © 2005, Yura Prokofiev"
#property  link      "Yura.prokofiev@gmail.com"

#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Black
#property  indicator_color2  Lime
#property  indicator_color3  Red
 
input string   Symb     ="GBPJPY";
extern int     period   =10;

double         ExtBuffer0[];
double         ExtBuffer1[];
double         ExtBuffer2[];


int init()
  {
   
   
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2,Red);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2,Lime);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   IndicatorDigits(Digits+1);

   SetIndexBuffer(0,ExtBuffer0);
   SetIndexBuffer(1,ExtBuffer1);
   SetIndexBuffer(2,ExtBuffer2);

   IndicatorShortName("Fisher");
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);

   return(0);
  }


int start()
  {
   //int     period=10;
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current,old;
   double Value=0,Value1=0,Value2=0,Fish=0,Fish1=0,Fish2=0;
   double price;
   double MinL=0;
   double MaxH=0;  
   

   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;


   for(int i=0; i<limit; i++)
    {  MaxH = High[iHighest(Symb,0,MODE_HIGH,period,i)];
       MinL = Low[iLowest(Symb,0,MODE_LOW,period,i)];
      price = (High[i]+Low[i])/2;
      Value = 0.33*2*((price-MinL)/(MaxH-MinL)-0.5) + 0.67*Value1;     
      Value=MathMin(MathMax(Value,-0.999),0.999); 
      ExtBuffer0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
      Value1=Value;
      Fish1=ExtBuffer0[i];
      
    }


   bool up=true;
   for(i=limit-2; i>=0; i--)
     {
      current=ExtBuffer0[i];
      prev=ExtBuffer0[i+1];
           
      if (((current<0)&&(prev>0))||(current<0))   up= false;    
      if (((current>0)&&(prev<0))||(current>0))   up= true;
      
      if(!up)
        {
         ExtBuffer2[i]=current;
         ExtBuffer1[i]=0.0;
        }
        
       else
         {
          ExtBuffer1[i]=current;
          ExtBuffer2[i]=0.0;
         }
     }

   return(0);
  }
Lo hice, pero eso no resuelve el problema para
price = (High[i]+Low[i])/2;
Alta y Baja utilizan el símbolo actual.
 
Maxim Kuznetsov:

Si lo he entendido bien, ¿quieres marcar el cierre horario en el gráfico?

// (только для TF меньше часа) для всех свечей внутри часа поставить HourCloseBuff=цена закрытия часа

// предполагается что close индексирован как тайм-серия

for(int back=i+1;back<=limit && TimeHour(time[back]==TimeHour(time[i+1]);back++) {

  HourCloseBuff[back]=close[i+1];

}

Maxim, ¡buenos días! Gracias por la variante, la mía es casi igual, también funciona, peroAlekseu Fedotov lo sugirió y escribí que hay una idea de cómo corregirlo?



for(i=limit; i>=0; i--)
     {
      T = iTime(NULL,0,i); 
      shift=iBarShift(NULL,60,T); 
      C=iClose(NULL,60,shift);
      CC[i]=C;
     }
 

Por favor, me pueden decir cómo restablecer el buffer cuando aparece una nueva barra, pero para que no se borren los datos anteriores y se muestren en el gráfico. Poralguna razón no puedo poner el buffer a cero y cuando apareceuna nueva barra, los nuevos datos se superponen a los antiguos datos acumulados. ¿En qué me equivoco en mi código? Gracias por la aclaración.

 datetime Вр=Time[0];   // Время текущего бара
   if(Вр>Время)           // Если новый бар
   {
      Время=Вр;           // Запомнить
      Buf_1[0]=0;         // и обнулить последний элемент буфера
      Buf_2[0]=0;
   }
   
      
   if(Bid > Bid1) 
   {
   V1 = iVolume(NULL, 0, 0);
   V2 = V1 + V2;
   Buf_1[0]= V2;
   }                             
   else 
   {
   V3 = iVolume(NULL, 0, 0);
   V4 = V3 + V4;
   Buf_2[0]= (V4*-1);
   }
   Bid1=Bid;
   
   
  return(rates_total);
 

¿Nadie puede ayudarme?

 

¡Buenos días a todos! ¿Cómo puedo cambiar a la ventana de gráficos correcta?

Tengo muchas ventanas de diferentes pares abiertas, cada una con un EA, aparece una señal de operación, pero las divisas están hasta la coronilla, y necesito activar rápidamente el gráfico exacto en el que vino la señal.

Conozco el comando Symbol(), pero no sé cómo activar una ventana con un par de divisas especificado. Tal vez, ¿quién se ha enfrentado a esta tarea?