找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 595|回复: 1

[技术讨论] [分享]Powershell基金实时涨跌及盈利数据查看15秒刷新一次

[复制链接]
发表于 2026-2-10 13:55:01 | 显示全部楼层 |阅读模式
本帖最后由 yakeyun 于 2026-2-10 13:56 编辑



可以通过“# 基金配置”里面的信息来添加自己的持有信息,等号左边是数字代码,右边是持有金额。预估金额每天相差出入比较少,默认自动15秒刷新一次。
  1. # 简化版基金监控GUI(A股风格:上涨红色,下跌绿色)- 优化显示格式
  2. # 文件名: SimpleFundMonitorGUI_AStockStyle_Optimized.ps1

  3. Add-Type -AssemblyName System.Windows.Forms
  4. Add-Type -AssemblyName System.Drawing

  5. # 基金配置
  6. $fundConfig = @{
  7.     "012734" = 39023
  8.     "026360" = 9948
  9.     "018099" = 31
  10.     "015839" = 6177
  11.     "161226" = 641
  12.     "017811" = 10354
  13.     "002207" = 6859
  14.     "016981" = 1003
  15.     "024663" = 38165
  16.     "016874" = 86
  17.     "003134" = 30
  18. }

  19. # 全局变量
  20. $timer = $null
  21. $isMonitoring = $false

  22. # 创建主窗体
  23. $form = New-Object System.Windows.Forms.Form
  24. $form.Text = "基金监控系统 (A股风格: 涨红跌绿)"
  25. $form.Size = New-Object System.Drawing.Size(1100, 600)  # 增加宽度
  26. $form.StartPosition = "CenterScreen"

  27. # 创建RichTextBox显示结果(支持彩色文本)
  28. $richTextBox = New-Object System.Windows.Forms.RichTextBox
  29. $richTextBox.Location = New-Object System.Drawing.Point(10, 10)
  30. $richTextBox.Size = New-Object System.Drawing.Size(1060, 450)  # 增加高度
  31. $richTextBox.Multiline = $true
  32. $richTextBox.ScrollBars = "Vertical"
  33. $richTextBox.Font = New-Object System.Drawing.Font("Consolas", 10)
  34. $richTextBox.ReadOnly = $true
  35. $richTextBox.BackColor = [System.Drawing.Color]::FromArgb(240, 240, 240)
  36. $richTextBox.WordWrap = $false  # 禁用自动换行

  37. # 控制按钮
  38. $startButton = New-Object System.Windows.Forms.Button
  39. $startButton.Location = New-Object System.Drawing.Point(10, 470)
  40. $startButton.Size = New-Object System.Drawing.Size(80, 30)
  41. $startButton.Text = "开始监控"

  42. $stopButton = New-Object System.Windows.Forms.Button
  43. $stopButton.Location = New-Object System.Drawing.Point(100, 470)
  44. $stopButton.Size = New-Object System.Drawing.Size(80, 30)
  45. $stopButton.Text = "停止监控"
  46. $stopButton.Enabled = $false

  47. $refreshButton = New-Object System.Windows.Forms.Button
  48. $refreshButton.Location = New-Object System.Drawing.Point(190, 470)
  49. $refreshButton.Size = New-Object System.Drawing.Size(80, 30)
  50. $refreshButton.Text = "立即刷新"

  51. # 刷新间隔设置
  52. $intervalLabel = New-Object System.Windows.Forms.Label
  53. $intervalLabel.Location = New-Object System.Drawing.Point(280, 475)
  54. $intervalLabel.Size = New-Object System.Drawing.Size(80, 20)
  55. $intervalLabel.Text = "刷新间隔(秒):"

  56. $intervalNumeric = New-Object System.Windows.Forms.NumericUpDown
  57. $intervalNumeric.Location = New-Object System.Drawing.Point(370, 470)
  58. $intervalNumeric.Size = New-Object System.Drawing.Size(60, 20)
  59. $intervalNumeric.Value = 15
  60. $intervalNumeric.Minimum = 5
  61. $intervalNumeric.Maximum = 3600

  62. # 状态标签
  63. $statusLabel = New-Object System.Windows.Forms.Label
  64. $statusLabel.Location = New-Object System.Drawing.Point(10, 510)
  65. $statusLabel.Size = New-Object System.Drawing.Size(500, 20)
  66. $statusLabel.Text = "就绪 - 点击'开始监控'按钮启动自动刷新"

  67. # 添加说明标签
  68. $infoLabel = New-Object System.Windows.Forms.Label
  69. $infoLabel.Location = New-Object System.Drawing.Point(10, 535)
  70. $infoLabel.Size = New-Object System.Drawing.Size(500, 20)
  71. $infoLabel.Text = "颜色说明: 上涨/盈利(红色)  下跌/亏损(绿色)"

  72. # 添加控件
  73. $form.Controls.Add($richTextBox)
  74. $form.Controls.Add($startButton)
  75. $form.Controls.Add($stopButton)
  76. $form.Controls.Add($refreshButton)
  77. $form.Controls.Add($intervalLabel)
  78. $form.Controls.Add($intervalNumeric)
  79. $form.Controls.Add($statusLabel)
  80. $form.Controls.Add($infoLabel)

  81. # 简化的数据获取函数
  82. function Get-SimpleFundData {
  83.     param([string]$FundCode)
  84.    
  85.     try {
  86.         # 使用多个备选数据源
  87.         $urls = @(
  88.             "http://fundgz.1234567.com.cn/js/${FundCode}.js",  # 天天基金
  89.             "http://api.fund.eastmoney.com/f10/lsjz?fundCode=${FundCode}&pageIndex=1"  # 东方财富
  90.         )
  91.         
  92.         foreach ($url in $urls) {
  93.             try {
  94.                 $webClient = New-Object System.Net.WebClient
  95.                 $webClient.Encoding = [System.Text.Encoding]::UTF8
  96.                 $webClient.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
  97.                 $response = $webClient.DownloadString($url)
  98.                
  99.                 # 尝试解析天天基金格式
  100.                 if ($response -match 'jsonpgz\((.+)\)') {
  101.                     $jsonStr = $matches[1]
  102.                     
  103.                     try {
  104.                         $fundInfo = $jsonStr | ConvertFrom-Json
  105.                         
  106.                         return @{
  107.                             Name = $fundInfo.name
  108.                             NetValue = [decimal]$fundInfo.dwjz
  109.                             ChangeRate = [decimal]$fundInfo.gszzl
  110.                             Time = $fundInfo.gztime
  111.                         }
  112.                     }
  113.                     catch {
  114.                         # 如果ConvertFrom-Json失败,使用正则解析
  115.                         if ($jsonStr -match '"name":"([^"]+)".*"dwjz":"([^"]+)".*"gszzl":"([^"]+)"') {
  116.                             $name = $matches[1]
  117.                             $dwjz = [decimal]$matches[2]
  118.                             $gszzl = [decimal]$matches[3]
  119.                            
  120.                             return @{
  121.                                 Name = $name
  122.                                 NetValue = $dwjz
  123.                                 ChangeRate = $gszzl
  124.                                 Time = (Get-Date -Format "HH:mm")
  125.                             }
  126.                         }
  127.                     }
  128.                 }
  129.             }
  130.             catch {
  131.                 # 尝试下一个URL
  132.                 continue
  133.             }
  134.         }
  135.     }
  136.     catch {
  137.         Write-Verbose "获取基金数据失败: $FundCode"
  138.     }
  139.    
  140.     return $null
  141. }

  142. # 添加彩色文本到RichTextBox
  143. function Add-ColoredText {
  144.     param(
  145.         [string]$Text,
  146.         [System.Drawing.Color]$Color = [System.Drawing.Color]::Black
  147.     )
  148.    
  149.     $richTextBox.SelectionStart = $richTextBox.TextLength
  150.     $richTextBox.SelectionLength = 0
  151.     $richTextBox.SelectionColor = $Color
  152.     $richTextBox.AppendText($Text)
  153.     $richTextBox.SelectionColor = $richTextBox.ForeColor
  154. }

  155. # 更新显示(优化格式:将名称放到最后)
  156. function Update-Display {
  157.     $statusLabel.Text = "正在更新数据..."
  158.     $form.Refresh()
  159.    
  160.     # 清空文本框
  161.     $richTextBox.Clear()
  162.    
  163.     # 添加标题
  164.     Add-ColoredText "基金实时监控 (A股风格: 涨红跌绿)`r`n" ([System.Drawing.Color]::Blue)
  165.     Add-ColoredText "更新时间: " ([System.Drawing.Color]::Black)
  166.     Add-ColoredText ((Get-Date -Format "yyyy-MM-dd HH:mm:ss") + "`r`n") ([System.Drawing.Color]::DarkBlue)
  167.    
  168.     # 添加分隔线
  169.     $separatorLine = "".PadRight(100, "=")
  170.     Add-ColoredText ($separatorLine + "`r`n") ([System.Drawing.Color]::Gray)
  171.    
  172.     # 添加表头(将名称放到最后一列)
  173.     $header = "{0,-8} {1,-10} {2,-12} {3,-12} {4,-12} {5,-10} {6,-30}`r`n" -f
  174.         "代码", "净值", "涨跌幅", "持有金额", "日收益", "时间", "基金名称"
  175.    
  176.     Add-ColoredText $header ([System.Drawing.Color]::DarkBlue)
  177.    
  178.     # 添加表头分隔线
  179.     $headerSeparator = "".PadRight(100, "-")
  180.     Add-ColoredText ($headerSeparator + "`r`n") ([System.Drawing.Color]::Gray)
  181.    
  182.     $totalInvest = 0
  183.     $totalEarnings = 0
  184.     $successCount = 0
  185.    
  186.     # 处理每只基金
  187.     foreach ($fund in $fundConfig.GetEnumerator()) {
  188.         $data = Get-SimpleFundData -FundCode $fund.Key
  189.         
  190.         if ($data) {
  191.             $dailyEarnings = [math]::Round($fund.Value * ($data.ChangeRate / 100), 2)
  192.             
  193.             # A股风格颜色:上涨红色,下跌绿色
  194.             $changeColor = if ($data.ChangeRate -ge 0) {
  195.                 [System.Drawing.Color]::Red  # 上涨用红色
  196.             } else {
  197.                 [System.Drawing.Color]::Green  # 下跌用绿色
  198.             }
  199.             
  200.             $earningsColor = if ($dailyEarnings -ge 0) {
  201.                 [System.Drawing.Color]::Red  # 盈利用红色
  202.             } else {
  203.                 [System.Drawing.Color]::Green  # 亏损用绿色
  204.             }
  205.             
  206.             # 添加基金代码(黑色)
  207.             $linePart1 = "{0,-8} " -f $fund.Key
  208.             Add-ColoredText $linePart1 ([System.Drawing.Color]::Black)
  209.             
  210.             # 添加净值(黑色)
  211.             $linePart2 = "{0,-10:N4} " -f $data.NetValue
  212.             Add-ColoredText $linePart2 ([System.Drawing.Color]::Black)
  213.             
  214.             # 添加涨跌幅(A股风格彩色)
  215.             $changeSymbol = if ($data.ChangeRate -ge 0) { "+" } else { "" }
  216.             $changeText = "$changeSymbol$($data.ChangeRate.ToString('N2'))%"
  217.             $linePart3 = "{0,-12}" -f $changeText
  218.             Add-ColoredText $linePart3 $changeColor
  219.             
  220.             # 添加持有金额(黑色)
  221.             $linePart4 = "{0,-12:N2} " -f $fund.Value
  222.             Add-ColoredText $linePart4 ([System.Drawing.Color]::Black)
  223.             
  224.             # 添加日收益(A股风格彩色)
  225.             $earningsSymbol = if ($dailyEarnings -ge 0) { "+" } else { "" }
  226.             $earningsText = "$earningsSymbol$($dailyEarnings.ToString('N2'))"
  227.             $linePart5 = "{0,-12}" -f $earningsText
  228.             Add-ColoredText $linePart5 $earningsColor
  229.             
  230.             # 添加时间(黑色)
  231.             $linePart6 = "{0,-10} " -f $data.Time
  232.             Add-ColoredText $linePart6 ([System.Drawing.Color]::Black)
  233.          
复制代码

评分

参与人数 1PB +6 技术 +1 收起 理由
老刘1号 + 6 + 1 感谢分享

查看全部评分

 楼主| 发表于 2026-2-10 13:55:22 | 显示全部楼层
  1.   
  2.             # 添加基金名称(黑色)- 放在最后一列
  3.             $fundName = if ($data.Name.Length -gt 30) {
  4.                 $data.Name.Substring(0, 27) + "..."
  5.             } else {
  6.                 $data.Name
  7.             }
  8.             $linePart7 = "{0,-30}`r`n" -f $fundName
  9.             Add-ColoredText $linePart7 ([System.Drawing.Color]::Black)
  10.             
  11.             $totalInvest += $fund.Value
  12.             $totalEarnings += $dailyEarnings
  13.             $successCount++
  14.         }
  15.         else {
  16.             # 获取失败的情况(灰色显示)
  17.             $line = "{0,-8} {1,-10} {2,-12} {3,-12:N2} {4,-12} {5,-10} {6,-30}`r`n" -f
  18.                 $fund.Key, "N/A", "N/A", $fund.Value, "N/A", "N/A", "获取失败"
  19.             
  20.             Add-ColoredText $line ([System.Drawing.Color]::Gray)
  21.         }
  22.         
  23.         # 短暂延迟,避免请求过快
  24.         Start-Sleep -Milliseconds 200
  25.     }
  26.    
  27.     # 添加总计分隔线
  28.     Add-ColoredText ("".PadRight(100, "=") + "`r`n") ([System.Drawing.Color]::Gray)
  29.    
  30.     # 添加总计行
  31.     $totalLinePart1 = "{0,-8} " -f "总计"
  32.     Add-ColoredText $totalLinePart1 ([System.Drawing.Color]::DarkBlue)
  33.    
  34.     $totalLinePart2 = "{0,-10} " -f ""
  35.     Add-ColoredText $totalLinePart2 ([System.Drawing.Color]::DarkBlue)
  36.    
  37.     $totalLinePart3 = "{0,-12} " -f ""
  38.     Add-ColoredText $totalLinePart3 ([System.Drawing.Color]::DarkBlue)
  39.    
  40.     $totalLinePart4 = "{0,-12:N2} " -f $totalInvest
  41.     Add-ColoredText $totalLinePart4 ([System.Drawing.Color]::DarkBlue)
  42.    
  43.     # 总计收益颜色(A股风格)
  44.     $totalEarningsColor = if ($totalEarnings -ge 0) {
  45.         [System.Drawing.Color]::Red  # 总盈利红色
  46.     } else {
  47.         [System.Drawing.Color]::Green  # 总亏损绿色
  48.     }
  49.    
  50.     $totalEarningsSymbol = if ($totalEarnings -ge 0) { "+" } else { "" }
  51.     $totalEarningsText = "$totalEarningsSymbol$($totalEarnings.ToString('N2'))"
  52.     $totalLinePart5 = "{0,-12}" -f $totalEarningsText
  53.     Add-ColoredText $totalLinePart5 $totalEarningsColor
  54.    
  55.     $totalLinePart6 = "{0,-10} " -f (Get-Date -Format "HH:mm:ss")
  56.     Add-ColoredText $totalLinePart6 ([System.Drawing.Color]::DarkBlue)
  57.    
  58.     $totalLinePart7 = "{0,-30}`r`n" -f "合计"
  59.     Add-ColoredText $totalLinePart7 ([System.Drawing.Color]::DarkBlue)
  60.    
  61.     # 添加统计信息
  62.     Add-ColoredText "`r`n" ([System.Drawing.Color]::Black)
  63.    
  64.     # 统计行1
  65.     $statsLine1 = "数据统计: 成功获取 {0}/{1} 只基金数据" -f $successCount, $fundConfig.Count
  66.     Add-ColoredText $statsLine1 ([System.Drawing.Color]::DarkBlue)
  67.    
  68.     # 统计行2
  69.     Add-ColoredText " | 总投入: " ([System.Drawing.Color]::Black)
  70.     Add-ColoredText ("{0:N2}" -f $totalInvest) ([System.Drawing.Color]::DarkBlue)
  71.    
  72.     Add-ColoredText " | 今日收益: " ([System.Drawing.Color]::Black)
  73.     if ($totalEarnings -ge 0) {
  74.         Add-ColoredText ("+" + "{0:N2}" -f $totalEarnings) ([System.Drawing.Color]::Red)
  75.     } else {
  76.         Add-ColoredText ("{0:N2}" -f $totalEarnings) ([System.Drawing.Color]::Green)
  77.     }
  78.    
  79.     # 统计行3 - 收益率
  80.     if ($totalInvest -gt 0) {
  81.         $totalReturnRate = [math]::Round(($totalEarnings / $totalInvest) * 100, 4)
  82.         Add-ColoredText " | 今日收益率: " ([System.Drawing.Color]::Black)
  83.         if ($totalReturnRate -ge 0) {
  84.             Add-ColoredText ("+" + "{0:N4}%" -f $totalReturnRate) ([System.Drawing.Color]::Red)
  85.         } else {
  86.             Add-ColoredText ("{0:N4}%" -f $totalReturnRate) ([System.Drawing.Color]::Green)
  87.         }
  88.     }
  89.    
  90.     Add-ColoredText "`r`n" ([System.Drawing.Color]::Black)
  91.    
  92.     # 滚动到顶部
  93.     $richTextBox.SelectionStart = 0
  94.     $richTextBox.ScrollToCaret()
  95.    
  96.     $statusLabel.Text = "最后更新: " + (Get-Date -Format "HH:mm:ss") + " | 下次更新: " + (Get-Date).AddSeconds($intervalNumeric.Value).ToString("HH:mm:ss")
  97. }

  98. # 开始监控
  99. function Start-Monitoring {
  100.     $script:isMonitoring = $true
  101.     $startButton.Enabled = $false
  102.     $stopButton.Enabled = $true
  103.    
  104.     # 创建定时器
  105.     $script:timer = New-Object System.Windows.Forms.Timer
  106.     $script:timer.Interval = $intervalNumeric.Value * 1000  # 转换为毫秒
  107.    
  108.     $script:timer.Add_Tick({
  109.         Update-Display
  110.     })
  111.    
  112.     $script:timer.Start()
  113.    
  114.     # 立即执行一次更新
  115.     Update-Display
  116.     $statusLabel.Text = "监控中... 间隔: " + $intervalNumeric.Value + "秒"
  117. }

  118. # 停止监控
  119. function Stop-Monitoring {
  120.     if ($script:timer) {
  121.         $script:timer.Stop()
  122.         $script:timer.Dispose()
  123.         $script:timer = $null
  124.     }
  125.    
  126.     $script:isMonitoring = $false
  127.     $startButton.Enabled = $true
  128.     $stopButton.Enabled = $false
  129.     $statusLabel.Text = "监控已停止"
  130. }

  131. # 事件处理
  132. $startButton.Add_Click({
  133.     Start-Monitoring
  134. })

  135. $stopButton.Add_Click({
  136.     Stop-Monitoring
  137. })

  138. $refreshButton.Add_Click({
  139.     Update-Display
  140. })

  141. # 刷新间隔改变时更新定时器
  142. $intervalNumeric.Add_ValueChanged({
  143.     if ($isMonitoring) {
  144.         Stop-Monitoring
  145.         Start-Monitoring
  146.     }
  147. })

  148. # 窗体关闭事件
  149. $form.Add_FormClosing({
  150.     Stop-Monitoring
  151. })

  152. # 显示窗体
  153. Write-Host "基金监控系统已启动 (A股风格: 涨红跌绿)" -ForegroundColor Cyan
  154. Write-Host "基金配置: " -NoNewline
  155. Write-Host ($fundConfig.Keys -join ", ") -ForegroundColor Yellow
  156. Write-Host "默认刷新间隔: 15秒" -ForegroundColor Yellow
  157. Write-Host "颜色说明: " -NoNewline
  158. Write-Host "上涨/盈利 " -ForegroundColor Red -NoNewline
  159. Write-Host "| " -NoNewline
  160. Write-Host "下跌/亏损 " -ForegroundColor Green
  161. Write-Host "`n使用说明: " -ForegroundColor Cyan
  162. Write-Host "1. 点击'开始监控'启动自动刷新" -ForegroundColor White
  163. Write-Host "2. 可设置刷新间隔(5-3600秒)" -ForegroundColor White
  164. Write-Host "3. 点击'立即刷新'手动更新数据" -ForegroundColor White
  165. Write-Host "4. 点击'停止监控'暂停自动刷新" -ForegroundColor White
  166. Write-Host "`n显示优化: 基金名称放在最后一列,避免错位" -ForegroundColor Cyan

  167. [void]$form.ShowDialog()
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 21:23 , Processed in 0.013224 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表