MetaTrader 5 Python User Group - Come usare Python in Metatrader - pagina 76

 
MrBrooklin:

Grazie, Maxim!

Lo sto già provando. Il ciclo è iniziato, ma il file non si sta ancora aprendo. Lascerò il ciclo in funzione e aspetterò.

Saluti, Vladimir.


P.S. Pardon! Non ha prestato subito attenzione, che valeva un'ora. L'ho cambiato al minuto EUR_USD_QUOTE.csv file è stato aperto ma ho ottenuto questo messaggio nella scheda Run di Pycharm:

�訡��: �� 㤠���� ���� ����� "excel.exe".

Poi, dopo un altro minuto circa, il file si è chiuso e riaperto, ma in Exel è apparsa una scheda sul lato sinistro del foglio di calcolo chiedendomi di salvare il testo precedentemente aperto. Ho aspettato ancora un po' per vedere cosa sarebbe successo dopo, ma poi il ciclo si è fermato ed è apparso un messaggio come questo:

�ᯥ譮: ����� "EXCEL.EXE", � �����䨪��஬ 4208, � �����襭.
�ᯥ譮: ����� "EXCEL.EXE", � �����䨪��஬ 3168, �� �����襭.
Traceback (most recent call last):
File "C:/Users/Vladimir/PycharmProjects/My_Python_Project/9.py", line 37, in <module>
get_data(save_file='EUR_USD_QUOTE.csv')
File "C:/Users/Vladimir/PycharmProjects/My_Python_Project/9.py", line 23, in get_data
with open(save_file, 'w') as save:
PermissionError: [Errno 13] Permesso negato: 'EUR_USD_QUOTE.csv'

Questo è il risultato finora, ma ho già fatto progressi!

Sinceramente, Vladimir.

Forse Excel non ha avuto il tempo di chiudere e stava cercando di accedere al file già, quindi

while True:
    t = datetime.now().hour
    if(t2 != t):
        os.system("TASKKILL /F /IM excel.exe") 
	time.sleep(10)
        get_data(save_file='EUR_USD_QUOTE.csv')
        t2 = t
    time.sleep(10)

Aggiungete un ritardo di 5-10 secondi qui, e il programma aspetterà che Excel si chiuda

Non ho deciso cosa fare con la finestra a sinistra)

 
MrBrooklin:

Voglio imparare come prendere le citazioni su Internet utilizzando il linguaggio Python per guardarle non nel terminale, ma in qualche file, per esempio, csv. Pensavo fosse il compito più elementare, ma si è scoperto che non lo era. Forse sono sulla strada sbagliata, ma chi non cerca niente, non trova niente.

Ora passerò al codice che hai proposto. Dopo che il codice è stato lanciato, è apparso un messaggio nell' ambiente di sviluppo di Pycharm :

Traceback (most recent call last):
File "C:/Users/Vladimir/PycharmProjects/My_Python_Project/10.py", line 25, in <module>
main()
File "C:/Users/Vladimir/PycharmProjects/My_Python_Project/10.py", linea 13, in main
eurusd_bid = soup.find('td', 'pid-1-bid').text.replace(',', '.')
AttributeError: l'oggetto 'NoneType' non ha attributo 'text'

Processo finito con codice di uscita 1

Cosa devo cambiare per vedere come funziona il codice?

Con rispetto, Vladimir.

Il motivo per cui non funziona è che questo sito ha bloccato l'invio di richieste. Il fatto che tu abbia dovuto falsificare un user agent deve essere stato un indizio che stavi facendo qualcosa che non volevano che tu facessi. La scansione del web è ben oltre lo scopo di questo argomento, quindi dovremmo smettere di parlarne e tornare all'argomento in questione. Ha qualche domanda sull'uso del pacchetto MetaTrader5?

 
Maxim Dmitrievsky:

Potrebbe non avere il tempo di chiudere Excel e sta cercando di accedere al file, quindi

aggiungere un ritardo di 5-10 secondi, il programma aspetterà che Excel si chiuda

Non ho ancora deciso cosa fare con la finestra di sinistra)

Maxim, ti ringrazio molto per il codice, che mi hai aiutato a migliorare. Il pannello di sinistra è poco preoccupante al momento. Aggiungerò il tuo nuovo codice più tardi, molto probabilmente nel fine settimana, poiché sono stato completamente sommerso dal lavoro oggi e ho bisogno di riposo. Vi farò sapere non appena avrò nuovi risultati.

Saluti, Vladimir.

 

Su quale offset la libreria MT5 restituisce il tempo degli ordini aperti?

def checkPositions(self):
        return mt5.positions_get(symbol=self.symbol)

pos = trade.checkPositions()
pos[0].time

>>> pos[0].time
1598035196

datetime.datetime.fromtimestamp(pos[0].time).strftime("%A, %B %d, %Y %I:%M:%S")

>>> datetime.datetime.fromtimestamp(pos[0].time).strftime("%A, %B %d, %Y %I:%M:%S")
'Saturday, August 22, 2020 01:39:56'

Ma nel terminale è un tempo diverso

