[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 404

 
hoz:
1. Beh, se sono arrivati nuovi dati, questo è ciò di cui abbiamo bisogno, no?
2. Beh, sì, abbiamo bisogno di dati dalla barra 0, ovviamente. MarketInfo() estrae i dati dalla barra zero, tutto qui. Allora perché paragonarlo a qualcos'altro?

3. anche se c'è un buco nella storia, non influenzerà i calcoli attuali. Avrebbe avuto un impatto nel momento in cui il buco era lì. Cioè, se otteniamo l'Ask attuale, non ci interessa molto sapere quali erano i prezzi diverse barre fa (non intendo formalmente, ma riguardo al momento attuale riguardo a una certa variabile di mercato, perché la funzione RefreshRates() farà il trucco riguardo al momento attuale nel tempo sulla 0a barra!

Certo, ho scavato a fondo, ma voglio capire come comportarmi meglio.

4. Tu, Vadim, mi hai detto che ho scritto male la funzione qui sopra:

double fGet_TradePrice(int fi_price,       // Цена: 0 - Bid; 1 - Ask
                       string fs_symbol)   // валютная пара
{
 double ld_price = 0.0;
   
switch (fi_price)
 {
  case 0:
   {
    if (fs_symbol == Symbol())
     {
      RefreshRates(); // Зачем этот тормоз без обработки возвращаемого значения?
      ld_price = Bid;
     }
    else ld_price = MarketInfo(fs_symbol, MODE_BID); // <-- Этого достаточно.
   } 
  case 1:
   {
    if (fs_symbol == Symbol())
     {
      RefreshRates(); // Зачем этот тормоз без обработки возвращаемого значения?
      ld_price = Ask;
     }
    else ld_price = MarketInfo(fs_symbol, MODE_ASK); // <-- Этого достаточно.
   }
 }
if (ld_price != 0) return(ld_price); // Некорректно! Что функция будет возвращать, если цена равна нулю?
}

Secondo voi, cosa c'è di sbagliato?

1. Se non ci sono dati, ma non ne sappiamo nulla? Restituisce FALSE. Come dovrebbe essere valutato? Nessun dato o un errore, o ci sono ancora dati?
2. Dovete riconciliarvi per risolvere il problema del 1° punto.
3. Non si considera la dinamica del processo. Accendere il computer, il terminale. Tutti i dati sembrano essere arrivati. Tutto convergeva sulla barra dello zero. I segnali vengono trovati. L'affare è concluso. Si è scoperto che non tutti i dati sono arrivati. 5 minuti dopo abbiamo ottenuto le barre mancanti con i numeri 1,2,3,4,5. Il segnale è scomparso. Cosa fare?

4. L'ho segnato in rosso. Un possibile errore di scelta di un identificatore sbagliato nello switch non è ancora gestito. Ho scritto sopra come dovrebbe essere fatto.

È inutile chiamare RefreshRates() senza aspettare il risultato. Può fallire per molto tempo.

 
Ciao a tutti. Ho una domanda del genere. Faccio trading su diversi conti (due in una società di brokeraggio e uno in un'altra), quindi uso Best copier, è molto conveniente. Si installa su un conto (l'esportatore) su qualsiasi grafico e si copia in altri conti (importatori), dove questo EA è anche installato sullo stesso grafico (se lo metti, nell'importatore, su diversi grafici, aprirà altrettanti ordini). Una volta quando volevo controllare il lavoro con esso su una delle società di intermediazione e impostare un conto demo), in un momento meraviglioso è stato spontaneamente impostato su diversi grafici e naturalmente ha aperto come molti ordini. Poi non ci ho fatto molto caso e ho pensato che fosse un difetto del terminale di questa società di intermediazione. Poi ho fatto trading per molto tempo sui conti menzionati sopra e non è successo niente del genere. Ma ieri, proprio durante il rilascio delle notizie, questa situazione si è verificata di nuovo su uno dei conti (per un'altra società di brokeraggio, non quella con l'esportatore installato). In 6 grafici sono stati piazzati automaticamente degli advisor e la cosa più interessante è che sono stati aperti 16 ordini su un simbolo. Perché questo accade e qual è la ragione? È uno svantaggio dell'Expert Advisor stesso o qualche altra ragione? C'è un modo per risolvere il problema? Grazie in anticipo.
 
// Зачем этот тормоз без обработки возвращаемого значения?

Chi fa una tale domanda?
 
hoz:

Cosa c'è di sbagliato secondo voi?


Non è sbagliato, è solo confuso.

Fine:

 if (ld_price != 0)
return (ld_price); 

Se ld_price = 0, la funzione restituisce 0 da sola. Perciò non abbiamo bisogno di un assegno.

Questo è un guasto:

 if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Bid;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_BID);

Anche non necessario. Potete usare MraketInfo() in tutti i casi.

Alla fine, la funzione si trasforma nella funzione MarketInfo() nella sua forma pura (se si rimuovono tutte le cose inutili).

 

In linea di principio, teoricamente, questi sono i posti giusti:

RefreshRates();
ld_price = Bid;
RefreshRates();
ld_price = Ask;

Non ci interessa cosa restituisce RefreshRates(), è importante che le variabili Ask e Bid abbiano gli ultimi valori conosciuti dal terminale.

 

Ciao!

Qual è la ragione dei diversi risultati del tester per lo stesso EA?

Il periodo testato, la coppia di valute e il timeframe sono gli stessi, ma i risultati ottenuti oggi sono molto diversi da quelli precedenti, l'EA ha smesso di aprire posizioni lunghe.

Non so se la colpa sia delle quotazioni del terminale o del fine settimana. Forse le persone competenti possono aprirmi gli occhi sulla ragione ovvia?

 
skyjet:

Ciao!

Qual è la ragione dei diversi risultati del tester per lo stesso EA?

Il periodo testato, la coppia di valute e il timeframe sono gli stessi, ma i risultati ottenuti oggi sono molto diversi da quelli precedenti, l'EA ha smesso di aprire posizioni lunghe.

Non so se la colpa sia delle quotazioni del terminale o del fine settimana. Forse le persone competenti possono aprirmi gli occhi sulla ragione ovvia?


Anche due test fatti in fila uno dopo l'altro possono essere diversi, e in modo molto evidente. Il broker cambia lo spread e il test viene fatto con uno spread diverso. Un cambiamento di un punto è sufficiente.

Se c'è stato un test precedente molto tempo fa, forse le impostazioni si sono allentate.

 
Zhunko:

1. Se non ci sono dati e allo stesso tempo ci sono tutti questi dati, ma non ne sappiamo nulla? Restituisce FALSE. Come deve essere interpretato questo? Non ci sono dati o c'è un errore, o ci sono ancora dati?

Non ti capisco. Andiamo in ordine... Chiamiamo RefreshRates(), nessun dato è arrivato... Ma ci sono dei dati. Quello che abbiamo qui è un casino. Se i dati non sono arrivati, i dati non saranno disponibili o i dati non sono stati aggiornati perché la variabile di mercato non è cambiata... Ci sono solo due opzioni.

Se restituisce TRU dopo aver chiamatoRefreshRates(), allora i dati sono stati aggiornati. E se restituisce FELS, allora o non hanno aggiornato, perché c'è un errore o non hanno aggiornato, perché i dati sono freschi e non hanno bisogno di essere aggiornati.

Quindi, capisco che questo può essere visto come segue:RefreshRates() controlla i dati, se i dati non sono nuovi, non aggiorna quelli che non sono nuovi, cioè non sono cambiati, e se sono nuovi, aggiorna. Quindi si può fare affidamento solo sul flag restituito daRefreshRates(). Avete altre opzioni?

Zhunko:

2. È necessario riconciliare per risolvere il problema del 1° elemento.

L'hai detto tu:

Riconcilio i dati dal server (MarketInfo()) con la barra zero. Aspettando che siano uguali.

Bene MarketInfo() sta tirando dalla barra zero così com'è... Cosa intendete con quanto sopra?

Zhunko:

3. Non si considera la dinamica del processo. Ha acceso il computer, il terminale. Tutti i dati sembrano essere arrivati. Tutto convergeva sulla barra zero. I segnali vengono trovati. L'affare è concluso. Si è scoperto che non tutti i dati sono arrivati. Cinque minuti dopo abbiamo ottenuto le barre mancanti con i numeri 1,2,3,4,5. Il segnale è scomparso. Cosa fare?

Ho deciso di aggiornarlo di nuovo. Ma cosa succede se chiamiamo RefreshRates() e questo aggiorna i dati lentamente? Cioè alcuni dei calcoli saranno eseguiti con alcuni dati di mercato, e altri con altri dati... Che cosa allora?

Zhunko:

4. Contrassegnato in rosso. Inoltre, un possibile errore di selezione dell'identificatore sbagliato nello switch non viene gestito. Ho scritto sopra come dovrebbe essere gestito.

È inutile chiamare RefreshRates() senza aspettare il risultato. Può fallire per molto tempo.

Hm. Beh, se aspettiamo, la citazione potrebbe cambiare... C'è una strada a doppio senso qui?

RefreshRates(); // Perché questo freno senza elaborazione del valore di ritorno?

Lo menzioni diverse volte, ma non c'è ancora alcuno specifico. Voglio dire, per quanto vedo questa funzione usata di solito, è appena prima del codice in cui si usano le variabili dei dati di mercato e questo è tutto. Non ci pensano davvero. Ma ci ho pensato e ho deciso di capire come farlo bene. Per sapere con certezza che tale e tale approccio è effettivamente corretto e funzionerà in tutte le condizioni normali.

Allora Vadim, cosa intendi con questa espressione:

"

Perché questo freno senza elaborare il valore di ritorno?".

Come possono essere trattati? Ho scritto la mia logica sopra, ma non ho avuto risposta. L'ho descritto abbastanza accuratamente e senza alcuna variante.

 
Integer:


Non è sbagliato, è solo confuso.

Fine:

if (ld_price != 0)
    return (ld_price); 

Se ld_price = 0, la funzione restituisce 0 da sola. Pertanto, non è necessario alcun controllo.

Perché dovrei farlo? Dovete solo aggiungere else, in modo che la funzione restituisca qualche altro valore, che significherebbe "Nessun prezzo". Sembra logico. Quando ho lanciato la funzione, pensavo più alla logica precedente, poi non ho fatto attenzione alla sua fine. E non capisco perché la funzione 0 restituisce 0 da sola...
Intero:


Questa è la ripartizione:

if (fs_symbol == Symbol())
{
    RefreshRates();
    ld_price = Bid;
}
else
    ld_price = MarketInfo(fs_symbol, MODE_BID);

Non è nemmeno necessario. Potete usare MraketInfo() in tutti i casi.

Alla fine, la funzione si trasforma in una pura funzione MarketInfo() (se si rimuovono tutte le cose inutili).


E poi perché Ask (se stiamo parlando specificamente del prezzo di acquisto), se possiamo sempre usare MarketInfo(fs_symbol, MODE_ASK)? Dopotutto, se la si guarda in questo modo, facendo riferimento ad Ask, non si può essere sicuri che sia preciso in questo momento?
 
Integer:

Non importa cosa restituisce la funzione RefreshRates(), è importante che le variabili Ask e Bid abbiano gli ultimi valori conosciuti dal terminale.


In pratica, abbiamo bisogno di qualcos'altro, per quanto ne so. E abbiamo bisogno di un ultimo server Ask e Bid e non di un terminale locale. Giusto?

Per questo ho iniziato una discussione qui, per capire una volta per tutte come organizzarla in modo più logico e corretto. Perché in teoria questo è corretto, ma in pratica...