Sessioni di trading o quanto è importante il tempo - pagina 9

 

Ecco alcune funzioni utili per trattare con il tempo (potete determinare se è in vigore l'ora legale o invernale per qualsiasi data).

#property copyright "Erics"
#property link      "erics.fx@tut.by"

#define EUR 0
#define USA 1

//+------------------------------------------------------------------+
//| скрипт, демонстрирующий использование некоторых функций времени  |
//+------------------------------------------------------------------+

void start()
{
  int tl = TimeLocal();
  MessageBox("Сейчас: " + TimeToStr(tl) + ", летнее время = " + getDST(EUR, tl) +
             "\n\n20.03.2008 0:00, летнее время в Европе  = " + getDST(EUR, MTtime(DateSerial(2008,3,20))) +
             "\n20.03.2008 0:00, летнее время в Америке = " + getDST(USA, MTtime(DateSerial(2008,3,20))) +
             "\n\n1.04.2008 0:00, летнее время в Европе  = " + getDST(EUR, MTtime(DateSerial(2008,4,1))) +
             "\n1.04.2008 0:00, летнее время в Америке = " + getDST(USA, MTtime(DateSerial(2008,4,1))));
}

int MTtime(double serialTime)
{ // переводит дату/время, заданную в днях от 1900 года (Windows)
  // в дату, заданную в секундах от 1970 года (Unix)
  return(86400.*(serialTime - 25569.));
}

int DateSerial(int yyyy, int mm, int dd)
{ // возвращает дату в формате Windows (от 1.01.1900 г.)
  yyyy -= 1900; mm++;
  if (mm < 4) { mm += 12; yyyy--; }
  int res = MathFloor(365.25*yyyy) + MathFloor(30.6*mm) + dd - 62;
  return(res);
}

int getDST(int country, int time)
{ // Daylight Saving Time - возвращает 1, если на время time действует летнее время и 0 - если поясное (зимнее) время
  int DSTstarts, DSTends, y, yr = TimeYear(time);

  switch(country)
  {
    case EUR:
      // летнее время в Европе и России начинается в последнее восресенье марта, в 2 часа ночи
      y = MathFloor(1.25 * yr + 4.);
      DSTstarts = MTtime(DateSerial(yr, 3, 31 - y % 7) + 2./24.);
      // летнее время в Европе и России заканчивается в последнее восресенье октября, в 3 часа ночи
      y = MathFloor(1.25 * yr + 1.);
      DSTends   = MTtime(DateSerial(yr,10, 31 - y % 7) + 3./24.);
      break;

    case USA:
      // летнее время в США и Канаде с 2007 г. начинается во второе восресенье марта, в 3 часа ночи
      y = MathFloor(1.25 * yr + 1.);
      DSTstarts = MTtime(DateSerial(yr, 3, 14 - y % 7) + 3./24.);
      // летнее время в США и Канаде с 2007 г. заканчивается в первое восресенье ноября, в 3 часа ночи
      DSTends   = MTtime(DateSerial(yr,11, 7 - y % 7) + 3./24.);
      break;
  }  
  if (time>=DSTstarts && time<=DSTends) return(1); else return(0);
}

P.S. In America prima del 2007, il passaggio al e dal DST era lo stesso tempo che in Europa. Usa EUR quando chiami.

Se qualcuno volesse convertire questo in una biblioteca, disposto ad aiutare (asia, australia).

File:
 

Ho fatto anche le funzioni DST per l'Europa e gli Stati Uniti, restituiscono true per l'ora legale e false per l'ora invernale. Sono progettati per funzionare con il tempo del server, solo per gli Stati Uniti dal 2007 in poi.

//+------------------------------------------------------------------+
bool DST_EU(int CurrentTime) {
  int CurMonth = TimeMonth(CurrentTime);
  int CurDayOfWeek; 
  int CurDay; 
  if (CurMonth > 3  &&  CurMonth < 10) return(true);
  else { 
    if (CurMonth < 3  ||  CurMonth > 10) return(false);
    else {
      CurDayOfWeek = TimeDayOfWeek(CurrentTime); 
      CurDay = TimeDay(CurrentTime); 
      switch (CurMonth) {
        case  3: if (CurDay-CurDayOfWeek > 24) return(true);
                 else return(false);
                 break;
        case 10: if (CurDay-CurDayOfWeek < 25) return(true);
                 else return(false);
                 break;
      }
    }
  }
}
//+------------------------------------------------------------------+
bool DST_US(int CurrentTime) {
  int CurMonth = TimeMonth(CurrentTime);
  int CurDayOfWeek; 
  int CurDay; 
  if (CurMonth > 3  &&  CurMonth < 11) return(true);
  else { 
    if (CurMonth < 3  ||  CurMonth > 11) return(false);
    else {
      CurDayOfWeek = TimeDayOfWeek(CurrentTime); 
      CurDay = TimeDay(CurrentTime); 
      switch (CurMonth) {
        case  3: if (CurDay-CurDayOfWeek > 7) return(true);
                 else return(false); 
                 break;
        case 11: if (CurDay-CurDayOfWeek < 1) return(true);
                 else return(false); 
                 break;
      }
    }
  }
}


Erics писал (а) >>

P.S. In America prima del 2007 il passaggio al e dal DST era lo stesso che in Europa. Usa EUR quando viene chiamato.

Questo è vero solo a metà, solo il finale corrispondeva.

 
kombat писал (а) >>

10:00 - Lancio europeo

kombat, ti sbagli. L'Europa apre alle 09:00 MSK (ora legale)

 
Una domanda per il mercato stagionato... Ha qualche mese particolarmente fortunato nel gioco e viceversa? Naturalmente dipende dalle vostre tattiche di trading, quindi la domanda è troppo astratta. Ma in un modo o nell'altro?
 

Come promesso, ho "digerito" tutto quello che potevo riguardo alle sessioni di trading e all'ora legale. Ho fatto un file excel con il calendario dell'ora legale e il calcolo dell'ora di inizio e fine sessione.

Il primo foglio è solo un calendario di transizione, senza formule. Questo calendario è utilizzato per calcolare le sessioni sul secondo foglio. Sul secondo foglio, puoi impostare solo tre parametri: la data attuale per la quale vuoi calcolare tutto, e due fusi orari: uno per il fuso orario del server DC, e l'altro per la tua ora locale (che hai sul tuo orologio da polso). Da questi si calcolano le tabelle con i tempi locali dei tempi di scambio, e da questi - i tempi di inizio e fine (minimo e massimo) delle sessioni di trading.

Sembra funzionare, ma io (per abitudine) non posso credere che tutto sia stato fatto senza errori. Perché? Beh, per esempio l'Australia e la sessione oceanica. Sono nell'altro emisfero e la loro ora legale è in inverno, quindi se i nostri mesi sono così LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL. Di conseguenza si ottengono formule diverse per i calcoli: qui si cerca l'ora legale, mentre loro devono cercare l'ora legale. In generale ci sono alcune difficoltà :(

Per questo motivo, il file che ho posato sul mio sito e non postato sul forum - come gli errori vengono eliminati, aggiornerò il file e il link dal forum sarà sempre scaricato versione fresca e corretta (io postare gli aggiornamenti in questo thread). Potete scaricare il file qui: http: //forextools.com.ua/uploads/files/DST.zip

Sembra così:


Se qualcuno ha dei suggerimenti costruttivi, scriva una lettera. Non posso promettere una rapida implementazione (a causa del tempo pieno sul lavoro principale), ma quando avrò tempo - tutto ciò che è sensato e utile sarà fatto ;)

 

ForexTools, buon lavoro!

Ma non riesco a capire cosa intendi con questo. Spiegare più specificamente cosa significa "additivo" (tanto per chiarire).

E che dire del server TMZ e del locale TMZ? Qual è la differenza tra l'ora locale e l'ora del DC? Hai i numeri 2 e 3 sotto ognuno di essi? Cosa significa?

 

Ci sono semplicemente due calcoli di tempo esattamente uguali, solo per comodità - se l'ora del terminale non corrisponde all'ora del computer locale.

L'aggiunta è quante ore (tenendo conto dell'ora estiva o invernale) saranno aggiunte all'ora UTC per convertire l'ora UTC del rispettivo scambio all'ora locale del fuso orario selezionato. Questo campo è necessario solo per facilitare i calcoli in excel.

Le regole sono molto semplici: definiamo (a seconda del campo Rule) e la data di tempo specificata. Si inserisce nel campo Letn di fronte alla data calcolata. Poi all'orario di lavoro dello scambio secondo UTC, aggiungere il numero di ore TMZ (dalla tabella superiore) e aggiungere ad esso la correzione Letn (se è ora legale - allora +1) e +TMZ del server della casa di intermediazione o TMZ locale. Di conseguenza, l'ora UTC viene convertita nell'ora locale della rispettiva TMZ.

 
Erics писал (а) >>

C'è un particolare standard di tempo nel forex. Questo è il tempo dell'Europa centrale, CET.

Questo è GMT (o UTC) +1 (+2 in estate).

In teoria, le candele giornaliere dovrebbero iniziare a mezzanotte CET in qualsiasi casa di intermediazione.

Questo probabilmente non è il caso, ma la maggior parte delle società di intermediazione usa il tempo CET.

Più tardi vi invierò uno script che definisce il GMT, l'ora legale/invernale, le date di traduzione in Europa e in America in qualsiasi anno (in America dal 2007, cioè secondo le nuove regole).

Chiarire: se guardo solo l'orologio del server (GMT+1), l'ora di inizio e fine delle sessioni sarà costante?

Nel prgramma uso le restrizioni dell'ora con il comando Hour(), cioè controllo l'ora corrente del server, e dentro o fuori.


Se c'è una transizione a ore due, diciamo all'indietro, allora la candela delle ore non contiene il doppio volume?

 
Parabellum писал (а) >>

Se c'è una transizione alle due del mattino, diciamo al contrario, la candela dell'una contiene un doppio volume?

La transizione avviene sempre di domenica, quando i server di trading (i server MT comunque) non sono "in commercio" e quindi non ci sono volumi singoli o doppi - c'è solo un buco nella storia.

 
ForexTools писал (а) >>

La transizione avviene sempre di domenica, quando i server di trading (quelli di MT comunque) non sono "in commercio" e quindi non ci sono volumi singoli o doppi - c'è solo un buco nella storia.

>> Capisco, grazie.

E la prima domanda? Non ho bisogno di sapere l'ora locale. Il mio orologio è il server di trading. Gli orari di apertura delle sessioni sono costanti in questo periodo?

Il programma ha una restrizione: se ( Hour()>t1 && Hout()<t2 ), allora vai avanti, altrimenti chiudi / dormi; più o meno. Senza alcuna correzione.