Come faccio a sincronizzare correttamente il tempo nel programma python con il tempo degli ordini (posizioni)?

 
Maxim Dmitrievsky:

Su quale offset la libreria MT5 restituisce il tempo degli ordini aperti?

Ma nel terminale è un tempo diverso

Come faccio a sincronizzare correttamente il tempo nel programma python con il tempo degli ordini (posizioni)?

Per prima cosa è necessario conoscere il fuso orario esatto del server commerciale. Poi create un oggetto fuso orario usando pytz. Infine, passate l'oggetto fuso orario a un metodo.

import datetime as dt

import pytz
import pymt5adapter as mta


def main():
    broker_timezone = pytz.timezone('Etc/UTC')
    for position in mta.positions_get():
        time = dt.datetime.fromtimestamp(position.time, tz=broker_timezone)
        print(time)


if __name__ == '__main__':
    with mta.connected():
        main()
https://stackoverflow.com/questions/13866926/is-there-a-list-of-pytz-timezones
Is there a list of Pytz Timezones?
Is there a list of Pytz Timezones?
  • 2012.12.13
  • ipegasus
  • stackoverflow.com
I would like to know what are all the possible values for the timezone argument in the Python library pytz. How to do it?
 
nicholish en:

Per prima cosa devi conoscere il fuso orario esatto del server commerciale. Poi create un oggetto fuso orario usando pytz. Infine, passate l'oggetto fuso orario al metodo.

https://stackoverflow.com/questions/13866926/is-there-a-list-of-pytz-timezones

Grazie, proverò così

Vorrei sincronizzare l'ora automaticamente poiché il server di trading può cambiare
 
Maxim Dmitrievsky:

Grazie, proverò questo

Vorrei sincronizzare l'ora automaticamente, perché il server commerciale può cambiare

I timestamp UNIX sono agnostici rispetto al fuso orario, quindi è necessario conoscere il fuso orario del broker per dare al timestamp un contesto consapevole del fuso orario. L'unico modo per farlo è conoscere il fuso orario del server commerciale. Non credo che ci sia un modo per ottenere questa informazione programmaticamente. Quello che puoi fare è creare un file di configurazione per mappare i diversi server commerciali che potresti usare per il fuso orario. Esempio:


config.json

{
    "servers": {
        "MetaQuotes-Demo": {
            "timezone": "Europe/Moscow"
        },
        "AMPGlobalUSA-Demo": {
            "timezone": "Etc/UTC"
        }
    }
}
 
nicholish en:

I timestamp UNIX sono agnostici rispetto al fuso orario, quindi è necessario conoscere il fuso orario del broker per dare al timestamp un contesto consapevole del fuso orario. L'unico modo per farlo è conoscere il fuso orario del server commerciale. Non credo che ci sia un modo per ottenere questa informazione programmaticamente. Quello che puoi fare è creare un file di configurazione per mappare i diversi server commerciali che potresti usare per il fuso orario. Esempio:


config.json

bene... sì

modo più semplice senza pytz:

pt = datetime.datetime.utcfromtimestamp(pos[0].time) // position open time by mt5 time
tt = datetime.datetime.utcnow() + datetime.timedelta(hours=3)   // current server time (from mt5 clock)

delta = tt-pt
>>> delta
datetime.timedelta(seconds=2139, microseconds=506786) // position lifetime
Inoltre possiamo aprire un ordine pendente lontano dal prezzo, prima di avviare l'EA. E confrontare la differenza di ore tra 'pt' e
datetime.utcnow()
per compensare automaticamente il tempo
 
Maxim Dmitrievsky :

bene ... sì

modo più semplice senza pytz:

Inoltre possiamo aprire un ordine pendente lontano dal prezzo, prima di avviare l'EA. E confrontare la differenza di ore tra 'pt' e per compensare automaticamente il tempo

Ho pensato la stessa cosa ma poi mi sono ricordato che il tempo dell'ordine è memorizzato in un timestamp UNIX che non ha un fuso orario. In altre parole, non puoi estrapolare il fuso orario del broker dal timestamp dell'ordine perché i timestamp sono gli stessi indipendentemente dal fuso orario. Se vuoi conoscere l'offset GMT devi conoscere l'ora corrente del terminale (broker) e attualmente non c'è modo di usare python per ottenere l'ora corrente del terminale o l'offset GMT.

 
Maxim Dmitrievsky:

Potrebbe non avere il tempo di chiudere Excel e sta cercando di accedere al file, quindi

aggiungere un ritardo di 5-10 secondi, il programma aspetterà che Excel si chiuda

Non ho ancora deciso cosa fare con la finestra a sinistra)

Ciao Maxim!

Vi ho promesso prima che nel fine settimana avrei controllato la variante con l'aggiunta di codice di ritardo. Ho controllato, ma il ritardo non ha influenzato nulla. Non ho problemi con la scheda di sinistra, perché semplicemente non ci faccio caso.

Ancora una volta, grazie mille per la vostra assistenza. Non farò più domande in questo thread.

Saluti, Vladimir.