构建新兴的社交技术, 第一部分: 发布您的 MetaTrader 5 信号·综合运用
📘

构建新兴的社交技术, 第一部分: 发布您的 MetaTrader 5 信号·综合运用

第 3/3 篇

◍ 把信号账号接进社交平台的鉴权回路

这段 PHP 逻辑处理的是第三方信号分发系统与 Twitter 的 OAuth 握手:先拿 request token,HTTP 返回码为 200 时才拼出授权 URL 并跳转,否则直接回写 Connection with Twitter failed 的 JSON 错误。 回调路由 /twitter/oauth_callback 里,用会话里暂存的 request_token 换 access_token;拿到后重建连接并把 host 写死为 https://api.twitter.com/1.1/,这是调用 1.1 版接口的关键一步,漏掉就会落到旧版端点。 最后用 account/verify_credentials 校验凭证有效性,参数里 include_entities 设为 false 可减少返回体积。做 MT5 信号转发中间件时,这套 token 生命周期管理可直接照搬,但注意外汇与贵金属信号推送涉及高风险,任何自动发单都只是概率优势而非确定性结论。

「OAuth 回调里落地令牌与库表同步」

这段服务端脚本处理 Twitter OAuth 回跳:当且仅当返回对象带 screen_name 与 name 时,才把 id 与 access_token 二元组写入 $_SESSION['twitter'],并顺手清掉临时的 request_token,避免授权态残留。 Twitter 的 OAuth access token 在用户主动撤销前长期有效,所以用户再次点击授权时不应新建记录,而是尝试刷新原令牌。代码先用 SELECT 查 twitterers 表是否存在 twitter_id,命中就走 UPDATE,未命中走 INSERT,用 mysql_real_escape_string 做基础转义。 验证方式很直接:在 MT5 之外的 Web 中间件里跑这套回调,用同一个测试账号连续授权两次,查库应只有一行且 access_token_secret 字段被更新;若看到两行相同 twitter_id,说明 SELECT 分支没生效。外汇与贵金属信号若接此类社交源,需注意第三方令牌泄露会带来跟单误触发的高风险。

MQL5 / C++
if($content && isset($content->screen_name) && isset($content->name))
{
    $_SESSION[&class="macro">#x27;twitter&class="macro">#x27;] = array(
        &class="macro">#x27;id&class="macro">#x27; => $content->id,
        &class="macro">#x27;access_token&class="macro">#x27; => $access_token[&class="macro">#x27;oauth_token&class="macro">#x27;],
        &class="macro">#x27;access_token_secret&class="macro">#x27; => $access_token[&class="macro">#x27;oauth_token_secret&class="macro">#x27;]
    );
    class=class="str">"cmt">// remove the request token from session
    unset($_SESSION[&class="macro">#x27;twitter&class="macro">#x27;][&class="macro">#x27;request_token&class="macro">#x27;]);
    unset($_SESSION[&class="macro">#x27;twitter&class="macro">#x27;][&class="macro">#x27;request_token_secret&class="macro">#x27;]);
    class=class="str">"cmt">// Twitter&class="macro">#x27;s OAuth access tokens are permanent until revoked so
    class=class="str">"cmt">// we try to update them when a tweeterer tries to give access
    class=class="str">"cmt">// permissions again
    $sql = "SELECT * FROM twitterers WHERE twitter_id=&class="macro">#x27;$content->id&class="macro">#x27;";
    $result = DBConnection::getInstance()->getHandler()->query($sql);
    if($result->num_rows)
    {
        $sql = "UPDATE twitterers SET "
        . "access_token = &class="macro">#x27;" . mysql_real_escape_string($access_token[&class="macro">#x27;oauth_token&class="macro">#x27;]) . "&class="macro">#x27;, "
        . "access_token_secret = &class="macro">#x27;" . mysql_real_escape_string($access_token[&class="macro">#x27;oauth_token_secret&class="macro">#x27;]) . "&class="macro">#x27; "
        . "WHERE twitter_id =&class="macro">#x27;" . $content->id . "&class="macro">#x27;";
    }
    else
    {
        $sql = "INSERT INTO twitterers(twitter_id, access_token, access_token_secret) "
        . "VALUES(&class="macro">#x27;"
        . mysql_real_escape_string($content->id) . "&class="macro">#x27;,&class="macro">#x27;"
        . mysql_real_escape_string($access_token[&class="macro">#x27;oauth_token&class="macro">#x27;]) . "&class="macro">#x27;,&class="macro">#x27;"
        . mysql_real_escape_string($access_token[&class="macro">#x27;oauth_token_secret&class="macro">#x27;]) . "&class="macro">#x27;)";
    }
    DBConnection::getInstance()->getHandler()->query($sql);
    echo &class="macro">#x27;{"message":{"text":"Everything is ok! Laplacianlab\&class="macro">#x27;s SDSS &class="macro">#x27;

把信号推送接进第三方账号的鉴权坑

这段 PHP 片段展示了一个常见误区:交易信号系统想代用户在 Twitter 发推,后端先用 OAuth 登录校验,失败就回 {"error":{"text":"Login error"}},成功才拼出提示文案说“SDSS 现在能代你发信号,不想再让它发就去 Twitter 撤销授权”。 真正落地时,代码后半段直接 new TwitterOAuth(API_KEY, API_SECRET, $user->getAccessToken(), $user->getAccessTokenSecret()) 发一条写死文案的推文。这里没有做 token 失效重试,也没有判断 $user 对象是否真拿到了 access token——MT5 侧的 WebRequest 若对接这类接口,401 概率会随 token 过期陡增。 外汇与贵金属信号推送属高风险场景,任何自动代发都可能因平台 API 变更而静默失败。开 MT5 用 WebRequest 打同样端点前,先手动 curl 一次确认 token 有效期,比直接抄这段更稳妥。

MQL5 / C++
<?php
$app->post(&class="macro">#x27;/login&class="macro">#x27;, function() use($app) {
  $username = $app->request->post(&class="macro">#x27;username&class="macro">#x27;);
  $password = $app->request->post(&class="macro">#x27;password&class="macro">#x27;);
  if (check_credentials($username, $password)) {
    $user = get_user($username);
    if ($user->is_twitter_linked()) {
      echo &class="macro">#x27;{"success":{"message":"SDSS
      . &class="macro">#x27;can now tweet trading signals on your behalf. Please, if you no &class="macro">#x27;
      . &class="macro">#x27;longer want the SDSS to tweet on your behalf, log in your Twitter &class="macro">#x27;
      . &class="macro">#x27;account and revoke access."}}&class="macro">#x27;;
    }
    else
    {
      echo &class="macro">#x27;{"error":{"text":"Login error"}}&class="macro">#x27;;
    }
  }
  else
  {
    echo &class="macro">#x27;{"error":{"text":"Login error"}}&class="macro">#x27;;
  }
});
$app->run();
class=class="str">"cmt">// Let&class="macro">#x27;s assume there&class="macro">#x27;s an object named $user to access the tokens...
$connection = new TwitterOAuth(
  API_KEY,
  API_SECRET,
  $user->getAccessToken(),
  $user->getAccessTokenSecret());
$message = "Hello world! I am Laplacianlab&class="macro">#x27;s SDSS and I am tweeting on behalf of a tweeterer.";
$connection->post(&class="macro">#x27;statuses/update&class="macro">#x27;, array(&class="macro">#x27;status&class="macro">#x27; => $message));

◍ 记住这一条就够了

把 MT5 的自动交易能力跟人脑判断接起来,核心就是 SDSS 这套架构:VPS 或 DC 上跑 MetaTrader 5 终端、瘦 PHP 写的 Twitter Web 应用、再加上 Twitter 本身三者串联。前边已经用 RESTful Web 服务打通了 MT5 与 PHP 应用,OAuth 协议则把应用挂上 Twitter,下一步是按 MQL5-RPC 文章的路子补一个 MQL5-RESTful 框架。 这类人机协同(HBC 模式)的思路,对外汇、贵金属这类高波动品种尤其值得试——EA 发信号让人确认再下单,可能比纯机器盲跑更稳,但手动环节延迟和样本偏差也别忽视。 真要落地,先开一台 VPS 部署 MT5,用 WebRequest() 把信号抛出去,剩下的集成慢慢迭代就行。

常见问题

检查 OAuth 回调地址是否与后台白名单完全一致,并在回调里同时做令牌落地和库表用户同步,少一步就会断链。
多半是令牌写入库表后没设过期刷新,或回调只存了 code 没换 access_token,补上刷新逻辑即可。
可以,小布能对照你的鉴权回路梳理 OAuth 回调步骤,标出令牌未落地或库表未同步的断点。
记住:回调里必须一次性完成令牌换取和库表同步,分开处理就会掉授权。
先跑通 OAuth 回调里的令牌落地与用户表写入,再接推送,能避开大部分鉴权坑。