MetaTrader 4 Build 529 beta rilasciato con un nuovo compilatore - pagina 18

 
mr_Johns:
Anche il manuale MQL4 (che si trova nell'editor) è stato aggiornato di conseguenza?


sì con una richiesta di aggiornamento. Il manuale MQL4 è quasi basato sul 5 e non corrisponde alla realtà del compilatore al momento.
 
ALXIMIKS:

Correggetemi se ho sbagliato.

Uso una funzione di libreria in un indicatore, questa funzione dichiara alcune variabili statiche che partecipano al calcolo dell'array dell'indicatore.

Se voglio cambiare i parametri dell'indicatore per correggere il calcolo dell'indicatore (in funzione delle variabili statiche),

passare il flag alla funzione di libreria che è responsabile della reinizializzazione (si dovrebbero espandere i parametri di input di ogni funzione che ha variabili statiche)

fare l'azzeramento delle variabili statiche nel corpo, e non dimenticare di rimuovere il flag prima di completare il calcolo.

Sarebbe molto più semplice se le variabili statiche avessero qualche parametro, impostato durante la loro dichiarazione, responsabile del fatto che queste variabili saranno azzerate durante la reinizializzazione.

Creare variabili globali invece di statiche locali (al di fuori delle funzioni), e inizializzarle alla prima chiamata.
 
ALXIMIKS:

Sarebbe molto più semplice se le variabili statiche avessero qualche parametro, impostato quando sono dichiarate, che è responsabile del fatto che queste variabili siano o meno resettate alla reinizializzazione.

Sarebbe ancora più facile, se gli sviluppatori facessero una funzione speciale come ResetStaticVars().

// A proposito, non è così facile da fare. Io non lo farei. Una cosa è azzerare semplicemente l'intero segmento di dati, un'altra cosa è assegnare correttamente tutti i valori iniziali dell'utente. Un dolore al collo, però.

In realtà (come paradigma) salvare i valori durante la vita del programma è piuttosto conveniente. C'è solo una questione di retrocompatibilità qui, quindi...

 

So che questa è una parte del forum di lingua russa, ma dato che non sono bravo a parlare russo (anche se lo so leggere) spero che a nessuno dispiaccia postare questo qui (dato che la parte inglese sembra completamente inattiva per quanto riguarda questi problemi e dato che non ho visto che qualcuno ha postato su questo problema)

C'è un problema serio con la nuova metatrader che riguarda i parametri stringa esterni. Inizialmente hanno un valore corretto, ma non appena si cambia la cornice temporale o il simbolo, il contenuto di un parametro stringa viene perso. Ecco un semplice esempio che mostrerà esattamente cosa sta succedendo. Questo problema si verifica anche quando tali indicatori sono utilizzati attraverso la chiamata iCustom() e questo rende qualsiasi indicatore inutilizzabile da qualsiasi EA o altro codice

#property indicator_chart_window

extern string TestString = "whatever value that we want initially set";

int OnInit() { return(0); }
int deinit() { return(0); }
int start()
{
   Comment(TestString);
   return(0);
}
 
ALXIMIKS:

Sì, con la richiesta di aggiornamento. Il manuale per MQL4
è quasi basato sul 5 e non corrisponde alla realtà del compilatore al momento.

Forse hanno lasciato lì qualcosa che è nel prossimo futuro? Ci conto.
 
mr_Johns:
Anche il manuale MQL4 (che si trova nell'editor) è stato aggiornato di conseguenza?

Sì, è stato aggiornato da molto tempo e viene attivamente integrato quotidianamente.
 

Non riesco a capire perché abbiamo bisogno di un design come questo

#property icon "\\Files\\button.ico"
 
VOLDEMAR:

Non riesco a capire perché abbiamo bisogno di un design come questo

Quando si avvia l'EA, ci sarà un'immagine nella scheda "Generale".
 
nessuna immagine
 
mladen:

So che questa è una parte del forum di lingua russa, ma dato che non sono bravo a parlare russo (anche se lo so leggere) spero che a nessuno dispiaccia postare questo qui (dato che la parte inglese sembra completamente inattiva per quanto riguarda questi problemi e dato che non ho visto che qualcuno ha postato su questo problema)

C'è un problema serio con la nuova metatrader che riguarda i parametri stringa esterni. Inizialmente hanno un valore corretto, ma non appena viene cambiato il quadro temporale o il simbolo, il contenuto di un parametro stringa viene perso. Ecco un semplice esempio che mostrerà esattamente cosa sta succedendo. Questo problema si verifica anche quando tali indicatori sono utilizzati attraverso la chiamata iCustom() e questo rende qualsiasi indicatore inutilizzabile da qualsiasi EA o altro codice

Mladen, è più facile per me rispondere in russo, visto che tu sai leggere bene.

Ecco la mia soluzione a questo problema. Nel mio codice init() includo la funzione ReInit() che reinizializza queste variabili globali, i cui valori dovrebbero essere ripristinati quando cambia il timeframe o il simbolo:

//-----------------------------------------------------------------------------
int init(){
   int Error;
   if( МинНаклонТренда<Zero ) МинНаклонТренда=0;
   if( МинНаклонТренда-МаксНаклонТренда>Zero ) МаксНаклонТренда=МинНаклонТренда;
   if( БарОкончания<1 ) БарОкончания=1;
   if( МинБазовыйПериод<1 ) МинБазовыйПериод=1;
   if( МаксБазовыйПериод<МинБазовыйПериод ) МаксБазовыйПериод=МинБазовыйПериод;
   if( БарНачала<МинБазовыйПериод+БарОкончания ) БарНачала=МинБазовыйПериод+БарОкончания;
   if( БарНачала>Bars-1 ){
      if( Bars>МинБазовыйПериод+БарОкончания ) БарНачала=Bars-1;
      else Alert("Неразрешимая ошибка: история("+Bars+")<=активация("+МинБазовыйПериод
                +")+окончание("+БарОкончания+")");
   }
   if( ТолщинаТрендовой<1 ) ТолщинаТрендовой=1;
   if( ТолщинаТрендовой>5 ) ТолщинаТрендовой=5;
   if( РазмерИндикатораТиков<1 ) РазмерИндикатораТиков=1;
   if( РазмерИндикатораТиков>5 ) РазмерИндикатораТиков=5;
   if( СдвигИндикатораТиков<3 ) СдвигИндикатораТиков=3;
   if( СдвигИндикатораТиков>100 ) СдвигИндикатораТиков=100;
   if( ПоказыватьВсе ) Visibility=0; else Visibility=EMPTY;
   LastBar     =БарОкончания;
   ЦветЛиний[0]=ЦветПоддержки;
   ЦветЛиний[1]=ЦветСопротивления;
   ЦветХорды[0]=ЦветВосходящейХорды;
   ЦветХорды[1]=ЦветНисходящейХорды;
   Цвет123[0]  =Цвет123 ВТ;
   Цвет123[1]  =Цвет123 НТ;
   NewTime     =0;
   ReInit();                                       // Повторная инициализация
   ClearScreen();                                  // Очистить экран
   Error=fVLine("StartLine","Старт",0,БарНачала,0,0,0,0,0,ЦветВертикалей);
   Error=fVLine("DeadLine","Пуск",0,БарОкончания,0,0,0,0,0,ЦветВертикалей);
   DeadLine=TimeCurrent();
   if( СтатическийРежим ){
      if( РежимОтладки ) РежимРаботы=" Отладка "; else РежимРаботы=" ";
      РежимРаботы=РежимРаботы+"Статический режим Пауза "+ПериодИмитацииТиков+" мс";
      МоделироватьДинамику=false;
      //РежимОтладки=false;
      while( true ){                               // Бесконечный цикл
         ReInit();                                 // Повторная инициализация
         start();                                  // Имитация тика
         Sleep(ПериодИмитацииТиков);               // Не работает в индикаторах
   }  }
   else {
      if( МоделироватьДинамику ){
         РежимРаботы=" Режим имитации динамики Размерность "+DoubleToStr(0.5*БарНачала*БарНачала,0);
         Print("      "+Version+РежимРаботы+" История: "+(БарНачала)+" баров с "+TimeToStr(Time[БарНачала]));
         LastBar=БарНачала;
         while( LastBar>БарОкончания ){            // Перебор всех баров истории
            LastBar--;
            start();                               // Имитация тика
         }
         МоделироватьДинамику=false;
         Print("      Режим имитации динамики отключен!");
   }  }
   if( РежимОтладки ) РежимРаботы=" Отладка "; else РежимРаботы=" ";
   РежимРаботы=РежимРаботы+"Динамический режим";
   Print("      "+Version+РежимРаботы+" История: "+(БарНачала)+" баров с "+TimeToStr(Time[БарНачала]));
   if( !ПечататьПредупреждения ) Print("Печать предупреждений запрещена!");
   if( РежимОтладки ) start();                     // Имитация тика
   return(0);
}
//-----------------------------------------------------------------------------
// Повторная инициализация глобальных переменных и массивов
void ReInit(){
   StartTime[0]   =Time[БарНачала];
   StartTime[1]   =Time[БарНачала];
   Groups[0]      =0;
   Groups[1]      =0;
   OldMG[0]       =0;
   OldMG[1]       =0;
   MainGroup[0]   =0;
   MainGroup[1]   =0;
   QualityMax[0]  =0;
   QualityMax[1]  =0;
   OldStopLine    =0;
   return;
}
//-----------------------------------------------------------------------------