MetaTrader 5 Python Kullanıcı Grubu - Metatrader'da Python nasıl kullanılır - sayfa 66

 
Vladimir Karputov :

Ve mevcut fiyatlar (Teklif ve Talep) neydi? Dondurma seviyesi neydi (SYMBOL_TRADE_FREEZE_LEVEL)?

DONDURMA seviyeleri hakkında emin değil misiniz?

Şortlarım için alış ve teklif fiyatım için satış fiyatı kullanılıyor.

Şimdi sl ve tp'mi kodlamayı denedim.

Sadece saatlerce mükemmel bir şekilde Alıp Satacak ve sonra duracak olması garip.

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 :

Hala yazıyor:

r.retcode != TRADE_RETCODE_REQUOTE ve r.retcode != TRADE_RETCODE_PRICE_OFF ise:
AttributeError: 'NoneType' nesnesinin 'retcode' özniteliği yok


Raşid Umarov :
https://www.mql5.com/ru/docs/integration/python_metatrader5/mt5ordersend_py için yardımdaki örneği çalıştırın

Yardım örneği çalışıyor.
Örneği işlevimde uyguluyorum, şöyle yazıyor:

sonuç_buy.retcode != mt5.TRADE_RETCODE_DONE ise:
AttributeError: 'NoneType' nesnesinin 'retcode' özniteliği yok

 
IvanDorofeev :

Hala yazıyor:

Yardım örneği çalışıyor.

Örneği işlevimde uyguluyorum, şöyle yazıyor:

eğer sonuç_buy.retcode ! = mt5.TRADE_RETCODE_DONE:
AttributeError: 'NoneType' nesnesinin 'retcode' özniteliği yok

Sonuç_buy==Yok oldunuz, değeri kontrol etmediniz ve Yok'tan yeniden kod almaya mı çalıştınız?

 

MetaTrader5 5.0.31 ile birlikte yeni MT5-terminal beta, iş parçacığını tamamen kilitlemeden önce copy_rates_from_pos() için yalnızca ~7700 çağrıyı sürdürebilir. Bu hatayı göstermek için asyncio kullanarak bir zaman aşımı uyguladım. Zaman aşımı kontrol üzerinde çalışır, ancak iş parçacığı hata nedeniyle tamamen donduğu için copy_rates_from_pos için çalışmaz.

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

Bağlantıyı kapatıp yeniden başlatmak bile yardımcı olmuyor.

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 :

Kopya oranlarında bir hata var. Bunu birkaç kez yazdım ama kimse kabul etmedi.

 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

Soru: Neden bu döngü?

 
Vladimir Perervenko :

Soru: Neden bu döngü?

"count" parametresi olarak maxbars talep eden hatalar alıyordum, bu yüzden fonksiyonu test etmek için birim testi olarak her yinelemede istenen bar sayısını artıran basit bir rutin yazdım. Bu sorunsuz bir şekilde tamamlanmalıdır, ancak buna yalnızca sınırlı sayıda diyebileceğiniz göz önüne alındığında, onu güvenilmez hale getirir.

 
nicholi shen :

"count" parametresi olarak maxbars talep eden hatalar alıyordum, bu yüzden fonksiyonu test etmek için birim testi olarak her yinelemede istenen bar sayısını artıran basit bir rutin yazdım. Bu sorunsuz bir şekilde tamamlanmalıdır, ancak buna yalnızca sınırlı sayıda diyebileceğiniz göz önüne alındığında, onu güvenilmez hale getirir.

Bu sorun 5.0.33'te düzeltildi, numpy dizilerinin otomatik olarak serbest bırakılmamasıyla ilgiliydi.
 
IvanDorofeev :

Hala yazıyor:

r.retcode != TRADE_RETCODE_REQUOTE ve r.retcode != TRADE_RETCODE_PRICE_OFF ise:
AttributeError: 'NoneType' nesnesinin 'retcode' özniteliği yok


Yardım örneği çalışıyor.
Örneği işlevimde uyguluyorum, şöyle yazıyor:

sonuç_buy.retcode != mt5.TRADE_RETCODE_DONE ise:
AttributeError: 'NoneType' nesnesinin 'retcode' özniteliği yok

5.0.33'e güncelleyin, Buy/Close betiği orada düzeltildi, yine de Yok olarak bir hata döndürecekler, ancak şimdi istisnasız mt5.last_error()'ı çağırabilir ve hata kodunu görebilirsiniz.
 

ckeiderling :

...

Aynı sorunu mt5.copy_ticks_range() ve mt5.copy_rates_range() kullanarak da alıyorum. Belleği temizlemek için çekirdeği sıfırlamam gerekiyor.

...
Bu 5.0.33'te düzeltildi
Neden: