[ARCHIV]Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Ohne dich kann ich nirgendwo hingehen - 5. - Seite 279

 

Etwas stimmt nicht mit meiner Funktion, die den Wert von Elementen desselben Arrays zurückgibt. Ich werde alles zu diesem Thema der Reihe nach beschreiben.

Die globalen Variablen sind:

extern int i_TF = 0;
int g_maPeriod[3] = {6, 25, 150, 250},             // Периоды обрабатываемых МА
    g_singMa[3] = {1,2,3,4};                     // признаки машек, добавляемые к основному мэйджику

// Идентификаторы сигналов
#define SIGNAL_BUY           0                                 // Сигнал на покупку
#define SIGNAL_SELL          1                                 // Сигнал на продажу
#define SIGNAL_NO           -1                                 // Сигнала нет

#define CROSS_UP             0                                 // Признак нахождения быстрой средней
                                                               // ..над медленной
#define CROSS_DN             1                                // Признак нахождения медленной..
                                                               // ..средней над быстрой
#define CROSS_NO            -1                                 // Признак равенства двух средних
int crossDir[3];

Bei dieser Berechnung verwendete Funktionen:

//+-------------------------------------------------------------------------------------+
//| Получение значений МА на двух соседних барах                                        |
//+-------------------------------------------------------------------------------------+
double GetCurAndPrevMA(int maPeriod, double& prevMA)
{
   prevMA = iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 1);
   return (iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 0));
}
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой                                               |
//+-------------------------------------------------------------------------------------+
void GetStateMa(int& crossDir[])
{
   double ema365_1;
   double ema365_0 = GetCurAndPrevMA(365, ema365_1);

   Print("g_maPeriod[0] = ", g_maPeriod[0]);
   Print("g_maPeriod[1] = ", g_maPeriod[1]);
   Print("g_maPeriod[2] = ", g_maPeriod[2]);
   Print("g_maPeriod[3] = ", g_maPeriod[3]);
   
   for (int i=0; i<4; i++)
   {
      double ema1;
      double ema0 = GetCurAndPrevMA(g_maPeriod[i], ema1);

      crossDir[i] = CROSS_NO;

      Print("ema1 < 365_1 ", ema1 ," < ", ema365_1);
      if (ema1 < ema365_1 && ema0 > ema365_0)
      {
         Print("ema1 < 365_1 ", ema1 ," < ", ema365_1);
         crossDir[i] = CROSS_UP;
      }
      if (ema1 > ema365_1 && ema0 < ema365_0)
      {
         Print("ema1 > 365_1 ", ema1 ," > ", ema365_1);
         crossDir[i] = CROSS_DN;
      }
   }
}

Ich drucke zusätzlich den Wert der Array-Elemente, die von der FunktionGetStateMa(int& crossDir[]) zurückgegeben werden:

   Print("crossDir[0] = ", crossDir[0]);
   Print("crossDir[1] = ", crossDir[1]);
   Print("crossDir[2] = ", crossDir[2]);
   Print("crossDir[3] = ", crossDir[3]);

Dies wird zurückgesendet:

2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[3] = 0
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[2] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[1] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[0] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: open #1 buy 0.10 EURUSD at 1.29654 ok
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.3129 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.3017 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.2886 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.2916 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[3] = 250
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[2] = 150
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[1] = 25
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[0] = 6

Die Werte der Array-ElementecrossDir[] werden unterschiedlich zurückgegeben, obwohl sie alle den Wert 1 haben sollten.

Dies zeigt sich daran, dass Ausdrücke, die Mach 4-Perioden und 365-Perioden vergleichen, nicht gesetzt werden. Können Sie mir sagen, warum die Werte nicht korrekt zurückgegeben werden?

 
Ekburg:


Danke, dass Sie so genau sind, denn der Link, den ich erhalten habe, enthielt diese Felder nicht, und ich habe die Spalte auf der linken Seite nicht beachtet, weil ich auf der Arbeit war.

aber niemand wird alles schlucken, was du ausspuckst, außer dir ;)


Wie haben Sie, wenn überhaupt, aus Hinweisen gelernt? Nur aktives und neugieriges Selbststudium wird Früchte tragen! Ich habe Sie zerkaut und Sie spucken mit guten Ratschlägen zurück! Besorgen Sie sich einen Babysitter, der Ihr Chaos aufräumt!
 
Wenn ich die Parameter von Indikator A ändere, wird Indikator B nicht automatisch neu erstellt, sondern muss zwangsweise neu kompiliert werden! Warum wird Indikator B nicht automatisch neu erstellt? Bitte teilen Sie mir mit, was mein Fehler ist?
 
MK07:
Guten Abend zusammen, ich habe Indikator B aus Indikator A erstellt (durch iCustom) . Beide Indikatoren sind auf dem Chart. Wenn ich die Parameter von Indikator A ändere, wird Indikator B nicht automatisch neu erstellt, ich muss ihn zwangsweise neu kompilieren. Warum wird Indikator B nicht automatisch neu erstellt? Bitte sagen Sie mir meinen Fehler?
Sie rufen den Indikator A (über iCustom) mit einigen spezifischen Einstellungen auf, die UNABHÄNGIG von den Einstellungen des Indikators A sind. Das bedeutet, dass das Terminal gleichzeitig zwei unabhängige Kopien des Indikators A berechnet.
 
TarasBY:
Sie rufen Indikator A (über iCustom) mit bestimmten Einstellungen auf, die NICHT von den Einstellungen von Indikator A abhängen. Das bedeutet, dass das Terminal gleichzeitig zwei unabhängige Kopien von Indikator A berechnet.

Was muss getan werden, damit das Terminal die zweite Variante des Indikators A berechnet?
 
MK07:
Was muss getan werden, damit das Terminal die zweite Version des Indikators A berechnet?
Seien Sie konkreter, was die Aufgabe betrifft.
 
borilunad:

Was haben Sie aus den Prompts gelernt, falls Sie etwas gelernt haben? Nur aktives und neugieriges Selbststudium wird Früchte tragen! Ich habe Sie durchgekaut und Sie spucken gute Ratschläge aus! Besorgen Sie sich einen Babysitter, der Ihr Chaos aufräumt!

mäßigen Sie Ihr Ego! Ich pralle nicht an diesem Ratschlag ab, ich habe ihn angenommen und mich bei Ihnen bedankt, aber ich nehme ihn nicht auf diese Weise! Ich habe gefragt und in einer zivilisierten Weise geantwortet!
 

Hallo!

Der Wert der Variablen Point muss im EA verwendet werden.

Sie ist jedoch gleich 0.

Soweit ich das verstanden habe, liegt das an den 5 Stellen nach dem Komma im Zitat.

Gibt es eine Möglichkeit, diesen Wert zu ermitteln?

Ich danke Ihnen.

 
TarasBY:
Bitte machen Sie Ihre Aufgabe deutlicher.

Indikator A - normale AO (My_AO) - oben auf dem Bild.

Indikator B - Histogramm(+1/-1) des AO-Indikators (My_AO) - mittleres Histogramm in der Abbildung.

Wenn Sie die Parameter von Indikator A (der untere im Bild) ändern, ändert sich Indikator B nicht, selbst wenn Sie ihn neu kompilieren.

Ich habe zwei AO-Indikatoren (My_AO) gleichzeitig gezeigt, nur um zu veranschaulichen, was mit den Indikatoren passiert, aber unter realen Bedingungen sollte es nur einen AO (My_AO) geben.



Der erste Code ist der Indikator A.

Zweiter Code - Indikator B.

//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Black
#property  indicator_color2  Green
#property  indicator_color3  Red
#property  indicator_width2  2
#property  indicator_width3  2
#property  indicator_level1 0.0

//---- input parameters
extern int FastPeriod =5;
extern int LowPeriod  =34;
//---- indicator buffers
double     ExtBuffer0[];
double     ExtBuffer1[];
double     ExtBuffer2[];



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   IndicatorDigits(Digits+1);
   SetIndexDrawBegin(0,34);
   SetIndexDrawBegin(1,34);
   SetIndexDrawBegin(2,34);
//---- 3 indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer0);
   SetIndexBuffer(1,ExtBuffer1);
   SetIndexBuffer(2,ExtBuffer2);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("My_AO");
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
      
  
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current;
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- macd
   for(int i=0; i<limit; i++)
      ExtBuffer0[i]=iMA(NULL,0,FastPeriod,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,LowPeriod,0,MODE_SMA,PRICE_MEDIAN,i);
//---- dispatch values between 2 buffers
   bool up=true;
   for(i=limit-1; i>=0; i--)
     {
      current=ExtBuffer0[i];
      prev=ExtBuffer0[i+1];
      if(current>prev) up=true;
      if(current<prev) up=false;
      if(!up)
        {
         ExtBuffer2[i]=current;
         ExtBuffer1[i]=0.0;
        }
      else
        {
         ExtBuffer1[i]=current;
         ExtBuffer2[i]=0.0;
        }
        
       
     }
//---- done
   return(0);
  }
#property indicator_separate_window
#property indicator_minimum -1.5
#property indicator_maximum 1.5
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red
#property  indicator_width1  2
#property  indicator_width2  2
#property indicator_level1 0.0

//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,ExtMapBuffer2);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {  
      
       
    double UP,DN;     
  
  
    int counted_bars=IndicatorCounted(),
       limit;  
       
    if(counted_bars>0)
      counted_bars--;
   
      limit=Bars-counted_bars;
//----
   for(int i=0;i<limit;i++)
       
      { 
        UP=iCustom(NULL,0,"My_AO",1,i+1);               
        DN=iCustom(NULL,0,"My_AO",2,i+1);    
             
        
       if(UP>0)       
         {ExtMapBuffer1[i+1]=1;
          ExtMapBuffer2[i+1]=0;
         }
         
       if(UP<0)       
         {ExtMapBuffer1[i+1]=-1;
          ExtMapBuffer2[i+1]=0;
         }  
         
                              
       if(DN>0)            
         {
          ExtMapBuffer1[i+1]=0;
          ExtMapBuffer2[i+1]=1;
         }
              
       if(DN<0)            
         {
          ExtMapBuffer1[i+1]=0;
          ExtMapBuffer2[i+1]=-1;
         }
               
                       
    
    }
//----
   return(0);
 
   }
   
//+------------------------------------------------------------------+    
   
        
        
 
MK07:

Indikator A - normaler AO-Indikator (My_AO) - oberer Indikator in der Abbildung.

Indikator B - Histogramm(+1/-1) des AO-Indikators (My_AO) - Mitte in der Abbildung.

Wenn Sie die Parameter von Indikator A (unten in der Abbildung) ändern, ändert sich Indikator B nicht, selbst wenn Sie neu kompilieren.

Die beiden AO-Indikatoren (My_AO) zur gleichen Zeit habe ich nur gezeigt, um zu veranschaulichen, was mit den Indikatoren passiert, aber im wirklichen Leben sollte es ein AO (My_AO) sein.

Der erste Code ist der Indikator A.

Der zweite Code ist der Indikator B.

Und diese Ordnung der Dinge ist normal (das sind die Prinzipien des Terminals).

Wenn Sie die Parameter von Indikator A ändern wollen, führen Sie einen Informationsaustausch zwischen den Indikatoren durch (z.B. eine Datei, globale Variablen des Terminals, RAM): Indikator A übergibt die initialisierbaren Parameter während der Initialisierung und Indikator B prüft regelmäßig die Änderungen von Indikator A. Wenn er Änderungen feststellt, sollte sich auch Indikator B mit den neuen Parametern perinitialisieren (forced init()).