[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 403

 
solnce600:
Con quale pulsante ti fa sorridere o rallegrare?

Urri non lo sapeva, e nemmeno io conosco il pulsante, ma a volte scodinzoliamo... :)))
 
lottamer:

2 ore cercando di scrivere un pezzo di prova, per testare ulteriormente diverse condizioni.

Non funziona!

Per favore, datemi l'errore.

il punto è che gli ordini si aprono dopo 2pp nella loro stessa direzione.

apre vendere e finisce...



Tutto sembra essere logicamente corretto! Solo attenzione - tutte le variabili devono essere dichiarate sopra l'inizio, comprese quelle tra parentesi.
 
hoz:


Mi sto chiedendo perché c'è una condizione qui?


C'è un ciclo while, che in linea di principio potrebbe essere infinito, quindi sono state prese misure per rendere più facile togliere l'EA dal grafico o spegnerlo.

È meglio terminare l'avvio se qualcosa va storto, piuttosto che andare in loop. Al prossimo segno di spunta, ripetilo.

 
lottamer:

La funzione di Kim ha il parametro time ="Data e ora in secondi dal 1970"

Ho provato 2 varianti.

ed entrambi danno un profitto non per il giorno corrente, ma un profitto completo su tutta la storia....

Il giorno corrente inizia all'inizio della barra D1 corrente (iTime (NULL, PERIOD_D1, 0)), ma non state cercando modi semplici? :)))
 
hoz:

Non capisco bene la logica di scrivere una funzione separata. Dopo tutto, la stessa funzione RefreshRates() serve ad aggiornare i dati delle variabili predefinite. E Bid e Ask sono variabili predefinite. Se la funzione RefreshRates() aggiorna le variabili predefinite, perché scrivere una funzione aggiuntiva?

C'è una particolarità:

bool RefreshRates( )

Aggiorna i dati nelle variabili predefinite e negli array di serie temporali. Questa funzione viene utilizzata quando un Expert Advisor o uno script ha eseguito calcoli per molto tempo e ha bisogno di dati aggiornati. Restituisce TRUE se i dati sono aggiornati, altrimenti FALSE. I dati non possono essere aggiornati solo perché corrispondono allo stato attuale del terminale client. Gli Expert Advisors e gli script lavorano con la propria copia di dati storici. La copia dei dati sul simbolo corrente viene creata al primo lancio dell'Expert Advisor o dello script. Ad ogni successivo lancio dell'Expert Advisor (ricorda che lo script viene eseguito una volta sola e non dipende dai tick in arrivo), la copia creata inizialmente viene aggiornata. Mentre l'Expert Advisor o lo script è in esecuzione, uno o più nuovi tick possono arrivare, quindi i dati possono diventare non aggiornati.

Anche i dati non vengono aggiornati istantaneamente. Questo deve essere controllato.

 
Zhunko:

C'è una particolarità:

bool RefreshRates( )

Aggiorna i dati nelle variabili predefinite e negli array di serie temporali. Questa funzione viene utilizzata quando un Expert Advisor o uno script ha eseguito calcoli per molto tempo e ha bisogno di dati aggiornati. Restituisce TRUE se i dati sono aggiornati, altrimenti FALSE. I dati non possono essere aggiornati solo perché corrispondono allo stato attuale del terminale client. Gli Expert Advisors e gli script lavorano con la propria copia di dati storici. La copia dei dati sul simbolo corrente viene creata al primo lancio dell'Expert Advisor o dello script. Ad ogni successivo lancio dell'Expert Advisor (ricorda che lo script viene eseguito una volta sola e non dipende dai tick in arrivo), la copia creata inizialmente viene aggiornata. Mentre l'Expert Advisor o lo script è in esecuzione, uno o più nuovi tick possono arrivare, quindi i dati possono diventare non aggiornati.

Anche i dati non vengono aggiornati istantaneamente. Questo deve essere controllato.


Sulla base del riferimento dato, prendiamo il prezzo ASK. Se eseguiamo RefreshRates(), i dati negli array di variabili predefinite vengono aggiornati. Se il prezzo di ASC è cambiato, allora dopo aver eseguitoRefreshRates(), ASC prenderà il nuovo valore. E se lo fa:

I dati non possono aggiornarsi solo perché corrispondono allo stato attuale del terminale client.

allora il valore ASC non è cambiato. Così, il precedente valore ASK sarà usato nel calcolo, così com'era, dato che non è cambiato.

Dopo tutto, seRefreshRates() restituisce il valore di TRU, significa che ha aggiornato con successo i dati, quindi non abbiamo bisogno di controllarlo! Non siete d'accordo?

 
hoz:


Sulla base di questo riferimento, prendiamo il prezzo ASC. Se eseguiamo RefreshRates(), i dati negli array di variabili predefinite vengono aggiornati. Quindi, se il prezzo ASC è cambiato, dopo aver eseguitoRefreshRates() ASC prenderà il nuovo valore. E se va così

allora il valore ASC non è cambiato. Così, il precedente valore ASK sarà usato nei calcoli, che è quello che era perché non è cambiato.

Dopo tutto, seRefreshRates() restituisce il valore TRU, ha aggiornato con successo i dati e non abbiamo bisogno di controllarlo! Non siete d'accordo?

No. Può restituire FALSE e i dati saranno freschi.

L'unica ragione per cui i dati potrebbero non essere aggiornati è perché corrispondono allo stato attuale del terminale client.

Dovete trovare un'indicazione che vi dica che i dati sono freschi. Può essere diverso per compiti diversi.
 
Zhunko:

No. Può restituire FALSE e i dati saranno freschi.

Quindi c'è un bug evidente nella documentazione? E non ci si può fidare della documentazione?

Zhunko:

Dovete trovare un'indicazione che vi permetta di supporre che i dati siano freschi. Può essere diverso per compiti diversi.

Supponiamo che stiamo parlando del prezzo ASK. Abbiamo due variabili:

ASC - Chiedere il valore dopoRefreshRates().

_ASK - valore di Ask ultimo conosciuto.

_____________________________________________________________________________________

È difficile da dire. Quale potrebbe essere il segno qui? Ci sono due varianti:

1. Il valore della variabile predefinita è cambiato. RefreshRates() restituisce True.

2. Il valore della variabile predefinita non è cambiato. RefreshRates() restituisce False.

Se guardiamo l'altro lato, sul trovare un segno. Ci sono 2 possibilità:

1. Il valore della variabile predefinita è cambiato. Cioè nel nostro caso Ask = ASC

2. Il valore della variabile predefinita non è cambiato. Cioè Ask = _ASK

O c'è un valore cambiato o un valore invariato, non ci sono altre opzioni. Cosa vuoi fare allora?

 
hoz:

Quindi c'è un errore lampante nella documentazione? E non ci si può fidare della documentazione?

Diciamo che stiamo parlando del prezzo ASK. Abbiamo 2 variabili:

ASC - Chiedere il valore dopoRefreshRates().

_ASK - valore di Ask ultimo conosciuto.

_____________________________________________________________________________________

È difficile da dire. Quale potrebbe essere il segno qui? Ci sono due varianti:

1. Il valore della variabile predefinita è cambiato. RefreshRates() restituisce True.

2. Il valore della variabile predefinita non è cambiato. RefreshRates() restituisce False.

Se guardiamo l'altro lato, sul trovare un segno. Ci sono 2 possibilità:

1. Il valore della variabile predefinita è cambiato. Cioè nel nostro caso Ask = ASC

2. Il valore della variabile predefinita non è cambiato. Cioè Ask = _ASK

O c'è un valore cambiato o un valore invariato, non ci sono altre opzioni. Come vuoi procedere allora?

La documentazione è tutta in ordine. È esattamente descritto ed è quello che vi ho fatto notare.

Viene restituito TRUE se i dati sono stati aggiornati, altrimenti viene restituito FALSE. L'unica ragione per cui i dati potrebbero non essere aggiornati è perché corrispondono allo stato attuale del terminale client.

Quindi questa funzione dice solo che sono stati ricevuti nuovi dati.

Non so come vuoi fare il resto. Controllo i dati dal server (MarketInfo()) con barra zero. Aspetto che siano uguali. A proposito, questo non garantisce che non ci sia un "buco" nella storia del prossimo futuro. Potrebbero facilmente mancare 1, 2 o 3 barre o diverse barre, e la barra zero sarà lì. A volte vengono dopo. A volte non lo fanno.

 
Zhunko:

Cioè questa funzione dice che sono arrivati nuovi dati, ma questo è tutto.

Quindi, se arrivano nuovi dati, è di questo che abbiamo bisogno, no?
Zhunko:

Controllo i dati dal server (MarketInfo()) rispetto alla barra zero. Aspetto che siano uguali. A proposito, non garantisce che non ci sia un "buco" nella storia più vicina. Potrebbero facilmente mancare 1, 2 o 3 barre o diverse barre, e la barra zero sarà lì. A volte arrivano più tardi. A volte non lo fanno.

Beh, sì, abbiamo bisogno dei dati della 0a barra. MarketInfo() estrae i dati dalla barra zero, tutto qui. Perché dovremmo controllare con qualcos'altro?
Zhunko:

A proposito, non garantisce l'assenza di un "buco" nella storia più vicina. Ci potrebbero facilmente essere 1, 2 o 3 barre o diverse barre mancanti e lo zero ci sarà. A volte arrivano più tardi. A volte non lo fanno.

Anche se c'è una lacuna nella storia, non influenzerà i calcoli attuali. Lo avrebbe fatto nel momento in cui c'era un buco. 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() lo farà riguardo al momento attuale sulla 0a barra!

Certo, sto scavando a fondo, ma voglio capire come comportarmi meglio.

Tu, Vadim, hai detto che ho scritto male la funzione qui sopra, la duplicherò di nuovo, con l'aggiunta di righe:

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);
}

Cosa c'è di sbagliato, secondo voi?

Motivazione: