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

 
Andrei Gerasimenko:

Tengo un gran deseo de utilizar mql4 para implementar dicho algoritmo:

Hay dos terminales MT4 de diferentes brokers. En uno de ellos hay un indicador de "exclusividad", que no se puede mover a otro terminal (como en Market).

¿Y qué? ¿Es posible tomar las lecturas de los búferes del indicador "exclusivo" e implementarlas en tu propio indicador en tu propio terminal?

Los recursos no funcionan de alguna manera.

Opción número 1 = abrir una cuenta con Mikhalych (¿es correcto?)

Opción número 2 = escribir un indicador que guarde los datos del indicador en un archivo y lo guarde, para luego leer este archivo con otro indicador en otra terminal y crear líneas con él.

 

Por favor, ayuda - Estoy tratando de aligerar el indicador - convertido de RSI, pero no puedo entender por qué los valores del indicador son diferentes?

//+------------------------------------------------------------------+
//|                                                       SVA_02.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
#property strict

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Yellow

//---- input parameters
extern int RSIPeriod=14;
extern int Levl=50;
extern int TF=0;
//---- buffers
double MABuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
   IndicatorBuffers(1);
   SetIndexBuffer(0,MABuffer);

//---- indicator line
   SetIndexStyle(0,DRAW_LINE);
//----
//---- name for DataWindow and indicator subwindow label
//   short_name="RSI("+IntegerToString(RSIPeriod)+")";
   short_name="RSI("+RSIPeriod+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);

   return(0);
  }
//+------------------------------------------------------------------+
//| Relative Strength Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int    i,counted_bars=IndicatorCounted();
   double rel,negative,positive,sma,x,y,Pos,Neg;
//----
   if(Bars<=RSIPeriod) return(0);
   if(TF!=0)
     {
      string name=WindowExpertName();
      for(i=0; i<Bars-counted_bars+1; i++)
        {
         int barIndex=iBarShift(NULL,TF,Time[i],false);
         MABuffer[i]=iCustom(Symbol(),TF,name,RSIPeriod,Levl,0,0,barIndex);
        }
      return(0);
     }

   i=Bars-RSIPeriod-1;
   if(counted_bars>=RSIPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double sumn=0.0,sump=0.0;
      if(i==Bars-RSIPeriod-1)
        {
         int k=Bars-2;
         //---- initial accumulation
         while(k>=i)
           {
            rel=Close[k]-Close[k+1];
            if(rel>0) sump+=rel;
            else      sumn-=rel;
            k--;
           }
         positive=sump/RSIPeriod;
         negative=sumn/RSIPeriod;
        }
      else
        {
         //---- smoothed moving average
         rel=Close[i]-Close[i+1];
         if(rel>0) sump=rel;
         else      sumn=-rel;
         positive=(Pos*(RSIPeriod-1)+sump)/RSIPeriod;
         negative=(Neg*(RSIPeriod-1)+sumn)/RSIPeriod;
        }

      Pos=positive;
      Neg=negative;
      i--;
     }
   i=Bars-RSIPeriod-1;
   if(counted_bars>=RSIPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {

      x=positive;
      y=negative;
      if(x>0)sma=Close[i+1]+x;
      else sma=Close[i+1]-y;
      MABuffer[i]=sma;
      i--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+


и

//+------------------------------------------------------------------+
//|                                                       SVA_03.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
#property strict

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Yellow

//---- input parameters
extern int RSIPeriod=14;
extern int Levl=50;
extern int TF=0;
//---- buffers
double MABuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
   IndicatorBuffers(1);
   SetIndexBuffer(0,MABuffer);

//---- indicator line
   SetIndexStyle(0,DRAW_LINE);
//----
//---- name for DataWindow and indicator subwindow label
//   short_name="RSI("+IntegerToString(RSIPeriod)+")";
   short_name="RSI("+RSIPeriod+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);

   return(0);
  }
//+------------------------------------------------------------------+
//| Relative Strength Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int    i,counted_bars=IndicatorCounted();
   double rel,negative,positive,sma,x,y,Pos,Neg;
//----
   if(Bars<=RSIPeriod) return(0);
   if(TF!=0)
     {
      string name=WindowExpertName();
      for(i=0; i<Bars-counted_bars+1; i++)
        {
         int barIndex=iBarShift(NULL,TF,Time[i],false);
         MABuffer[i]=iCustom(Symbol(),TF,name,RSIPeriod,Levl,0,0,barIndex);
        }
      return(0);
     }

   i=Bars-RSIPeriod-1;
   if(counted_bars>=RSIPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double sumn=0.0,sump=0.0;
      if(i==Bars-RSIPeriod-1)
        {
         int k=Bars-2;
         //---- initial accumulation
         while(k>=i)
           {
            rel=Close[k]-Close[k+1];
            if(rel>0) sump+=rel;
            else      sumn-=rel;
            k--;
           }
         positive=sump/RSIPeriod;
         negative=sumn/RSIPeriod;
        }
      else
        {
         //---- smoothed moving average
         rel=Close[i]-Close[i+1];
         if(rel>0) sump=rel;
         else      sumn=-rel;
         positive=(Pos*(RSIPeriod-1)+sump)/RSIPeriod;
         negative=(Neg*(RSIPeriod-1)+sumn)/RSIPeriod;
        }

      x=positive;
      y=negative;
      Pos=positive;
      Neg=negative;
      if(x>0)sma=Close[i+1]+x;
      else sma=Close[i+1]-y;
      MABuffer[i]=sma;

      i--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+
Archivos adjuntos:
SVA_02.mq4  4 kb
SVA_03.mq4  4 kb
 
-Aleks-:

Por favor, ayuda - Estoy tratando de aligerar el indicador - la conversión de RSI, pero no puedo entender por qué los valores del indicador son diferentes?

...

и

...

No está nada claro qué intentabas hacer, qué hiciste mal y qué querías conseguir al final.
 
-Aleks-:

Por favor, ayuda - Estoy tratando de aligerar el indicador - convertido de RSI, pero no puedo entender por qué los valores del indicador son diferentes?

En 03 positivo y negativo calculado para la barra e inmediatamente los utilizó para calcular la media. En 02 cálculo de la media en un ciclo separado, en positivo y en negativo ¿qué? Algo hay, pero no para la barra que se calcula.
 
Artyom Trishkin:
No está nada claro qué intentabas hacer, qué hiciste mal y qué querías conseguir al final.

Inicialmente estoy tratando de deshacerse de los búferes innecesarios al calcular la parte RSI mediante la eliminación de los búferes teóricamente innecesarios eran:

   i=Bars-RSIPeriod-1;
   if(counted_bars>=RSIPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double sumn=0.0,sump=0.0;
      if(i==Bars-RSIPeriod-1)
        {
         int k=Bars-2;
         //---- initial accumulation
         while(k>=i)
           {
            rel=Close[k]-Close[k+1];
            if(rel>0) sump+=rel;
            else      sumn-=rel;
            k--;
           }
         positive=sump/RSIPeriod;
         negative=sumn/RSIPeriod;
        }
      else
        {
         //---- smoothed moving average
         rel=Close[i]-Close[i+1];
         if(rel>0) sump=rel;
         else      sumn=-rel;
         positive=(PosBuffer[i+1]*(RSIPeriod-1)+sump)/RSIPeriod;
         negative=(NegBuffer[i+1]*(RSIPeriod-1)+sumn)/RSIPeriod;
        }
      PosBuffer[i]=positive;
      NegBuffer[i]=negative;

      i--;
     }

PosBuffer[i] yNegBuffer[i] son en realidad los valorespositivos ynegativospasados, que más allá de una barra no se utilizan, pero consumen memoria, se convirtió:

   i=Bars-RSIPeriod-1;
   if(counted_bars>=RSIPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double sumn=0.0,sump=0.0;
      if(i==Bars-RSIPeriod-1)
        {
         int k=Bars-2;
         //---- initial accumulation
         while(k>=i)
           {
            rel=Close[k]-Close[k+1];
            if(rel>0) sump+=rel;
            else      sumn-=rel;
            k--;
           }
         positive=sump/RSIPeriod;
         negative=sumn/RSIPeriod;
        }
      else
        {
         //---- smoothed moving average
         rel=Close[i]-Close[i+1];
         if(rel>0) sump=rel;
         else      sumn=-rel;
         positive=(Pos*(RSIPeriod-1)+sump)/RSIPeriod;
         negative=(Neg*(RSIPeriod-1)+sumn)/RSIPeriod;
        }

      Pos=positive;
      Neg=negative;
      i--;
     }

Y además, recorto una parte para mi indicador (proporcionado parte problemática del código), que en el bucle idéntico hace más cálculo SVA_02

   i=Bars-RSIPeriod-1;
   if(counted_bars>=RSIPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {

      x=positive;
      y=negative;
      if(x>0)sma=Close[i+1]+x;
      else sma=Close[i+1]-y;
      MABuffer[i]=sma;
      i--;
     }

Y entonces pensé que, como el bucle es idéntico, podía simplemente poner el cálculo en el primer bucle: obtuveSVA_03

   i=Bars-RSIPeriod-1;
   if(counted_bars>=RSIPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double sumn=0.0,sump=0.0;
      if(i==Bars-RSIPeriod-1)
        {
         int k=Bars-2;
         //---- initial accumulation
         while(k>=i)
           {
            rel=Close[k]-Close[k+1];
            if(rel>0) sump+=rel;
            else      sumn-=rel;
            k--;
           }
         positive=sump/RSIPeriod;
         negative=sumn/RSIPeriod;
        }
      else
        {
         //---- smoothed moving average
         rel=Close[i]-Close[i+1];
         if(rel>0) sump=rel;
         else      sumn=-rel;
         positive=(Pos*(RSIPeriod-1)+sump)/RSIPeriod;
         negative=(Neg*(RSIPeriod-1)+sumn)/RSIPeriod;
        }

      x=positive;
      y=negative;
      Pos=positive;
      Neg=negative;
      if(x>0)sma=Close[i+1]+x;
      else sma=Close[i+1]-y;
      MABuffer[i]=sma;

      i--;
     }
//----
   return(0);
  }

Aquí está el último paso, resulta que los resultados deMABuffer[i] sondiferentes en SVA_02 y SVA_03 - no puedo entender lógicamente cuál esel error.

 
Dmitry Fedoseev:
En 03 se calculó el positivo y el negativo de la barra y se utilizó inmediatamente para calcular la media. En 02 el cálculo de la media está en un ciclo separado, en positivo y en negativo ¿qué? Hay algo, pero no para la barra que se calcula.
Sí, pero en realidad, ¿cuál es la diferencia? Los ciclos son los mismos - por favor, ayúdame a entender cuál es el error lógico.
 
-Aleks-:
Sí, es cierto, pero ¿cuál es la diferencia real? Los ciclos son los mismos - por favor, ayúdame a entender cuál es el error lógico.
¿Cómo se le puede explicar algo? Ya se ha explicado aquí. ¿Qué es lo que no está claro en esta explicación? ¿Es una forma de vida: ser un tonto y hacerse el tonto? ¿Cómo es posible explicar algo después de eso? ¿Con un mazo en la cabeza? Bueno, quítate el casco.
 
Dmitry Fedoseev:
¿Cómo se le puede explicar algo? Ya se ha explicado aquí. ¿Qué es lo que no está claro en esta explicación? ¿Es una forma de vida ser un tonto y hacer el ridículo? ¿Cómo puedes explicar algo después de eso? ¿Con un mazo en la cabeza? Bueno, quítate el casco.
Porque la frase "Hayalgo, pero no es para la barra que se cuenta. " suena extraño, porque el bucle tiene un valor del último buclepositivo ynegativo.
 
-Aleks-:
Sí porque la frase"Algo hay, pero no para la barra que se cuenta." suena extraño porque el ciclo tiene un valor del último ciclopositivo ynegativo.
Desde el último bucle para algún último compás, algo queda ahí, pero lo aplicas para cada compás. En la variante correcta, no se deja nada en las variables, sino que se calcula para cada barra y se utiliza inmediatamente para calcular la media.
 
Dmitry Fedoseev:
Del último ciclo para algún último compás, queda algo en él, y lo aplicas para cada compás. En la variante correcta no se deja nada en las variables, sino que se calcula para cada barra y se utiliza inmediatamente para calcular la media.

Estoy tratando de encontrarle sentido. Así que, en su opinión, la opción correcta es SVA_03, ¿verdad?

Razón de la queja: