Indikator Frage

 

Hallo zusammen,

Ich war das Lernen einige allgemeine Themen über Arrays aus einem Code-Basis-Indikator, der iFractals mit einigen großen Hilfe von Gurus in den Foren hat.


Also, jedenfalls

Ich war nicht in der Lage, bedingte Operatoren oder logische Operationen hinzuzufügen, um dem Indikator eine Additionsfunktion hinzuzufügen

//+------------------------------------------------------------------+
//|                                   
//+------------------------------------------------------------------+


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White

//---- buffers
double v1[1000];
double v2[1000];
double v3[1000];
double val1;
double val2;
double val3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorBuffers(3);

   SetIndexArrow(0, 111);
   SetIndexStyle(0,DRAW_ARROW,STYLE_DOT,1,Blue);
   SetIndexBuffer(0, v1);
   SetIndexLabel(0,"Resistance");
   

   SetIndexArrow(1, 111);
   SetIndexStyle(1,DRAW_ARROW,STYLE_DOT,1,Red);
   SetIndexBuffer(1, v2);
   SetIndexLabel(1,"Support");
  
   
   SetIndexArrow(2, 111);
   SetIndexStyle(2,DRAW_ARROW,STYLE_DOT,1,White);
   SetIndexBuffer(2, v3);
   SetIndexLabel(2,"High A");
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
    
   double   faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1), //MODE_MAIN
            slower = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); //MODE_SIGNAL
           
            
   int i=Bars;
//----
  
    for(i=Bars; i>=0; i--)
     {
      val1=iFractals(NULL, 0, MODE_UPPER,i);
      if (val1 > 0)
         {        
          v1[i]=High[i]; 
                         
          Print ("v1[", i, "]= ", v1[i], " if");
          }    
               
      else          
         {
         //v1[i]=v1[i+1];
         //Print ("v1[", i, "]= ", v1[i], " else");
         }
      
      val2=iFractals(NULL, 0, MODE_LOWER,i);
      if (val2 > 0)
         {
          v2[i]=Low[i];
          
          Print ("v2[", i, "]= ", v2[i], " if");
         }
          
      else          
         {
         //v2[i]=v2[i+1]; 
         //Print ("v2[", i, "]= ", v2[i], " else");         
         }
      }

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

Ich habe versucht, if(faster > slower) in verschiedene Bereiche des Codes einzufügen, nur um mit dieser Idee zu spielen. Normalerweise würden diese Ideen in einem EA funktionieren, aber nicht in einem Indikator

IE if(v1 > 0 && schneller > langsamer)

aber dies führt dazu, dass der Indikator zu verschwinden.

Viele andere Kombinationen, von denen ich dachte, dass sie den gewünschten Indikator ergeben sollten, wenn (andere Bedingungen) usw. usw.
Alle erzeugen keine Druckanweisungen.

Welchen Punkt übersehe ich hier.

Bitte um Rat
Vielen Dank





 

double v1[1000];
double v2[1000];
double v3[1000];<------ leave out the '1000' initialization for indicator buffers, as they don't require 

 
diostar:


Nun, das habe ich zuerst getan, aber dann konnte ich die Werte des Puffers nicht ausdrucken, was ich tun wollte

Nun, warten Sie, lassen Sie mich das neu formulieren:

Wenn ich die Anzahl der Elemente im Puffer nicht deklariere, dann funktioniert der Indikator wie bei v1[i]=High[i]
Aber Print (v1[i]); wird nicht ausgegeben, weil es, soweit ich weiß, keine Möglichkeit gibt, nicht deklarierte Array-Werte zu drucken, wenn die Anzahl der Elemente nicht deklariert wurde, also wird immer 0 gedruckt

Wenn ich es also nicht global deklariere, dann funktioniert der Indikator, aber das if(faster>slower) lässt den Indikator immer noch verschwinden, UND ich kann die Werte auch nicht drucken.

Wenn ich ihn deklariere und auch wieder mit v1[i]=High[i] neu initialisiere, dann kann ich drucken, aber alle Zusätze wie && schneller > langsamer entfernen den Indikator wieder.

Ich verstehe nicht ganz, warum.

Vielen Dank
 

Ich habe Ihren Code genommen, die Werte aus den Pufferdeklarationen herausgenommen und es funktioniert einwandfrei....

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 wenn
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1,5996 wenn
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 wenn


 
RaptorUK:

Ich habe deinen Code genommen, die Werte aus den Pufferdeklarationen herausgenommen und es funktioniert einwandfrei....

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 if <----High

------> zu diesem Zeitpunkt ist Fractals inkonsistentes High niedriger als das vorherige Low <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 if <----Low

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 if<----High

------> zu diesem Zeitpunkt ist Fractals inkonsistentes High niedriger als das vorherige Low <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992 if<----Low

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1.5996 if<----High

------> zu diesem Zeitpunkt alternierende Fraktale konsistent <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 if <----Low
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 if <----High


Interessant, danke für das Ergebnis Agent86V2. Fraktale sind in der Tat eine dieser faszinierenden und dennoch profitablen Möglichkeiten des Handels.

 
RaptorUK:

Ich habe Ihren Code genommen, die Werte aus den Pufferdeklarationen herausgenommen und es funktioniert einwandfrei....

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 wenn
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1,5996 wenn
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 wenn


Ich kann den Code auch ausdrucken, ohne dass Nullwerte entstehen, was in dem anderen Thread nicht der Fall war.
Es tut mir leid, ich verstehe es einfach nicht. Ich dachte, ich hätte es verstanden, aber ich scheine immer noch etwas zu übersehen.

int start()
   {
   double test[];
   
   test[39] = 45.6;
   Print("test[39]= ",test[39] );
   

      return(0);
   }
Sie wiesen mich an, wie oben beschrieben zu deklarieren:

Und Sie haben dieses Thema zitiert:

Als Sie das Buch über Arrays gelesen haben, haben Sie gesehen, wo dies steht?

"Bei der Deklaration eines Arrays müssen Datentyp, Array-Name und Anzahl der Elemente jeder Dimension angegeben werden:"

Einerseits kann ich also das Array nicht wie in diesem Skript drucken, ohne vorher double test[40]; zu deklarieren, wie Sie es angewiesen haben, aber jetzt scheine ich auch ohne Deklaration drucken zu können.

Es scheint also, dass ich die Werte im Puffer unabhängig von der Deklaration drucken kann.

Ich kann jedoch keine zusätzlichen Bedingungen hinzufügen, die normalerweise das gewünschte Ergebnis liefern würden, wie z. B. if(schneller > langsamer) oder && schneller > langsamer
EMA kann alles sein, ich möchte nur verstehen, warum es nicht funktioniert.
Es bewirkt, dass die Höchststände des Indikators verschwinden und die Druckausgabe von v1 aufhört zu drucken. Ich hatte erwartet, dass es in Übereinstimmung mit der Bedingung fallen und die Ausgabe zu drucken.

Ich habe versucht, zusätzliche Codeblöcke für diese auch mit den gleichen Ergebnissen hinzuzufügen.

Vielen Dank
 

Ich habe auch dies geschrieben...

RaptorUK:

Indikatorpuffer sind spezielle Arrays ... verwechseln Sie nicht Arrays und Puffer, sie sind ähnlich und doch verschieden.

Im ursprünglichen Code sind v1[] und v2[] Puffer, in Ihrem neuen Code sind es Arrays. Wenn Sie ein Array deklarieren, müssen Sie ihm eine Größe geben, z. B. hat v1[50] 50 Elemente von v1[0] bis v1[49]. Die Größe des Puffers wird automatisch angepasst, wenn mehr Elemente benötigt werden, und die Werte verschieben sich automatisch im Puffer. Betrachten Sie den sich gerade bildenden Balken, Balken 0, wenn dieser Balken abgeschlossen ist, muss ein mit diesem Balken verbundener Indikatorwert zum Index 1 verschoben werden ... dies geschieht automatisch mit Puffern ... wenn Sie etwas Ähnliches mit Arrays machen wollen, können Sie das, aber Sie müssen es selbst codieren.

 
Agent86:

Ich kann jedoch keine zusätzlichen Bedingungen hinzufügen, die normalerweise das gewünschte Ergebnis liefern würden, wie z. B. if(schneller > langsamer) oder && schneller > langsamer
EMA kann alles sein, ich möchte nur verstehen, warum es nicht funktioniert.
Es bewirkt, dass die Höchststände des Indikators verschwinden und die Druckausgabe von v1 aufhört zu drucken. Ich hatte erwartet, dass es in Übereinstimmung mit der Bedingung fallen und die Ausgabe zu drucken.

Ich habe versucht, zusätzliche Codeblöcke für diese auch mit den gleichen Ergebnissen hinzuzufügen.

Vielen Dank

Zeigen Sie Ihren Code, das Zeug, das nicht funktioniert. Ich verwende keine technischen Indikatoren... niemals, also nehmen Sie nicht an, dass ich weiß, was Sie mit EMAs usw. meinen ;-) Sie müssen mir Ihren Code zeigen.
 
RaptorUK:

Ich habe auch dies geschrieben ...

RaptorUK:

Indikatorpuffer sind spezielle Arrays ... verwechseln Sie nicht Arrays und Puffer, sie sind ähnlich und doch verschieden.

Im ursprünglichen Code sind v1[] und v2[] Puffer, in Ihrem neuen Code sind es Arrays. Wenn Sie ein Array deklarieren, müssen Sie ihm eine Größe geben, z. B. hat v1[50] 50 Elemente von v1[0] bis v1[49]. Die Größe des Puffers wird automatisch angepasst, wenn mehr Elemente benötigt werden, und die Werte verschieben sich automatisch im Puffer. Betrachten Sie den sich gerade bildenden Balken, Balken 0, wenn dieser Balken abgeschlossen ist, muss ein Indikatorwert, der mit diesem Balken verbunden ist, zum Index 1 verschoben werden ... dies geschieht automatisch mit Puffern ... wenn Sie etwas Ähnliches mit Arrays machen wollen, können Sie das, aber Sie müssen es selbst codieren.

Stimmt. "Ähnlich und doch anders". Ich kann mir keine bessere Formulierung vorstellen als diese.
 
Ok, ähnlich, aber anders, ich habe es verstanden. Ich hatte anfangs große Probleme, v1[i] an irgendeinem Punkt im Code zu drucken, aber jetzt scheint es so zu drucken, wie ich es ursprünglich erwartet hatte.
Ich habe nur eine zweite Schleife erstellt, weil ich nicht in der Lage war, innerhalb der ersten Indikatorschleife zu drucken, aber jetzt druckt es
Wie auch immer, ich werde das nicht wieder aufwärmen, ich denke, ich habe es verstanden.

Der Code, der nicht funktioniert, ist in den hier gezeigten Beispielen zu sehen:

//+------------------------------------------------------------------+
//|                                   
//+------------------------------------------------------------------+


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White

//---- buffers
double v1[];
double v2[];
double v3[];
double val1;
double val2;
double val3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorBuffers(3);

   SetIndexArrow(0, 111);
   SetIndexStyle(0,DRAW_ARROW,STYLE_DOT,1,Blue);
   SetIndexBuffer(0, v1);
   SetIndexLabel(0,"Resistance");
   

   SetIndexArrow(1, 111);
   SetIndexStyle(1,DRAW_ARROW,STYLE_DOT,1,Red);
   SetIndexBuffer(1, v2);
   SetIndexLabel(1,"Support");
  
   
   SetIndexArrow(2, 111);
   SetIndexStyle(2,DRAW_ARROW,STYLE_DOT,1,White);
   SetIndexBuffer(2, v3);
   SetIndexLabel(2,"High A");
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
    
   double   faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1), //MODE_MAIN
            slower = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); //MODE_SIGNAL
           
            
   int i=Bars;
//----
  
    for(i=Bars; i>=0; i--)
     {
      val1=iFractals(NULL, 0, MODE_UPPER,i);
      if (val1 > 0 && faster > slower) 
         // I think I need to add some more comparisons for the Low[i] also
         // the comparison works but shows indicator when faster < slower too.
         // adding additional code blocks instead of above and including the part below and inserting this instead 
         //                                               if(faster>slower)
         //                                                     {
         //                                                      v1[i]=High[i];
         //                                                     }
         //                                                      causes indicator to disappear
         
         {                             
          v1[i]=High[i]; 
                         
          Print ("v1[", i, "]= ", v1[i], " if");
          }    
               
      else          
         {
         //v1[i]=v1[i+1];
         //Print ("v1[", i, "]= ", v1[i], " else");
         }
      
      val2=iFractals(NULL, 0, MODE_LOWER,i);
      if (val2 > 0)
         {
          v2[i]=Low[i];
          
          Print ("v2[", i, "]= ", v2[i], " if");
         }
          
      else          
         {
         //v2[i]=v2[i+1]; 
         //Print ("v2[", i, "]= ", v2[i], " else");         
         }
      }

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

Danke

 
Agent86:

Der Code, der nicht funktionieren wird, ist in den folgenden Beispielen dargestellt:

Danke

OK, ich kann Ihnen sagen, was Ihr Problem ist oder ich kann Ihnen einige Hinweise geben. ... Hinweise zuerst, wenn Sie wollen, dass ich es Ihnen sage, sagen Sie es einfach und ich sage es Ihnen. .

Innerhalb der Schleife, for(i=Bars; i>=0; i--) . . was sind die Werte für schneller und langsamer?