Ich werde den Indikator kostenlos schreiben - Seite 98

 
Aleksei Stepanenko:

Ich kann nur ein wenig helfen, absolut kostenlos.

Am unteren Rand des Indikators befinden sich zwei Funktionen. Im Kommentar wird der Wert des Indikators selbst und der Wert des aktuellen Punktes auf der letzten Trendlinie angezeigt.

Finden Sie es heraus.

Vielen Dank, Alexej. Ich wünsche Ihnen einen schönen Tag.
 
A-V-K:
Vielen Dank, Alexej. Ich wünsche Ihnen einen schönen Tag.

.

 

Guten Tag!

Ich habe den folgenden Indikator geschrieben


//+------------------------------------------------------------------+
//|                                                      MTF_H&L.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020"
#property strict
#property indicator_chart_window
#property indicator_buffers   2
#property indicator_width1    1
#property indicator_color1    clrTeal
#property indicator_type1     DRAW_LINE
#property indicator_width2    1
#property indicator_color2    clrCrimson
#property indicator_type2     DRAW_LINE
//---
input ENUM_TIMEFRAMES   period01 =  PERIOD_D1;
input ENUM_TIMEFRAMES   period02 =  PERIOD_M15;
input int               percount =  10;         //Ограничение истории

double Buffer1[];
double Buffer2[];
int    index1=-1;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   SetIndexBuffer(0, Buffer1, INDICATOR_DATA);
   SetIndexBuffer(1, Buffer2, INDICATOR_DATA);
//---
   IndicatorDigits(Digits);
   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 i, limit, barcount;
   barcount=period01/Period()*percount;
   if(barcount != 0) limit = barcount; 
   else limit = rates_total - 2;
   
   for(i=limit;i>=0;i--)
   {
      if(TimeSeconds(time[i])==0)
      index1=iBarShift(Symbol(), period02, time[i], false);

      if(TimeHour(time[i])==0&&TimeMinute(time[i])<period02)
      {
      Buffer1[i]=iOpen(NULL,period02,index1);
      Buffer2[i]=iOpen(NULL,period02,index1);
      }
      else 
      {
      Buffer1[i]=iHigh(NULL,period02,index1);
      if(Buffer1[i]<Buffer1[i+1]){
      Buffer1[i]=Buffer1[i+1];}
      
      Buffer2[i]=iLow(NULL,period02,index1);
      if(Buffer2[i]>Buffer2[i+1]){
      Buffer2[i]=Buffer2[i+1];}
      }
   }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+

Bitte helfen Sie mir, den Indikator zu korrigieren oder sagen Sie mir, wie.

1) Ich weiß nicht, wie ich den Referenzpunkt "period01" setzen kann, damit der Indikator zu Beginn einer neuen Periode mit "iOpen" startet.

2) Ich weiß nicht, wie man "iHighest" benutzt, damit ich nicht auf solche "Krücken" zurückgreifen muss.

if(Buffer1[i]<Buffer1[i+1]){
   Buffer1[i]=Buffer1[i+1];}

Bitte um Hilfe.

 
MakarFX:

Guten Tag!

Ich habe den folgenden Indikator geschrieben


Bitte helfen Sie mir, den Indikator zu korrigieren oder sagen Sie mir, wie.

1) Ich weiß nicht, wie ich den Referenzpunkt "Periode01" setzen kann, so dass der Indikator zu Beginn einer neuen Periode mit "iOpen" startet.

2) Ich weiß nicht, wie man "iHighest" benutzt, damit ich nicht auf solche "Krücken" zurückgreifen muss.

Bitte um Hilfe.

Warum haben Sie es geschrieben?

 
Алексей Тарабанов:

Warum haben Sie es geschrieben?

Auf der Suche nach einem Muster...

wenn sie in den Keller verlegt wird, sieht es so aus


 
MakarFX:

Guten Tag!

Grüße, Makar!

Wie hoch ist hier der Eröffnungspreis? Die Extremwerte des ersten Taktes sofort zu nehmen. Wie dieses hier:

if(i==limit || TimeDay(time[i])!=TimeDay(time[i+1]))
   {
   Buffer1[i]=iHigh(NULL,period02,index1);
   Buffer2[i]=iLow(NULL,period02,index1);
   }
else
   {
   if(iHigh(NULL,period02,index1)-Buffer1[i+1]>0)
      {
      Buffer1[i]=iHigh(NULL,period02,index1);
      }
   else
      {
      Buffer1[i]=Buffer1[i+1];
      }
   if(Buffer2[i+1]-iLow(NULL,period02,index1)>0)
      {
      Buffer2[i]=iLow(NULL,period02,index1);
      }
   else
      {
      Buffer2[i]=Buffer2[i+1]; 
      }
   }
Oder habe ich die Idee falsch verstanden?
 
Aleksei Stepanenko:

Grüße, Makar!

Wie hoch ist hier der Eröffnungspreis? Die Extremwerte des ersten Taktes sofort zu nehmen. Wie dieses hier:

Oder habe ich die Idee falsch verstanden?

Ich schrieb.

1) Ich weiß nicht, wie ich den Referenzpunkt"period01" setzen kann, damit der Indikator zu Beginn einer neuen Periode mit "iOpen" beginnt.

Um es gleich vorweg zu nehmen, das Extremum des ersten Balkens ist korrekt und ich nehme Ihren Code nach "else". Ich danke Ihnen.

Aber hier

if(i==limit || TimeDay(time[i])!=TimeDay(time[i+1]))

es passt nicht, weil es mit dem Tagesanfang verknüpft ist und ich die Auswahl "Periode01" benötige - H1;H4; und so weiter

 

Alternativ können Sie auch das aktuelle Datum durch die Anzahl der Sekunden im Zeitrahmen teilen und den daraus resultierenden Wert mit dem vorherigen Wert vergleichen:

int part=0;

int OnCalculate(......)
   {

   for(......)
      {
      if(time[i]/PeriodSeconds(period01)>part)
         {      
         part=time[i]/PeriodSeconds(period01);
      
         Buffer1[i]=iHigh(NULL,period02,index1);
         Buffer2[i]=iLow(NULL,period02,index1);
         }
      else
.......
      

Der Start wird wahrscheinlich nicht mit dem Diagramm synchronisiert, aber die Zeitbalken werden korrekt gezählt. Sie könnten darüber nachdenken, wie Sie den ersten Start synchronisieren können,

wie zum Beispiel:

if(time[i]%PeriodSeconds(period01)==0)
 
Aleksei Stepanenko:

Alternativ können Sie auch das aktuelle Datum durch die Anzahl der Sekunden im Zeitrahmen teilen und den daraus resultierenden Wert mit dem vorherigen Wert vergleichen:

Der Start wird wahrscheinlich nicht mit dem Diagramm synchronisiert sein, aber die Zeitbalken werden korrekt gezählt. Sie könnten darüber nachdenken, wie Sie den ersten Start synchronisieren können,

wie zum Beispiel:

Vielen Dank, ich werde es versuchen.
 

Bitte sehr. Ein kürzerer Eintrag:

Buffer1[i]=MathMax(iHigh(NULL,period02,index1),Buffer1[i+1]);
Buffer2[i]=MathMin(iLow(NULL,period02,index1),Buffer2[i+1]);
Grund der Beschwerde: