Scriverò l'indicatore gratuitamente - pagina 98

 
Aleksei Stepanenko:

Posso solo aiutare un po', assolutamente gratis.

Ci sono due funzioni nella parte inferiore dell'indicatore. Nei commenti mostra il valore dell'indicatore stesso e il valore del punto corrente sull'ultima linea di tendenza.

Capire cosa fare.

Grazie, Alexei. Buona giornata.
 
A-V-K:
Grazie, Alexei. Buona giornata.

.

 

Buon pomeriggio!

Ho scritto il seguente indicatore


//+------------------------------------------------------------------+
//|                                                      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);
  }
//+------------------------------------------------------------------+

Per favore aiutatemi a correggere l'indicatore o ditemi come.

1) Non so come impostare il punto di riferimento "period01", in modo che l'indicatore inizi con "iOpen" all'inizio di un nuovo periodo.

2) Non so come usare "iHighest" per non dover usare queste "stampelle".

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

Per favore, aiutatemi.

 
MakarFX:

Buon pomeriggio!

Ho scritto il seguente indicatore


Per favore aiutatemi a correggere l'indicatore o ditemi come.

1) Non so come impostare il punto di riferimento "period01", in modo che l'indicatore inizi con "iOpen" all'inizio di un nuovo periodo.

2) Non so come usare "iHighest" per non dover usare queste "stampelle".

Per favore, aiutatemi.

Perché l'hai scritto?

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

Perché l'hai scritto?

Cercando un modello...

se spostato nel seminterrato appare così


 
MakarFX:

Buona giornata!

Saluti, Makar!

Qual è il prezzo di apertura qui ? Prendere immediatamente gli estremi della prima barra. Come questo:

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]; 
      }
   }
O mi sono fatto un'idea sbagliata?
 
Aleksei Stepanenko:

Saluti, Makar!

Qual è il prezzo di apertura qui ? Prendere immediatamente gli estremi della prima barra. Come questo:

O ho capito male?

Ho scritto

1) Non so come impostare il punto di riferimento "period01" in modo che l'indicatore inizi con "iOpen" all'inizio di un nuovo periodo.

Per prendere subito l'extrema della prima barra è corretto e prendo il tuo codice dopo "else". Grazie.

Ma qui

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

non si adatta, perché è legato all'inizio del giorno e ho bisogno della selezione "periodo01" - H1;H4; e così via

 

In alternativa, si potrebbe dividere la data attuale per il numero di secondi nel lasso di tempo e poi confrontare il valore risultante con il valore precedente:

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
.......
      

La partenza probabilmente non sarà sincronizzata con il grafico, ma le barre di cronometraggio conteranno correttamente. Si potrebbe pensare a come sincronizzare il primo avvio,

come:

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

In alternativa, si potrebbe dividere la data attuale per il numero di secondi nel lasso di tempo e poi confrontare il valore risultante con il valore precedente:

La partenza probabilmente non sarà sincronizzata con il grafico, ma le barre di cronometraggio conteranno correttamente. Si potrebbe pensare a come sincronizzare il primo avvio,

come:

Grazie mille, lo proverò.
 

Non c'è di che. Una voce più breve:

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