📅 财经日历 📊 实时波动 📈 大盘云图 📶 行情走势 🆚 投机情绪 🚀 今日热点

    DeepSeek API在MQL4中的运用 

    2026-01-03 · 630 阅读
    • 使用WebRequest()函数发送HTTP请求
    • 构建符合DeepSeek API规范的JSON请求体
    • 解析返回的JSON响应数据
    • 将分析结果转换为交易信号

      1. //+------------------------------------------------------------------+
      2. //|                                                   DeepSeekAPI.mq4 |
      3. //+------------------------------------------------------------------+
      4. #property copyright ""
      5. #property version   "1.00"
      6. #property strict

      7. // 输入参数
      8. input string apiKey = "your-deepseek-api-key-here";  // DeepSeek API密钥
      9. input string apiEndpoint = "https://api.deepseek.com/chat/completions";
      10. input double riskPercentage = 2.0;  // 风险百分比
      11. input int maxTokens = 500;  // 最大token数
      12. input double temperature = 0.7;  // 温度参数

      13. // 全局变量
      14. string lastAnalysis = "";
      15. datetime lastAnalysisTime = 0;

      16. //+------------------------------------------------------------------+
      17. //| 专家初始化函数                                                   |
      18. //+------------------------------------------------------------------+
      19. int OnInit()
      20. {
      21.     // 检查网络连接
      22.     if(!TerminalInfoInteger(TERMINAL_CONNECTED))
      23.     {
      24.         Print("错误: 无网络连接");
      25.         return(INIT_FAILED);
      26.     }
      27.    
      28.     // 设置定时器,每15分钟分析一次
      29.     EventSetTimer(900);
      30.    
      31.     return(INIT_SUCCEEDED);
      32. }

      33. //+------------------------------------------------------------------+
      34. //| 获取市场数据字符串                                              |
      35. //+------------------------------------------------------------------+
      36. string GetMarketDataString()
      37. {
      38.     string data = "";
      39.    
      40.     // 获取当前品种信息
      41.     data += "品种: " + Symbol() + "\n";
      42.     data += "时间: " + TimeToString(TimeCurrent()) + "\n";
      43.     data += "当前价格: " + DoubleToString(Close[0], Digits) + "\n";
      44.     data += "开盘价: " + DoubleToString(Open[0], Digits) + "\n";
      45.     data += "最高价: " + DoubleToString(High[0], Digits) + "\n";
      46.     data += "最低价: " + DoubleToString(Low[0], Digits) + "\n";
      47.    
      48.     // 技术指标数据
      49.     data += "RSI(14): " + DoubleToString(iRSI(Symbol(), PERIOD_H1, 14, PRICE_CLOSE, 0), 2) + "\n";
      50.     data += "MACD主线: " + DoubleToString(iMACD(Symbol(), PERIOD_H1, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 0), Digits) + "\n";
      51.     data += "布林带上轨: " + DoubleToString(iBands(Symbol(), PERIOD_H1, 20, 2, 0, PRICE_CLOSE, MODE_UPPER, 0), Digits) + "\n";
      52.     data += "布林带中轨: " + DoubleToString(iBands(Symbol(), PERIOD_H1, 20, 2, 0, PRICE_CLOSE, MODE_MAIN, 0), Digits) + "\n";
      53.     data += "布林带下轨: " + DoubleToString(iBands(Symbol(), PERIOD_H1, 20, 2, 0, PRICE_CLOSE, MODE_LOWER, 0), Digits) + "\n";
      54.    
      55.     // 最近5根K线数据
      56.     data += "\n最近K线数据:\n";
      57.     for(int i = 0; i < 5; i++)
      58.     {
      59.         data += "K线" + IntegerToString(i) + ": ";
      60.         data += "O=" + DoubleToString(Open[i], Digits) + " ";
      61.         data += "H=" + DoubleToString(High[i], Digits) + " ";
      62.         data += "L=" + DoubleToString(Low[i], Digits) + " ";
      63.         data += "C=" + DoubleToString(Close[i], Digits) + "\n";
      64.     }
      65.    
      66.     return data;
      67. }

      68. //+------------------------------------------------------------------+
      69. //| 构建DeepSeek API请求                                            |
      70. //+------------------------------------------------------------------+
      71. string BuildDeepSeekRequest(string marketData)
      72. {
      73.     string prompt = "你是一个专业的外汇交易AI分析师。请基于以下市场数据进行分析:\n\n";
      74.     prompt += marketData + "\n\n";
      75.     prompt += "请提供:\n";
      76.     prompt += "1. 市场趋势分析(看涨/看跌/震荡)\n";
      77.     prompt += "2. 关键支撑阻力位\n";
      78.     prompt += "3. 交易建议(买入/卖出/观望)\n";
      79.     prompt += "4. 建议入场位\n";
      80.     prompt += "5. 止损位\n";
      81.     prompt += "6. 止盈位\n";
      82.     prompt += "7. 风险等级(低/中/高)\n";
      83.     prompt += "请以JSON格式返回,包含以下字段:trend, support_resistance, recommendation, entry_price, stop_loss, take_profit, risk_level";
      84.    
      85.     string jsonRequest = "{";
      86.     jsonRequest += ""model": "deepseek-chat",";
      87.     jsonRequest += ""messages": [";
      88.     jsonRequest += "{"role": "system", "content": "你是一个专业的外汇交易分析师"},";
      89.     jsonRequest += "{"role": "user", "content": "" + prompt + ""}";
      90.     jsonRequest += "],";
      91.     jsonRequest += ""max_tokens": " + IntegerToString(maxTokens) + ",";
      92.     jsonRequest += ""temperature": " + DoubleToString(temperature, 1);
      93.     jsonRequest += "}";
      94.    
      95.     return jsonRequest;
      96. }

      97. //+------------------------------------------------------------------+
      98. //| 发送API请求                                                     |
      99. //+------------------------------------------------------------------+
      100. string SendDeepSeekRequest(string jsonRequest)
      101. {
      102.     char data[];
      103.     char result[];
      104.     string headers = "Content-Type: application/json\r\n";
      105.     headers += "Authorization: Bearer " + apiKey + "\r\n";
      106.    
      107.     // 转换字符串到字符数组
      108.     StringToCharArray(jsonRequest, data, 0, StringLen(jsonRequest));
      109.    
      110.     // 发送POST请求
      111.     int res = WebRequest("POST", apiEndpoint, headers, 5000, data, result, headers);
      112.    
      113.     if(res == 200) // 请求成功
      114.     {
      115.         return CharArrayToString(result, 0, ArraySize(result));
      116.     }
      117.     else if(res == -1) // 网络错误
      118.     {
      119.         Print("WebRequest失败,错误: ", GetLastError());
      120.         Print("请确保在工具->选项->EA交易中允许WebRequest");
      121.         return "";
      122.     }
      123.     else
      124.     {
      125.         Print("HTTP错误代码: ", res);
      126.         return "";
      127.     }
      128. }

      129. //+------------------------------------------------------------------+
      130. //| 解析DeepSeek响应                                                |
      131. //+------------------------------------------------------------------+
      132. bool ParseDeepSeekResponse(string response, double &entry, double &sl, double &tp, string &recommendation)
      133. {
      134.     // 简单解析JSON响应(实际使用时建议使用更健壮的JSON解析器)
      135.     int startPos = StringFind(response, ""content":");
      136.     if(startPos == -1) return false;
      137.    
      138.     startPos += 11; // 跳过 ""content":"
      139.     int endPos = StringFind(response, ""}", startPos);
      140.     if(endPos == -1) endPos = StringLen(response);
      141.    
      142.     string content = StringSubstr(response, startPos, endPos - startPos);
      143.     content = StringTrimLeft(StringTrimRight(content));
      144.    
      145.     // 移除转义字符
      146.     content = StringReplace(content, "\\n", "\n");
      147.     content = StringReplace(content, "\\"", """);
      148.    
      149.     Print("DeepSeek分析结果:\n", content);
      150.    
      151.     // 简单的模式匹配提取关键信息
      152.     if(StringFind(content, "买入") != -1 || StringFind(content, "buy") != -1)
      153.         recommendation = "BUY";
      154.     else if(StringFind(content, "卖出") != -1 || StringFind(content, "sell") != -1)
      155.         recommendation = "SELL";
      156.     else
      157.         recommendation = "HOLD";
      158.    
      159.     // 这里可以添加更复杂的解析逻辑来提取具体价格
      160.    
      161.     return true;
      162. }

      163. //+------------------------------------------------------------------+
      164. //| 执行市场分析                                                    |
      165. //+------------------------------------------------------------------+
      166. void PerformMarketAnalysis()
      167. {
      168.     // 限制分析频率(至少间隔10分钟)
      169.     if(TimeCurrent() - lastAnalysisTime < 600)
      170.         return;
      171.    
      172.     Print("开始市场分析...");
      173.    
      174.     // 获取市场数据
      175.     string marketData = GetMarketDataString();
      176.    
      177.     // 构建请求
      178.     string request = BuildDeepSeekRequest(marketData);
      179.    
      180.     // 发送请求
      181.     string response = SendDeepSeekRequest(request);
      182.    
      183.     if(response != "")
      184.     {
      185.         double entry, sl, tp;
      186.         string recommendation;
      187.         
      188.         if(ParseDeepSeekResponse(response, entry, sl, tp, recommendation))
      189.         {
      190.             lastAnalysis = response;
      191.             lastAnalysisTime = TimeCurrent();
      192.             
      193.             // 显示分析结果
      194.             Comment("最后分析: ", TimeToString(lastAnalysisTime),
      195.                     "\n建议: ", recommendation,
      196.                     "\n更新时间: ", TimeToString(TimeCurrent()));
      197.             
      198.             // 可选:基于分析执行交易
      199.             // ExecuteTradeBasedOnAnalysis(recommendation, entry, sl, tp);
      200.         }
      201.     }
      202. }

      203. //+------------------------------------------------------------------+
      204. //| 定时器事件                                                      |
      205. //+------------------------------------------------------------------+
      206. void OnTimer()
      207. {
      208.     PerformMarketAnalysis();
      209. }

      210. //+------------------------------------------------------------------+
      211. //| 图表事件处理                                                    |
      212. //+------------------------------------------------------------------+
      213. void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
      214. {
      215.     if(id == CHARTEVENT_CLICK)
      216.     {
      217.         // 点击图表时触发分析
      218.         PerformMarketAnalysis();
      219.     }
      220. }

      221. //+------------------------------------------------------------------+
      222. //| 专家去初始化函数                                                 |
      223. //+------------------------------------------------------------------+
      224. void OnDeinit(const int reason)
      225. {
      226.     EventKillTimer();
      227.     Comment("");
      228. }

      229. //+------------------------------------------------------------------+
      230. //| 基于分析执行交易(示例)                                         |
      231. //+------------------------------------------------------------------+
      232. void ExecuteTradeBasedOnAnalysis(string recommendation, double entry, double sl, double tp)
      233. {
      234.     if(recommendation == "HOLD") return;
      235.    
      236.     // 计算手数(基于风险百分比)
      237.     double lotSize = CalculateLotSize(sl);
      238.    
      239.     // 执行交易
      240.     if(recommendation == "BUY")
      241.     {
      242.         OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, sl, tp, "DeepSeek AI分析", 0, 0, Green);
      243.     }
      244.     else if(recommendation == "SELL")
      245.     {
      246.         OrderSend(Symbol(), OP_SELL, lotSize, Bid, 3, sl, tp, "DeepSeek AI分析", 0, 0, Red);
      247.     }
      248. }

      249. //+------------------------------------------------------------------+
      250. //| 计算合适的手数                                                  |
      251. //+------------------------------------------------------------------+
      252. double CalculateLotSize(double stopLoss)
      253. {
      254.     double accountBalance = AccountBalance();
      255.     double riskAmount = accountBalance * riskPercentage / 100;
      256.     double stopPoints = MathAbs(OrderOpenPrice() - stopLoss) / Point;
      257.     double tickValue = MarketInfo(Symbol(), MODE_TICKVALUE);
      258.    
      259.     if(stopPoints == 0) return 0.01;
      260.    
      261.     double lotSize = riskAmount / (stopPoints * tickValue);
      262.     lotSize = NormalizeDouble(lotSize, 2);
      263.    
      264.     // 确保不超过最小/最大限制
      265.     double minLot = MarketInfo(Symbol(), MODE_MINLOT);
      266.     double maxLot = MarketInfo(Symbol(), MODE_MAXLOT);
      267.    
      268.     if(lotSize < minLot) lotSize = minLot;
      269.     if(lotSize > maxLot) lotSize = maxLot;
      270.    
      271.     return lotSize;
      272. }
      复制代码



    ""
    还没有人打赏,支持一下
    回复

    举报

     

    回答|共 14 个

    janny1122 LV0

    发表于 2026-1-3 19:59:00 | 显示全部楼层

    这不得需要付费的API才行啊,接入哪个模型版本啊

    Yasinjan LV4

    发表于 2026-1-3 23:44:40 | 显示全部楼层

    最近我专门找这个函数。很多次让DS做出来,链接失败。这个试一试。 感谢。

    Yasinjan LV4

    发表于 2026-1-3 23:56:05 | 显示全部楼层

    另外, 要在输入参数窗口里, 能实现随意填写交易策略的。(比如: 价格回调均线附近做多,交叉就平仓)。 我见过一个收费ea的参数。就这样。 因API在MQL4中的运用失败就买能继续研究了。 现在重新研究以下。
    JunMingHe, 这方面可以多沟通一下吗。留下 wx  xatik1

    Yasinjan LV4

    发表于 2026-1-4 00:47:17 | 显示全部楼层

    问题来了,API请求失败。就是信息交换不了。这个怎么解决?以前也这个问题。
    https://api.deepseek.com/chat/completions
    https://api.deepseek.com/v1/chat/completions

    2026.01.04 00:40:17.046        DS_AI交易系统 XAUUSD,H1: 2026.01.02 23:59:58 [INFO] 备用分析完成 - 信号: HOLD, 置信度: 0.30
    2026.01.04 00:40:17.046        DS_AI交易系统 XAUUSD,H1: 2026.01.02 23:59:58 [INFO] API请求失败,使用备用技术分析
    2026.01.04 00:40:17.046        DS_AI交易系统 XAUUSD,H1: 2026.01.02 23:59:58 [INFO] DeepSeek API请求失败, 尝试切换到Kimi
    2026.01.04 00:40:17.046        DS_AI交易系统 XAUUSD,H1: 2026.01.02 23:59:58 [INFO] 错误响应: Failed to parse the request body as JSON: messages[1].?: EOF while parsing a string at line 1 column 1290
    2026.01.04 00:40:17.046        DS_AI交易系统 XAUUSD,H1: 2026.01.02 23:59:58 [INFO] API返回错误状态码: 400
    2026.01.04 00:40:16.914        DS_AI交易系统 XAUUSD,H1: 2026.01.02 23:59:58 [INFO] 开始执行AI分析...
    2026.01.04 00:40:15.644        DS_AI交易系统 XAUUSD,H1: 2026.01.02 23:59:58 [INFO] 备用分析完成 - 信号: HOLD, 置信度: 0.30
    2026.01.04 00:40:15.644        DS_AI交易系统 XAUUSD,H1: 2026.01.02 23:59:58 [INFO] API请求失败,使用备用技术分析
    2026.01.04 00:40:15.644        DS_AI交易系统 XAUUSD,H1: 2026.01.02 23:59:58 [INFO] DeepSeek API请求失败, 尝试切换到Kimi
    2026.01.04 00:40:15.644        DS_AI交易系统 XAUUSD,H1: 2026.01.02 23:59:58 [INFO] 错误响应: Failed to parse the request body as JSON: messages[1].?: EOF while parsing a string at line 1 column 1290
    2026.01.04 00:40:15.643        DS_AI交易系统 XAUUSD,H1: 2026.01.02 23:59:58 [INFO] API返回错误状态码: 400
    怎么解决?
    1111111.jpg


    janny1122 LV0

    发表于 2026-1-4 00:51:51 | 显示全部楼层

    调试成功,但是得开通付费,不然就会提示失败。
    api.png

    janny1122 LV0

    发表于 2026-1-4 00:56:43 | 显示全部楼层

    搞个调用免费版的,或者用开源版的自己搭建出来一个就好了,有不有技术大佬解决一下呢?
    付费.png

    janny1122 LV0

    发表于 2026-1-4 08:01:19 | 显示全部楼层

    Yasinjan 发表于 2026-1-4 00:47
    问题来了,API请求失败。就是信息交换不了。这个怎么解决?以前也这个问题。
    https://api.deepseek.com/ch ...

    你这个UI可以呀,分享一下 呀

    Yasinjan LV4

    发表于 2026-1-4 14:18:30 | 显示全部楼层

    本帖最后由 Yasinjan 于 2026-1-4 14:38 编辑

    源码在这。
    DS_AI交易系统.mq4

    janny1122 LV0

    发表于 2026-1-4 19:24:44 | 显示全部楼层

    Yasinjan 发表于 2026-1-4 14:18
    源码在这。

    这其他功能需要完善。

    我电脑配置是可以,你会开源代码本地部署不?或者买服务器部署。
    12下一页
    您需要登录后才可以回帖 登录 | 注册

    提醒: 禁止引战、谩骂、灌水内容

    微信二维码

    有问题联系客服