J'essaie de comprendre le MetaTrader 4 langage de script (et de convertir un couple de scripts en C#), alors j'ai commencé avec le PeriodConverter.mq4
(il est venu avec l'installation MT4).Comment le script MetaTrader 4 «normalise»-t-il le temps?
Voici les valeurs pour le script:
periodseconds == 1800
Time[start_pos] == 2013/11/20 07:00
Voici la partie du script que je vais avoir du mal à comprendre:
//--- normalize open time
rate.time=Time[start_pos]/periodseconds;
rate.time*=periodseconds;
cela me donne un résultat de 2013/11/20 04:00
pas 2013/11/20 07:00
comme je l'aurais attendu
Plus de détail:
Si je lance le script PeriodConverter.mq4
de MT4 disant que je veux utiliser le FSTE100
1 heure données et le multiplicateur de la période que je veux est 5 heures, cela donnera periodseconds
une valeur de 18000
(voir extraits du script ci-dessous).
int i,start_pos,periodseconds;
// Period() == 60 because I'm using a 1hour chart
// InpPeriodMultiplier == 5 because I want 5 hour increments
int i_period=Period()*InpPeriodMultiplier;
periodseconds=i_period*60;
ainsi, 60 * 5 * 60 == 18000
. Si je lance maintenant le script en utilisant les données ci-dessous:
2013.11.20,07:00,6669.3,6677.5,6669.3,6674.2,456
rate.time
sera 04:00
Mais comment est-elle cette valeur? J'ai essayé de le convertir en C# pour voir si je pouvais reproduire le résultat
var x = new DateTime(2013, 11, 20, 7, 0, 0);
var ticks1 = x.Ticks/18000;
var ticks2 = ticks1 * 18000;
DateTime myDateTime = new DateTime(ticks2);
Mais cela m'a donné la même valeur que je commence par 2013/11/20 07:00
Alors, comment obtenir MT4 04:00
de 07:00
? et est-il possible de dupliquer ceci en C#?
Merci d'avance.
AVEC L'AIDE DE JOSEPH LE PROBLÈME A ÉTÉ RÉSOLU!
Voici mon code de test de travail pour tous ceux qui en ont besoin
// working with seconds
var x = new DateTime(2013, 11, 20, 7, 0, 0);
// number of seconds since 12:00:00, 01-01-0001
var sec1 = x.Ticks/TimeSpan.TicksPerSecond;
// number of seconds since 12:00:00, 01-01-1970
var sec2 = sec1 - (new DateTime(1970, 1, 1, 0, 0, 0).Ticks/TimeSpan.TicksPerSecond);
// rate.time=Time[start_pos]/periodseconds
var newRateTimeInSeconds = sec2/18000;
newRateTimeInSeconds *= 18000;
DateTime myDateTime = new DateTime((newRateTimeInSeconds * TimeSpan.TicksPerSecond) + new DateTime(1970, 1, 1, 0, 0, 0).Ticks);
Cela a trié! – DavidO