Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 8

 
Andrei Gerasimenko:

Tenho um grande desejo de usar o mql4 para implementar tal algoritmo:

Existem dois terminais MT4 de diferentes corretores. Em um deles há um indicador "exclusivo", que não pode ser movido para outro terminal (como no Mercado).

E daí! É possível tomar as leituras dos buffers indicadores "exclusivos" e implementá-los em seu próprio indicador em seu próprio terminal?

Os recursos não funcionam de alguma forma.

Opção número 1 = abrir uma conta com Mikhalych (estava certo?)

Opção número 2 = escrever um indicador que salvará os dados do indicador em um arquivo e salvá-lo, depois ler este arquivo com outro indicador em outro terminal e criar linhas com ele.

 

Por favor, ajude - estou tentando aliviar o indicador - convertido do RSI, mas não consigo entender porque os valores do indicador são 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);
  }
//+------------------------------------------------------------------+
Arquivos anexados:
SVA_02.mq4  4 kb
SVA_03.mq4  4 kb
 
-Aleks-:

Por favor, ajude - estou tentando aliviar o indicador - conversão do RSI, mas não consigo entender porque os valores do indicador são diferentes?

...

и

...

Só não está nada claro o que você estava tentando fazer, o que você fez de errado, e o que você queria obter no final.
 
-Aleks-:

Por favor, ajude - estou tentando aliviar o indicador - convertido do RSI, mas não consigo entender porque os valores do indicador são diferentes?

Em 03 positivos e negativos calculados para barra e imediatamente usados para calcular a média. Em 02 cálculo da média em um ciclo separado, em positivo e negativo o quê? Algo está lá, mas não para a barra sendo calculada.
 
Artyom Trishkin:
Só não está nada claro o que você estava tentando fazer, o que você fez de errado e o que você queria obter no final.

Inicialmente estou tentando me livrar de amortecedores desnecessários ao calcular a parte da LER, removendo os amortecedores teoricamente desnecessários:

   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] eNegBuffer[i] são na verdade valorespositivos enegativospassados, que mais profundos que uma barra não são usados, mas consomem memória, tornaram-se:

   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--;
     }

E além disso, eu aparo parte para meu indicador (desde que parte problemática do código), que em loop idêntico faz mais cálculos 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--;
     }

E então pensei que, como o laço é idêntico, eu poderia apenas colocar o cálculo no primeiro laço - eu conseguiSVA_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);
  }

Aqui está o último passo, acontece queMABuffer[i] os resultados sãodiferentes em SVA_02 e SVA_03 - não consigo entender logicamente qual éo erro.

 
Dmitry Fedoseev:
Em 03 os positivos e negativos foram calculados para a barra e imediatamente usados para calcular a média. Em 02 o cálculo da média está em um ciclo separado, em positivo e negativo o quê? Há algo, mas não para a barra que está sendo calculada.
É sim, mas na verdade qual é a diferença? Os ciclos são os mesmos - por favor, ajude-me a entender qual é o erro lógico.
 
-Aleks-:
Sim, isso é verdade, mas qual é a diferença real? Os ciclos são os mesmos - por favor, ajude-me a entender qual é o erro lógico.
Como se pode explicar qualquer coisa a você? Já explicado aqui. O que não está claro nesta explicação? É um modo de vida - ser um tolo e se fazer de bobo? Como é possível explicar algo depois disso? Com um martelo de forja na cabeça? Bem, tire seu capacete.
 
Dmitry Fedoseev:
Como se pode explicar qualquer coisa a você? Já foi explicado aqui. O que não está claro sobre esta explicação? É um modo de vida ser um tolo e fazer figura de tolo? Como você pode explicar qualquer coisa depois disso? Com um martelo de forja na cabeça? Bem, tire seu capacete.
Porque a frase: "Há algo, mas não é para o bar ser contado". " parece estranho, porque o loop tem um valor do último looppositivo enegativo.
 
-Aleks-:
Sim, porque a frase"Algo está lá, mas não para o bar que está sendo contado". " soa estranho porque o ciclo tem um valor do último ciclopositivo enegativo.
Desde o último ciclo para alguma última barra, algo é deixado lá, mas você o aplica para cada barra. Na variante correta, nada é deixado nas variáveis, mas é calculado para cada barra e imediatamente utilizado para calcular a média.
 
Dmitry Fedoseev:
Desde o último ciclo para alguma última barra, algo é deixado nela, e você a aplica para cada barra. Na variante correta nada é deixado nas variáveis, mas é calculado para cada barra e imediatamente utilizado para calcular a média.

Estou tentando dar sentido a isso. Então, em sua opinião, a opção correta é SVA_03, certo?