2016-02-17 1 views
0

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); 

Répondre

0

Tenez compte des points suivants:

  • En C#, 10mil tiques à 1 seconde. Donc, il ne devrait pas être / 1800. Nous devons utiliser var sec1 = x.Ticks/(1800 * TimeSpan.TicksPerSecond);
  • La valeur de date-heure BASE est 01.01.0001 en C#, alors que dans MQL4, elle est 01-01-1970.
  • Il s'agit d'une distinction très importante lorsque nous convertissons la valeur datetime en nombre entier.
  • Si nous prenons integer viTime = TimeCurrent(), viTime est le nombre de secondes ELAPSED depuis 01-01-1970.
  • Ceci est TRÈS important; vs C# 's Tick, qui est la valeur de intervalles de 100 nanosecondes qui se sont écoulées depuis 12:00:00, 01-01-0001.
  • Pour obtenir le même integer viTime = TimeCurrent() MQL4 en C#, vous devez obtenir la valeur sec en C#, puis en déduire la valeur sec de 01-01-1970.
+0

Cela a trié! – DavidO