'NoneType''NoneType'对象不可迭代

时间:2020-06-29 18:14:49

标签: python pandas metatrader5

我正在尝试遍历符号列表,以通过mt5获取各种货币的汇率。我使用下面的代码,但出现TypeError

     d[i] = [y.close for y in rates1]

TypeError:“ NoneType”对象不可迭代

我看不到哪里出错了,我想使用这种结构来循环创建多个数据帧,然后使用相同的循环对所有对和时间进行大的多重索引。我没写太久。

sym = ['GBPUSD','USDJPY','USDCHF','AUDUSD','GBPJPY']

# Copying data to dataframe
d = pd.DataFrame()
for i in sym:
     rates1 = mt5.copy_rates_from(i, mt5.TIMEFRAME_M1, 5)
     d[i] = [y.close for y in rates1]

# -*- coding: utf-8 -*-
"""
Created on Mon Jun 29 18:38:11 2020

@author: DanPc
"""

# -*- coding: utf-8 -*-
"""

"""

import pytz
import pandas as pd
import MetaTrader5 as mt5
import time
from datetime import datetime
from threading import Timer
import talib
import numpy as np
import matplotlib as plt
from multiprocessing import Process
import sys


server_name = "" ENTER DETAILS HERE
server_num = 
password = ""



#------------------------------------------------------------------------------
def actualtime():
    # datetime object containing current date and time
    now = datetime.now()
    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
    #print("date and time =", dt_string)
    return str(dt_string)
#------------------------------------------------------------------------------
def sync_60sec(op):

    info_time_new = datetime.strptime(str(actualtime()), '%d/%m/%Y %H:%M:%S')
    waiting_time = 60 - info_time_new.second

    t = Timer(waiting_time, op)
    t.start()

    print(actualtime)
#------------------------------------------------------------------------------
def program(symbol):
    if not mt5.initialize(login=server_num, server=server_name, password=password):
        print("initialize() failed, error code =",mt5.last_error())
        quit()

    timezone = pytz.timezone("Etc/UTC")
    utc_from = datetime.now()

    ######### Change here the timeframe 525600
  
    
   # Create currency watchlist for which correlation matrix is to be plotted
sym = ['GBPUSD','USDJPY','USDCHF','AUDUSD','GBPJPY']

# Copying data to dataframe
d = pd.DataFrame()
for i in sym:
     rates1 = mt5.copy_rates_from(i, mt5.TIMEFRAME_M1, 5)
     d[i] = [y.close for y in rates1]
    
    
print(rates1)
    
mt5.shutdown()

  
if not mt5.initialize():
        print("initialize() failed, error code =",mt5.last_error())
        quit()

         
# starting mt5
if not mt5.initialize(login=server_num, server=server_name, password=password):
    print("initialize() failed, error code =",mt5.last_error())
    quit()          
#------------------------------------------------------------------------------
#                   S T A R T I N G   M T 5 
#------------------------------------------------------------------------------
authorized=mt5.login(server_num, password=password)
if authorized:
    account_info=mt5.account_info()
    if account_info!=None:       
        account_info_dict = mt5.account_info()._asdict()
        df=pd.DataFrame(list(account_info_dict.items()),columns=['property','value'])
        print("account_info() as dataframe:")
        print(df)
else:
    print(mt5.last_error)

mt5.shutdown()
#------------------------------------------------------------------------------

def trading_bot():
    symbol_1 = 'EURUSD'
    symbol_2 = 'EURCAD'
    while True:
        program(symbol_1)
        program(symbol_2)
        time.sleep(59.8) # it depends on your computer and ping

sync_60sec(trading_bot)



2 个答案:

答案 0 :(得分:0)

如果出现错误,

copy_rates_from返回None。该文档建议致电last_error()找出错误所在。

(不,我不知道为什么copy_rates_from不仅会引发异常来指示错误。显然,该模块是C库的瘦包装。)

答案 1 :(得分:0)

我来到了创建数据帧字典的解决方案。

sym = ["GBPUSD","USDJPY","USDCHF","AUDUSD","GBPJPY"]


# Copying data to dataframe

utc_from = datetime.now()
for i in sym:
  rates = {i:pd.DataFrame(mt5.copy_rates_from(i, mt5.TIMEFRAME_M1, utc_from , 60), 
                 columns=['time', 'open', 'low', 'high', 'close', 'tick_volume', 'spread', 'real_volume']) for i in sym}