【问题标题】:Batch file does not run properly a loop in a python script批处理文件在 python 脚本中的循环中无法正确运行
【发布时间】:2022-01-12 09:56:49
【问题描述】:

我有这个脚本

from ib_insync import *
import pandas as pd
from tqdm import tqdm
    
util.startLoop()
ib = IB()
ib.connect('127.0.0.1', 7497, clientId=1)


data = {'Name': ['AAPL', 'TSLA', 'GOOG', 'NVDA'], 'buy_amount': [10, 10, 10, 10]}  
df = pd.DataFrame(data)  


for i in tqdm(df.index):    
    contract = Stock(df['Name'].iloc[i],exchange='SMART',currency='USD')
    marketOrder = MarketOrder('BUY',df['buy_amount'].iloc[i])
    marketOrder.tif = 'GTC'
    marketOrder = ib.placeOrder(contract, marketOrder)

我正在使用ib_insync 来自动化我的交易。我希望它能够自动完成所有操作。为了自动化,我尝试使用 bat 文件来运行我的脚本。

首先,我可以在 VScode 中毫无问题地运行此脚本。它可以在没有任何问题的情况下下达所有订单。但是,当我使用 bat 文件或在 VScode 之外运行此脚本(在 Windows 资源管理器上双击 py 脚本)时,它不会下所有订单,只有第一个订单(即 AAPL)。这意味着该循环仅在我使用 VScode 运行时才有效。我不使用虚拟环境,因此这应该不是问题。我无法确定问题的原因,非常感谢任何帮助

【问题讨论】:

  • 是否有任何异常可见?您是否尝试将您的代码段“框定”成单独的防异常、异常的自我报告代码段以帮助解决根本原因?
  • @user3666197 不,我看不到任何异常。我尝试在 bat 文件末尾使用暂停,但终端在下第一个订单后关闭。据我了解,当我在 bat 文件末尾使用暂停时,终端不应关闭。我还没有尝试“框架”我的代码,因为我还不知道该怎么做。但这将是我现在学习的第一件事
  • 在你自己启动的终端中运行.bat文件
  • @rioV8 好的,谢谢,我尝试了您的建议,现在它不会自动关闭。我还使用了user3666197提供的代码,报告显示一切正常,但它仍然只发送带有.bat文件的第一个订单。完全相同的代码就像 VScode 的魅力一样
  • 什么是使用pandas的原因一个简单的带有元组的列表就足够了

标签: python batch-file visual-studio-code algorithmic-trading interactive-brokers


【解决方案1】:

如上所述,

"@user3666197 不,我看不到任何异常。我尝试在 bat 文件末尾使用暂停,但终端在下第一个订单后关闭。据我了解,终端不应关闭当我在 bat 文件末尾使用暂停时。我还没有尝试“框架”我的代码,因为我还不知道该怎么做。但这将是我现在学习的第一件事 - Bogdan Titomir "

这个临时代码可能有助于追查根本原因:


###################################### "fused"-section under review
try:
       ...code...

except aKnownAndExpectedExcREASON:
       ... a handled case ...

except:
      ... a not expected, yet happened EXC ...
      print ( "EXC: this happened in ...code... Check why ... " )

finally:
      print ( "INF: going to next section " )

###################################### 

这个微不足道的“框架”可以帮助您在必要时和必要时查看、停止和诊断所有细节

...
#______________________________________ a risky step, so fused here
try:
     util.startLoop()
     print ( "INF: ok... " )

except:
     print ( "EXC: ..." )
     # pause

finally:
     pass
#______________________________________ a risky step, so fused here
try:
     ib = IB()
     ib.connect( '127.0.0.1',
                  7497,
                  clientId = 1 )
     print ( "INF: ok... " )

except:
     print ( "EXC: ..." )
     # pause

finally:
     pass
 
data = { 'Name':       ['AAPL', 'TSLA', 'GOOG', 'NVDA'],
         'buy_amount': [10, 10, 10, 10]
          }
df = pd.DataFrame(data)  


for i in tqdm(df.index):    
    contract    = Stock( df['Name'].iloc[i],
                         exchange = 'SMART',
                         currency = 'USD'
                         )
    marketOrder = MarketOrder( 'BUY', df['buy_amount'].iloc[i] )
    marketOrder.tif = 'GTC'

    #__________________________________ a risky step, so fused here
    try:
          marketOrder = ib.placeOrder( contract, marketOrder )
          print ( "INF: ok... ", i )

    except:
          print ( "EXC: ..." )
          # pause
    finally:
          pass


谢谢,当我在 VScode 中运行您的代码时,我得到了这个
INF:好的... INF:好的... 100%|██████████| 4/4 [00:00我可以在我的 bat 文件中看到相同的结果。Bogdan Titomir

很酷,
这意味着你已经毫无问题地发送了所有 -4- ib.placeOrder() 呼叫,即 AAPLTSLAGOOGNVDA 呼叫
--
Q.E.D.

在操作系统生成的 python-interpreter 中添加暂停并启动它(可能还打印版本详细信息)将完成其余的工作。

【讨论】:

  • 谢谢,当我在 VScode 中运行您的代码时,我得到这个 INF:好的... INF:好的... 100%|██████████| 4/4 [00:00
  • 很酷,这意味着您已经毫无问题地发送了所有 -4- ib.palceOrder() 调用,即 AAPL、TSLA、GOOG、NVDA 调用中的任何一个 - Q.E.D. 在 O/S 生成的 python 解释器中添加暂停并启动它(可能还打印版本详细信息)将完成其余的工作 - G/L on this & Happy Trading ๛
  • 我无法编辑之前的评论。虽然我的 bat 文件报告说一切正常,但它仍然只发送第一个订单,而如果我使用 Vscode 运行您的代码,脚本会放置所有订单
  • 谢谢,“O/S-spawned python-interpreter”是什么意思?
  • 这意味着任何启动代码的方式,而不使用 VScode --- a) 带有命令行的终端 b) ipython 生态系统 c) 任何 REPL 可用的 python 控制台 + d)一旦用户双击 .py 文件(在这里,我们需要对上述所有暂停进行实际编程,以便工作和暂停代码解释的流程,否则将没有时间阅读 O/P 中反对的特定于异常的详细信息
猜你喜欢
  • 1970-01-01
  • 2011-06-07
  • 2019-12-06
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
相关资源
最近更新 更多