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

 
PokrovMT5:

Hallo, Können Sie mir bitte sagen, wenn Sie in iData für diesen Indikator eingeben müssen, egal, ob es ein Programm oder Verweis auf die Bar-Daten, wo Sie den Zeitrahmen angeben können, warum ist die Daten aus anderen Zeitrahmen sind nicht korrekt in der aktuellen verschiedenen auf Zeitrahmen Chart reflektiert, sondern nur in den Chart der angegebenen Zeitrahmen? Ich danke Ihnen.


Das verstehe ich nicht ganz

Aber ich denke, dies wird helfen

Доступ к таймсериям и индикаторам - Справочник MQL4
Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
Функции для работы с таймсериями и индикаторами. Таймсерия отличается от обычного массива тем, что индексация элементов таймсерии производится от конца массива к началу (от самых свежих данных к самым старым). Для копирования значений таймсерий и индикаторов рекомендуется использовать только динамические массивы, так как функции копирования...
 

Danke für den Link, ich habe genau das gleiche Bild, nur einen etwas anderen Algorithmus, der Punkt ist, um mehr Punkte (in der endgültigen Zeichnung) zu machen, machen sie mit einem Schwellenwert erscheinen.

 
Alekseu Fedotov:

Ich verstehe das nicht ganz.

Aber ich denke, es hilft.


Vielen Dank, ich werde auf jeden Fall in sie schauen, aber als Beispiel das Prinzip, warum es nicht funktioniert, wenn anstelle der Daten von einem anderen Zeitrahmen anstelle von Null zu schreiben, warum ist es nicht richtig reflektiert, sollte ich es zuerst kopieren und dann rendern es ?

iClose(NULL,0,i);
 

Novaja:

Danke für den Link, ich habe genau das gleiche Bild, nur einen etwas anderen Algorithmus, die Essenz ist, mehr Punkte zu machen (in der endgültigen Zeichnung), um sie mit einem Schwellenwert erscheinen zu lassen.


Sie können dies tun, aber es stellt sich heraus, Renco, dh teilt sich in gleiche Segmente Abstand m / ein Scheitelpunkt. Dies bricht den Algorithmus selbst suchen Scheitelpunkte, die Frage, wie man unter Beibehaltung der ursprünglichen Code, der Schwellenwert zwischen den Punkten (auf zusätzlich Zeichnung) zu machen, sollte ein Vielfaches des Abstandes zwischen allen, aber die letzte und die Spitze (wird weniger als die Schwelle) zu bekommen.

 
//+------------------------------------------------------------------+
//|                                                       FastZZ.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, Yurich"
#property link      "https://login.mql5.com/ru/users/Yurich"
//---
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Red
#property indicator_color2 Red
#property indicator_color3 Gold
#property indicator_color4 DodgerBlue

#property indicator_width3 3
#property indicator_width4 3

//--- input parameters
extern int  Depth    = 10;
//---
double zzH[], zzL[];
double depth;
int last, direction, pbars;
datetime lastbar;

double ArrUp[];
double ArrDn[];
//+------------------------------------------------------------------+
int init()
{
//---- indicators
   SetIndexBuffer(0,zzH);
   SetIndexBuffer(1,zzL);
   SetIndexBuffer(2,ArrUp);
   SetIndexBuffer(3,ArrDn);
   
   SetIndexStyle(0,DRAW_ZIGZAG);
   SetIndexStyle(1,DRAW_ZIGZAG);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexStyle(3,DRAW_ARROW);
   
   SetIndexArrow(2,159);
   SetIndexArrow(3,159);
   
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   IndicatorDigits(Digits);
//----
   depth=Depth*Point;
   direction=1;
   last=0;
   pbars=0;
   lastbar=0;
   return(0);
}
//+------------------------------------------------------------------+
int start()
{
   int limit=Bars-IndicatorCounted()-1;
   if(lastbar!=Time[0])
   {
      lastbar=Time[0];
      last++;
   }
   if(MathAbs(Bars-pbars)>1) { last=Bars-1; limit=last;}
   pbars=Bars;
   //---
   for(int i=limit; i>0; i--)
   {
      bool set=false;
      zzL[i]=0;
      zzH[i]=0;
      ArrUp[i]=EMPTY_VALUE;
      ArrDn[i]=EMPTY_VALUE;
      //---
      if(direction>0)
      { 
         if(High[i]>zzH[last]+depth)
         {
            zzH[last]=0;
            zzH[i]=High[i];
           
            ArrUp[i]=High[i];
            
            if(Low[i]<High[last]-depth)
            {
               if(Open[i]<Close[i])
                {
                  zzH[last]=High[last]; 
                  ArrUp[last]=High[last];
                }else direction=-1;
               zzL[i]=Low[i];
               ArrDn[i]=Low[i];
            }
            last=i;
            set=true;
         }
         if(Low[i]<zzH[last]-depth && (!set || Open[i]>Close[i]))
         {
            zzL[i]=Low[i];
            ArrDn[i]=Low[i];
            
            if(High[i]>zzL[i]+depth && Open[i]<Close[i])
             {
               zzH[i]=High[i];
               ArrUp[i]=High[i]; 
             }else direction=-1;
            last=i;
         }
      } else //direction<0
      {
         if(Low[i]<zzL[last]-depth)
         {
            zzL[last]=0;
            zzL[i]=Low[i];
        
            ArrDn[i]=Low[i];            
            
            if(High[i]>Low[last]+depth)
            {
               if(Open[i]>Close[i])
                {
                  zzL[last]=Low[last]; 
                  ArrDn[last]=Low[last];
                }else direction=1;
               zzH[i]=High[i];
               ArrUp[i]=High[i];
            }
            last=i;
            set=true;
         }
         if(High[i]>zzL[last]+depth && (!set || Open[i]<Close[i]))
         {
            zzH[i]=High[i];
            ArrUp[i]=High[i];
            
            if(Low[i]<zzH[i]-depth && Open[i]>Close[i])
             {
               zzL[i]=Low[i]; 
               ArrDn[i]=Low[i];
             }else direction=1;
            last=i;
         }
      }
   }
//----
   zzH[0]=0;
   zzL[0]=0;
//----
   return(0);
}
//+------------------------------------------------------------------+
 

Aus irgendeinem Grund fügte der Code den Kommentar nicht sofort ein, ich musste ihn neu schreiben.

 
PokrovMT5:

Danke, ich werde mich darum kümmern, aber warum funktioniert es zum Beispiel nicht, wenn man anstelle von Null Daten eines anderen Zeitrahmens einträgt, warum wird es nicht korrekt wiedergegeben, sollte ich es zuerst kopieren und dann zeichnen?



CopyClose ist eine modernere Funktion, aber ok,iClose(...) funktioniert gut

Wie funktioniert es nicht richtig? Ein Bild oder ein Stück Code, bitte präzisieren Sie.

 
Alekseu Fedotov:

CopyClose ist eine modernere Funktion, aber okay, iClose(...) funktioniert gut

Wie funktioniert es falsch? Ein Bild oder ein Stück Code, bitte präzisieren Sie.

Nun, hier ist ein einfaches Beispiel, ich möchte die Schlusskurse auf dem Chart sehen, ich möchte eine Stunde auf dem Zeitrahmen sehen, es ist ok auf der Uhr, aber es ist anders auf anderen Zeitrahmen. Die Idee war, die Schlusskurse der höheren Kurse in einem kleineren Zeitrahmen zu sehen. Der Film dauert 30 Minuten.
//+------------------------------------------------------------------+
//|                                                   Проверка 2.mq4 |
//|                                                  Bugaev Vladimir |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Bugaev Vladimir"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 clrBlue
#property indicator_width1 2
int i,limit;

double C,CC[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
IndicatorBuffers(1);
//----      
   SetIndexBuffer(0,CC);
  
   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[])
 
 {
if(prev_calculated<1) limit=rates_total-1;
if(prev_calculated>0)limit=rates_total-prev_calculated;
for(i=limit; i>0; i--)  
  
  {
 C= iClose(NULL,60,i);
 CC[i]=C; 



  }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
PokrovMT5:
Nun, hier ist das einfachste Beispiel, ich möchte die Schlusskurse auf dem Chart sehen, der Zeitrahmen ist eine Stunde geschrieben, alles ist gut auf der Uhr, alles ist anders auf jedem anderen Zeitrahmen. Die Idee war, die Schlusskurse der höheren Kurse in einem kleineren Zeitrahmen zu sehen. Der Film dauert 30 Minuten.

Wie diese


     int shift;
     datetime  T;
  
   for(i=limit; i>=0; i--)
     {
      T = iTime(NULL,0,i); 
      shift=iBarShift(NULL,60,T); 
      C=iClose(NULL,60,shift);
      CC[i]=C;
     }
 
Alekseu Fedotov:

So ist das nun mal.



Herzlichen Dank!

Grund der Beschwerde: