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

 
tuner:

Non ho notato subito la risposta. Beh, ad essere onesti non ho capito bene cosa intendi dicendo che non c'è confusione.

Cosa intendete con "non importa a che oraStringToTime() conta i secondi trascorsi"?

La funzione essenzialmente prende una data del tutto sinistra(credo che la data del PC locale sia sinistra) e confronta l'ora corrente del server del broker con essa, perché non dovrebbe essere importante?

Dallo screenshot qui sopra, il commento dice che l'ora sul tuo PC locale è 1 ora avanti rispetto all'ora del broker, cioè lo spostamento GMT è maggiore. Se fosse X ore in meno, sarebbe critico, come nel caso di cui ho scritto venerdì.

Per quanto riguarda la fine del tempo di negoziazione. Immagino che per la funzioneStringToTime() non dovrebbeimportare quando il broker finisce il giorno o la settimana di trading...

Non ho altre spiegazioni.

Se sono le 11:40 a Mosca, allora sono passati XXX secondi dal 01.01.1970 all'ora attuale.

Quando sono le 11:40 a Londra, per esempio, il numero di secondi sarà lo stesso che a Mosca ora... Questo è solo perché il 01.01.1970 a Londra era molto più tardi dell'ora attuale. Non è il tempo inserito, ma solo il numero di secondi.

Provate a scrivere voi stessi una formula per calcolare il numero di secondi dal 01.01.1970 00:00:00.

Per un breve periodo di tempo si potrebbe usare questa formula. Dall'inizio del mese corrente passato 6*24*60*60 + 11*60*60 + 59*60 + il valore attuale dei secondi sull'orologio che state guardando.

 

Naturalmente, il confronto si basa sul numero di secondi che sono trascorsi dall'anno 70, ma questo numero di secondi tiene conto di tutto - data e ora.

Vi farò solo un esempio, che è essenzialmente una semplificazione di un problema che ho incontrato di recente.

Il compito: calcolare l'ora (datetime) della fine delle contrattazioni di venerdì, tenendo conto della variabile stringa "21:30".

Inizialmente avevo una soluzione del genere:

datetime EndTrading;

if(TimeDayOfWeek(TimeCurrent())==5)     // если сейчас пятница, например возьмем сегодняшний день, первый тик 2014.11.07 00:00
  EndTrading=StringToTime("21:30");     // подразумевается что тут должно быть время пятницы...

if(TimeDayOfWeek(TimeCurrent())==5)     // если настала пятница
  if(TimeCurrent()>EndTrading)          // и время удовлетворяет условию
    Print("Настала пятница и текущее время больше чем 21:30");

E ora la trovata: la stampa specificata nel codice apparirà venerdì, ma non dopo le 21:30, bensì alle 00:00 del primo tick.

Perché quando il server del mio broker ha ottenuto venerdì, sul mio PC locale era ancora giovedì, il timeshift è diverso.

Nel tester, tutto è OK e la stampa sarà rilasciata come dovrebbe essere venerdì dopo le 21:30. Non è confuso?

 
tuner:

Naturalmente, il confronto si basa sul numero di secondi che sono trascorsi dall'anno 70, ma questo numero di secondi tiene conto di tutto - data e ora.

Vi farò solo un esempio, che è essenzialmente una semplificazione di un problema che ho incontrato di recente.

Il compito: calcolare l'ora (datetime) della fine delle contrattazioni di venerdì, tenendo conto della variabile stringa "21:30".

Inizialmente avevo una soluzione del genere:

E ora la trovata: la stampa specificata nel codice apparirà venerdì, ma non dopo le 21:30, bensì alle 00:00 del primo tick.

Perché quando il server del mio broker ha ottenuto venerdì, sul mio PC locale era ancora giovedì, il timeshift è diverso.

Nel tester, tutto è OK e la stampa sarà rilasciata come dovrebbe essere il venerdì dopo le 21:30. Non è confuso?

Certo che è confuso. È solo confusione nella tua testa. TimeToString("21:30") darà la data corrente dalle 21:30:00 alle 21:29:59 del giorno successivo. Correggo i commenti nel tuo codice.

datetime EndTrading;

if(TimeDayOfWeek(TimeCurrent())==5)     // если сейчас пятница, от текущего времени. Наступит когда по времени сервера будет 00:00
  EndTrading=StringToTime("21:30");     // А тут в 00:00 устанавливается четверг 21:30 потому, что это время пятницы ещё далеко.

if(TimeDayOfWeek(TimeCurrent())==5)     // если настала пятница
  if(TimeCurrent()>EndTrading)          // А тут условие если(текущее время больше чем четверг 21:30)
   {
    Print("EndTrading = ", TimeToString(EndTrading)); // Посмотри что будет напечатано.
   }


E questo codice funzionerà correttamente

if(TimeDayOfWeek(TimeCurrent()) == 5 && TimeCurrent() >= StringToTime("21:30"))
Print("Настала пятница и текущее время больше чем 21:30");
 
ikatsko:
Ci sono due terminali MT4 sullo stesso portatile: uno con 4 cifre decimali e uno con 5 cifre decimali. Nello stesso tempo il traffico sul primo è 105/0 kb, sul secondo 3450/0 kb. La prima è intensiva per la CPU del 6%, la seconda del 39%. Qual è il problema? Ma questa è una norma?
Sì.
 

AlexeyVik

Ho cambiato la data sul mio computer in 2000.

ha eseguito questo script:

input string time="21:30";

Comment("TimeCurrent() = ",TimeCurrent(),"\n",
"TimeLocal() = ",TimeLocal(),"\n",
"StringToTime(",time,") = ",StringToTime(time));

e ho ottenuto questo:

quindi StringToTime() prende la data dal computer locale

 
tuner:

AlexeyVik

Ho cambiato la data sul mio computer in 2000.

ha eseguito questo script:

e ho ottenuto questo:

Quindi StringToTime() prende la data dal computer locale

E allora? Lasciate che lo prenda dalla luna, purché impostiate il tempo "da e verso" passato XXX secondi e questo numero intero lo confrontiamo con il numero di secondi passati dal 01.01.1970 del tempo necessario.

È meglio controllare questa linea

if(TimeDayOfWeek(TimeCurrent()) == 5 && TimeCurrent() >= StringToTime("21:30"))

dove avete avuto il problema. Oggi è venerdì.

 
AlexeyVik:

Faresti meglio a controllare quella linea

dove avete avuto il problema. Oggi è venerdì.

Ho controllato, se il computer locale ha una data inferiore a quella del broker, allora le stampanti sono lì,

e se il computer locale ha una data maggiore di quella del broker, nessuna stampante.

Allo stesso tempo ho controllato il tempo che è sicuramente passato, cioè "11:30".

nel primo caso TimeCurrent() è confrontato con 2014.11.06 11:30, e nel secondo casocon 2014.11.0811:30

PS ha corretto l'evidenziato

if(TimeDayOfWeek(TimeCurrent())==5)      // если сейчас пятница, от текущего времени. Наступит когда по времени сервера будет 00:00
   EndTrading=StringToTime("21:30");     // А тут в 00:00 устанавливается четверг 21:30 потому, что это время пятницы ещё далеко.

La prima linea è chiara, il commento sulla seconda linea no.

Perché il venerdì è lontano quando è già arrivato? Dopo tutto, la seconda linea viene eseguita solo se è venerdì.

 
tuner:

Ho controllato, se il computer locale ha una data inferiore a quella del broker, allora le stampanti ci sono,

e se la data sul computer locale è superiore a quella del broker, allora non ci sono stampanti.

cioè il tempo è passato, cioè "11:30".

nel primo caso TimeCurrent() è confrontato con 2014.11.06 11:30, e nel secondo casocon 2014.11.0811:30

PS ha corretto l'evidenziato


Bene, qui ho l'ora locale maggiore dell'ora del server di 1 ora.

Questo script

   datetime time_begin;
    time_begin = StringToTime("21:30");
    Comment("Текущее локальное время ", TimeLocal(), " ", TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS), "\n"
          , "Текущее время сервера    ", TimeCurrent(), " ", TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS), "\n"
          , "Сегодня 21:30 по TimeLocal будет через    ", time_begin-TimeLocal(), " секунд или ", 
           TimeToString(time_begin-TimeLocal(), TIME_MINUTES|TIME_SECONDS), "\n"
          , "Сегодня 21:30 по TimeCurrent будет через ", time_begin-TimeCurrent(), " секунд или ", 
           TimeToString(time_begin-TimeCurrent(), TIME_MINUTES|TIME_SECONDS), "\n"
          );


Emette i seguenti valori.

Prima il numero di secondi trascorsi dal 01.01.1970 all'ora specificata, e poi l'ora nella forma a cui siamo abituati.


Su questa base, per favore, spiegate cosa vi confonde di questi valori?


Sì, nel mio secondo commento pensavo a qualcos'altro.

 
TheXpe
TheXpert:
да.
Grazie. La brevità è la sorella del talento!
 

Salve.

C'è un compito come questo. (non può attaccarlo a un segno di spunta)

Se un ordine pendente si innesca {allora...}.

Nel mio EA, uso Terminal.mqh per calcolare gli ordini.

Terminale // Mas_Tip[0] aperto Comprare

// se il numero di ordini di acquistoè aumentato di 1

se (Mas_Tip[0]+1)

{

funzione

}

Tutto funziona. Ma si innesca ad ogni prossimo tick.

Come attaccare questo caso a una zecca? E poi confrontare il valore sul tick precedente e sul tick attuale.

Motivazione: