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

 
neverness:

Ti ho detto chiaramente che non dovresti insegnare agli altri quando tu stesso non ne hai idea.

L'aiuto dovrebbe essere "qualificato", non "dalla strada"!

Descrivete di nuovo il problema, ciò che è necessario.

 
Vitaly Muzichenko:

Ridescrivere di nuovo il compito, esattamente ciò che è necessario.

Sono interessato a poter trasferire dati in MT4/MT5 tra diversi moduli.

Per esempio:

Come trasferire i dati da un indicatore all'altro?

Come trasferire i dati da un indicatore a uno script?

Come trasferire i dati dall'indicatore all'Expert Advisor? ecc... e così via.

La semplice aggiunta di dati trasferiti in un file separato e poi la lettura di questi dati dal file in altri moduli è un modo abbastanza ovvio e comune per trasferirli.

Ma in questo caso c'è un problema di sincronizzazione dei dati trasferiti/letti.

Intuitivamente, suppongo che il terminale MT4/MT5 deve avere una certa area di memoria buffer condivisa e ci devono essere delle procedure che regolano lo scambio di dati attraverso questa area.

Ma non ho trovato niente del genere nella descrizione.

 
neverness:

Sono interessato alla procedura di trasferimento MT4/MT5 tra diversi moduli.

Per esempio:

Come trasferire i dati da un indicatore all'altro?

Come trasferire i dati da un indicatore a uno script?

Come trasferire i dati dall'indicatore all'Expert Advisor? ecc... e così via.

La semplice aggiunta di dati trasferiti in un file separato e poi la lettura di questi dati dal file in altri moduli è un modo abbastanza ovvio e comune per trasferirli.

Ma in questo caso c'è un problema di sincronizzazione dei dati trasferiti/letti.

Intuitivamente, suppongo che il terminale MT4/MT5 deve avere una certa area di memoria buffer condivisa e ci devono essere delle procedure che regolano lo scambio di dati attraverso questa area.

Ma non ho trovato nulla di simile nella descrizione.

Bene, il trasferimento dei dati può essere effettuato attraverso un file o una variabile globale del terminale.

Se è una variabile globale:

// записываем значение, помещаем это всё в OnTick()
GlobalVariableSet("Sname", 123.25);

// Получаем в любой программе эти значения, так-же внутри OnTick()
GlobalVariableGet("Sname"); // получим 123.25

Questo è il modo più semplice per scambiare tra tutti i programmi in un terminale

 
Vitaly Muzichenko:

Bene, il trasferimento dei dati come scritto in precedenza può avvenire tramite file, o una variabile globale del terminale

Se una variabile globale:

Questo è il modo più semplice per scambiare tra tutti i programmi in un terminale

Ok. Scriviamo in indicatore un'espressione:

GlobalVariableSet("Sname", 123.25); Questo evento si verifica, per esempio, onTick().

Ma gli script non lavorano con gli array di dati e non hanno l'evento OnTick(). Come lo script sa che l'evento OnTick() si è verificato e dovrebbe applicare la procedura per ottenere nuovi dati

GlobalVariableGet("Sname");

Potete usare l'evento OnTimer() invece di OnTick(). Ma lo script ha il suo OnTimer(), mentre l'indicatore ha il suo e non sono collegati.

Ecco il problema:

Come assicurare cheGlobalVariableSet("Sname", 123.25); e GlobalVariableGet("Sname"); siano eventi sincroni?

O c'è una procedura che controlla il cambiamento del valore "Sname"? Come OnChange.

Cioè, come fa lo script a sapere che l'indicatore ha cambiato il valore di "Sname", e questo valore è diventato 125,35?

Dov'è il ponte traGlobalVariableSet("Sname", 123.25); e GlobalVariableGet("Sname"); ?

Sono in programmi diversi.


 
neverness:

OK. Scriviamo un'espressione nell'indicatore:

GlobalVariableSet("Sname", 123.25); Questo evento si verifica, per esempio, quando OnTick().

Ma gli script non lavorano con gli array di dati e non hanno l'evento OnTick(). Come lo script sa che l'evento OnTick() si è verificato e dovrebbe applicare la procedura per ottenere nuovi dati

GlobalVariableGet("Sname");

Potete usare l'evento OnTimer() invece di OnTick(). Ma lo script ha il suo OnTimer(), mentre l'indicatore ha il suo, quindi non sono collegati tra loro.

Ecco il problema:

Come assicurare cheGlobalVariableSet("Sname", 123.25); e GlobalVariableGet("Sname"); siano eventi sincroni?

O c'è una procedura che controlla il cambiamento del valore "Sname"? Come OnChange.

Cioè, come fa lo script a sapere che l'indicatore ha cambiato il valore di "Sname", e questo valore è diventato 125,35?

Dov'è il ponte traGlobalVariableSet("Sname", 123.25); e GlobalVariableGet("Sname"); ?

Sono in programmi diversi.

Il collegamento è un disco rigido del computer. Record penso che il problema non è, e si può ottenere in ogni caso, anche nello script, non differisce da come si ottiene il valore corrente ASK e BID


P.S. Allego un indicatore e uno script per esempio, nell'indicatore registriamo i volumi di tick

Indicatore

//+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
  ArraySetAsSeries(tick_volume,true);
  
  // записываем значение
   GlobalVariableSet("Sname", tick_volume[0]);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Script

//+------------------------------------------------------------------+
//|                                                          Get.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
    Alert(GlobalVariableGet("Sname"));
  }
//+------------------------------------------------------------------+
File:
Set.mq5  4 kb
Get.mq5  1 kb
 
Vitaly Muzichenko:

L'anello di congiunzione è il disco rigido del computer. Penso che non sarà un problema scriverlo, ma si può ottenere da qualsiasi evento, anche in uno script, non è diverso da come si ottengono i valori attuali ASK e BID

Fico!

E come farlo?

Mi faccia un esempio.

Per esempio, come simulare un caso del genere.

L'indicatore riceve i dati, calcola la varianza dei dati e prepara le coordinate dei punti dell'ellisse per lo script (4 variabili globali Q1,Q2,T1,T2 da passare allo script).

Ora l'indicatore dovrebbe dare un comando allo script che disegna l'ellisse usando queste variabili globali.

Come può farlo l'indicatore?

 
Vitaly Muzichenko:

L'anello di congiunzione è il disco rigido del computer. Penso che non sarà un problema registrare, ma si può ottenere da qualsiasi evento anche nello script, non differisce da come si ottengono i valori attuali di ASK e BID


P.S. Allego un indicatore e uno script per esempio, nell'indicatore registriamo i volumi di tick

Indicatore

Script

Nel tuo esempio, lo script funziona solo una volta - all'inizio, cioè quando si verifica l'evento OnStart().

E poi come?

Dov'è la sincronizzazione?

Come si fa a far funzionare lo script in modo sincrono con l'indicatore?

Per esempio, come attivare lo script ogni volta che i volumi superano un certo valore?

 
neverness:

Quindi, nel tuo esempio, lo script funziona solo una volta - all'avvio, cioè quando si verifica l'evento OnStart().

E poi come?

Dov'è la sincronizzazione?

Come si fa a far funzionare lo script in modo sincrono con l'indicatore?

Per esempio, come attivare lo script ogni volta che i volumi superano un certo valore?

È vostro compito come lavorare con lo script. Non sarebbe più facile creare un Expert Advisor piuttosto che uno script?

Un indicatore che dà valori:

//+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   return(INIT_SUCCEEDED);

  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
  ArraySetAsSeries(time,true);
  ArraySetAsSeries(tick_volume,true);

  // записываем нужные значение
   GlobalVariableSet("Q1", tick_volume[0]);
   GlobalVariableSet("Q2", tick_volume[1]);
   GlobalVariableSet("T1", time[0]);
   GlobalVariableSet("T2", time[1]);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Un semplice esempio di script in loop:

//+------------------------------------------------------------------+
//|                                                          Get.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   while(!IsStopped())
    {
     double Q1 = GlobalVariableGet("Q1");
     double Q2 = GlobalVariableGet("Q2");
     datetime T1 = (datetime)GlobalVariableGet("T1");
     datetime T2 = (datetime)GlobalVariableGet("T2");
     Print("Q1 = ",Q1,", Q2 = ",Q2,", T1 = ",TimeToString(T1),", T2 = ",TimeToString(T2));
     Sleep(1000); // Пауза 1 секунда
    }
  }
//+------------------------------------------------------------------+

P.S. Corretto il codice.

 
Vitaly Muzichenko:

Sta a voi decidere come lavorare con lo script. Non sarebbe più facile per te creare un EA piuttosto che uno script?

Un indicatore che dà valori:


Un semplice esempio di script in loop:

Ho capito che in MQL non c'è la possibilità di sincronizzare diversi moduli.

Ok. Allora ecco una domanda. Cosa succede se metto il pulsante sul campo e alimento lo script a quel pulsante?

C'è questa possibilità in MQL o non c'è nemmeno questa possibilità?

Dopo tutto, lo script deve essere lanciato in qualche modo!

 
neverness:

Ho capito che in MQL non c'è la possibilità di sincronizzare diversi moduli.

Ok. Allora ecco una domanda. Cosa succede se metto il pulsante sul campo e metto lo script su questo pulsante.

C'è questa possibilità in MQL o non c'è nemmeno questa possibilità?

Lo script deve essere lanciato in qualche modo!

L'argomento è vecchio, ma ancora da leggere, o forse qualcuno suggerirà qualcosa di nuovo. Non eseguo script e non ci lavoro affatto)

Как вызвать скрипт из индикатора
Как вызвать скрипт из индикатора
  • 2008.10.15
  • www.mql5.com
Подскажите можноли и как вызвать на выполнение скрипт из индикатора...