Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 645

 

Taras, è possibile fare tale normalizzazione del grafico per il cambio di frame con un clic del mouse?

A volte per abitudine clicco quando il cursore è vicino al pulsante, ma il risultato non mi piace.

Non ho trovato nulla di adatto nella lista della gestione degli eventi, c'è soloCHARTEVENT_CHART_CHANGE senza alcuna descrizione specifica. Posso provare a legare un clic del mouse, ma per quanto ho capito l'utente non può lavorare con il menu di sistema, solo se crea i propri pulsanti. C'è una soluzione semplice?

 
psyman:

Taras, è possibile fare tale normalizzazione del grafico per il cambio di frame con un clic del mouse?

A volte per abitudine clicco quando il cursore è vicino al pulsante, ma il risultato non mi piace.

Non ho trovato nulla di adatto nella lista della gestione degli eventi, c'è soloCHARTEVENT_CHART_CHANGE senza alcuna descrizione specifica. Posso provare a legare il clic del pulsante del mouse, ma per quanto ho capito l'utente non può lavorare con il menu di sistema, solo se crea i propri pulsanti. C'è una soluzione semplice?

Cioè, per cliccare su alcune "zone di rubinetto" sul grafico?
È possibile, è necessario tenere traccia delle coordinate del cursore e dei clic del pulsante del mouse.

MOVIMENTO DEL MOUSE

 

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

Qualsiasi domanda per i principianti su MQL4, aiuto e discussione su algoritmi e codici

Taras Slobodyanik, 2018.10.04 09:37

Vuoi dire che devi cliccare con il mouse su alcune "zone di rubinetto" sul grafico?
È possibile, è necessario tenere traccia delle coordinate del cursore e dei clic del mouse.



Il fatto è che si tratta di un clic sul grafico, non su un pulsante del menu di sistema. Come elaborare un tale evento non lo so.
 
psyman:

Il fatto è che è un clic su un grafico, non un pulsante dal menu di sistema. Non so come elaborare un tale evento.

ricordate il periodo di caratteri corrente e in"CHARTEVENT_CHART_CHANGE" controllate i cambiamenti e fate quello che dovete fare

 
OK, grazie ancora.
 

Per favore, ditemi perché la stessa funzione del corpo EA OnTick() non funziona (o meglio, funziona, ma fallisce su tutti i grafici correttamente)

Ma dalla procedura OnInit() funziona bene e anche da uno script ordinario. L'Expert Advisor è installato su 80 grafici contemporaneamente (20 valute, ogni 4 finestre W1 D1 H4 H1) può solo il mio computer non può farcela? Si prega di avvisare. Lo scopo del robot è quello di emettere i messaggi MessageBox sullo schermo, se viene rilevato un segnale su uno dei grafici. Forse il computer è lento al momento dell'inizio di questi messaggi?
 

Ho problemi a ricordare il periodo prima che un evento sia gestito, dove lo faccio?

Ho deciso di tracciare per messaggio, si scopre che CHARTEVENT_CHART_CHANGE viene elaborato 2 volte in un clic, la variabile ctime viene azzerata.


#proprietà rigorosa

#proprietà indicator_chart_window

int ctime;


void OnInit()

{

Print(" OnInit------------1 ", ChartPeriod(0));

Print("OnInit ctime = ", ctime);

// ctime=ChartPeriod(0);

}


int OnCalculate(const int rates_total,

const int prev_calculated,

const datetime &time[],

const double &open[],

const double &high[],

const double &low[],

const double &close[],

const long &tick_volume[],

const long &volume[],

const int &spread[])

{

ctime=ChartPeriod(0);

return(rates_total);

}

void OnChartEvent(const int id,

const long &lparam,

const double &dparam,

const string &sparam)


{


se(id==CHARTEVENT_CHART_CHANGE)

{

Print("CHARTEVENT_CHART_CHANGE è iniziato ctime=", ctime);

if(ctime!=ChartPeriod(0))

{

Stampa(ChartPeriod(0), " CHANGED!!!!!!!!!!!!!!! ", ctime);

}

}

}



Aggiungere l'indicatore su base oraria, poi passare al giornaliero

2018.10.05 01:04:45.171 _t1 CADJPY,Daily: CHARTEVENT_CHART_CHANGE is started ctime=1440

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: 1440 CHANGED!!!!!!!!!!!!!!! 0

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: CHARTEVENT_CHART_CHANGE is started ctime=0

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: inizializzato

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: OnInit ctime=0

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: OnInit------------1 1440

2018.10.05 01:04:45.156 _t1 CADJPY,H1: uninit reason 3

2018.10.05 01:02:02.000 _t1 CADJPY,H1: CHARTEVENT_CHART_CHANGE è iniziato ctime=60

2018.10.05 01:02:02.000 _t1 CADJPY,H1: 60 CHANGED!!!!!!!!!!!!!!! 0

2018.10.05 01:02:02.000 _t1 CADJPY,H1: CHARTEVENT_CHART_CHANGE è iniziato ctime=0

2018.10.05 01:02:02.000 _t1 CADJPY,H1: inizializzato

2018.10.05 01:02:02.000 _t1 CADJPY,H1: OnInit ctime=0

2018.10.05 01:02:02.000 _t1 CADJPY,H1: OnInit------------1 60

2018.10.05 01:02:01.078 Indicatore personalizzato _t1 CADJPY,H1: caricato con successo





 
psyman:

Ho problemi a ricordare il periodo prima che l 'evento venga elaborato, dove deve essere fatto?

Ho deciso di tracciare per messaggio, si scopre che CHARTEVENT_CHART_CHANGE viene elaborato 2 volte in un clic, la variabile ctime viene azzerata.

Metti il codice nel messaggio correttamente! È molto difficile da leggere in questa forma. Deve assomigliare a questo.

#property strict
#property indicator_chart_window
int ctime;
void OnInit()
   {
     Print("  OnInit------------1  ", ChartPeriod(0));
     Print("OnInit ctime = ", ctime);
   //  ctime=ChartPeriod(0);   
   }
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   ctime=ChartPeriod(0);         
   return(rates_total);
  }
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   if(id==CHARTEVENT_CHART_CHANGE)
      {
      Print("CHARTEVENT_CHART_CHANGE     is started  ctime=", ctime);
      if(ctime!=ChartPeriod(0))
      {
      Print(ChartPeriod(0), "  CHANGED!!!!!!!!!!!!!!!   ", ctime);
      }
      } 
}

Quando cambiate i parametri di un grafico, l'indicatore viene ricaricato forzatamente, leggete il documento per il motivo della deinizializzazione e la sua variabile motivo.

Potete usare le variabili globali del terminale per salvare i parametri richiesti.

 
Vitaly Gorbunov:

Inserisci il codice correttamente nel messaggio! È molto difficile leggerlo così. Dovrebbe essere così.

L'indicatore è forzato a ripartire quando cambiate i parametri del grafico leggete il documento per il motivo della deinizializzazione e la sua variabile motivo.

Potete usare le variabili globali del terminale per salvare i parametri richiesti.

Sì, dovete salvare i valori in GlobalVariable, e poi, all'avvio, controllare la loro esistenza.

Cioè, il numero del grafico, il simbolo, il periodo dovrebbero essere salvati.
E poi cancellare le variabili non necessarie, o renderle inizialmente come variabili globali temporanee.

ps. si possono anche memorizzare informazioni in oggetti sul grafico - finché il grafico esiste, gli oggetti esistono

 

Pensavo che sarebbe stato molto più facile :-)

Poi una domanda piuttosto infantile - il mio codice non comporta alcun trading o grafica, che tipo di programma dovrei usare?

Gli script sono una tantum, ma possono essere eseguiti in un ciclo? Ho dichiarato un indicatore personalizzato per pura inerzia, perché non ho mai usato Expert Advisors. Non li ho mai usati prima, ma si riavviano automaticamente, cosa di cui non ho bisogno. Ho bisogno del vostro consiglio.

ps

Gli oggetti possono essere a dimensione zero, in modo che visivamente non siano d'intralcio?