Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 846

 
Pokrov:

Ho GetLastError dopo le funzioni e se si verifica un errore, non andrà in questo blocco (come scritto) e i comandi non saranno eseguiti? Capisco la catena, ad esempio OrderSend() -> GetLastError -> blocco di errore Sleep(3000) RefreshRates() -> esce dal blocco e se le condizioni rimangono OrderSend() viene richiesto nuovamente. Oppure il mio ragionamento e i miei concetti sono sbagliati. Capisco che vuoi scrivere il valore di ritorno 1 o 0 nel blocco, ma le mie funzioni sono semplici non legate a valori booleani come SignalBuy, se ho capito bene, i valori di ritorno dovrebbero essere restituiti lì.

Fai un ciclo sul numero di tentativi di commercio all'errore. Aggiorna l'ambiente di trading. Azzera il valore dell'errore precedente e invia una richiesta di scambio con un controllo del risultato restituito. Se viene restituito un errore, analizzatelo e, a seconda del codice di errore, o terminate il ciclo completamente o eseguite le azioni necessarie per correggere l'errore e procedere alla prossima iterazione del ciclo. Se l'operazione di compravendita ha avuto successo, interrompe il ciclo e restituisce al programma chiamante il valore corrispondente alla logica del programma per l'ulteriore elaborazione del risultato della richiesta di compravendita (o il flag di successo dell'esecuzione della funzione o il numero di ticket dell'ordine aperto, ecc.)
 
Pokrov:

Ho GetLastError dopo le funzioni e se si verifica un errore, non andrà in questo blocco (come scritto) e i comandi non saranno eseguiti? Capisco la catena, ad esempio OrderSend() -> GetLastError -> blocco di errore Sleep(3000) RefreshRates() -> esce dal blocco e se le condizioni rimangono OrderSend() viene richiesto nuovamente. Oppure il mio ragionamento e i miei concetti sono sbagliati. Capisco che vuoi scrivere il valore di ritorno 1 o 0 nel blocco, ma le mie funzioni sono semplici non legate a valori booleani come SignalBuy, se ho capito bene, i valori di ritorno dovrebbero essere restituiti lì.

Aggiungo anche che nel tuo esempio non c'è nessuna reazione dopo aver ottenuto un errore. L'unica differenza è che abbiamo controllato o meno, a parte il fatto che abbiamo deciso di dormire per un po' o di aggiornare i dati. Basta uscire al completamento della funzione OnTick()
 
Buon pomeriggio!

Ho bisogno di un consiglio. Secondo le condizioni, la posizione dovrebbe essere chiusa e dopo 121 secondi dovrebbe essere aperta una nuova posizione. Come posso farlo con Sleep(121000)?

if(GetProfitOpenHigestInPoint(NULL,OP_BUY,magic) > PiespieduClose*10)
{
ClosePosWithMaxProfitInCurrency(NULL,OP_BUY,magic);
Sleep(121000);
OpenPosition(NULL, OP_BUY, LotSize(),0,0,magic); 
}
 
abeiks:
Buona giornata!

Ho bisogno di un consiglio. Secondo le condizioni, la posizione dovrebbe essere chiusa e dopo 121 secondi dovrebbe essere aperta una nuova posizione. Come posso farlo con Sleep(121000)?

Aiuto: OnTimer()
 
artmedia70:
OnTimer() al salvataggio
Grazie! Non ho mai usato OnTimer() e questa parte di codice è in void OnTick(). Posso gestire la funzione OpenPosition() con OnTimer()? Se potete, per favore correggete il codice come inserire OnTimer() lì correttamente...
void OnTick()
{
...

if(GetProfitOpenHigestInPoint(NULL,OP_BUY,magic) > PiespieduClose*10)
{
ClosePosWithMaxProfitInCurrency(NULL,OP_BUY,magic);
EventSetTimer(121); 
OpenPosition(NULL, OP_BUY, LotSize(),0,0,magic); 
}

...   
}
 

Ho appena reinstallato Windows 7 e volevo installare Mt4, il problema è che i file non vengono scaricati, cosa devo fare?

 
Alexei e Artem, grazie per i vostri esperti commenti e consigli!
 
abeiks:
Grazie! Non ho mai usato OnTimer(). Questa parte di codice è in void OnTick(). Sarà quindi possibile gestire la funzione OpenPosition() da OnTimer()? Se potete, per favore correggete il codice come inserire OnTimer() lì correttamente...

Il timer viene avviato in OnInit()

EventSetTimer(1); // раз в секунду

Per iniziare il conto alla rovescia, è necessario trovare il tempo di chiusura dell'ultima posizione nel timer e contare 121 sukunds da questo tempo. Per passare il flag che vi permette di aprire una nuova posizione, usate una variabile globale il cui scopo copre l'intero programma. Puoi fare in modo che inizialmente contenga un valore maggiore di 121, per esempio 122 (puoi cambiare il tempo di attesa nelle impostazioni).

In OnTick(), controllate questa variabile. Se è maggiore di 121 e non c'è nessuna posizione, si apre una posizione e, dopo aver controllato se è stata aperta con successo, si azzera la variabile.

Non appena la posizione viene chiusa, il timer vede il tempo di chiusura della posizione (lo fa continuamente una volta al secondo) e se dal tempo corrente al tempo di chiusura della posizione è passato meno di 121 secondi, il timer inizia a contare - ogni secondo il valore variabile viene aggiunto di 1.

All'incirca così. Dove potrebbe esserci un bug - se la posizione non è ancora stata chiusa, il suo tempo di chiusura è uguale a zero. Questo può causare un problema con l'avvio del conto alla rovescia. Potreste resettare la variabile a -1, per esempio.

Sì, non dimenticate di distruggere il timer in OnDeinit():

//+------------------------------------------------------------------+
   void OnDeinit(const int reason) {EventKillTimer();}
//+------------------------------------------------------------------+
 
artmedia70:

Il timer viene avviato in OnInit()

Per iniziare il conto alla rovescia, è necessario trovare il tempo nel timer quando l'ultima posizione è stata chiusa e contare 121 secondi da quel momento. Per passare il flag che vi permette di aprire una nuova posizione, usate una variabile globale che sia scalabile da tutto il programma. Puoi fare in modo che inizialmente contenga un valore superiore a 121, per esempio 122 (puoi cambiare il tempo di attesa nelle impostazioni).

In OnTick() si controlla questa variabile. Se è maggiore di 121 e non c'è nessuna posizione - aprire una posizione - e, dopo aver controllato se è stata aperta con successo, azzerare la variabile.

Non appena la posizione viene chiusa, il timer vede il tempo di chiusura (lo fa continuamente una volta al secondo) e se dal tempo attuale al tempo di chiusura della posizione è passato meno di 121 secondi, il timer inizia a contare - ogni secondo il valore della variabile viene aggiunto di 1.

All'incirca così. Dove potrebbe esserci un bug - se la posizione non è ancora stata chiusa, il suo tempo di chiusura è zero. Questo può causare un problema con l'avvio del conto alla rovescia. Potreste resettare la variabile a -1, per esempio.

Sì, non dimenticate di distruggere il timer in OnDeinit():

Capito, grazie. Speravo di farlo in una riga, ma probabilmente dovrò lavorare un po' più a lungo.

 
abeiks:

Capisco, grazie. Speravo di farlo in una sola riga, ma credo che ci vorrà più lavoro.