Python: Numpy datetime into DB-writable format

 

Hi,

rates = mt5.copy_rates_from("EURUSD", mt5.TIMEFRAME_H4, utc_from, 10)

liefert im ersten Element des Arrays "time" als:

C:\Users\User\python>python python2db1.py
MetaTrader5 package author:  MetaQuotes Ltd.
MetaTrader5 package version:  5.0.36
Display obtained data 'as is'
(1578484800, 1.11269, 1.11309, 1.11104, 1.11244, 12463, 5, 0)
tuple:  (Timestamp('1970-01-01 00:00:01.578484800'), 1.11269, 1.11309, 1.11104, 1.11244, 12463.0, 5.0)

im "as is" als timestamp in Sekunden von 1.1.70 und mit pd.to_datetime(rate[0]) als:

'1970-01-01 00:00:01.578484800'

Jetzt will ich das, eigentlich lieber im Sekunnden-vom-1.1.70 Format in eine PostGresql DB schreiben und bekomme es nicht hin.
Ich habe sicherlich an die 20 Funktionen mit datetime-Konvertierei herumgespielt, aber nichts landet in der DB. Habe dort mit dem Datentypen für die Spalte experimentiert, auch einfach den SekundenTimeStamp in INT zu schreiben, aber nichts klappt.

Hat das jemand hinbekommen? Welchen Datentyp nimmt man für die Spalte in der DB und wie muss ich das im Python vor dem rates[0] umbiegen, dass es reinpasst?

Ich finde nur Funktionen "fromtimestamp" oder "to_datetime" usw.. aber das will ich gar nicht, ich will einfach nur die Unix-Sekunden 1:1 übernehmen und in die DB schreiben.


1000 Dank!



 

Ich hab's hinbekommen via datetime.fromtimestamp(rate[0])

datadb=# SELECT * FROM bars;
 id |        time         | high2close | high2open | open2low |     close2low      | high2low | open2close
----+---------------------+------------+-----------+----------+--------------------+----------+------------
  1 | 2022-01-26 16:00:00 |    1.12819 |   1.12959 |  1.12812 | 1.1283400000000001 |     4066 |          5
(1 Zeile)

Ich Esel hatte conn.commit() hinter einem Quit.. daher wurde der TimeStamp nicht in die DB geschrieben, da hätte ich noch 1000 Funktionen ausprobieren können..

VG

 
Christian Linden #:

Ich hab's hinbekommen via datetime.fromtimestamp(rate[0])

Ich Esel hatte conn.commit() hinter einem Quit.. daher wurde der TimeStamp nicht in die DB geschrieben, da hätte ich noch 1000 Funktionen ausprobieren können..

VG

Richtig, das Problem ist immer einen halben Meter davor :-)

Für python fragwen bist bei stackoverflow viel besser aufgehoebn.

Dort finde ich ich auch immer meine Antworten.

 

Du machst das schon so lange.. vielleicht kannst Du mir ein paar Stunden sparen.. (ich habe übrigens einen VPS von MetaQuotes laufen ;-)

timezone = pytz.timezone('Europe/Amsterdam')

bars_from = datetime(2022, 1, 26, 9, 4, tzinfo=timezone)

rates = mt5.copy_rates_from("EURUSD", mt5.TIMEFRAME_M1, bars_from, 4)

Ich will die Minutenkerzen von 9:00, 9:01, 9:02 und 9:03.

Ich ziehe mir den TimeStamp so:

datetime.fromtimestamp(rate[0])

rate0 ist 1643189100

timestamp = 1643271900

dt_object = datetime.fromtimestamp(timestamp)

print(dt_object)

2022-01-27 09:25:00

Ich wäre erstmal zufrieden, wenn da 9:00 rauskäme.. Woher kommen die 25min Abweichung? Ist das was mit den s/ms ?

Danke Dir!

 
Ich habs:
timezone = pytz.timezone('ETC/GMT-1')  (auch wenn ich eher dachte, wir wären hier GMT+1...)

Irgendwie liefert die Europe/Amsterdam-TZ Mist. 
 

Für genau diese Problem habe ich für MT5 diese Lösungen entwickelt:

https://www.mql5.com/de/articles/9926 // Umgang mit Zeit (Teil 1): Die Grundlagen
https://www.mql5.com/de/articles/9929 // Umgang mit Zeit (Teil 2): Die Funktionen

Umgang mit Zeit (Teil 1): Die Grundlagen
Umgang mit Zeit (Teil 1): Die Grundlagen
  • www.mql5.com
Funktionen und Codeschnipsel, die den Umgang mit der Zeit, dem Broker-Offset und der Umstellung auf Sommer- oder Winterzeit vereinfachen und verdeutlichen. Genaues Timing kann ein entscheidendes Element beim Handel sein. Ist die Börse in London oder New York zur aktuellen Stunde bereits geöffnet oder noch nicht, wann beginnt und endet die Handelszeit für den Forex-Handel? Für einen Händler, der manuell und live handelt, ist dies kein großes Problem.
 
Super, das muss ich mir alles angucken.. beim Überfliegen ist es noch einmal mehr verwunderlicher wieso ich mit GMT-1 meine European Time bekomme.
Vielleicht verstehe ich es, wenn ich später durch bin, danke!
 
Ich bekomme über copy_rates_from diese Werte:
tuple:  (datetime.datetime(2022, 2, 2, 9, 0), 15688.91, 15688.91, 15678.4, 15679.41, 38.0, 75.0)

Wenn ich im MT5 auf die Kerze gehe und in das Datenfenster schaue, finde ich andere Werte (15675.91 als Open (oben die 15688.91)).
Meinst Du, das hängt mit der Zeit zusammen, dass ich, trotz den scheinbaren 9:00, die Daten einer anderen Kerze bekomme?

 
Christian Linden #:
Super, das muss ich mir alles angucken.. beim Überfliegen ist es noch einmal mehr verwunderlicher wieso ich mit GMT-1 meine European Time bekomme.
Vielleicht verstehe ich es, wenn ich später durch bin, danke!
Die Serverzeit wird vom Broker festgelegt.