Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1410

 

Ragazzi, ciao a tutti i professionisti e a chi sa come fare!

Ho un problema con l'ottenimento dei dati da un indicatore -- per favore aiutatemi, chi può farlo....

Funzione Obiettivo: Calcolare la distanza media in punti tra le linee esterne dell'indicatore"Bollinger Bands", per il periodo specificato.

L'essenza del problema: Non riesco a ottenere i valori reali del prezzo sulle linee dell'indicatore per la barra specificata, perché per qualche motivo lo stesso valore di prezzo viene scritto in buffer diversi dell'indicatore, che non corrisponde nemmeno ai valori reali di nessuna delle linee su questa barra. Di conseguenza, un valore di prezzo sconosciuto viene scritto in buffer diversi (con richieste diverse), vanificando l'intero lavoro della funzione.
Inoltre, utilizzando esattamente lo stesso metodo di questa funzione, sono riuscito a ottenere indicatori da qualsiasi altro indicatore, ma qui non funziona....

int Bollinger_Bands(int _Average_Period, int _Number)
{
   double   Buffer_BASE_LINE[];                                                                          // Массив Буффера Линии BASE_LINE
   double   Buffer_UPPER_BAND[];                                                                         // Массив Буффера Линии UPPER_BAND
   double   Buffer_LOWER_BAND[];                                                                         // Массив Буффера Линии LOWER_BAND
   int      Bar_Cash             = _Average_Period;                                                                       // Количество плучаемых значений от индикатора
   int      Bands_Handel         = 0;                                                                       // Хендл индикатора Bollinger_Bands
   //---//
   double   Base_Line            = 0;                                                                       // Значение линии BASE_LINE
   double   Upper_Line           = 0;                                                                       // Значение линии UPPER_BAND
   double   Lower_Line           = 0;                                                                       // Значение линии LOWER_BAND
   //---//
   double   Band_Size_Buffer[];											// Буфер расчётных значений разницы между линиями индикатора 
   int      Band_Size_Total      = 0;										// Итог среднего значения расстояния между линиями в пунктах
   ENUM_APPLIED_PRICE   applied_price = PRICE_CLOSE; // тип цены 
   //---//
      ArrayResize(Band_Size_Buffer,_Average_Period+1);  
      ArrayResize(Buffer_UPPER_BAND,_Average_Period+1);
      ArrayResize(Buffer_LOWER_BAND,_Average_Period+1);
      //---//
         Bands_Handel = iBands(_Symbol,PERIOD_CURRENT,20,2,0,applied_price);
         //---//      
            CopyBuffer(Bands_Handel,0,_Number,_Average_Period,Buffer_BASE_LINE);       ArraySetAsSeries(Buffer_BASE_LINE,true);
            CopyBuffer(Bands_Handel,1,_Number,_Average_Period,Buffer_UPPER_BAND);      ArraySetAsSeries(Buffer_UPPER_BAND,true);
            CopyBuffer(Bands_Handel,2,_Number,_Average_Period,Buffer_LOWER_BAND);      ArraySetAsSeries(Buffer_LOWER_BAND,true);
            //---//

         //---//  Тут получение значений для выбранного номера бара из переменной которая передаётся в функцию (использовал как проверку получения данных по линиям)
         Base_Line   = NormalizeDouble(Buffer_BASE_LINE[_Number], _Digits);      //Alert("Base_Line[",_Number,"] = ",Base_Line);
         Upper_Line  = NormalizeDouble(Buffer_UPPER_BAND[_Number], _Digits);     //Alert("Upper_Line[",_Number,"] = ",Upper_Line);
         Lower_Line  = NormalizeDouble(Buffer_LOWER_BAND[_Number], _Digits);     //Alert("Lower_Line[",_Number,"] = ",Lower_Line);
             //---//
         
         
         //---// ** А это расчёт среднего расстояния между внешними линиями Боллинджера за указанный период. Получается 0 потому что одно число отнимается само от себя.
         for(int i=_Average_Period; i>=0; i--) { 
         //---//
            Upper_Line  = NormalizeDouble(Buffer_UPPER_BAND[i], _Digits);     //Alert("Upper_Line[",i,"] = ",Upper_Line);
            Lower_Line  = NormalizeDouble(Buffer_LOWER_BAND[i], _Digits);     //Alert("Lower_Line[",i,"] = ",Lower_Line);
            //---//
               Band_Size_Buffer[i] = NormalizeDouble( ((Upper_Line - Lower_Line) / _Point), 2);     //Alert("Band_Size_Buffer[",i,"] = ",Band_Size_Buffer[i]);
              }//---//
         
               Band_Size_Total = (int) MathMean(Band_Size_Buffer);
               //---//

   
 return(Band_Size_Total);
}
 

C'è confusione con l'utilizzo della libreria standard.
Come ottenere un ticket dopo aver aperto un ordine utilizzando la libreria standard?
Posso essere sicuro che la risposta del server sia già stata ricevuta? Il terminale si blocca in attesa di una risposta dal server? Non è chiaro.

                     if(!m_trade.BuyLimit(...))
                       {
                        ...
                       }
                     else
                       {
                       int ticket=m_trade.RequestOrder();  // ??? 
                        ...
                        a[n]=ticket; 
                       }

In MQ4 tutto era semplice:

         ticket=OrderSend(...);
         if(ticket>0)
           {
            ...
            a[n]=ticket;
           }
 
Nauris Zukas utilizzo della libreria standard.
Come ottenere un ticket dopo aver aperto un ordine utilizzando la libreria standard?
Posso essere sicuro che la risposta del server sia già stata ricevuta? Il terminale si blocca in attesa di una risposta dal server? Non capisco.

In MQ4 tutto era semplice:

È meglio utilizzare la gestione dell'evento OnTradeTransaction().

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Функции обработки событий - Функции - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov #:

È preferibile utilizzare il gestore dell'evento OnTradeTransaction()

Grazie! Allora dovrò rifare un paio di funzioni.

Forse da qualche parte hai visto una funzione per calcolare lo slippage su mql5?

 
Nauris Zukas #:

Grazie! Dovrò rifare un paio di funzioni allora.

Hai visto da qualche parte una funzione per calcolare lo slittamento su mql5?

Perché cercarla? In OnTradeTransaction si cattura l'evento di inserimento dell'ordine, si legge il prezzo dell'ordine, poi si cattura l'operazione, si legge il prezzo dell'operazione e si ottiene la differenza di questi prezzi.

Si può anche creare una variabile a livello globale, scriverci il prezzo al momento dell'invio dell'ordine e in OnTradeTransaction ottenere il prezzo dell'operazione...

 

Alexey Viktorov #:

Si può anche creare una variabile a livello globale, scriverci il prezzo quando viene inviato l'ordine e ottenere il prezzo della transazione in OnTradeTransaction....

Questa opzione è decisamente da escludere. Se ho bisogno di un prezzo senza ticket se invio molti ordini, come si comporterà OnTradeTransaction?

 
Nauris Zukas #:

Questa opzione è definitivamente esclusa. Cosa faccio senza ticket se invio molti ordini, come si comporta OnTradeTransaction?

In base all'ID della posizione, la situazione si risolve senza problemi.

Si ottiene un'operazione, si ottiene l'ID della posizione, si estraggono gli ordini e le operazioni dalla cronologia in base a questo ID e si leggono i prezzi degli ordini e delle operazioni IN.

Leggete la documentazione. Vi si possono trovare molte cose interessanti.

 

Alexey Viktorov #:

Si ottiene un'operazione, si ottiene l'ID della posizione, si estraggono gli ordini e le operazioni dalla cronologia in base a questo ID e si leggono i prezzi degli ordini e delle operazioni IN.

È chiaro! Ma la seconda opzione con il prezzo salvato, durante l'invio di un ordine, a livello globale e poi in OnTradeTransaction ottenere il prezzo della transazione... non mi è chiara. Perché salvare un prezzo che non è legato (all'ordine) mentre si invia l'ordine?


In breve, farò in questo modo: ottengo la transazione e poi tiro fuori tutto il resto.

 
Adam Dee "Bollinger Bands", per il periodo specificato.

L'essenza del problema: Non riesco a ottenere i valori reali del prezzo sulle linee dell'indicatore per la barra specificata, perché per qualche motivo lo stesso valore di prezzo viene scritto in buffer diversi dell'indicatore, che non corrisponde nemmeno ai valori reali di nessuna delle linee su questa barra. Di conseguenza, un valore di prezzo sconosciuto viene scritto in buffer diversi (con richieste diverse), vanificando l'intero lavoro della funzione.
Inoltre, utilizzando esattamente lo stesso metodo di questa funzione, sono riuscito a ottenere indicatori da qualsiasi altro indicatore, ma qui non funziona....

Bolinger è SMA +- N*deviazioni_standard.

Esistono indicatori propri sulla deviazione standard e sulla SMA. Ma si calcola tutto senza di essi: prendete un libro di riferimento ed ecco una formula. Da essa si ricava la "distanza media in punti tra le linee", che al momento è pari a 4 sigma secondo i valori predefiniti.
E la media (per quale periodo?), vi preoccupate di calcolarla?

Di fatto si vuole conoscere la media della deviazione standard.

 
Nauris Zukas #:

Questo è chiaro! Ma la seconda opzione di salvare il prezzo durante l'invio dell'ordine, a livello globale e poi in OnTradeTransaction per ottenere il prezzo della transazione... non mi è chiara. Perché salvare un prezzo che non è legato (all'ordine) durante l'invio dell'ordine?


In breve, farò in questo modo: otterrò la transazione e poi tirerò fuori tutto il resto.

Questo è stato detto a proposito del trading calmo, quando tutto sarà a tempo... Senza tenerne conto

Forum sul trading, sui sistemi di trading automatico e sulla verifica delle strategie di trading

Domande dei principianti MQL5 MT5 MetaTrader 5

Nauris Zukas, 2022.06.11 17:49

Questa opzione è sicuramente fuori. Qual è il prezzo per me senza ticket se invio molti ordini, come si comporterà OnTradeTransaction?


Motivazione: