Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1461

 
Aleksandr Slavskii #:

Se nell'Expert Advisor è prescritta la cancellazione degli ordini e la chiusura delle posizioni quando l'Expert Advisor viene cancellato,

allora tutto verrà cancellato e chiuso

Una piccola aggiunta: se ci vogliono 2,5 secondi.

Выполнение функции OnDeinit() ограничивается 2.5 секундами. Если за это время функция не закончила свою работу, то ее выполнение завершается принудительно.
 

Non riesco a capire come fare.

Quando si verifica l'evento di scorrimento della rotellina del mouse, il codice viene eseguito.

La rotellina del mouse può essere fatta scorrere per diversi clic alla volta e non si otterrà un evento con dparam = numero di clic, ma diversi eventi con dparam = +/-120.

Il codice viene eseguito per un certo tempo, che è molto più lungo del tempo che intercorre tra un clic e l'altro durante lo scorrimento della rotellina del mouse.

Di conseguenza, risulta che nessuno scorre più la rotellina del mouse e il programma continua a ricalcolare per un altro po' di tempo.

//+------------------------------------------------------------------+
void OnInit()
  {
   ChartSetInteger(0, CHART_EVENT_MOUSE_WHEEL, 0, true);
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   static double delta = 0;

   if(id == CHARTEVENT_MOUSE_WHEEL)
     {
      //--- какой то код
      delta += dparam / 120;
      Sleep(1000);
      //---
      Print(delta);
     }
  }
//+------------------------------------------------------------------+
15:12:22.820    test (EURUSD,H1)        0.0
15:12:23.821    test (EURUSD,H1)        1.0
15:12:24.811    test (EURUSD,H1)        2.0
15:12:25.823    test (EURUSD,H1)        3.0
15:12:26.817    test (EURUSD,H1)        4.0
15:12:27.814    test (EURUSD,H1)        5.0
La rotellina del mouse è stata fatta scorrere alle 15:12:22.820 e poi il programma è stato eseguito altre 5 volte, per 5 secondi interi.


Domanda: come eseguire il codice del programma una sola volta anziché più volte.

Cioè, la rotellina scorre per 5 click, delta = dparam / 120 * 5.

 
Aleksandr Slavskii #:

Non riesco a capire come fare.

Quando si verifica l'evento di scorrimento della rotellina del mouse, il codice viene eseguito.

La rotellina del mouse può essere fatta scorrere per diversi clic alla volta e non si otterrà un evento con dparam = numero di clic, ma diversi eventi con dparam = +/-120.

Il codice viene eseguito per un certo tempo, che è molto più lungo del tempo che intercorre tra un clic e l'altro durante lo scorrimento della rotellina del mouse.

Di conseguenza, si scopre che nessuno scorre più la rotellina del mouse e il programma continua a ricalcolare per un altro po' di tempo.

La rotellina del mouse è stata fatta scorrere alle 15:12:22.820 e poi il programma è stato eseguito altre 5 volte, per 5 secondi interi.


Domanda: come eseguire il codice del programma una sola volta anziché più volte.

Cioè, la rotella è stata fatta scorrere per 5 click, delta = dparam / 120 * 5.

Prova questo

//+------------------------------------------------------------------+
void OnInit()
  {
   ChartSetInteger(0, CHART_EVENT_MOUSE_WHEEL, 0, true);
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   static double delta = 0;
   bool flag = true;
   if(id == CHARTEVENT_MOUSE_WHEEL)
     {
      //--- какой то код
      delta += dparam / 120;
      Sleep(1000);
      //---
      if(flag)
       {
        Print(delta);
        flag = false;
       }
     }
  }
//+------------------------------------------------------------------+

Non ho controllato, semmai non è colpa mia...)))))) Dovrò fare qualcosa con il flag... e forse dovrò inserire il codice in una funzione personalizzata e gestire il flag lì.

 
Grazie mille!
 

Il 03 giugno ho pubblicato il mio script per MT5(https://www.mql5.com/ru/code/44732).... E' ancora nello stato di "in fase di controllo da parte del moderatore". Chi sa quanto tempo ci vorrà per il controllo?

Скачать бесплатно скрипт 'Quick Change MA (method, period)' от 'NotBuffett' для MetaTrader 5 в MQL5 Code Base
  • www.mql5.com
Скачать бесплатно скрипт 'Quick Change MA (method, period)' от 'NotBuffett' для MetaTrader 5 в MQL5 Code Base
 
Alexey Viktorov #:

Prova questo

Non ho controllato, se non è colpa mia...)))))) Dovrò modificare il flag in qualche modo... e forse dovrò inserire il codice in una funzione personalizzata e modificare il flag lì.

Il problema è che le funzioni personalizzate vengono eseguite solo all'interno di funzioni evento, e io ho solo due funzioni di questo tipo OnInit e OnChartEvent nel mio EA.

In generale, sono riuscito a farcela, anche se non proprio come asso pigliatutto, ma comunque meglio di prima.

//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   static double delta = 0;
   static ulong timeWheel = 0;
   static bool mouse_wheel = false;

   if(id == CHARTEVENT_MOUSE_WHEEL)
     {
      delta += dparam / 120;
      mouse_wheel = true;
      timeWheel = GetMicrosecondCount();
     }

   if(mouse_wheel && GetMicrosecondCount() - timeWheel > 0)
     {
      Print(delta);
      //--- какой то код
      Sleep(1000);
      //---
      delta = 0;
      mouse_wheel = false;
     }
  }
//+------------------------------------------------------------------+
23:48:28.853    test (EURUSD,H1)        1.0
23:48:29.857    test (EURUSD,H1)        1.0
23:48:30.856    test (EURUSD,H1)        4.0
23:48:31.881    test (EURUSD,H1)        2.0
23:48:32.880    test (EURUSD,H1)        4.0
23:48:33.887    test (EURUSD,H1)        11.0
23:48:34.914    test (EURUSD,H1)        15.0
23:48:35.926    test (EURUSD,H1)        7.0
23:48:36.936    test (EURUSD,H1)        9.0
23:48:46.477    test (EURUSD,H1)        6.0
23:48:47.479    test (EURUSD,H1)        -1.0
 
Aleksandr Slavskii #:

Il problema è che le funzioni personalizzate vengono eseguite solo all'interno di funzioni evento e io ho solo due funzioni di questo tipo OnInit e OnChartEvent nel mio EA.

In generale, sono riuscito a farlo, anche se non è proprio una buona idea, ma comunque meglio di come era.

È anche possibile chiamare funzioni personalizzate da OnChartEvent senza problemi.

Il flag è dichiarato a livello globale. Inserire OnTick solo per resettare il flag non è un problema e non ritarda l'esecuzione del codice.

Se il flag è aperto, viene chiamata una funzione personalizzata. Internamente, il flag è stato chiuso. In OnTick, il flag viene riaperto e attende la prossima esecuzione della funzione utente.

Penso che sia più facile che rimanere bloccati sul tempo di esecuzione.

 
Alexey Viktorov #:

È possibile chiamare funzioni personalizzate anche da OnChartEvent, senza problemi.

Il flag è dichiarato a livello globale. Inserire OnTick solo per resettare il flag non è un problema e non ritarda l'esecuzione del codice.

Se il flag è aperto, viene chiamata una funzione personalizzata. Internamente, il flag è stato chiuso. In OnTick il flag viene riaperto e attende la prossima esecuzione della funzione utente.

Penso che sia più semplice che essere legati al tempo di esecuzione.

Non capisco bene, o meglio non capisco affatto :)

E se non ci sono tick, OnTick non funziona senza tick, cosa dovrei fare?


In realtà chiamo comunque funzioni personalizzate da OnChartEvent. Era solo un problema di tracciamento dell'ultimo clic del mouse quando si scorre la rotellina.

Si trattava di ritardare l'esecuzione della funzione personalizzata fino al momento in cui si interrompeva lo scorrimento della rotellina, contando il numero di clic durante lo scorrimento.

In linea di principio, ha funzionato.

 
NotBuffett #:

Il 03 giugno ho pubblicato il mio script per MT5(https://www.mql5.com/ru/code/44732).... E' ancora nello stato di "in fase di controllo da parte del moderatore". Chi sa quanto tempo ci vorrà per il controllo?

Ho appena pubblicato il codice. La verifica ha richiesto meno di un minuto.

Molto probabilmente hai commesso un errore durante la pubblicazione.

 
Aleksandr Slavskii #:

Ho appena pubblicato il codice. La verifica ha richiesto meno di un minuto.

Molto probabilmente hai commesso un errore durante la pubblicazione.

Ho provato a pubblicare di nuovo... ed è la stessa cosa:

sotto "5. Test" c'è scritto"Iltest è stato completato senza errori" e propone di pubblicarlo, ma quando si fa clic sul pulsante "Pubblica" si riceve un errore

404. Questa pagina non esiste

Nella sottosezione "I miei codici" ci sono ora due codici e su entrambi c'è scritto "controllato dal moderatore".

In generale, farò una domanda nel thread generale, forse i moderatori se ne accorgeranno.