用AI代理进行加密货币交易

我们建立了一个持续交易反馈系统。它的作用是从选定的交易所平台持续收集加密货币市场数据,进行技术分析,构建,训练一个预测机器学习模型,并做出预测。

用AI代理进行加密货币交易
一键发币: Aptos | X Layer | SUI | SOL | BNB | ETH | BASE | ARB | OP | Polygon | Avalanche | 用AI学区块链开发

随着科技行业的快速变化,AI再次崛起,改变了我们当前世界的几乎所有方面。AI本身并不是一个新概念,但当OpenAI的模型“GPT-3”(基于转换器的大语言模型)能够通过NVIDIA芯片处理数百亿个标记时,这场革命才真正开始,因此他们与NVIDIA的强大合作以及云基础设施扩展等其他因素。

这种新能力颠覆了所有东西,从医疗保健、军事、零售到教育、金融和网络安全等。

在本文中,我想聚焦并展示这项技术如何影响金融交易领域。

在金融科技行业(FinTech)中,作为一家交易公司,您要解决的问题是什么?

嗯,让我们探讨一下一般的交易工作流程是什么样的:

  • 收集、获取资产的数据集(历史+实时)
  • 从各种数据点(新闻源、社交媒体、文章、经济事件)收集和分析市场信息
  • 分析这个数据集,以技术指标提取必要的见解,告诉资产的方向。这是技术分析阶段。
  • 将所有收集的数据相关联,以得出资产和市场方向的清晰画面,从而进行/采取有利可图的交易。

从高层次来看,这就是它看起来的样子。人类已经这样做了很多年;在某些情况下,这会带来好的结果,在其他情况下可能不是那么好,但关键是这就是一直这样做的方式。

现在,代理AI发挥作用的地方是它可以使这个过程更加高效,因为它可以:

  • 以人类无法达到的速度阅读/总结数百万页
  • 它可以访问、浏览网络并理解它(总结)以人类无法达到的速度
  • 它可以在人类无法达到的速度下查找、识别和关联数百万个数据点
  • 它可以扮演任何主题的角色,以人类无法达到的准确性产生建议、回应

在本文的下一节中,我们将深入探讨为加密货币交易市场构建的代理系统的详细技术 walkthrough。系好安全带...

1、系统

我们建立了一个持续交易反馈系统。它的作用是从选定的交易所平台持续收集加密货币市场数据,进行技术分析构建训练一个预测机器学习模型,并做出预测。所有KPI、算法用于此预测都被记录和存储。该模型实时更新,每次交易都包括一个庞大的自定义技术分析数据集,随着时间的推移提高其预测准确性。所有这些数据都存储在一个noSQL数据库(elasticsearch)中,显然整个流管道都在Kafka上。

所以,我们最终得到的是市场上每个资产的档案。这个数据集使我们变得有价值,因为没有人有这个。

2、大型语言模型

因此,我们设置我们的代理AI代理工作流程如下。下面的每个工具都有特定的任务,以便指导LLM如何执行它以及预期什么。这对于保持整个流程准确以达到目标非常重要:

(1) 获取/检索 最新的10个历史+当前交易评估数据集,针对特定资产从我们的数据存储(Elastic)
注意:您可以将其扩展到您认为足够让模型了解的大小。

(2) 获取/检索 最新的KPI指标、算法、市场状况从我们的数据存储(Elastic)

(3) 获取最新价格 特定资产从加密货币交易所平台。在“indexPrice”, “lastPrice” 和 “markPrice” — 中选择最佳(最低/最高),这在设定/建议交易的入场价时将重要

(4) 获取最新的市场新闻数据集 从互联网(网页、文章、社交媒体、经济公告)。我们需要这个来感受市场状况和方向

(5) 在收集了所有数据集之后,进行初步评估 以应用判断。根据您的角色 对所有收集的数据集进行推理。

(6) 在基于所有数据集做出判断后,重新评估 并特别关注数据集中的特定KPI,并根据目标的利润损失范围进行最终要求。

这完成了工作流程,我们得到了最终响应。当然我们可以有后续对话,但在此时主要决定已经决定了。

3、代码

这里是代码的一部分…

导入你的模块

from __future__ import annotations  

import os  
import json  
import re  
import traceback  
from datetime import datetime  

from dotenv import load_dotenv  

import pandas as pd  
from pydantic import BaseModel  

# 可选的Tavily(网络搜索)  
_tavily_ok = True  
try:  
    from langchain_tavily import TavilySearch  
except Exception:  
    _tavily_ok = False  

# LangChain + OpenAI兼容导入  
try:  
    from langchain_openai import ChatOpenAI  
except Exception:  
    from langchain.chat_models import ChatOpenAI  # 更早版本的langchain  

from langchain.agents import initialize_agent, AgentType, tool, Tool  
# 新增工具调用代理选项A  
from langchain.agents import create_tool_calling_agent, AgentExecutor  
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder  
from langchain_core.messages import SystemMessage  

try:  
    from langchain.memory import ConversationBufferMemory  
except Exception:  
    from langchain.memory import ConversationBufferMemory  

try:  
    from langchain.prompts.chat import MessagesPlaceholder  
except Exception:  
    from langchain.prompts import MessagesPlaceholder  

# Elasticsearch客户端SDK  
from elasticsearch import Elasticsearch  

# UI  
import gradio as gr  

# Bybit世界  
from pybit.unified_trading import HTTP  
import time

设置你的ENV和客户端

load_dotenv("(YOUR PATH)/.env")  
ES_URL=os.environ["ES_URL"]  
ES_INDEX=os.environ["ES_INDEX"]  
ES_SSL_VERIFY_CERTS=os.environ["ES_SSL_VERIFY_CERTS"]  
ES_CACERT=os.environ["ES_CACERT"]  
ES_CAKEY=os.environ["ES_CAKEY"]  
ES_USER=os.environ["ES_USER"]  
ES_PASSWORD=os.environ["ES_PASSWORD"]  
TODAY = datetime.utcnow().strftime("%B %d, %Y")  

# OpenAI模型(环境变量OPENAI_API_KEY应该存在)  
OPENAI_API_KEY = os.environ["OPENAI_API_KEY"]  

# Elastic客户端  
es = Elasticsearch(  
    [os.environ["ES_URL"]],  
    basic_auth=(os.environ["ES_USER"], os.environ["ES_PASSWORD"]),  
    verify_certs=os.environ['ES_SSL_VERIFY_CERTS'],  
    ca_certs=os.environ['ES_CACERT'],  
    client_key=os.environ['ES_CAKEY'],  
    request_timeout= 60  
)  

print(es)  

# 加密货币交易所客户端  
session = HTTP(  
    testnet=False,  
    api_key=os.environ["EXCHANGE_API_KEY"],  
    api_secret=os.environ["EXCHANGE_API_SECRET"],  
    timeout=int(os.environ["EXCHANGE_API_TIMEOUT"])  
)

然后,我们将开始设置模型在整个工作流中使用的工具。首先让我们检查设置函数工具的结构。你听说过Pydantic吗?

它是Python中最广泛使用的数据验证库,也是代理框架的核心。我们使用它来设置模式并验证函数的输入

# 使用 'BaseModel' 设置你的模式  
class ElasticGetDatasetInput(BaseModel):  
    es_index: str  
    symbol_asset: str  
    instruction: str  

# 让工具知道这是它在执行此工具时将使用的模式  
@tool(args_schema=ElasticGetDatasetInput)  

# 构建你的函数工具  
def elastic_get_dataset(es_index: str, symbol_asset: str, instruction: str) -> str:  
# 你的注释在这里。引导LLM如何执行以及期望什么  
""" 文本 """  

代码 ....  

# 返回你希望LLM将其输入到其记忆中并了解的内容  
return 

示例(这是数据集收集工具):

class ElasticGetDatasetInput(BaseModel):  
    es_index: str  
    symbol_asset: str  
    instruction: str  

@tool(args_schema=ElasticGetDatasetInput)  
def elastic_get_dataset(es_index: str, symbol_asset: str, instruction: str) -> str:  
    """  
    目的:从Elasticsearch索引中获取给定symbol_asset的最新历史数据集,并返回JSON。  
                检索的文档包含所有需要的指标KPI,用于对这个资产的趋势、行为进行分析  
                你将稍后使用它来与最新检索的数据集进行比较,以做出判断  

    何时使用:使用此工具从索引'trades_assessments_micka'中获取资产的最新历史数据集,以分析其模式、趋势和成功或失败的交易。  
    """  

    query = {  
    "_source": {"excludes": ["M_*", "timestamp_updated_win_*", "status_at_*", "timestamp_updated_*", "customer", "FAILED_PURCHASED"]},  
    "sort": [  
        {  
        "timestamp": {  
            "order": "desc"  
        }  
        }  
    ],  
    "size": 10,  
    "query": {  
        "bool": {  
        "must": [  
            {  
            "match": {  
                "symbol.keyword": symbol_asset  
            }  
            },  
            {  
            "exists": {  
                "field": "btc_price_difference_max_7d"  
            }  
            },  
            {  
            "exists": {  
                "field": "high_supply_vs_demand"  
            }  
            },  
            {  
            "exists": {  
                "field": "btc_price_difference_min_7d"  
            }  
            },  
            {  
            "exists": {  
                "field": "outcome_02.keyword"  
            }  
            },  
            {  
            "match": {  
                "side.keyword": "Sell"  
            }  
            }  
        ],  
        "filter": [  
            {  
            "range": {  
                "timestamp": {  
                "gte": "now-90d/m",  
                "lte": "now/m"  
                }  
            }  
            }  
        ]  
        }  
    }  
    }  
    }  

    res = es.search(index=es_index, scroll="1m", body=query)  
    hits = res.get("hits", {}).get("hits", [])  
    records = [h.get("_source", {}) for h in hits]  
    if not records:  
        return json.dumps({"shape": [0, 0], "columns": [], "sample": [], "note": f"No records for {symbol_asset} in {es_index}."}, ensure_ascii=False)  

    df = pd.json_normalize(records)  
    # 轻量级数值强制转换  
    for col in df.columns:  
        if df[col].dtype == object:  
            try:  
                df[col] = pd.to_numeric(df[col])  
            except Exception:  
                pass  

    payload = {  
        "sample": df.head(min(50, len(df))).to_dict(orient="records"),  
    }  

    return json.dumps({  
        "dataset": payload,  
        "instruction": instruction  
    },ensure_ascii=False)

推理工具:

class ReasonsInput(BaseModel):  
    dataframe_json: str  
    instruction: str  

@tool(args_schema=ReasonsInput)  
def reasons_based_on_dataset(dataframe_json: str, instruction: str) -> str:  

    """  
    目的:读取之前工具'relastic_get_dataset','search_crypto_info','elastic_get_latest_dataset','bybit_get_price_now'的结果,  
    并确定应进行的交易。此时是做多还是做空。   

    何时使用:为了基于所有运行工具的结果进行推理,以便进行交易预测   
    """  

    return json.dumps(  
        {  
            "task": instruction,  
            "today": TODAY,  
        },  
        ensure_ascii=False,  
    )

你会注意到TODAY变量,我发现它很重要,因为它设定了时间点,让LLM模型知道给出最近的信息,尤其是在浏览网络时非常有用。因此,这个结构对于我们在代码中定义的所有工具都是如此。

然后你确保你分组你的工具,设置LLM模型的参数,并最重要的是你的提示

# LLM模型  
llm = ChatOpenAI(  
    model="gpt-5",  
    api_key=OPENAI_API_KEY,  
    streaming=True,  
    temperature=0,  
    reasoning={"effort": "medium"} # https://platform.openai.com/docs/guides/reasoning#get-started-with-reasoning  
)  

# 系统角色  
system = """ SET YOUR SYSTEM ROLE"""  

# 提示  
prompt = ChatPromptTemplate.from_messages([  
    SystemMessage(content=system),  
    MessagesPlaceholder(variable_name="chat_history", optional=True),  
    ("human", "{input}"),  
    MessagesPlaceholder(variable_name="agent_scratchpad"),  
])  

agent_core = create_tool_calling_agent(llm, tools, prompt)  

agent = AgentExecutor(  
    agent=agent_core,  
    tools=tools,  
    verbose=True,  
    max_iterations=10,  
    handle_parsing_errors=True,  
    return_intermediate_steps=False,  
    memory=memory  
)  
return agent, memory

设置我们的UI(Gradio):

with gr.Blocks(fill_height=True, css="#chat {height: 65vh;}") as demo:  
    gr.Markdown("## FTDanalytics Trading")  

    with gr.Tab("Pipeline"):  
        es_index = gr.Textbox(label="Elasticsearch index", placeholder="e.g., crypto_candles", value="")  
        symbol_asset = gr.Textbox(label="symbol_asset", placeholder="e.g., BTCUSDT", value="")  
        instruction = gr.Textbox(label="Instruction", value="Based on recent momentum and risk, should I go long or short? Explain briefly.", lines=2)  
        include_web = gr.Checkbox(label="Include web search (latest 24h)", value=True)  
        run_btn = gr.Button("Run decision", variant="primary")  

        final_json = gr.Code(label="Final JSON result")  
        final_msg = gr.Markdown(label="Message / Decision")  

        def on_run(es_index_v, symbol_asset_v, instr_v, include_web_v):  
            try:  
                result = sequential_decision(  
                    es_index=str(es_index_v).strip(),  
                    symbol_asset=str(symbol_asset_v).strip(),  
                    instruction=str(instr_v).strip(),  
                    include_web_search=bool(include_web_v),  
                )  
                msg = result.get("message", "")  
                dec = result.get("decision", "")  
                md = f"**Decision:** `{dec}`\n\n{msg}" if msg else f"**Decision:** `{dec}`"  
                return json.dumps(result, ensure_ascii=False, indent=2), md  
            except Exception as e:  
                err = f"ERROR: {e}\n\n{traceback.format_exc()}"  
                return err, "**Error**\n\n````\n" + err + "\n````"  

        run_btn.click(on_run, inputs=[es_index, symbol_asset, instruction, include_web], outputs=[final_json, final_msg])  

    with gr.Tab("Chat (ad-hoc)"):  
        state = gr.State({})  
        chat = gr.Chatbot(label="Conversation", elem_id="chat")  
        with gr.Row():  
            msg = gr.Textbox(label="Input", placeholder="Ask something…", lines=2, scale=4)  
            send = gr.Button("Send", variant="primary", scale=1, min_width=100)  
            clear = gr.Button("Clear", scale=1, min_width=100)  

        def on_submit(user_input, chat_history, session_state):  
            try:  
                if "agent" not in session_state:  
                    a, mem = build_agent_with_memory()  
                    session_state["agent"] = a  
                    session_state["memory"] = mem  
                else:  
                    a = session_state["agent"]  

                result = _agent_call(a, user_input)  
                chat_history = chat_history + [(user_input, str(result))]  
                return chat_history, "", session_state  
            except Exception as e:  
                err = f"ERROR: {e}\n\n{traceback.format_exc()}"  
                chat_history = chat_history + [(user_input, err)]  
                return chat_history, "", session_state  

        msg.submit(on_submit, inputs=[msg, chat, state], outputs=[chat, msg, state])  
        send.click(on_submit, inputs=[msg, chat, state], outputs=[chat, msg, state])  
        clear.click(lambda: ([], "", {}), inputs=None, outputs=[chat, msg, state])  

if __name__ == "__main__":  
    demo.launch(server_name="0.0.0.0", server_port=7865, show_error=True)

一旦系统启动,这就是我们的前端界面的样子:

让我们开始一段关于资产的对话……假设我是一个对交易一无所知的交易者或投资者,但想在这个领域增长我的投资。我会让我们的代理AI代理告诉我是否应该购买特定的加密货币代币以及在什么价格,也许……我的(*止盈)*和(*止损)*应该是什么。我们将使用两种不同的模型来执行此操作,Chap-GPT5在左边和DeepseekV3(推理模式)在右边。

Chat-GPT5在大约2分钟内完成了它的运行,而DeepseekV3在不到一分钟内完成,大约50秒。它们被给予了相同的数据集进行处理。它们都得出结论,采取长期头寸,我将在下面贴出详细信息:

DeepseekV3:

## **对OPUSDT做多**  

**做多的关键原因:**  

1. **技术动量**:  
   - 当前RSI为33.42(超卖区域),表明潜在反弹  
   - 1H MACD显示改善(-0.004122 vs 之前的-0.005412)  
   - ROC_9D为-2.96%,但显示出从更深的负值中恢复的迹象  

2. **供需动态**:  
   - 高供应与需求为44.42%(买家 > 卖家)  
   - 市场显示出恢复,市场_count_now为178 vs 104之前  

3. **价格行动**:  
   - 当前价格为0.4069,显示出从近期低点的恢复  
   - 近24小时表现:-3.53%,但显示出稳定化的迹象  
   - 历史数据显示,当RSI处于这个范围时,长期头寸的成功率较高  

4. **市场背景**:  
   - BTC表现出强劲(BTC价格为110,152.6)  
   - 最近的网络搜索显示更广泛的加密货币市场复苏动量  
   - 历史交易显示在类似条件下长期头寸的成功率更高  

**风险管理**:  
- **止盈**: 2%(目标 ~0.4149)  
- **止损**: 1%(止损 ~0.4028)

Chat-GPT5

{"message": "OPUSDT显示日内动量向上转变:1h MACD > 信号(看涨转折),RSI在分钟/小时框架上强劲(M ~68, H ~51),市场广度正在改善(market_count_now 178 > 15m 154 > 30m 101)。价格在过去几小时内反弹(7h→1h: 0.3978 → 0.4039),BTC稳定/上涨,RSI ~46。阻力:整体趋势仍疲软(ROC_9D负,1D/7D下跌),高供应与需求低于50%(~44% → 卖家仍略微占优),以及代币解锁(~31.3M OP)增加了供应风险。在2% TP / 1% SL下,短期广度 + 1h动量有利于快速做多而非做空(后者面临挤仓风险)。交易计划:以 ~0.4069 入场,TP ~0.415 (+~2%),SL ~0.403 (−~1%)。如果BTC明显走弱或广度逆转(例如,market_count_now急剧下降)或OP迅速跌破0.403,则无效。",  
"decision": "long"  
}

(Chat-GPT5) 推理过程。以下是工具在后台被调用的情况。请注意LLM根据每个工具的注释生成的指令:

调用: `elastic_get_latest_dataset` with `{'es_index': 'long_crypto_statistics', 'symbol_asset': 'OPUSDT', 'instruction': '获取OPUSDT的最新KPI快照,包括RSI、MACD、ROC、cmc_rank、high_supply_vs_demand、btc_*字段、candle_*字段、百分位数和价格差异。'}`  
"task": "获取OPUSDT的最新KPI快照,包括RSI、MACD、ROC、cmc_rank、high_supply_vs_demand、btc_*字段、candle_*字段、百分位数和价格差异。"}  

调用: `bybit_get_price_now` with `{'symbol_asset': 'OPUSDT', 'instruction': '获取OPUSDT的最新现货价格。'}`  
"instruction": "获取OPUSDT的最新现货价格。"  

调用: `search_crypto_info` with `{'query': 'OPUSDT OP token news analysis RSI MACD market sentiment Binance Bybit CoinMarketCap Crypto news last 24 hours', 'instruction': '总结最近的相关催化剂、上市、解锁、重大合作伙伴关系、监管头条,这些可能会影响OP(Optimism)价格在未来24-72小时内。'}`  
"task": "总结最近的相关催化剂、上市、解锁、重大合作伙伴关系、监管头条,这些可能会影响OP(Optimism)价格在未来24-72小时内。"}  

调用: `reasons_based_on_dataset` with `{'dataframe_json': '{"latest_dataset": {"percentiles_1": 0.40324193581461903, "market_count_15m": 154, "ROC_9D": -2.958721068957282, "btc_price_difference_min_7d": 5.343661837134802, "percentiles_5": 0.42909647607658147, "percentiles_99": 0.836462241128087, "RSI_NOW_H": 50.74896163237766, "cmc_rank": 81, "MACD_1H_BELOW_FLAT_AVG": -489.1891891891892, "percentiles_95": 0.8120397941343618, "price_diff_now_7d": 0.44410295934366756, "RSI_NOW_M": 67.8518344007476, "btc_price_max_7d": 112367.0078125, "ROC_9D_H_BELOW_AVG": false, "worked": 0.017776299728436307, "btc_candle_7h_closed": 109475.2, "RSI_NOW_H_BELOW_AVG": false, "MACD_M_5_BELOW_AVG": false, "MACD_M_5": 0.001648, "btc_price_low_hit_occured": false, "MACD_1H_BELOW_MIN": false, "percentage_24": -0.035341, "MACD_M_1": 0.00059, "roc_9d_btc": 2.394096879917562, "candle_7h.closed": 0.3978, "ROC_CURVED": true, "ROC_CURVED_DAY": false, "btc_candle_4h_closed": 109761.4, "zoom_8d_avg": -0.006538106723069938, "btc_candle_4d_closed": 112112.0, "btc_price_difference_max_7d": -1.9706921592101498, "candle_7d.closed": 0.4381, "MACD_M_1_BELOW_MIN": false, "zoom_8d_max_price": 0.4068, "ROC_CURVED_DAY_POSITIVE": false, "ROC_CURVED_DAY_NEGATIVE": true, "market_count_now": 178, "candle_3h.closed": 0.3982, "candle_3d.closed": 0.4249, "track_candle_up_count": 132.0, "MACD_1H": -0.004122, "RSI_NOW_M_1_BELOW_AVG": false, "candle_1d.closed": 0.3962, "rsi": 33.41832711913045, "ROC_AVG_30D_5MIN": -0.5727142042426361, "volume_now": 140946339.22324252, "track_candle_down_avg": 1.8135593220338984, "candle_1h.closed": 0.4039, "btc_candle_6h_closed": 109169.3, "ROC_9D_M_1": 0.4197530864197496, "RSI_NOW_M_BELOW_AVG": false, "btc_avg_7d_mark": 111494.8645710022, "timestamp": "2025-10-31T12:18:15.325839", "price_difference_7d_ago": -8.069620253164558, "btc_candle_3h_closed": 109656.4, "rsi_btc": 45.95179206788483, "side": "Sell", "percentiles_5_below": 0.42909647607658147, "btc_candle_7d_closed": 110618.8, "market_count_30m": 101, "ROC_9D_M_1_BELOW_MIN": false, "MACD_SIGNAL_LINE_M_5": 0.001162, "price_1d_ago": 0.4217, "ROC_CURVED_HOUR_POSITIVE": false, "ROC_9D_M_BELOW_MIN": false, "MACD_DAY_CURVED": false, "MACD_SIGNAL_LINE_M_1": 0.000531, "price_difference_1d_ago": -3.5570310647379686, "track_candle_down_count": 214.0, "price_diff_now_1d": 0.40359999895095827, "RSI_AVG_30D_1MIN": 25.966590346661647, "price_diff_change_10min_1": 0.012288, "price_7d_ago": 0.4424, "btc_candle_3d_closed": 109056.2, "btc_price_low_hit": false, "candle_4h.closed": 0.3971, "candle_4d.closed": 0.426, "percentiles_50": 0.705925970927869, "candle_2d.closed": 0.3859, "RSI_NOW": 33.41832711913045, "tendancies_pct_down": 718.8275862068965, "RSI_NOW_M_1": 66.94240778350334, "ROC_9D_H_BELOW_MIN": false, "RSI_NOW_H_BELOW_MIN": false, "MACD_M_5_BELOW_MIN": false, "RSI_CURVED_H": false, "MACD_1H_BELOW_AVG": false, "zoom_8d_price": 0.44107422710498545, "btc_candle_6d_closed": 111187.8, "tendancies_pct_up": 669.3103448275862, "track_candle_up_avg": 1.4831460674157304, "MACD_M_1_BELOW_AVG": false, "volume_bybit_90d": 51006848.2471527, "price_now": 0.4068, "candle_5d.closed": 0.4477, "roc_9d": -2.958721068957282, "price_diff_change_10min": 0.015938, "candle_5h.closed": 0.3962, "btc_candle_2d_closed": 106225.0, "macd_btc": -1030.854614, "btc_candle_2h_closed": 109409.2, "RSI_NOW_M_1_BELOW_MIN": false, "macd": -0.051564, "macd_sline": -0.057685, "RSI_CURVED": false, "ROC_AVG_30D_1MIN": -0.30851523878418874, "btc_price_now": 110152.6, "percentiles_25_below": 0.5688568147775508, "RSI_NOW_M_BELOW_MIN": false, "candle_6h.closed": 0.3981, "ROC_9D_M": 1.7767767767767673, "high_supply_vs_demand": 44.41676158808684, "RSI_AVG_30D_5MIN": 26.409722497313652, "macd_btc_sline": -1122.959361, "ROC_9D_M_1_BELOW_AVG": false, "ROC_CURVED_NOW": false, "ROC_9D_M_BELOW_AVG": false, "btc_candle_5h_closed": 109154.8, "btc_candle_5d_closed": 113777.3, "volume_90d": 193669990.9976871, "btc_candle_1d_closed": 108223.0, "btc_price_min_7d": 104565.0, "symbol": "OPUSDT", "candle_2h.closed": 0.3989, "candle_6d.closed": 0.4393, "MACD_1H_SIGNAL_LINE": -0.00626, "volume_bybit_now": "34246475.8006", "ROC_9D_H": 1.2951432129514329, "btc_candle_1h_closed": 110090.0, "ROC_CURVED_HOUR_NEGATIVE": false}, "historical_sample": {"timestamp_updated": "2025-10-31T12:22:09.108254", "side": "Sell", "outcome_02": "win", "percentage_difference": -21.107871720116613, "macd_60min": -0.005388, "MACD_1H_SIGNAL_LINE": -0.00686, "RSI_NOW": 31.704581441578682, "RSI_NOW_H": 40.23476913485378, "RSI_NOW_M": 47.68294416424075, "high_supply_vs_demand": 47.45316556186655, "btc_candle_1h_closed": 109555.0, "candle_1h.closed": 0.3989, "market_count_now": 104, "market_count_15m": 114, "market_count_30m": 105, "btc_price_difference_max_7d": -2.498783110061292, "btc_price_difference_min_7d": 4.776167933821066}, "web_search_summary": {"catalysts": ["OP token unlock around Oct 31 (~31.34M OP, ~1.7% of supply) may add supply pressure", "Some technical pieces suggest MACD histogram turning positive and RSI recovery from oversold; a close above ~$0.45 seen as bullish trigger", "General market breadth mixed lately but improving intraday; BTC steady to slightly up"], "sentiment": "mixed-to-cautious: rebound attempts vs. unlock-driven supply"}, "price_now": {"bybit_bid": 0.4069, "bybit_ask": 0.4072}}', 'instruction': '使用历史数据集、最新KPI、实时价格和网络新闻,决定条件是否有利于做多(买入OPUSDT)或做空(卖出OPUSDT),2% TP和1% SL。注意:market_count_now/15m/30m,RSI,MACD与信号(percentage_difference),ROC,BTC蜡烛和百分比变化,high_supply_vs_demand,cmc_rank,price_difference_1d_ago/7d,以及OP和BTC蜡烛。返回简洁的推理和一方。'}`  
{"task": "使用历史数据集、最新KPI、实时价格和网络新闻,决定条件是否有利于做多(买入OPUSDT)或做空(卖出OPUSDT),2% TP和1% SL。注意:market_count_now/15m/30m,RSI,MACD与信号(percentage_difference),ROC,BTC蜡烛和百分比变化,high_supply_vs_demand,cmc_rank,price_difference_1d_ago/7d,以及OP和BTC蜡烛。返回简洁的推理和一方。", "today": "October 31, 2025"}  

调用: `re_assess_based_on_all_gathered_facts` with `{'instruction': '使用所有收集的事实重新评估OPUSDT的最终交易决策,2%止盈和1%止损。考虑广度(market_count_now/15m/30m)、百分位数、ROC、MACD、RSI、BTC和OP蜡烛、cmc_rank、价格差异、high_supply_vs_demand (>0买家>卖家),以及来自网络搜索的代币解锁催化剂。输出最终的一方(做多或做空)和简短的理由。', 'text': '最新数据集突出显示:market_count_now 178(更强的广度)对比15m 154和30m 101(改善的广度)。OP最后价格约0.4069/0.4072。RSI_NOW约33(略显超卖),RSI_NOW_H约50.7,RSI_NOW_M约67.9(短期力量)。MACD_1H -0.0041 vs signal -0.00626(MACD高于信号 -> 1H看涨转折)。ROC_9D -2.96(弱),但ROC_9D_M +1.78(相比中期改善)。high_supply_vs_demand 44.4%(卖家>买家)。BTC稳定/上涨,1h蜡烛110090,RSI BTC约46,BTC MACD改善;BTC 7d差值最小+5.34%和最大-1.97%表明最近反弹。OP蜡烛:7h:0.3978, 6h:0.3981, 5h:0.3962, 4h:0.3971, 3h:0.3982, 2h:0.3989, 1h:0.4039 → 日内反弹。price_difference_1d_ago -3.56%(下跌1d),price_difference_7d_ago -8.07%(下跌7d)。cmc_rank约81(中盘)。网络:OP代币解锁约31.34M在10月31日(约1.7%供应)→ 可能的短期供应压力;一些报道提到RSI恢复和MACD在> $0.45突破时转为积极。风险框架:2% TP,1% SL。做多:入场0.407 -> TP ~0.415,SL ~0.403;反弹可能实现2%如果动量持续;但供应/需求显示卖家主导和解锁风险。做空:入场0.407 -> TP ~0.399,SL ~0.411;对抗改善的广度和1H MACD交叉。最终交易应权衡短期动量与解锁供应压力。'}`  
{"message": "最新数据集突出显示:market_count_now 178(更强的广度)对比15m 154和30m 101(改善的广度)。OP最后价格约0.4069/0.4072。RSI_NOW约33(略显超卖),RSI_NOW_H约50.7,RSI_NOW_M约67.9(短期力量)。MACD_1H -0.0041 vs signal -0.00626(MACD高于信号 -> 1H看涨转折)。ROC_9D -2.96(弱),但ROC_9D_M +1.78(相比中期改善)。high_supply_vs_demand 44.4%(卖家>买家)。BTC稳定/上涨,1h蜡烛110090,RSI BTC约46,BTC MACD改善;BTC 7d差值最小+5.34%和最大-1.97%表明最近反弹。OP蜡烛:7h:0.3978, 6h:0.3981, 5h:0.3962, 4h:0.3971, 3h:0.3982, 2h:0.3989, 1h:0.4039 → 日内反弹。price_difference_1d_ago -3.56%(下跌1d),price_difference_7d_ago -8.07%(下跌7d)。cmc_rank约81(中盘)。网络:OP代币解锁约31.34M在10月31日(约1.7%供应)→ 可能的短期供应压力;一些报道提到RSI恢复和MACD在> $0.45突破时转为积极。风险框架:2% TP,1% SL。做多:入场0.407 -> TP ~0.415,SL ~0.403;反弹可能实现2%如果动量持续;但供应/需求显示卖家主导和解锁风险。做空:入场0.407 -> TP ~0.399,SL ~0.411;对抗改善的广度和1H MACD交叉。最终交易应权衡短期动量与解锁供应压力。", "decision": ""}[{'type': 'text', 'text': '{\n  "message": "OPUSDT shows an intraday momentum turn up: 1h MACD > signal (bullish inflection), RSI on minute/hour frames is strong (M ~68, H ~51), and market breadth is improving (market_count_now 178 > 15m 154 > 30m 101). Price has bounced across the past hours (7h→1h: 0.3978 → 0.4039), with BTC stable/up and RSI ~46. Headwinds: broader trend remains weak (ROC_9D negative, 1D/7D drawdowns), high_supply_vs_demand is sub-50% (~44% → sellers still slightly dominant), and a token unlock (~31.3M OP) adds supply risk. With a 2% TP / 1% SL, the short-term breadth + 1h momentum favors a quick long scalp over a short (which risks a squeeze). Trade plan: enter ~0.4069, TP ~0.415 (+~2%), SL ~0.403 (−~1%). Invalidate if BTC weakens materially or breadth reverses (e.g., market_count_now drops sharply) or OP loses 0.403 quickly.",\n  "decision": "long"\n}'}

OpenAI的优点之一是你可以轻松地追溯你的对话来权衡你的token使用情况并相应地微调你的代理:

我的对话消耗了大约50k tokens。你可以看到调用了哪些工具以及推理级别:

好了,这完成了我们如何利用代理AI在加密货币领域的讲解。


原文链接:Leveraging Agentic AI in the Crypto trading sector

DefiPlot翻译整理,转载请标明出处

免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。