Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 8

 
Andrei Gerasimenko:

Ich habe große Lust, mql4 zu verwenden, um einen solchen Algorithmus zu implementieren:

Es gibt zwei MT4-Terminals von verschiedenen Brokern. In einem von ihnen befindet sich ein "Exklusiv"-Indikator, der nicht auf ein anderes Terminal verschoben werden kann (wie in Market).

Na und! Ist es möglich, die Werte der "exklusiven" Indikatorpuffer zu übernehmen und in einem eigenen Indikator in einem eigenen Terminal zu implementieren?

Die Ressourcen funktionieren irgendwie nicht.

Option Nummer 1 = Eröffnung eines Kontos bei Mikhalych (war das richtig?)

Option Nummer 2 = einen Indikator schreiben, der die Indikatordaten in einer Datei speichert und diese Datei dann mit einem anderen Indikator in einem anderen Terminal lesen und damit Zeilen erstellen.

 

Bitte helfen Sie - ich versuche, den Indikator zu erhellen - konvertiert von RSI, aber ich kann nicht verstehen, warum die Indikatorwerte unterschiedlich sind?

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

Bitte helfen Sie - ich versuche, den Indikator zu erhellen - Konvertierung von RSI, aber ich kann nicht verstehen, warum die Indikatorwerte unterschiedlich sind?

...

и

...

Es ist nur überhaupt nicht klar, was du versucht hast, was du falsch gemacht hast und was du am Ende erreichen wolltest.
 
-Aleks-:

Bitte helfen Sie - ich versuche, den Indikator zu erhellen - konvertiert von RSI, aber ich kann nicht verstehen, warum die Indikatorwerte unterschiedlich sind?

In 03 wurden positive und negative Werte für Balken berechnet und sofort zur Berechnung des Durchschnitts verwendet. In 02 Berechnung des Durchschnitts in einem separaten Zyklus, in positiven und negativen was? Es ist etwas da, aber nicht für den zu berechnenden Balken.
 
Artyom Trishkin:
Es ist nur überhaupt nicht klar, was du versucht hast, was du falsch gemacht hast und was du am Ende erreichen wolltest.

Zunächst versuche ich, unnötige Puffer bei der Berechnung des RSI-Teils loszuwerden, indem theoretisch unnötige Puffer entfernt werden:

   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] undNegBuffer[i] sind eigentlich vergangenepositive undnegativeWerte, die tiefer als ein Balken nicht verwendet werden, sondern Speicher verbrauchen:

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

Und weiter, ich trimmen Teil für meinen Indikator (sofern problematischen Teil des Codes), die in identischen Schleife macht weitere Berechnung 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--;
     }

Und dann dachte ich, da die Schleife identisch ist, könnte ich die Berechnung einfach in die erste Schleife setzen - ich erhieltSVA_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);
  }

Hier ist der letzte Schritt, es stellt sich heraus, dass dieMABuffer[i]- Ergebnissein SVA_02 und SVA_03 unterschiedlich sind- ich kann logisch nicht verstehen, was der Fehler ist.

 
Dmitry Fedoseev:
In 03 wurden die positiven und negativen Werte für den Balken berechnet und sofort zur Berechnung des Durchschnitts verwendet. Im Jahr 02 erfolgt die Durchschnittsberechnung in einem separaten Zyklus, in positiven und negativen was? Es gibt etwas, aber nicht für den zu berechnenden Balken.
Ja, aber worin besteht der Unterschied? Die Zyklen sind die gleichen - bitte helfen Sie mir zu verstehen, wo der logische Fehler liegt.
 
-Aleks-:
Ja, das stimmt, aber was ist der eigentliche Unterschied? Die Zyklen sind die gleichen - bitte helfen Sie mir zu verstehen, wo der logische Fehler liegt.
Wie kann man Ihnen etwas erklären? Bereits hier erklärt. Was ist an dieser Erklärung unklar? Ist es eine Lebenseinstellung, ein Narr zu sein und sich dumm zu stellen? Wie kann man danach noch etwas erklären? Mit einem Vorschlaghammer auf den Kopf? Dann nimm deinen Helm ab.
 
Dmitry Fedoseev:
Wie kann man Ihnen etwas erklären? Dies wurde hier bereits erläutert. Was ist an dieser Erklärung unklar? Ist es eine Lebenseinstellung, ein Narr zu sein und sich lächerlich zu machen? Wie können Sie danach noch etwas erklären? Mit einem Vorschlaghammer auf den Kopf? Dann nimm deinen Helm ab.
Denn der Satz: "Es gibt etwas, aber es ist nicht für die Bar gezählt werden. "Klingt seltsam, denn die Schleife hat einenpositiven und einennegativen Wert aus der letzten Schleife.
 
-Aleks-:
Ja, denn der Satz"Etwas ist da, aber nicht für den Balken, der gezählt wird."Das klingt seltsam, weil der Zyklus einenpositiven und einennegativen Wert aus dem letzten Zyklus hat.
Von der letzten Schleife für den letzten Takt bleibt etwas übrig, aber man wendet es für jeden Takt an. Bei der korrekten Variante wird nichts in den Variablen belassen, sondern es wird für jeden Balken berechnet und sofort zur Berechnung des Durchschnitts verwendet.
 
Dmitry Fedoseev:
Vom letzten Zyklus für einen bestimmten letzten Takt bleibt etwas übrig, und das wird für jeden Takt verwendet. Bei der richtigen Variante wird nichts in den Variablen belassen, sondern für jeden Balken berechnet und sofort zur Berechnung des Durchschnitts verwendet.

Ich versuche, mir einen Reim darauf zu machen. Ihrer Meinung nach ist die richtige Option also SVA_03, richtig?

Grund der Beschwerde: