Array fuori portata in Bisogno di aiuto - pagina 7

 
Valeriy Yastremskiy:

Gli estremi giornalieri, e quelli che trovate sono essenzialmente estremi, i minimi (o i massimi) hanno una distanza abbastanza lunga dal prezzo attuale. La differenza tra il minimo e il massimo di 132 giorni sull'eu è più di 12300 pip. Prezzo dal minimo più vicino di 2000, dal massimo di 800.

Non lo capisco nemmeno io.

Mi dispiace, cercherò di spiegare domani stanco oggi

 
MakarFX:

AUDUSD non è così per me

ArrayCopyRates(Bar_data_D1,_Symbol,PERIOD_D1); // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров

Cosa copia e dove ritorna?

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

Cosa viene copiato dove e a chi?

Alexei Tarabanov:

In cosa si copia e in cosa ritorna?

di chiamare questa funzione:

intArrayCopyRates(
MqlRates&rates_array[],// array di MqlRates passato per riferimento
stringasymbol=NULL,// lo strumento
inttimeframe=0// timeframe
);

Copia i dati delle barre del grafico specificato in un array bidimensionale della forma double RateInfo[][6] e restituisce il numero di barre copiate.

intArrayCopyRates(
void&dest_array[][],// array passato per riferimento
stringasymbol=NULL,// strumento
inttimeframe=0// timeframe
);

Parametri

ArrayCopyRates

Quando si usa la seconda forma di chiamata, i dati vengono effettivamente copiati nell'array dest_array[][], l'array stesso viene automaticamente riallocato per corrispondere alla dimensione del timeframe (anche se l'array è stato dichiarato statico).

La prima dimensione della matrice contiene il numero di barre. La seconda dimensione ha 6 elementi con i valori:

0 - tempo (time),
1 - prezzo aperto (open),
2 - prezzo più basso (low),
3 - prezzo più alto (high),
4 - prezzo di chiusura (close),

Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Если некоторое имя, которое не было описано ранее, появляется в выражении и за ним следует левая круглая скобка, то оно по контексту считается именем некоторой функции. Аргументы (формальные параметры) передаются по значению, т. е. каждое выражение x1, . . . , xn вычисляется и значение передается функции. Порядок вычисления выражений и порядок...
 
Dark Kchlyzov:
di chiamare questa funzione:

intArrayCopyRates(
MqlRates&rates_array[],// array di MqlRates passato per riferimento
stringasymbol=NULL,// lo strumento
inttimeframe=0// timeframe
);

Copia i dati delle barre del grafico specificato in un array bidimensionale della forma double RateInfo[][6] e restituisce il numero di barre copiate.

intArrayCopyRates(
void&dest_array[][],// array passato per riferimento
stringasymbol=NULL,// strumento
inttimeframe=0// timeframe
);

Parametri

ArrayCopyRates

Quando si usa la seconda forma di chiamata, i dati vengono effettivamente copiati nell'array dest_array[][], l'array stesso viene automaticamente riallocato per corrispondere alla dimensione del timeframe (anche se l'array è stato dichiarato statico).

La prima dimensione della matrice contiene il numero di barre. La seconda dimensione ha 6 elementi con i valori:

0 - tempo (time),
1 - prezzo aperto (open),
2 - prezzo più basso (low),
3 - prezzo più alto (high),
4 - prezzo di chiusura (close),

E dove viene salvato il valore restituito dell'int-type? Hai passato tutti i dati alla funzione, ma non hai ottenuto nulla da essa.

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

Dove viene salvato il valore di ritorno del tipo int? Hai passato tutti i dati nella funzione, ma non ne hai ricavato nulla.

Min_D_Level = iLow(_Symbol,PERIOD_D1,i); break;

Sembra essere memorizzato qui

double Min_D_Level ; //il livello D minimo più vicino

o non capisco qualcosa?

E dove viene salvato il valore restituito di tipo int?

???

Sto davvero facendo un brainstorming.

È possibile farlo in modo più semplice?

Come se tu (tu) avessi fatto un errore qui, il modo giusto di farlo è questo esempio di codice, ecc.

 

È stato seduto qui per un po':

#property version   "1.00"
#property strict

//символ и таймфрейм текущего графика
string symbol;
ENUM_TIMEFRAMES frame;
datetime time;
   

struct BarData
   {
   struct Elem
      {
      int      number;     //порядковый номер периода (дня, месяца или года)
      double   high;       //максимум периода
      double   low;        //минимум периода
      datetime time_high;  //время максимума
      datetime time_low;   //время минимума
      } Arr[];             //массив периода
   int index;              //текущий индекс массива
   double   max;           //последнее максимальное значение периода
   double   min;           //последнее минимальное значение периода
   datetime time_max;      //время максимума
   datetime time_min;      //время минимума

   //при создании структуры указываем, что массив пустой
   BarData(){index=-1;}    
   
   //функция записывает текущие экстремумы
   void WriteBar(int eNumber, string eSymbol, ENUM_TIMEFRAMES eFrame, datetime eTime)
      {
      int eShift=iBarShift(eSymbol,eFrame,eTime);
      double eHigh=iHigh(eSymbol,eFrame,eShift);
      double eLow=iLow(eSymbol,eFrame,eShift);
      //если элементов ещё нет или период сменился
      if(index<0 || eNumber!=Arr[index].number)
         {
         ArrayResize(Arr,++index+1);
         Arr[index].number=eNumber;
         Arr[index].high=eHigh;
         Arr[index].low=eLow;
         Arr[index].time_high=eTime;
         Arr[index].time_low=eTime;
         }
      //если произошло обновление текущего максимума
      if(eHigh-Arr[index].high>0)
         {
         Arr[index].high=eHigh;
         Arr[index].time_high=eTime;
         }
      //если произошло обновление текущего минимума
      if(Arr[index].low-eLow>0)
         {
         Arr[index].low=eLow;
         Arr[index].time_low=eTime;
         }
      //если произошло обновление предыдущего максимума
      if(eHigh-max>0)
         {
         for(int i=index+1; i>=0; i--)
            {
            if(Arr[index].high-eHigh>0)
               {
               max=Arr[index].high;
               time_max=Arr[index].time_high;
               break;
               }
            }
         }
      //если произошло обновление предыдущего минимума
      if(min-eLow>0)
         {
         for(int i=index+1; i>=0; i--)
            {
            if(eLow-Arr[index].low>0)
               {
               min=Arr[index].low;
               time_min=Arr[index].time_low;
               break;
               }
            }
         }
      }
   } day, month, year;

int OnInit()
   {
   symbol=Symbol();
   frame=(ENUM_TIMEFRAMES)Period();
   return(INIT_SUCCEEDED);
   }

void OnTick()
   {
   //текущее время закрытого бара
   time=iTime(symbol,frame,1);
   
   MqlDateTime date; 
   TimeToStruct(time,date);
   
   //делаем записи каждого периода
   day.WriteBar(date.day,symbol,frame,time);
   month.WriteBar(date.mon,symbol,frame,time);
   year.WriteBar(date.year,symbol,frame,time);
   
   //теперь имеем значения   
   Comment(TimeToString(day.time_max)+" : "+DoubleToString(day.max)+" : "+DoubleToString(day.Arr[day.index].high)+"\n"+TimeToString(day.time_min)+" : "+DoubleToString(day.Arr[day.index].low)+" : "+DoubleToString(day.min));
   }
Dovremmo cercare di evitare cicli inutili. Abbiamo un sacco di citazioni in arrivo, e devi fare le voci giuste al volo, in modo da non dover scavare nella storia e sprecare risorse del computer.
 
Dark Kchlyzov:

Più o meno così

double Min_D_Level ; //il livello D min più vicino

O mi sfugge qualcosa?

Sì, lei non capisce qualcosa. Dovrebbe andare così:

Количество_баров=ArrayCopyRates(Bar_data_D1,_Symbol,PERIOD_D1); // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров

E poi...

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

Sì, c'è qualcosa che non capisci. È così che deve essere:

E poi...

Grazie mille!

 
Dark Kchlyzov:

Grazie mille anche per questo!!!

Non c'è di che.

 

3.47 Vado a letto.

Digerirò tutto domani e se avrò delle domande te lo farò sapere!

Grazie mille a tutti!!!