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]))
# ifthis 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
#########
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()
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
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.
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.
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.
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.
Still schreibt:
if r.retcode != TRADE_RETCODE_REQUOTE und r.retcode != TRADE_RETCODE_PRICE_OFF:
AttributeError: 'NoneType' Objekt hat kein Attribut 'retcode'
Laufhilfe Beispiel für https://www.mql5.com/ru/docs/integration/python_metatrader5/mt5ordersend_py
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'
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.
Auch das Beenden und Neuinitialisieren der Verbindung hilft nicht.
Es gibt einen Fehler in den Kopierraten. Ich habe dies schon mehrmals gepostet, aber niemand hat es zur Kenntnis genommen.
Frage: Wofür ist dieser Zyklus gedacht?
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.
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.
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'
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.
...