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

'NoneType' 'NoneType' object is not iterable

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

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

类型错误:'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)



copy_rates_fromreturnsNone如果有错误。文档建议调用 last_error() 找出错误是什么。

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

我找到了这个创建数据框字典的解决方案。

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}