Sequenza di esecuzione di Init() e DeInit() - pagina 25

 
Alexey Viktorov:

Dimitri mi sembri un programmatore istruito. Non ti hanno insegnato le regole dell'etichetta nella programmazione?

Per il resto si può scrivere come nel vecchio mql4 con la possibilità di overrun dell'array e altre ipotesi. Si ottiene un errore in risposta... Beh, segnalalo... andiamo avanti, non abbiamo tempo... E poi ti imbatti in un problema che non vale un accidente in un linguaggio più rigoroso e cominci a dare la colpa agli sviluppatori...

Cristo è risorto.


Quando si crea un oggetto esistente non succede niente di terribile, non succede neanche niente di terribile, l'oggetto semplicemente non viene creato e questo è tutto.
 
Nikolai Semko:

Penso che aggiungerò anche una soluzione più tardi, ma senza usare variabili globali del terminale e dei file, e con la possibilità di applicare diversi indicatori identici in una finestra.

A proposito, è un compito interessante scrivere una funzione che produce un valore diverso per ogni diversa serie di parametri di input dell'indicatore.

La prima cosa che mi è venuta in mente è ChartSaveTemplate.


Rinunciare alle risorse globali - a quanto pare, alle risorse.

 
fxsaber:

A proposito, è un compito interessante scrivere una funzione che produce un valore diverso per ogni diversa serie di parametri di input dell'indicatore.

La prima cosa che mi è venuta in mente è attraverso ChartSaveTemplate.


Rinunciare a quelle globali - apparentemente risorse.


Naturalmente le risorse - mi sembrano la soluzione migliore, perché sono invisibili, a differenza delle variabili globali del terminale e dei file, e veloci. Inoltre, si possono passare gli array attraverso di loro, proprio come attraverso i file, ma più velocemente, perché tutto avviene nella RAM. Appartengono anche alla finestra, non al terminale, come nel caso del globale. Inoltre, è possibile creare una risorsa per tutti gli stessi indicatori in una finestra.

No, penso che ChartSaveTemplate sia troppo ingombrante. Cercherò di creare una risorsa comune per tutte le istanze di un indicatore senza usare modifiche globali, modelli e file.

 
Nikolai Semko:

Il mio esempio è stato creato per mostrare il problema di una sequenza ambigua dell'unità della nuova TF e dell'unità della vecchia TF, non come soluzione.

Hai solo aggirato il problema, non l'hai risolto.
Nel mio esempio, è solo importante cancellare l'oggetto nell'unità del vecchio TF in ogni caso, anche quando il TF viene cambiato, e nell'unità del nuovo oggetto viene creato di nuovo.

Se la sequenza è prima Deunit della vecchia TF, poi Unit della nuova TF, come dovrebbe essere logicamente. Poi l'oggetto viene cancellato e poi creato di nuovo.

Se la sequenza è prima l'unità della nuova TF e poi la Deunit della vecchia TF, allora l'oggetto viene semplicemente modificato quando si cerca di crearlo nell'unità, perché non è ancora cancellato. E poi viene cancellato dalla Deunit del vecchio TF. Questo è il bug.

Questo era lo scopo di questo esempio - mostrare cosa può incontrare qualsiasi programmatore che non ha letto questo ramo e non è a conoscenza di questa "caratteristica".
Questo esempio non voleva essere una soluzione. Le varianti della soluzione sono presentate qui e qui. Penso che aggiungerò anche una soluzione più tardi, ma senza usare variabili globali e file del terminale e perché questa soluzione funzioni anche se diversi indicatori identici sono impostati in una finestra. Avete provato a risolvere questo problema? Oppure siete capaci solo di trovare errori nel codice degli altri, soprattutto quando non ci sono.


È un peccato bestemmiare oggi, ma ne ho voglia...

Non sono nemmeno riuscito a leggere le tue sciocchezze fino alla fine.

Ripeto ancora una volta di non creare un problema dove non c'è un problema.

La risposta a tutte le tue domande nel tuo codice era qui

Alexey Viktorov:

Che senso ha usare l'esempio primitivo della strada a doppio senso?

È meglio usare un esempio di codice quasi corretto .

Non contavo sull'assolutezza.

Questo è tutto ... vai via Satana, non portarmi al peccato.

 
Alexey Viktorov:

È un peccato bestemmiare oggi, ma ne ho voglia...

Non sono nemmeno riuscito a leggere le tue sciocchezze fino alla fine.

Lo ripeto, non mettete il problema dove non esiste.

La risposta a tutte le domande del tuo codice era qui.

Non contavo sugli assoluti.

Questo è tutto... Satana se ne vada, non ci porti al peccato.


Oh, amico, devi andare in un altro forum. Dove gli psicoterapeuti danno consigli. Capisco, capisco. Deficit d'amore infantile, vogliono attenzione e amore. Mi dispiace. Ti aiuterò se hai bisogno di qualcosa. Potete scrivermi di persona. Non sto scherzando.

Ed è meglio non farlo qui, perché abbiamo divertito troppo la gente.

LA RESURREZIONE DAVVERO!

 

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Sequenza di esecuzione di Init() e DeInit()

fxsaber, 2017.04.14 13:52

Un po' di tipster's tipster's tipster's tipster's tipster's tipster's tipster's tipster's tipster's
Nessuna lamentela agli sviluppatori.
Fantastico come fare! Esegui
#property indicator_chart_window
#property indicator_plots   0

void OnInit()
{
  Print(__FUNCTION__ + (string)ChartIndicatorGet(0, 0, MQLInfoString(MQL_PROGRAM_NAME)));
}

void OnDeinit( const int Reason )
{
  Print(__FUNCTION__);
}

int OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double& price[])
{
  return(rates_total);
}

E cambiare il TF. Non ci sarà un solo Deinit! Tutti gli indicatori passeranno inosservati, consumando risorse. E volevo solo

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Bug, bug, domande

fxsaber, 2016.09.22 16:14

Come faccio a conoscere il mio manico su un grafico in un indicatore? AttraversoChartIndicatorName non è adatto perché restituisce un nome breve. E con lo stesso nome può essere già in esecuzione lo stesso indicatore con diversi parametri di input.

Si scopre che se si vuole conoscere il suo manico, è necessario utilizzare ChartIndicatorGet, ma come mostrato nell'esempio sopra, sarà un vero problema - l'indicatore sarà disinstallabile.

Che sfortuna.


Non posso nemmeno fare questo.

Forum sul trading, sistemi di trading automatico e test di strategia

Bug, bug, domande

fxsaber, 2016.09.23 10:20

Come faccio a conoscere il mioINDICATOR_SHORTNAME? Nessuna funzione IndicatorGet*!

Non c'è modo di sapere dall'indicatore quale sub_window ha colpito. E' solo un mucchio di fannulloni.

 
fxsaber:

Non si può dire dall'indicatore in quale sub_finestra si trova. E' solo un mucchio di fannulloni.

https://www.mql5.com/ru/docs/chart_operations/chartwindowfind
Документация по MQL5: Операции с графиками / ChartWindowFind
Документация по MQL5: Операции с графиками / ChartWindowFind
  • www.mql5.com
Операции с графиками / ChartWindowFind - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber:
Un piccolo e fresco tiphack! Esegui

E cambia il TF. Non ci sarà una sola Deinit! Tutti gli indicatori funzioneranno furtivamente, consumando risorse. E io volevo solo

Si scopre che se volete conoscere il suo manico, dovreste usare ChartIndicatorGet, ma, come mostrato nell'esempio sopra, sarà una vera seccatura - l'indicatore non sarà cancellabile.

Diventerà irrecuperabile.

Ho affrontato una cosa simile. Gli sviluppatori hanno consigliato di leggere più attentamente l'aiuto perché c'è un esempio:

//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
   //--- количество окон на графике (всегда есть хотя бы одно главное окно) 
   int windows=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL); 
   //--- про ходим по окнам 
   for(int w=0;w<windows;w++) 
     { 
      //--- сколько индикаторов в данном окне/подокне 
      int total=ChartIndicatorsTotal(0,w); 
      //--- переберем все индикаторы в окне 

      for(int i=0;i<total;i++) 
        { 
         //--- получим короткое имя индикатора 
         string name=ChartIndicatorName(0,w,i); 
         //--- получим хэндл индикатора 
         int handle=ChartIndicatorGet(0,w,name); 
         //--- выведем в журнал 
         PrintFormat("Window=%d,  index=%d,  Name=%s,  handle=%d",w,i,name,handle); 
         //--- обязательно освобождаем хендл индикатора, как только он становится ненужным 
         IndicatorRelease(handle); 
        } 
     } 
  }
Tuttavia, hanno poi aggiunto che il comportamento sarebbe stato "corretto". Ma a quanto pare è ancora in fase di aggiustamento.
 
Alexey Kozitsyn:
https://www.mql5.com/ru/docs/chart_operations/chartwindowfind

Grazie, ma c'è la stessa limitazione - non c'è modo senza un nome breve (come lo conosci?).

 
Alexey Kozitsyn:

Mi sono imbattuto in qualcosa del genere. Gli sviluppatori mi hanno consigliato di leggere più attentamente l'aiuto perché c'è un esempio:

Tuttavia, poi ha aggiunto che il comportamento sarebbe stato "corretto". Ma a quanto pare è ancora in fase di aggiustamento.

Questo mi ha davvero aiutato, grazie!

La cosa principale è non fare IndicatorRelease in Deinit.

Motivazione: