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

 
Artyom Trishkin:

Quali calcoli?

Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
Last_Arrow_Buy_index  = n;

Capito, domanda rimossa, ti ho sentito e ho capito che dichiarare una variabile nell'area OnTick() non va bene, e i calcoli possono essere fatti anche all'interno del ciclo.

Fatto, tutto funziona grazie, ora ho solo bisogno di ottenere i prezzi. Grazie mille.

void OnTick()
  {
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
                  Last_Arrow_Buy_index  = n;
                  Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
                  break;
               }   
            }
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Sell_volume = Buf_Arrow_Sell[n];
                  Last_Arrow_Sell_index  = n;
                  Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);
                  break;
               }
            }
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }
 
Sergey Voytsekhovsky:

Capito, domanda rimossa, ti ho sentito e ho capito che dichiarare una variabile nell'area OnTick() non va bene, e i calcoli possono essere fatti anche all'interno del ciclo.

Fatto, tutto funziona grazie, ora ho solo bisogno di ottenere i prezzi. Grazie mille.

Non si tratta di calcoli all'interno del ciclo, ma di ottenere i dati necessari, che è ciò per cui questo ciclo è progettato.

Ma i calcoli all'interno del ciclo dovrebbero essere evitati.

In effetti, devi riconsiderare il tuo approccio immediatamente. State ricevendo dati nel ciclo. Si interrompe il ciclo dopo il primo dato incontrato. Tutto questo rientra interamente nel concetto di funzione - restituire il risultato richiesto.

Trasformate l'intero ciclo in una funzione e restituite il numero della barra se viene trovata o WRONG_VALUE - se non viene trovata.

allora: n=Func();

e poi usare n per lo scopo previsto se non è uguale a WRONG_VALUE. Nominare la funzione con un nome "parlante". E il codice in OnTick() sarà più breve e la logica sarà più chiara - non sarà sovraccaricato con qualcosa di inutile.

 
Artyom Trishkin:

Formare l'intero ciclo in una funzione, e restituire il numero di barra da esso se trovato, o WRONG_VALUE - se non trovato.

Allora: n=Func();

e poi usare n come previsto, se non è uguale a WRONG_VALUE. Nominare la funzione con un nome che "dice". E il codice in OnTick() sarà più breve e la logica sarà più chiara - non sarà sovraccaricata di cose inutili.

Si vive e si impara. Molto interessante, lo proverò in serata. Nel frattempo, come rapporto e con grande gratitudine a voi, ho ottenuto i prezzi da..... È stata una bella giornata :-))

void OnTick()
  {
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Buy_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Buy_index  = n;
                  Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
                  break;
               }   
            }
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Sell_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Sell_index  = n;
                  Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);
                  break;
               }
            }
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }
 

Ragazzi che possono aiutare con questa domanda https://www.mql5.com/ru/forum/160683/page845#comment_11741857 - il commento è già andato lontano? C'è anche una domanda come creare un ciclo che può funzionare in entrambe le direzioni, se è necessario eseguire incrementale se è necessario eseguire decrementale? Ecco uno schema esemplificativo di come funzionerebbe.

Se (è successo qualcosa) {assegnare valori alle variabili} allora il ciclo sarà chiamato e conterrà un corpo, i cui calcoli dipenderanno dai valori del ciclo

per (a seconda delle variabili di cui sopra incrementare o decrementare)

{ corpo }

Non c'è modo di duplicare la condizione, deve essere specificata una volta nel ciclo. È possibile fare questo.

 

Di nuovo buona sera. Non l'ho ancora trasformato in una funzione, ma ho una nuova domanda. Nell'immagine allegata puoi vedere che c'è un nuovo segnale (Freccia), ma nei commenti puoi vedere che l'EA non lo accetta, considera ancora quello di 11 candele fa come l'Ultimate Up Arrow.

https://www.mql5.com/ru/charts/10181812/eurusd-h1-alpari-international

График EURUSD, H1, 2019.05.20 18:00 UTC, Alpari International, MetaTrader 5, Real
График EURUSD, H1, 2019.05.20 18:00 UTC, Alpari International, MetaTrader 5, Real
  • www.mql5.com
Символ: EURUSD. Период графика: H1. Брокер: Alpari International. Торговая платформа: MetaTrader 5. Режим торговли: Real. Дата: 2019.05.20 18:00 UTC.
 
Sergey Voytsekhovsky:

11 candele fa.

Si scopre che l'indicatore ha già dato un nuovo segnale (sta correndo parallelamente all'EA sul grafico), non ci sono eventi nell'EA oltre a OnTick, e l'EA non vede il segnale.

 
Sergey Voytsekhovsky:

Di nuovo buona sera. Non l'ho ancora trasformato in una funzione, ma ho una nuova domanda. Nell'immagine allegata puoi vedere che c'è un nuovo segnale (Freccia), ma nei commenti puoi vedere che l'EA non lo accetta, considera ancora quello di 11 candele fa come l'Ultimate Up Arrow.

https://www.mql5.com/ru/charts/10181812/eurusd-h1-alpari-international

Quando si trova un valore di buffer non vuoto, stampa nel log il tempo corrispondente alla barra n. Vedrete quale barra trova. Può darsi che lei stia leggendo il buffer al contrario.

 

Per favore consigliate perché l'EA non vede la freccia, è già nel buffer dell'indicatore, a giudicare dalla finestra dei dati, l'EA interroga OnTick, di cos'altro ha bisogno? Codice completo qui sopra.


 
Artyom Trishkin:

Quando si trova un valore di buffer non vuoto, stampa nel log il tempo corrispondente alla barra n. Mostrerà quale barra trova. Può darsi che lei stia leggendo il buffer al contrario.

OK, fatto, l'ora mostra l'ora corretta, l'ora di apertura della candela su cui è impostata la freccia. Codice allegato, immagine allegata.

void OnTick()
  {
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Buy_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Buy_time   = iTime(_Symbol,0,n);
                  Last_Arrow_Buy_index  = n;
                  Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index,", Last_Arrow_Buy_time = ",Last_Arrow_Buy_time);
                  break;
               }   
            }
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Sell_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Sell_time   = iTime(_Symbol,0,n);
                  Last_Arrow_Sell_index  = n;
                  Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index,", Last_Arrow_Buy_time = ",Last_Arrow_Buy_time);
                  break;
               }
            }
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }


 

se non riesci a vedere il registro nella foto, ecco alcune voci estreme


2019.05.20 21:42:52.601 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:42:53.824 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:42:53.824 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:00.819 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:00.819 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.021 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.021 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.621 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.622 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:10.696 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:10.696 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00