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

 
Mikhail Mishanin:

È divertente) non dovrebbe esserlo)

Se la battaglia è finita - fare trading con uno spread normale, basta togliere il suo 'limite' nell'input e semplicemente ignorare il trade se lo spread è sopra il limite.

Gli spread possono essere allungati dai dilling senza rollover.

Ho un bel po' di oscillazioni di spread, da 10 unità a 45

Devo aspettare di proiettare il 45.

Allo stesso tempo la funzione conta una media di 17, che è abbastanza soddisfacente.

Sale a 100-140 per 1 ora dopo il rollover, eseguirò il codice e vedrò come si comporta.

 
Vitaly Muzichenko:

Si potrebbe, tuttavia, prescrivere in questo modo:

Dovrebbe funzionare correttamente.

Non mi piace questa logica.

Il primo input della funzione:

res = 0;

Quindi la condizione

if(dt.hour==22 && res<_sp)

non è soddisfatto.

E non voglio entrare ulteriormente nei dettagli. A cosa serve questa condizione all'improvviso?

   if(tc>LONG_MAX-1)
Non capisco la logica di tutto questo.
 
Alexey Viktorov:

Non mi piace questa logica.

Il primo input della funzione:

res = 0;

Di conseguenza, la condizione

if(dt.hour==22 && res<_sp)

non è soddisfatta.

E non voglio entrare ulteriormente nel merito. A cosa serve questa condizione all'improvviso?

   if(tc>LONG_MAX-1)
Non capisco la logica di tutto questo.

1. Questa condizione è solo per 1 ora dopo il rollover, quando il tempo è di 22 ore. Ma questo è solo al primo avvio, mentre il terminale funziona sempre con l'Expert Advisor, il che significa che è vuoto solo una volta.

Forse dovrebbe anche essere dichiarato come statico in caso di cambiamento del tempo

2. if(tc>LONG_MAX-1) = azzeriamo la variabile tc se abbiamo superato i limiti ammissibili di long. Questo è improbabile che accada, poiché il terminale a volte si sovraccarica, per esempio durante il fine settimana.

---

Codice modificato, questo deve essere definitivo:

void OnTick()
{
 int sp = SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);
   if(CheckSpr(sp)) {
      // Здесь код отправки
   }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MqlDateTime dt;
bool CheckSpr(int _sp)
{
   static int ts=0;
   static ulong tc=0;
   static int res=0;
   TimeGMT(dt);
   if(res<_sp && (dt.hour==22||dt.hour==23)) { // Если 2 часа после Rollover спред упадёт до нормального - торгуем
      Comment("Rollover: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
      return(false);
   }
   tc++;
   ts += _sp;
   res =ts/tc;
   if(tc<500) {
      Comment("Тиков менее 500: ",tc,", Спред: ",_sp,", Средний: ",res);
      return(false);
   }
   if(res>_sp) {
      Comment("Торгуем: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
      return(true);
   }
   Comment("Не торгуем - спред завышен: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
   return(false);
}

P.S. Mettilo alla prova

P.S. Rivisto il codice

----

P.S.S.S. Ho aggiunto 1 ora di tempo in più dopo il rollover, altrimenti ho uno spread molto alto su alcuni dealer.

La variante finale ha lavorato 20 ore e il risultato è sorprendente

Lo spread medio giornaliero è di 10-45 pps, ma la maggior parte del tempo è di 10-17 pps, lo spread medio è stato calcolato come 19

Grazie a tutti per la vostra partecipazione, se avete qualcosa da aggiungere - scrivete!

 
Vitaly Muzichenko:

Forse dovrebbe anche essere dichiarato statico, in caso di cambiamento del tempo

L'ho capito, sembra funzionare, mi rimangio "non dovrebbe"), ora devo solo capire i momenti di azzeramento/assegnazione.

 

Ho visto una discussione sul forum, ma non riesco a trovarla.

Bisogna limitarsi a una posizione su una barra che può essere aperta in qualsiasi momento, questa è l'opzione ora, ma è "pesante" secondo me

if(Bars(Symbol(), PERIOD_CURRENT, Buy.LastOpenTime, TimeCurrent())==0) return; // Открывать не более 1 на баре

Come può essere sostituito per renderlo più leggero?

 
Vitaly Muzichenko:

Ho visto una discussione sul forum, ma non riesco a trovarla.

Bisogna limitarsi a una posizione su una barra che può essere aperta in qualsiasi momento, questa è l'opzione ora, ma è "pesante" secondo me

Come può essere sostituito per renderlo più leggero?

"Devi limitarti a una posizione sulla barra, che può essere aperta in qualsiasi momento..."

troppo generico, vuoi dire che una volta sulla barra in questo simbolo si può inviare OrderSend?

 
Mikhail Mishanin:

"Devi limitarti a una posizione sulla barra, che può essere aperta in qualsiasi momento..."

la formulazione è troppo generica, vuoi dire che una volta per barra in questo simbolo si può inviare OrderSend?

Sì. L'Expert Advisor lavora sul timeframe H1 e può aprire una posizione alle 10:17, non deve aprirne un'altra prima delle 11:00, cioè sulla barra corrente.

 
Vitaly Muzichenko:

Sì. L'EA lavora sul time frame H1 e può aprire una posizione alle 10:17, devi assicurarti che prima delle 11:00, cioè sulla barra corrente - non si apra più.

Sì, di nuovo, penso che il diavolo sia nei dettagli.

aprire una posizione - impostare una "bandiera di divieto" e/o salvare il "tempo" (non importa quale, purché sia lo stesso (fonte) per il confronto)

si apre un nuovo bar - il "ban flag" è impostato...

Domanda: e se la posizione è in qualche modo cambiata?

Esempio di come definisco una nuova barra - doTB divisor in secondi, per H1 è 3600.0

BARii[].time - tempo delle barre con M1, ma può essere arbitrario e con qualsiasi divisione, se è più o uguale a 1 significa il "tempo" da diverse "barre

if(MathFloor(BARii[0].time/doTB)-MathFloor(BARii[1].time/doTB)>=1.0)//если бар закрылся
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением...
 
Mikhail Mishanin:

Sì, di nuovo condizioni incomplete a mio parere, "il diavolo è nei dettagli", in parole povere se il testo

aperto una posizione - impostare una "bandiera di divieto" e/o salvare il "tempo" (non importa quale, purché sia lo stesso (fonte) per il confronto)

si apre un nuovo bar - il "ban flag" è impostato...

Domanda: e se la posizione è in qualche modo cambiata?

Esempio di come definisco una nuova barra - doTB divisor in secondi, per H1 è 3600.0

BARii[].time - tempo delle barre con M1, ma può essere arbitrario e con qualsiasi divisione, se è più o uguale a 1, significa il "tempo" da diverse "barre

In quel momento non ero soddisfatto dell'opzione che utilizzava le bandiere; non ricordo perché, ma l'ho sostituita con

if(Bars(Symbol(), PERIOD_CURRENT, Buy.LastOpenTime, TimeCurrent())==0) return; // Открывать не более 1 на баре

OK, penserò a un'altra implementazione

 
Vitaly Muzichenko:

All'epoca non ero contento dell'opzione delle bandiere, non ricordo perché, ma l'ho sostituita con

Ok, penserò a un'altra implementazione.

E cosa trattiene questa implementazione? Simile al mio codice determina due volte in una "barra" o in diverse. Solo nella mia variante "vero" quando in diverse "barre", nella tua variante "vero" quando in una barra, basta bypassare il confronto == con "0" specialmente intero, wo, e probabilmente posso cambiare condizione a >0.0 o >0.9, devo pensare...