Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1418

 

Buonasera, cari programmatori!

Aiutatemi a risolvere un semplice problema. C'è un codice di MQL4. Voglio adattarlo al 5. Cioè, per lavorare in modo simile in MQL5.


//Введем внешнюю переменную, чтобы иметь возможность изменить количество сканируемых свечей.
extern int Window=30;
 
void OnStart()
{
   //Вводим переменные.
   double Highest=High[0];
   double Lowest=Low[0];
 
   //Сканируем 30 свечей и обновляем значения самых высоких и самых низких цен.
   for(int i=0; i<=Window; i++) {
   if(Low[i]<Lowest) Lowest=Low[i];
   if(High[i]>Highest) Highest=High[i];  
}
 
   //Выводим результат.
   Alert("Самая высокая цена ",Highest," - Самая низкая цена ",Lowest);
}



La mia variante ovviamente non passa, per qualche motivo ci sono molti errori):

//Введем внешнюю переменную, чтобы иметь возможность изменить количество сканируемых свечей.
extern int Window=30;
 
 
void OnStart()
{

double   o = iOpen(NULL, PERIOD_CURRENT, 0);
double   h = iHigh(NULL, PERIOD_CURRENT, 0);
double   l = iLow(NULL, PERIOD_CURRENT, 0);
double   c = iClose(NULL, PERIOD_CURRENT, 0);

double Highest=h;
double Lowest=l;

   //Сканируем 30 свечей и обновляем значения самых высоких и самых низких цен.
     
   for(int i=0; i<=Window; i++) 
{
   if  ( l[i] < Lowest ) 
   Lowest=[i];
  

   if  ( h[i] > Highest ) 
   Highest=[i];  
  
}
 
   //Выводим результат.
   Print("Самая высокая цена ",Highest,
         " - Самая низкая цена ",Lowest);
}
 
 
Alexey Belyakov #:

Buonasera, cari programmatori!

Aiutatemi a risolvere un semplice problema. C'è un codice di MQL4. Voglio adattarlo al 5. Cioè, dovrebbe funzionare in modo simile in MQL5.


Cercare nella guida

iHigh

e funzioni simili

Se non funziona, c'è un errore nel ciclo.

e non si riesce a vedere a quale variabile si stanno aggiungendo i dati

 
lynxntech #:

guardare nella guida

e funzioni simili

se non funziona, c'è un errore nel ciclo

e non si riesce a vedere a quale variabile si stanno aggiungendo i dati

Il massimo e il minimo dovrebbero essere visualizzati.

Ho guardato questo:

int val_index=iLowest(NULL,0,MODE_CLOSE,10,1);

Molto vicino, ma non ancora.

Beh, mostra il NUMERO delle ultime 10 (a partire dalla prima "1") candele con il massimo ribasso. Ma mi serve il valore del prezzo, non il numero della candela.

 

In generale, è necessario non guardare indietro, ma in avanti.

Ad esempio: cercare il "minimo" dall'inizio della candela precedente (che è numerata "1") durante le 100 candele successive.

 
lynxntech #:

si può fare tutto, la domanda era rivolta a coloro che misurano il lavoro effettivo, e meglio agli sviluppatori, chissà cosa hanno nei loro piani lì

Non vogliosperimentare, ci sono molti altri compiti.

Giusto. Non un business reale in .........

 
Alexey Viktorov #:

Proprio così. Non sono affari del re .........

forse dovremmo chiudere il thread "Domande dei principianti"? Alexei, se non vuoi aiutare, per favore stanne fuori, ci sono troppe lamentele da parte tua.

Mi interessava una risposta professionale per avere un'idea di come funziona la piattaforma.

 
Alexey Belyakov #:

Buonasera, cari programmatori!

Aiutatemi a risolvere un semplice problema. C'è un codice di MQL4. Voglio adattarlo al 5. Cioè, dovrebbe funzionare in modo simile in MQL5.




La mia variante ovviamente non funziona, per qualche motivo ci sono molti errori):

A quanto pare, non hai molta dimestichezza con la programmazione. Per questo motivo, qualunque sia il consiglio che ti viene dato, non avrai successo finora .

Ma comunque... cercate di capire la funzione

int  CopyHigh(
   string           symbol_name,      // имя символа
   ENUM_TIMEFRAMES  timeframe,        // период
   int              start_pos,        // откуда начнем 
   int              count,            // сколько копируем
   double           high_array[]      // массив для копирования максимальных цен
   );

e la funzione di lavorare con gli array

int  ArrayMaximum(
   const void&   array[],             // массив для поиска
   int           start=0,             // с какого индекса начинаем поиск
   int           count=WHOLE_ARRAY    // количество проверяемых
   );

Esistono altre varianti per risolvere questo problema.

 
Alexey Belyakov #:

Buonasera, cari programmatori!

Aiutatemi a risolvere un semplice problema. C'è un codice di MQL4. Voglio adattarlo al 5. Cioè, dovrebbe funzionare in modo simile in MQL5.




La mia variante ovviamente non funziona, per qualche motivo ci sono molti errori):

CopyRates() invece di un mucchio di indicatori e le modifiche al codice diventeranno minime, il codice rimarrà compatto e leggibile.

//Введем внешнюю переменную, чтобы иметь возможность изменить количество сканируемых свечей.
extern int Window=30;
 
void OnStart()
{
   //Вводим переменные.
   double Highest=DBL_MIN;// 
   double Lowest=DBL_MAX; // 
   MqlRates rates[];
   //Сканируем 30 свечей и обновляем значения самых высоких и самых низких цен.
   if (CopyRates(_Symbol,_Period,30,rates)!=30) {
      Alert("copyRates failed");
      return;
   }
   for(int i=0; i<=Window; i++) {
      if(rates[i].low<Lowest) Lowest=rates[i].low;
      if(rates[i].high>Highest) Highest=rates[i].high;  
   }
 
   //Выводим результат.
   Alert("Самая высокая цена ",Highest," - Самая низкая цена ",Lowest);
}

In realtà, si dovrebbe aggiungere anche un controllo per le virgolette curve

 
Maxim Kuznetsov #:

CopyRates() invece di un mucchio di indicatori e le modifiche al codice diventeranno minime, il codice rimarrà compatto e leggibile.

In realtà, si dovrebbe anche aggiungere un controllo per le quotazioni curve

Maxim, CopyRates non viene presentato come un simbolo con tutte le sue funzioni?

più economico ci sono le singole funzioni

 
lynxntech #:

Maxim, CopyRates non è stato presentato come un'acquisizione di tutte le caratteristiche del personaggio?

più economico ci sono le caratteristiche individuali

1) secondo le parole degli sviluppatori la copia virtuale, cioè se possibile i dati non vengono trasferiti, ma vengono trasferiti i riferimenti interni 2) anche con la copia completa è più veloce di CopyBuffer per iHigh,iLow separatamente (1 chiamata invece di 2, che andranno comunque nelle stesse strutture del terminale).

Infine, la cosa principale: quando si esegue un porting, è molto importante che il codice sia il più possibile simile all'originale, anche visivamente. Si deve essere assolutamente sicuri che il codice faccia esattamente la stessa cosa dell'originale. Le piccole ottimizzazioni si fanno dopo, e solo quando sono veramente critiche.

Motivazione: