Mein Indikator verschwindet jedes Mal, wenn ich zu einem neuen Zeitdiagramm wechsle.

 

Hallo,

Ich beginne mit einem Indikator (Der ERSTE TEIL). Es funktioniert gut, wenn der Zeitrahmen ändern.

Dann füge ich den zweiten Teil hinzu, der lautet: Wenn Close[i]-Close[i+1] kleiner ist als der Median der letzten 100 Bar Differenzwert, werde ich allen Puffern den Wert 0 zuweisen.

Jetzt funktioniert der kombinierte Indikator in einem Diagramm gut, aber wenn ich den Zeitrahmen wechsle, verschwindet der Indikator. Ich muss ihn wieder an das Diagramm anhängen.

Ich denke, das Problem wird durch Array verursacht, aber ich weiß nicht, wie ich es beheben kann.

Kann mir jemand bei diesem Fehler helfen?

Ich danke Ihnen vielmals.

SCFX

//+------------------------------------------------------------------+
//|                                                          hf1.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              httakeprofit://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "httakeprofit://www.mql5.com"
#property version   "1.00"
#property strict

//--- indicator settings
//#property indicator_chart_window
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_width1 2  
#property indicator_width2 2 
#property indicator_width3 1 
#property indicator_width4 1 
#property indicator_width5 1 

#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 Red
#property indicator_color4 Orange
#property indicator_color5 Orange

//--- input parameter
input int kperiod=30;
input int dperiod=9;
input int slow=9;
input int sample_roc_quartile=100;

//--- buffers
double buy[];
double sell[];
double stoploss[];
double takeprofit1[];
double takeprofit2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void) //*/*/*/*/*/
  {
//--- indicator buffers mapping
//--- 1 additional buffer used for counting.
   //IndicatorBuffers(6);
   IndicatorDigits(Digits);
//--- indicator line
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexBuffer(0,buy);
   SetIndexArrow(0,241);
   
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexBuffer(1,sell);
   SetIndexArrow(1,242);

   SetIndexStyle(2,DRAW_ARROW);
   SetIndexBuffer(2,stoploss);

   SetIndexStyle(3,DRAW_ARROW);
   SetIndexBuffer(3,takeprofit2); 
         
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexBuffer(4,takeprofit1);  
   
  
//--- name for DataWindow and indicator subwindow label

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
      int limit=rates_total-prev_calculated;
      
      double roc_s[];
      ArrayResize(roc_s,sample_roc_quartile+1);

//---

//------------------------------------------ 

for(int i=0; i<limit; i++)
{  

//FIRST PSART 

   if(iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i)>iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i)   &&   iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))   
      {  buy[i]=Close[i]; 
         stoploss[i]=Low[i]-0.005; 
         takeprofit1[i]=Close[i]+0.005;
         takeprofit2[i]=Close[i]+0.01;
         }
      
   if(iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i)   &&   iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)>iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))   
      {  sell[i]=Close[i]; 
         stoploss[i]=High[i]; 
         takeprofit1[i]=Close[i]-0.0050;
         takeprofit2[i]=Close[i]-0.01;
         }   
         
//SECOND PART         
   for(int j=0;j<=sample_roc_quartile;j++)
   {
      roc_s[j]=Close[i+j]-Close[i+j+1];
      ArraySort(roc_s);
      
      if(   (Close[i]-Close[i+1])<roc_s[50]  )
         {  buy[i]=0; 
            stoploss[i]=0; 
            takeprofit1[i]=0;
            takeprofit2[i]=0;
         }
    }     
}
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Möglicherweise ein Array-Fehler außerhalb des Bereichs und der Indikator wird entfernt

int limit=rates_total-prev_calculated;

for(int i=0; i<limit; i++)
iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))

Sie erhalten möglicherweise eine Meldung im Protokoll über einen globalen Initialisierungsfehler
Prüfen Sie Ihre Protokolle

 

Vielen Dank für Ihre Anregung.

Ich überprüfe das Protokoll, es gibt keinen Fehler oder Warnhinweis.

Ich bin mir nicht sicher, ob (i+1) Probleme verursacht, da dieser Indikator alleinstehend (oder durch einfaches Löschen des zweiten Teils) gut funktioniert.

SCFX

 

Es gibt Fehler, die ich kompiliert Ihren Code und testete es:

2014.05.22 22:39:43.936 Benutzerdefinierter Indikator Testindikator 3 XAUUSD,M1: entfernt
2014.05.22 22:39:43.905 Testindikator 3 XAUUSD,M1: globale Initialisierung fehlgeschlagen
2014.05.22 22:39:43.905 Testindikator 3 XAUUSD,M5: uninit Grund 3 //----------------------- Chart ändern
2014.05.22 22:39:17.323Array außerhalb des Bereichs in 'Testindikator 3.mq4' (117,32)
2014.05.22 22:39:15.591 Testindikator 3 XAUUSD,M5: initialisiert
2014.05.22 22:39:09.570 Benutzerdefinierter Indikator Testindikator 3 XAUUSD,M5: erfolgreich geladen

 
scfx:

Vielen Dank für Ihre Anregung.

Ich überprüfe das Protokoll, es gibt keinen Fehler oder Warnhinweis.

Ich bin mir nicht sicher, ob (i+1) Probleme verursacht, da dieser Indikator alleinstehend (oder durch einfaches Löschen des zweiten Teils) gut funktioniert.

SCFX


Dann ist es wahrscheinlich dies

roc_s[j]=Close[i+j]-Close[i+j+1];

Sie versuchen, den Schlusskurs von Bars zu erhalten, die nicht existieren

 

Sie sollten eine Zeile hinzufügen, wenn der Indikator zuerst gestartet wird: prev_calculated == 0,

oder so ähnlich:

 int limit = -100;
   if( prev_calculated == 0 ) limit = 3000;// will calculate 3000 Bars
    else                      limit = rates_total-prev_calculated;
      

auf meinem Computer auch kein Fehler ;-)

 

Hallo ffoorr,

Deine Lösung ist wirklich gut.

Um die Wahrheit zu sagen, habe ich gestern Abend jemanden beauftragt, das Problem zu lösen. Ja, er hat es geschafft, aber der Code ist ineffizient, siehe unten, da er ein weiteres for(i) hinzugefügt hat.

Ich wäre dir dankbar, wenn du mir erklären könntest, was das mit prev_calculated ==0 bedeutet.

//+------------------------------------------------------------------+
//|                                                          hf1.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              httakeprofit://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "httakeprofit://www.mql5.com"
#property version   "1.00"
#property strict

//--- indicator settings
//#property indicator_chart_window
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_width1 2  
#property indicator_width2 2 
#property indicator_width3 1 
#property indicator_width4 1 
#property indicator_width5 1 

#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 Red
#property indicator_color4 Orange
#property indicator_color5 Orange

//--- input parameter
input int kperiod=30;
input int dperiod=9;
input int slow=9;
input int sample_roc_quartile=100;

//--- buffers
double buy[];
double sell[];
double stoploss[];
double takeprofit1[];
double takeprofit2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void) //*/*/*/*/*/
  {
//--- indicator buffers mapping
//--- 1 additional buffer used for counting.
   //IndicatorBuffers(6);
   IndicatorDigits(Digits);
//--- indicator line
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexBuffer(0,buy);
   SetIndexArrow(0,241);
   
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexBuffer(1,sell);
   SetIndexArrow(1,242);

   SetIndexStyle(2,DRAW_ARROW);
   SetIndexBuffer(2,stoploss);

   SetIndexStyle(3,DRAW_ARROW);
   SetIndexBuffer(3,takeprofit2); 
         
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexBuffer(4,takeprofit1);  
   
  
//--- name for DataWindow and indicator subwindow label

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
      int limit=rates_total-prev_calculated;
          if(limit<=0)limit =2;
     
      double roc_s[];
      ArrayResize(roc_s,sample_roc_quartile+1);

//---

//------------------------------------------ 

for(int i=1; i<limit; i++)
{  

//FIRST PSART 

   if(iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i)>iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i)   
   &&   iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))   
      {  buy[i]=Close[i]; 
         stoploss[i]=Low[i]-0.005; 
         takeprofit1[i]=Close[i]+0.005;
         takeprofit2[i]=Close[i]+0.01;
         }
      
   if(iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i)   
   &&   iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)>iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))   
      {  sell[i]=Close[i]; 
         stoploss[i]=High[i]; 
         takeprofit1[i]=Close[i]-0.0050;
         takeprofit2[i]=Close[i]-0.01;
         }   
} 

    
//SECOND PART   

//--------------------------------------- HERE IS THE WHAT HE DID
int mid = (sample_roc_quartile +1)/2;
  
for(int i=1; i<limit&&(i+1)<rates_total; i++)
{    

//---------------------------------------------


  for(int j=0;j<=sample_roc_quartile&&(i+j+1)<rates_total;j++)
   {
      roc_s[j]=Close[i+j]-Close[i+j+1];
      ArraySort(roc_s);
   }   
      
      if( (Close[i]-Close[i+1])<roc_s[mid]  )
         {  buy[i]=0; 
            stoploss[i]=0; 
            takeprofit1[i]=0;
            takeprofit2[i]=0;
         }
    
 }    

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Hallo zusammen...


Ich habe ein Problem bei der Installation des traditionellen IBFX MACD-Indikators und anderer Vorlagen in meinem MT4.

In der vorherigen Version musste ich nur meine Dateien in den "Indikator"-Ordner kopieren und einfügen, der sich im "Expert"-Ordner befindet.

Die aktuelle Version hat nur den Ordner "MQL4", der aus einem separaten Ordner "expert" und "indicator" besteht.

Ich habe versucht, in beide Ordner einzufügen und meine Plattform neu zu starten, aber es funktioniert einfach nicht.

nicht passieren.

Kann jemand da draußen bitte beraten Sie mich auf dieses Problem? oder vielleicht irgendwelche anderen Möglichkeiten für mich, die traditionellen MACD-Indikator mit 2 EMA-Linien zu bekommen?

Vielen Dank

Douglas
 
douglas beng du musst aufhören, deine Frage in die Themen der anderen zu stellen, wenn sie nichts mit deren Thema zu tun hat. ERÖFFNEN SIE IHR EIGENES THEMA.
 
douglas_heng: Ich habe Probleme, den traditionellen IBFX MACD-Indikator und andere Vorlagen in meinem MT4 zu installieren.
Don't Don't mehrere (6) Beiträge. Hijacken Sie nicht die Beiträge anderer Leute.
 
scfx:

Hallo ffoorr,

Deine Lösung ist wirklich gut.

Um die Wahrheit zu sagen, habe ich gestern Abend jemanden beauftragt, das Problem zu lösen. Ja, er hat es geschafft, aber der Code ist ineffizient, siehe unten, da er ein weiteres for(i) hinzugefügt hat.

Ich wäre dir dankbar, wenn du mir erklären könntest, was das mit prev_calculated ==0 bedeutet.


Nun scfx, ich verstehe den zweiten Teil deines Indikators nicht, also kann ich es nicht sagen.

Wenn ein Indikator zum ersten Mal gestartet wird (auf einem Chart), ist previous_calculation konstruktionsbedingt gleich Null, so dass man den Startpunkt festlegen kann, ab dem der Indikator mit der Berechnung beginnt.

if( prev_calculated == 0) limit = 100;

oder

if( prev_calculated < 50) limit = 500:

oder sagen wir

if( prev_calculated < 500) limit = 3000: (alles das gleiche, der Anfang des Charts wird nicht verwendet)

int limit = -100;
   if( prev_calculated == 0 ) limit = 3000;// will calculate 3000 Bars
    else                      limit = rates_total-prev_calculated;

at the first lauch of the indicator limit = 3000;

for(int i=1; i<3000; i++) // draw 3000 bars 

at the second lauch limit = 0; // ( because rates_total-prev_calculated = 0)  ;
for(int i=1; i<0; i++)    //   draw the last bars only, faster

eine sehr gute Idee, die ......

Grund der Beschwerde: