Aiuta un principiante - Funzioni di giorno e ora

 

Ciao, sono un novellino e ho bisogno di aiuto,

Sono un novellino e ho bisogno di aiuto.

Ho un EA che fa trading quando il mercato apre la domenica. Il problema con l'EA è che prende anche i trade durante la settimana e io non lo voglio.

Voglio che funzioni così:

extern int StartDay="sunday"

extern int StartTime="23:00"

extern int StopDay="lunedì"

extern int StopTime="15:00"

Se day="sunday" e il mercato è aperto (solo un trade può essere aperto tra domenica 23:00 e lunedì 15:00, nessun nuovo trade se il nostro trade è chiuso a causa di TP o SL)

{

Iniziare la negoziazione (un po' di codice che ho già)

}

Come posso fare questo in MQL?

 

controllare Time[0]

con queste funzioni in aiuto Funzioni data e ora

 
// SEE IF THIS WORK FOR YOU..... (I'VE NOT TESTED IT....)



int start()
{
  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())>=0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())<=1) && (Hour()<=15); 
  if( sunday_cond  || monday_cond )
      go_trading();

}
 
abstract_mind:
  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())>=0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())<=1) && (Hour()<=15); 
  if( sunday_cond  || monday_cond )

Non sono sicuro che questo sia giusto. Il "sunday_cond" è vero ogni giorno della settimana tra le 23 e mezzanotte. Quindi, poiché il codice fa o sunday_cond o monday_cond, potenzialmente scambierà dopo le 23 ogni giorno. Inoltre, "monday_cond" è soddisfatto la domenica fino alle 3 del pomeriggio. È improbabile, ma in alcuni fusi orari questo potrebbe anche rientrare nelle ore di trading. Ancora più importante, Hour() <= 15 è vero fino alle 3:59pm, non fino alle 3:00pm.


Ma il principio è ovviamente valido in termini di ciò che EagleEye deve fare: controllare l'ora e anche il giorno della settimana usando DayOfWeek() o TimeDayOfWeek().

 
jjc:

Non sono sicuro che questo sia giusto. Il "sunday_cond" è vero ogni giorno della settimana tra le 23 e mezzanotte. Quindi, poiché il codice fa o sunday_cond o monday_cond, potenzialmente scambierà dopo le 23 ogni giorno. Inoltre, "monday_cond" è soddisfatto la domenica fino alle 3 del pomeriggio. È improbabile, ma in alcuni fusi orari questo potrebbe anche rientrare nelle ore di trading. Ancora più importante, Hour() <= 15 è vero fino alle 3:59pm, non fino alle 3:00pm.


Ma il principio è ovviamente valido in termini di ciò che EagleEye deve fare: controllare l'ora e anche il giorno della settimana usando DayOfWeek() o TimeDayOfWeek().



Hai ragione. Questo dovrebbe funzionare:

  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())==0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())==1) && (Hour()<=15);
  if( sunday_cond  || monday_cond )
go_trading();
 

Grazie ragazzi,


Proverò questo e vi farò sapere se funziona.

 

only one trade can be open between sunday 23:00 and monday 15:00

Il codice di cui sopra dovrebbe scambiare da domenica 23:00 a lunedì 15:59 (Hour()<=15), non 15:00 (Hour()<15)

Inoltre dovrete avere un codice per aprire solo un trade durante il periodo consentito.

 
Che tipo dovrebbero essere sunday_cond e monday_cond? int?
 

Non sono sicuro di capire cosa intendi con questa parte WHRoeder: Lunedì 15:59 (Hour()<=15), non 15:00 (Hour()<15)?

Sì, hai ragione, ho bisogno anche di quel codice. Spero che qualcuno possa fornirmelo.

 
EagleEye:

Sì u r giusto ho bisogno di quel codice pure. Spero che qualcuno possa fornirmelo.

Questo è un problema un po' insolito perché non vuoi prendere un nuovo trade se ne hai già aperto uno durante la finestra di trading corrente, anche se il trade è ormai chiuso. La maggior parte delle discussioni su questo forum si preoccupa solo di controllare che non ci sia un trade attualmente aperto (e questo è un argomento che viene fuori spesso).


In sostanza, avete tre opzioni in termini di controllo delle trade chiuse:


  1. Quando aprite una nuova operazione, memorizzate il tempo corrente in una variabile. Quando considerate di piazzare una nuova operazione, controllate che il tempo memorizzato dell'ultima operazione non cada nella finestra di trading corrente.
  2. Come sopra, ma memorizza l'ora dell'ultima negoziazione nelle variabili globali di MT4.
  3. Esaminare la lista di trade di MT4, alla ricerca di trade chiusi che sono stati aperti durante la finestra di trading corrente.


Queste opzioni sono approssimativamente in ordine di complessità (e anche in ordine inverso di performance, cioè con la 3 che è di gran lunga la più lenta, anche se qualsiasi differenza di velocità tra di loro è molto improbabile che ponga problemi nella vita reale).


Tuttavia, le opzioni sono anche in ordine di resilienza:


  1. Se il tempo dell'ultima transazione è memorizzato in una variabile (in memoria), allora il valore viene perso se MT4 viene riavviato o se il vostro EA deve essere ricaricato per qualsiasi altra ragione. In altre parole, se l'EA viene ricaricato, allora potenzialmente scambierà più di una volta durante la stessa finestra di trading.
  2. Se il tempo è memorizzato in una variabile globale di MT4, allora il suo record dovrebbe sopravvivere ai ricarichi dell'EA. Tuttavia, se il trading deve essere spostato in fretta su un nuovo computer, allora il record del tempo dell'ultima negoziazione sarà perso (a meno che non sia disponibile un backup del file gvariables.dat di MT4).
  3. La scansione della lista di trade di MT4 è l'unica opzione che è adeguatamente resiliente in termini di disaster-recovery: è possibile accedere al conto del broker da una copia di MT4 su un altro computer, avviare l'EA, e avere la garanzia che non prenda operazioni extra errate.


 

// Approccio_1

  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())==0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())==1) && (Hour()<=15);
  if( sunday_cond  || monday_cond )
if(OrdersTotal()==0)
go_trading();



// Approccio_2

  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())==0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())==1) && (Hour()<=15);
  if( sunday_cond  || monday_cond )
{
if(number_of_longs()==0) // Count the longs from both "trade context" and history for the period in qestion. There is code for counting open longs/shorts in the forum
go_trading_longs();
if(number_of_shorts()==0)
go_trading_shorts();

}
Motivazione: