完全使用TRAE和AI 开发一款完整的应用----第一周

虽然也在工作使用使用ai 补全代码或者完善代码,但还是没有完全使用ai 做一款应用,不依赖手工编程、不依赖人查找资料

所以决定自己写一个应用玩玩,感受一下全完使用ai开发一款应用的乐趣, 跟上时代发展的步伐

不得不说以前写玩具项目挺枯燥,现在用ai写 还是挺有意思的

应用的需求:

使用ai 分析 k线,并进行点评,让天底下的韭菜没有看不懂的k线,让ai进行cosplay 扮演各路专家进行点评,这不是一款应用这是一款ai驱动的综艺节目

考虑我国复杂的金融监管环境,对股票分析限制非常多,所以对 美股 和港股还有web3 领域的token 进行分析

下面是项目和代码文件

主要是一个图表组件TradingChart.tsx和首页 page.tsx

TradingChart.tsx

复制代码
'use client'; // 确保只在客户端渲染

import { useEffect, useRef } from 'react';
import {
  createChart,
  CandlestickSeries,
  HistogramSeries,
} from 'lightweight-charts';

export interface KLine {
  time: string; // 'YYYY-MM-DD'
  open: number;
  high: number;
  low: number;
  close: number;
  volume: number;
}

interface Props {
  data: KLine[];
}

export default function TradingChart({ data }: Props) {
  console.log(data);
  const containerRef = useRef<HTMLDivElement>(null);

  useEffect(() => {
    if (!containerRef.current || !data.length) return;

    const chart = createChart(containerRef.current, {
      width: containerRef.current.clientWidth,
      height: containerRef.current.clientHeight,
      layout: { textColor: '#d1d4dc', background: { color: '#111' } },
      grid:   { vertLines: { color: '#2a2e39' }, horzLines: { color: '#2a2e39' } },
      rightPriceScale: { visible: true },
      leftPriceScale:  { visible: true },
      
      crosshair: { mode: 1 },
      timeScale: {
        
        fixLeftEdge: false,
        fixRightEdge: false,
        barSpacing: 10,
        minBarSpacing: 5,
      },
    });
   chart.applyOptions({
    localization:{
      dateFormat: 'yyyy-MM-dd',
    }
   })
    /* ---- 蜡烛图 Pane(上方)---- */
    const candlePane = chart.panes()[0];
    const candleSeries = candlePane.addSeries(CandlestickSeries, {
      upColor: '#26a69a',
      downColor: '#ef5350',
      borderVisible: false,
      wickUpColor: '#26a69a',
      wickDownColor: '#ef5350',
      priceScaleId: 'right',
    });
    candleSeries.setData(
      data.map(({ time, open, high, low, close }) => ({ time, open, high, low, close }))
    );

    /* ---- 成交量 Pane(下方 30%)---- */
    const volumePane = chart.addPane();
    volumePane.setHeight(80);
    const volumeSeries = volumePane.addSeries(HistogramSeries, {
      color: '#26a69a',
      priceScaleId: 'right',
      base: 0,
    });
    
    // 格式化成交量Y轴标签 - 调整为20%高度
    volumePane.priceScale('right').applyOptions({
      //设置高度
      
      scaleMargins: {
        top: 0.2,
        bottom: 0,
      },
      borderVisible: false,
    });
    
    // 自定义成交量格式化
    volumeSeries.priceScale().applyOptions({
      invertScale: false,
      borderColor: '#2a2e39',
    });
    
    // 使用priceFormatter来格式化成交量数值
    volumeSeries.applyOptions({
      priceFormat: {
        type: 'custom',
        minMove: 1,
        formatter: (price: number) => {
          if (price >= 1000000) {
            return (price / 1000000).toFixed(1) + 'M';
          } else if (price >= 1000) {
            return (price / 1000).toFixed(0) + 'K';
          } else {
            return price.toFixed(0);
          }
        }
      }
    });
    volumeSeries.setData(
      data.map(d => ({
        time: d.time,
        value: d.volume,
        color: d.close >= d.open ? '#26a69a' : '#ef5350',
      }))
    );
    chart.timeScale().fitContent();

    /* 自适应窗口大小 */
    const ro = new ResizeObserver(() => chart.applyOptions({
      width: containerRef.current!.clientWidth,
      height: containerRef.current!.clientHeight,
       
    }));
    ro.observe(containerRef.current);

    return () => {
      ro.disconnect();
      chart.remove();
    };
  }, [data]);

  return <div ref={containerRef} style={{ width: '100%', height: '100%' }} />;
}

page.tsx

复制代码
// app/page.tsx 或 pages/index.tsx
"use client"
import dynamic from 'next/dynamic';
import { KLine } from '@/components/TradingChart';
import TradingChart from '@/components/TradingChart';
import { useState, useEffect } from 'react';



interface Coin {
  id: string;
  symbol: string;
  name: string;
}

export default function HomePage() {
  const [kLineData, setKLineData] = useState<KLine[]>([]);
  const [coins, setCoins] = useState<Coin[]>([]);
  const [selectedCoin, setSelectedCoin] = useState<string>('bitcoin');

  useEffect(() => {
    const fetchCoins = async () => {
      try {
        const response = await fetch('https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&order=market_cap_desc&per_page=100&page=1&sparkline=false');
        const data = await response.json();
        setCoins(data);
      } catch (error) {
        console.error('获取币种列表失败:', error);
      }
    };

    fetchCoins();
  }, []);

  useEffect(() => {
    const fetchData = async () => {
      if (!selectedCoin) return;
      
      try {
        // 180 天 和30天数据
        // 并行获取OHLC和成交量数据
        const [ohlcRes, volumeRes] = await Promise.all([
          fetch(`https://api.coingecko.com/api/v3/coins/${selectedCoin}/ohlc?vs_currency=usd&days=180`),
          fetch(`https://api.coingecko.com/api/v3/coins/${selectedCoin}/market_chart?vs_currency=usd&days=180&interval=daily`,{cache:'force-cache'})
        ]);
        const ohlcData = await ohlcRes.json();
        const volumeData = await volumeRes.json();

        // 合并数据并转换格式
        const formattedData = ohlcData.map(([timestamp, open, high, low, close]: [number, number, number, number, number]) => {
          // 匹配对应时间戳的成交量
          const volumeEntry = volumeData.total_volumes?.find(([volTimestamp]: [number, number]) => volTimestamp === timestamp);
          const volume = volumeEntry ? volumeEntry[1] : 0;

          // 转换时间戳为YYYY-MM-DD格式
          const date = new Date(timestamp);
          // const time = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;

          return { time:timestamp/1000, open, high, low, close, volume };
        });

        setKLineData(formattedData);
      } catch (error) {
        console.error('数据获取失败:', error);
      }
    };

    fetchData();
  }, [selectedCoin]);

  return (
    <div >
        <div className='w-[70%]' style={{ height: '600px' }}>
        <div className=' flex  align-center'>
           <select 
          value={selectedCoin}
          onChange={(e) => setSelectedCoin(e.target.value)}
          className="px-4 py-2 border border-gray-300 rounded-lg bg-white text-gray-700 shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 hover:border-gray-400 transition-colors duration-200"
        >
          {coins.map((coin) => (
            <option key={coin.id} value={coin.id} className="py-1">
              {coin.name} ({coin.symbol.toUpperCase()})
            </option>
          ))}
        </select>
        {/* 显示 下拉列表中选中的币种的current_price */}
        <div className='flex items-center'>
          {coins.find((coin) => coin.id === selectedCoin)?.current_price} usdt
        </div>


        </div>

        
        
        <TradingChart data={kLineData} />
      </div>
      <div className='w-[30%]'>
       对话框组件
      </div>

    </div>
      
    );
  }

下面是上周工作的成果 绘制了k线和显示了下拉列表还有价格

下面说一下我开发的步骤

1 首选是使用ai 进行需求分析

使用豆包进行的需求分析

https://www.doubao.com/thread/w0e5291f6269dbb19

2 使用ai 分析用什么工具才能绘制交易专用的图表

https://www.doubao.com/thread/wf2ef2d222fdba7eb

3 使用ai 寻找提供的数据源

使用kimi 寻找数据源

https://www.kimi.com/share/d23na3djqedfoaoeplr0

4 使用ai 开发图表组件

怎么使用ai 开发专业的交易图表组件?现在多数ai 都支持html 在线预览 例如 豆包和kimi

例如我需要绘制k线和成交量在一起的一个图表

先使用ai 制作一个html页面,进行在线预览,如果对效果不满意就完善提示词

我分别使用 豆包 deepseek kimi 若干次 最后在kimi 成功制作了交易组件的html页面

使用kimi制作html 页面

https://www.kimi.com/share/d23na3djqedfoaoeplr0

在制作完成html 页面之后,在用ai将html的内容用react 或者vue 重写一遍

然后就是复制到ide 中 进行进一步的完善

相关推荐
四谎真好看7 天前
SSM学习笔记(SpringBoot篇)
spring boot·笔记·学习·学习笔记·ssm
~黄夫人~8 天前
Linux 权限管理:用户组 + 特殊权限 + ACL 解析
linux·运维·计算机·学习笔记·权限管理
四谎真好看10 天前
SSM学习笔记(SpringMVC篇 Day02)
笔记·学习·学习笔记·ssm
四谎真好看12 天前
SSM学习笔记(SpringMVC篇 Day01)
笔记·学习·学习笔记·ssm
heartbeat..16 天前
Java 微服务初学者入门指南(CSDN 博客版)
java·运维·微服务·学习笔记·入门
四谎真好看16 天前
SSM学习笔记(Spring篇Day03)
笔记·学习·学习笔记·ssm
四谎真好看18 天前
SSM学习笔记(Spring篇 Day02)
笔记·学习·学习笔记·ssm
四谎真好看19 天前
SSM学习笔记(Spring篇 Day01)
笔记·学习·学习笔记·ssm
四谎真好看20 天前
JavaWeb学习笔记(Day14)
笔记·学习·学习笔记·javaweb
四谎真好看24 天前
JavaWeb学习笔记(Day13)
笔记·学习·学习笔记·javaweb