Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 8

 
Andrei Gerasimenko:

J'ai très envie d'utiliser mql4 pour mettre en œuvre un tel algorithme :

Il existe deux terminaux MT4 provenant de courtiers différents. Dans l'un d'eux, il y a un indicateur "exclusif", qui ne peut pas être déplacé vers un autre terminal (comme dans Market).

Et alors ? Est-il possible de prendre les lectures des tampons de l'indicateur "exclusif" et de les implémenter dans votre propre indicateur dans votre propre terminal ?

Les ressources ne fonctionnent pas d'une manière ou d'une autre.

Option numéro 1 = ouvrir un compte avec Mikhalych (c'était bien ça ?)

Option numéro 2 = écrire un indicateur qui va sauvegarder les données de l'indicateur dans un fichier et le sauvegarder, puis lire ce fichier avec un autre indicateur dans un autre terminal et créer des lignes avec lui.

 

Aidez-moi s'il vous plaît - J'essaie d'alléger l'indicateur - converti du RSI, mais je n'arrive pas à comprendre pourquoi les valeurs de l'indicateur sont différentes ?

//+------------------------------------------------------------------+
//|                                                       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);
  }
//+------------------------------------------------------------------+
Dossiers :
SVA_02.mq4  4 kb
SVA_03.mq4  4 kb
 
-Aleks-:

Aidez-moi s'il vous plaît - J'essaie d'alléger l'indicateur - conversion du RSI, mais je ne comprends pas pourquoi les valeurs de l'indicateur sont différentes ?

...

и

...

Ce n'est pas du tout clair ce que vous essayiez de faire, ce que vous avez mal fait, et ce que vous vouliez obtenir à la fin.
 
-Aleks-:

Aidez-moi s'il vous plaît - J'essaie d'alléger l'indicateur - converti du RSI, mais je n'arrive pas à comprendre pourquoi les valeurs de l'indicateur sont différentes ?

En 03, le positif et le négatif sont calculés pour la barre et sont immédiatement utilisés pour calculer la moyenne. Dans 02 calcul de la moyenne dans un cycle séparé, en positif et en négatif quoi ? Il y a quelque chose, mais pas pour la barre calculée.
 
Artyom Trishkin:
Ce n'est pas clair du tout ce que vous essayiez de faire, ce que vous avez mal fait et ce que vous vouliez obtenir à la fin.

Initialement, j'essaie de me débarrasser des tampons inutiles lors du calcul de la partie RSI en supprimant les tampons théoriquement inutiles étaient :

   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] etNegBuffer[i] sont en fait les valeurspositives etnégativespassées, qui, plus profondes qu'une barre, ne sont pas utilisées, mais consomment de la mémoire, devenue :

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

Et en plus, j'ai coupé une partie de mon indicateur (fourni la partie problématique du code), qui dans une boucle identique fait un autre calcul 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--;
     }

Et puis j'ai pensé que puisque la boucle est identique, je pourrais juste mettre le calcul dans la première boucle - j'ai obtenuSVA_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);
  }

Voici la dernière étape, il s'avère que les résultats deMABuffer[i] sontdifférents dans SVA_02 et SVA_03 - je n'arrive pas à comprendre logiquement quelle est l'erreur.

 
Dmitry Fedoseev:
En 03, le positif et le négatif ont été calculés pour la barre et immédiatement utilisés pour calculer la moyenne. En 02 le calcul de la moyenne est dans un cycle séparé, en positif et en négatif quoi ? Il y a quelque chose, mais pas pour la barre calculée.
Oui, mais en fait, quelle est la différence ? Les cycles sont les mêmes - aidez-moi à comprendre quelle est l'erreur logique.
 
-Aleks-:
Oui, c'est vrai, mais quelle est la différence réelle ? Les cycles sont les mêmes - aidez-moi à comprendre quelle est l'erreur logique.
Comment peut-on vous expliquer quoi que ce soit ? Déjà expliqué ici. Qu'est-ce qui n'est pas clair dans cette explication ? Est-ce un mode de vie - être un imbécile et faire l'imbécile ? Comment est-il possible d'expliquer quelque chose après ça ? Avec un marteau de forgeron sur la tête ? Eh bien, enlève ton casque.
 
Dmitry Fedoseev:
Comment peut-on vous expliquer quoi que ce soit ? Cela a déjà été expliqué ici. Qu'est-ce qui n'est pas clair dans cette explication ? Est-ce un mode de vie que d'être un idiot et de se ridiculiser ? Comment pouvez-vous expliquer quoi que ce soit après ça ? Avec un marteau de forgeron sur la tête ? Eh bien, enlève ton casque.
Parce que la phrase"Il y a quelque chose, mais ce n'est pas pour la barre qui est comptée. "Cela semble étrange, car la boucle a une valeur de la dernière bouclepositive etnégative.
 
-Aleks-:
Oui parce que la phrase"Quelque chose est là, mais pas pour la barre qui est comptée."Cela semble étrange car le cycle a une valeur du dernier cyclepositive etnégative.
Du dernier cycle pour une dernière barre, il reste quelque chose, mais vous l'appliquez à chaque barre. Dans la variante correcte, rien n'est laissé dans les variables, mais il est calculé pour chaque barre et immédiatement utilisé pour calculer la moyenne.
 
Dmitry Fedoseev:
Du dernier cycle pour une dernière mesure, il reste quelque chose, et vous l'appliquez pour chaque mesure. Dans la variante correcte, rien n'est laissé dans les variables, mais est calculé pour chaque barre et immédiatement utilisé pour calculer la moyenne.

J'essaie de donner un sens à tout ça. Donc, à votre avis, l'option correcte est SVA_03, n'est-ce pas ?