Объект 'NoneType' 'NoneType' не является итерируемым

Я пытаюсь просмотреть список символов, чтобы получить курсы для различных валют через 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)




person Daniel Hill    schedule 29.06.2020    source источник
comment
Ну, rates1 это просто None.   -  person Jan    schedule 29.06.2020
comment
Спасибо, мне не хватало utc_from . rate1 = mt5.copy_rates_from(i, mt5.TIMEFRAME_M1, utc_from, 60)   -  person Daniel Hill    schedule 30.06.2020


Ответы (2)


copy_rates_from возвращает None в случае ошибки. В документации предлагается вызвать last_error(), чтобы узнать, что это за ошибка.

(И нет, я не знаю, почему copy_rates_from просто не вызывает исключение, чтобы указать на ошибку. Судя по всему, модуль представляет собой тонкую оболочку библиотеки C.)

person chepner    schedule 29.06.2020
comment
Спасибо. Я не указал время как UTC. (utc_from,) - person Daniel Hill; 30.06.2020

Я пришел к этому решению, которое создает словарь фреймов данных.

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}
person Daniel Hill    schedule 01.07.2020