完全使用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 天前
图论 III
学习笔记·图论
w909510 天前
【9】斯特林数学习笔记
数学·学习笔记
w909517 天前
【7】卡特兰数学习笔记
数学·学习笔记
鱼鱼莲1 个月前
GAMES101作业3
学习笔记·games101
鱼鱼莲1 个月前
GAMES101作业2
学习笔记·games101
丶Darling.2 个月前
26考研 | 王道 | 第六章 应用层
计算机网络·考研·学习笔记·王道
丶Darling.2 个月前
26考研 | 王道 | 第五章 传输层
计算机网络·考研·学习笔记·王道
Alice-YUE2 个月前
【CSS学习笔记1】css基础知识介绍
css·学习笔记
再睡一夏就好2 个月前
从硬件角度理解“Linux下一切皆文件“,详解用户级缓冲区
linux·服务器·c语言·开发语言·学习笔记