MetaTrader 5 Python 사용자 그룹 - Metatrader에서 Python을 사용하는 방법 - 페이지 66

 
Vladimir Karputov :

그리고 현재 가격 (입찰 및 매도)은 얼마였습니까? 동결 수준(SYMBOL_TRADE_FREEZE_LEVEL)은 무엇이었습니까?

FREEZE 레벨이 확실하지 않습니까?

매도호가는 내 반바지에 대한 매수 및 입찰가에 사용됩니다.

나는 지금 내 sl과 tp를 하드 코딩하려고 시도했습니다.

몇 시간 동안 완벽하게 사고 팔고 멈추는 것이 이상합니다.

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 :

여전히 다음과 같이 씁니다.

r.retcode != TRADE_RETCODE_REQUOTE 및 r.retcode != TRADE_RETCODE_PRICE_OFF인 경우:
AttributeError: 'NoneType' 개체에 'retcode' 속성이 없습니다.


라시드 우마로프 :
https://www.mql5.com/ru/docs/integration/python_metatrader5/mt5ordersend_py 에 대한 도움말에서 예제를 실행합니다.

도움말 예제가 작동합니다.
내 기능에 예제를 적용하고 다음과 같이 씁니다.

result_buy.retcode != mt5.TRADE_RETCODE_DONE인 경우:
AttributeError: 'NoneType' 개체에 'retcode' 속성이 없습니다.

 
IvanDorofeev :

여전히 다음과 같이 씁니다.

도움말 예제가 작동합니다.

내 기능에 예제를 적용하고 다음과 같이 씁니다.

만약 result_buy.retcode ! = mt5.TRADE_RETCODE_DONE:
AttributeError: 'NoneType' 개체에 'retcode' 속성이 없습니다.

그래서 result_buy==None을 얻었고 값을 확인하지 않았고 None에서 retcode를 얻으려고 했습니까?

 

MetaTrader5 5.0.31과 함께 새로운 MT5 터미널 베타는 스레드를 완전히 잠그기 전에 copy_rates_from_pos() 에 대한 약 7700번의 호출만 유지할 수 있습니다. 이 버그를 시연하기 위해 asyncio를 사용하여 타임아웃을 구현했습니다. 타임아웃은 컨트롤에서 작동하지만 버그로 인해 스레드가 완전히 정지되기 때문에 copy_rates_from_pos에서는 작동하지 않습니다.

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

연결을 종료하고 다시 초기화해도 도움이 되지 않습니다.

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 :

복사율에 버그가 있습니다. 나는 이것을 여러 번 올렸지만 아무도 그것을 인정하지 않았습니다.

 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

질문: 왜 이 주기를 사용합니까?

 
Vladimir Perervenko :

질문: 왜 이 주기를 사용합니까?

maxbars를 "count" 매개변수로 요청하는 데 실패했기 때문에 함수 를 테스트하기 위한 단위 테스트로 각 반복에서 요청된 막대 수를 늘리는 간단한 루틴을 작성했습니다. 이것은 문제 없이 완료되어야 하지만 제한된 횟수만 호출할 수 있다는 점을 감안하면 신뢰할 수 없습니다.

 
nicholi shen :

maxbars를 "count" 매개변수로 요청하는 데 실패했기 때문에 함수 를 테스트하기 위한 단위 테스트로 각 반복에서 요청된 막대 수를 늘리는 간단한 루틴을 작성했습니다. 이것은 문제 없이 완료되어야 하지만 제한된 횟수만 호출할 수 있다는 점을 감안하면 신뢰할 수 없습니다.

이 문제는 5.0.33에서 수정되었으며 numpy 배열을 자동으로 해제하지 않는 것과 관련이 있습니다.
 
IvanDorofeev :

여전히 다음과 같이 씁니다.

r.retcode != TRADE_RETCODE_REQUOTE 및 r.retcode != TRADE_RETCODE_PRICE_OFF인 경우:
AttributeError: 'NoneType' 개체에 'retcode' 속성이 없습니다.


도움말 예제가 작동합니다.
내 기능에 예제를 적용하고 다음과 같이 씁니다.

result_buy.retcode != mt5.TRADE_RETCODE_DONE인 경우:
AttributeError: 'NoneType' 개체에 'retcode' 속성이 없습니다.

5.0.33으로 업데이트하면 구매/닫기 스크립트가 수정되어 여전히 오류가 없음으로 반환되지만 이제 예외 없이 mt5.last_error()를 호출 하고 오류 코드 를 볼 수 있습니다.
 

ckeiderling :

...

mt5.copy_ticks_range() 및 mt5.copy_rates_range()를 사용하여 동일한 문제가 발생합니다. 메모리를 지우려면 커널을 재설정해야 합니다.

...
이것은 5.0.33에서 수정되었습니다.