2010-12-27 4 views
1

Supposons que j'ai un DateTime, e. g. 2010.12.27 12:33:58 et j'ai un intervalle de trame, supposons, 2 secondes, en excluant la dernière frontière.Brain storm: comment organiser DateTime en cadre d'intervalle particulier?

Donc, j'ai les images suivantes: - (excl.)

12:33:58 (incl.) 12:34:00 - que ce soit l'intervalle 1

12:34:00 (incl.) - 12:34:02 (excl.) - que ce soit intervalle 2

12:34:02 (incl.) - 12:34:04 (excl.) - que ce soit intervalle 3

et ainsi de suite.

Je reçois une valeur DateTime aléatoire et je dois corréler cette valeur selon les règles ci-dessus.

E. g. la valeur "12:33:58" tombe dans l'intervalle 1, "12:33:59" tombe dans l'intervalle 1, "12:34:00" tombe dans l'intervalle 2 et ainsi de suite.

Dans le code, il devrait ressembler à ce qui suit:

var dt = DateTime.Now; 
DateTime intervalStart = apply_the_algorythm(dt); 

Il semble être une action arithmétique simple (s) avec flotteur ou quelque chose, toutes les décisions sont les bienvenus!

+0

Qu'avez-vous trouvé jusqu'à présent? – Steven

+0

J'écris le système de trading à haute fréquence et j'ai besoin d'un algorithme rapide pour organiser des affaires dans des bougies japonaises – skaeff

Répondre

2

Si l'intervalle est uniquement de la deuxième résolution et toujours divisé par 86400, prenez le nombre de secondes écoulées aujourd'hui, divisez-le par l'intervalle, arrondissez-le à une valeur entière, multipliez-le et ajoutez-le à aujourd'hui. Quelque chose comme dateinquestion.Subtract (dateinquestion.Date) .TotalSeconds, ((int) secondes/intervalle) * intervalle, dateinquestion.Date.AddSeconds (...)

+0

Math.Floor au lieu de rond, je pense – skaeff

+0

Je voulais dire arrondi vers zéro, le casting (int) fait la même chose. – fejesjoco

0
DateTime start = new DateTime(2010, 12, 31, 12, 0, 0); 
TimeSpan frameLength = new TimeSpan(0, 0, 3); 
DateTime testTime = new DateTime(2010, 12, 31, 12, 0, 4); 

int frameIndex = 0; 
while (testTime >= start) 
{ 
    frameIndex++; 
    start = start.Add(frameLength); 
} 

Console.WriteLine(frameIndex); 
+0

var dt = DateTime.Now; DateTime intervalStart = apply_the_algorythm (dt); – skaeff

+0

@skaeff: Je vous montre la majeure partie du code dont vous avez besoin, et trouve une direction, vous pouvez facilement envelopper le code dans une méthode. Sinon, ce que vous devez faire est de copier la réponse, de la coller dans votre programme et de l'exécuter. Pensez-vous que c'est bon pour vos compétences? –

2

Si vous voulez que la plage de tous vos intervalles pour s'étendre sur plusieurs jours, peut-être longtemps, vous pouvez exprimer vos valeurs DateTime en UNIX-seconds (le nombre de secondes depuis 1970-01-01). Ensuite, vous trouverez juste quand votre premier intervalle a commencé, calculer le nombre de secondes écoulées depuis, et diviser par deux:

int secondsSinceFirstInterval = <currDate in UNIX time> 
           - <start of first interval in UNIX time>; 
int intervalIndex = secondsSinceFirstInterval/2; 

Sinon, vous êtes mieux que compter de minuit.

0
dates = new List<DateTime> 
      { 
       DateTime.Now.AddHours(-1), 
       DateTime.Now.AddHours(-2), 
       DateTime.Now.AddHours(-3) 
      }; 
      dates.Sort((x, y) => DateTime.Compare(x.Date, y.Date)); 
      DateTime dateToCheck = DateTime.Now.AddMinutes(-120); 
      int place = apply_the_algorythm(dateToCheck); 
      Console.WriteLine(dateToCheck.ToString() + " is in interval :" +(place+1).ToString()); 

private int apply_the_algorythm(DateTime date) 
     { 
      if (dates.Count == 0) 
       return -1; 
      for (int i = 0; i < dates.Count; i++) 
      { 
       // check if the given date does not fall into any range. 
       if (date < dates[0] || date > dates[dates.Count - 1]) 
       { 
        return -1; 
       } 
       else 
       { 
        if (date >= dates[i] 
         && date < dates[i + 1]) 
         return i; 
       } 
      } 
      return dates.Count-1; 
     } 
1

Utilisez TimeSpan.TotalSeconds et divisez le résultat par la taille de l'intervalle.

const long intervalSize = 2; 
DateTime start = new DateTime(2010, 12, 27, 12, 33, 58); 

TimeSpan timeSpan = DateTime.Now - start; 
long intervalInSeconds = (long)timeSpan.TotalSeconds; 
long intervalNumber = 1 + intervalInSeconds/intervalSize; 
Questions connexes