MetaTrader 5 Python User Group - wie man Python in Metatrader verwendet - Seite 66

 
Vladimir Karputov:

Wie lauteten die aktuellen Kurse (Bid und Ask)? Wie hoch war der Freeze Level (SYMBOL_TRADE_FREEZE_LEVEL)?

Sie sind sich bei den FREEZE-Stufen nicht sicher?

Der Briefkurs wird für meine Käufe und der Geldkurs für meine Verkäufe verwendet.

Ich habe jetzt versucht, meine sl und tp fest zu kodieren.

Es ist nur seltsam, dass es stundenlang perfekt kauft und verkauft und dann aufhört.

price_ask = mt5.symbol_info_tick(symbol).ask # Buying    

####################

##cONDITION FOR buy

if close_past < close_current and position_type(symbol) != 0 or position_type(symbol) == None:
        mt5.Close(symbol)
        buy(symbol, lot, price_ask, point, digits)
        print('{} LONG Postition bought!'.format(symbol))

####################

##### Function to BUY
def buy(symbol, lot, price, point, digits):
    request_buy = {
        "action": mt5.TRADE_ACTION_DEAL,
        "symbol": symbol,
        "volume": lot,
        "type": mt5.ORDER_TYPE_BUY,
        "price": round(price, digits),
        "sl": round((price - 100 * point),digits),
        "tp": round((price + 300 * point),digits),
        "magic": 234000,
        "comment": "{} Buy.".format(symbol),
        "type_time": mt5.ORDER_TIME_GTC,
        }
    # send a trading request
    result_buy = mt5.order_send(request_buy)
    # check the execution result
    print("1.BUY order send(): by {} {} lots at {}".format(symbol,lot,price));
    if result_buy.retcode != mt5.TRADE_RETCODE_DONE:
        print("2. order_send failed, retcode={}".format(result_buy.retcode))
        # request the result as a dictionary and display it element by element
        result_dict=result_buy._asdict()
        for field in result_dict.keys():
            print("   {}={}".format(field,result_dict[field]))
            # if this is a trading request structure, display it element by element as well
            if field=="request":
                traderequest_dict=result_dict[field]._asdict()
                for tradereq_filed in traderequest_dict:
                    print("       traderequest: {}={}".format(tradereq_filed,traderequest_dict[tradereq_filed]))
    else:
        return result_buy
#########
 
nicholi shen:

Still schreibt:

if r.retcode != TRADE_RETCODE_REQUOTE und r.retcode != TRADE_RETCODE_PRICE_OFF:
AttributeError: 'NoneType' Objekt hat kein Attribut 'retcode'


Beispiel aus der Hilfe funktioniert.
Ich habe ein Beispiel in meiner Funktion verwendet und geschrieben:

if result_buy.retcode != mt5.TRADE_RETCODE_DONE:
AttributeError: 'NoneType' Objekt hat kein Attribut 'retcode'

 
IvanDorofeev:

Er schreibt immer noch:

Das Beispiel aus der Hilfe funktioniert.

Im Beispiel meiner Funktion heißt es:

if result_buy.retcode != mt5.TRADE_RETCODE_DONE:
AttributeError: 'NoneType' Objekt hat kein Attribut 'retcode'

Sie haben also result_buy==None, haben den Wert nicht überprüft und versucht, den Retcode von None zu erhalten?

 

Das neue MT5-Terminal Beta zusammen mit dem MetaTrader5 5.0.31 kann nur etwa 7700 Aufrufe von copy_rates_from_pos() verkraften, bevor es den Thread komplett blockiert. Um diesen Fehler zu demonstrieren, habe ich einen Timeout mit asyncio implementiert. Die Zeitüberschreitung funktioniert bei der Steuerung, aber nicht bei copy_rates_from_pos, da der Thread aufgrund des Fehlers komplett einfriert.

import asyncio
import time

import MetaTrader5 as mt5


async def proof_timeout_works_on_blocking_call():
    loop = asyncio.get_running_loop()
    future = loop.run_in_executor(None, time.sleep, 5.0)
    try:
        await asyncio.wait_for(future, timeout=0.5)
    except asyncio.TimeoutError:
        print("Timeout works as expected for blocking calls!")


async def async_copy_rates(*args, timeout):
    loop = asyncio.get_running_loop()
    future = loop.run_in_executor(None, mt5.copy_rates_from_pos, *args)
    try:
        return await asyncio.wait_for(future, timeout=timeout)
    except asyncio.TimeoutError:
        print(f"async_copy_rates timed out")
        print('mql errors =', *mt5.last_error())
        raise


async def async_last_error():
    loop = asyncio.get_running_loop()
    err = await loop.run_in_executor(None, mt5.last_error)
    return err


async def main():
    await proof_timeout_works_on_blocking_call()
    maxbars = mt5.terminal_info().maxbars
    for i in range(1, maxbars):
        r = await async_copy_rates('EURUSD', mt5.TIMEFRAME_M1, 0, i, timeout=0.5)
        if r is not None:
            print(f'{i} -> {len(r)}')


if __name__ == '__main__':
    mt5.initialize()
    print(mt5.__version__)
    asyncio.run(main())
    mt5.shutdown()
 

Auch das Beenden und Neuinitialisieren der Verbindung hilft nicht.

import time

import MetaTrader5 as mt5


def main():
    maxbars = mt5.terminal_info().maxbars
    for i, count in enumerate(range(1000, maxbars), 1):
        for retry in range(5):
            r = mt5.copy_rates_from_pos('EURUSD', mt5.TIMEFRAME_M1, 0, count)
            errno, strerr = mt5.last_error()
            if errno != mt5.RES_S_OK:
                print(strerr)
                print('Reinitialing connection')
                mt5.shutdown()
                time.sleep(1)
                print('Reinitialing connection =', mt5.initialize())
            else:
                print(f"{i} -> {len(r)}")
                break
        else:
            print('maxium retry exceed')
            mt5.shutdown()
            quit()


if __name__ == '__main__':
    mt5.initialize()
    print(mt5.__version__)
    main()
    mt5.shutdown()
 
nicholi shen:

Es gibt einen Fehler in den Kopierraten. Ich habe dies schon mehrmals gepostet, aber niemand hat es zur Kenntnis genommen.

for count in range(maxbars):
    rates = mt5.copy_rates_from_pos('EURUSD', mt5.TIMEFRAME_M1, 0, count)
    errno, strerror = mt5.last_error()
    if errno != mt5.RES_S_OK:
        print(f"Failed on count={count} with strerror={strerror}")
        break

Frage: Wofür ist dieser Zyklus gedacht?

 
Vladimir Perervenko:

Frage: Warum dieser Zyklus?

Ich war immer Fehler anfordern maxbars als "count"-Parameter, so schrieb ich eine einfache Routine, die die Anzahl der Balken auf jeder Iteration als Unit-Test zum Testen der Funktion angefordert wächst. Das sollte ohne Probleme funktionieren, aber da man es nur eine begrenzte Anzahl von Malen aufrufen kann, ist es unzuverlässig.

 
nicholi shen:

Ich habe Fehler erhalten, die maxbars als Parameter "count" anfordern, also habe ich eine einfache Routine geschrieben, die die Anzahl der angeforderten Balken bei jeder Iteration als Unit-Test erhöht, um die Funktion zu testen. Dies sollte ohne Probleme abgeschlossen werden, aber da man es nur eine endliche Anzahl von Malen aufrufen kann, ist es unzuverlässig.

Dieses Problem wurde in Version 5.0.33 behoben, da die Numpy-Arrays nicht automatisch freigegeben wurden.
 
IvanDorofeev:

Still schreibt:

if r.retcode != TRADE_RETCODE_REQUOTE und r.retcode != TRADE_RETCODE_PRICE_OFF:
AttributeError: 'NoneType' Objekt hat kein Attribut 'retcode'


Beispiel aus der Hilfe funktioniert.
Wenn ich ein Beispiel in meiner Funktion anwende, heißt es

if result_buy.retcode != mt5.TRADE_RETCODE_DONE:
AttributeError: 'NoneType' Objekt hat kein Attribut 'retcode'

Update auf 5.0.33, Buy/Close-Skript ist dort behoben, sie werden immer noch Fehler als None zurückgeben, aber jetzt können Sie mt5.last_error() ohne Ausnahme aufrufen und sehen Fehlercode.
 

ckeiderling:

...

Ich habe das gleiche Problem mit mt5.copy_ticks_range () und mt5.copy_rates_range (). Ich muss den Kernel zurücksetzen, um den Speicher zu löschen.

...
Dies wurde in Version 5.0.33 behoben.