😭「TradingViewとMT4を繋げたいけどサーバーは無理!」からのローカル救済作戦

『クラウドサーバーは高いし、設定難しいし...』と絶望していた私が、ngrokという魔法のツールを発見して、自宅PCでTradingView自動売買を実現した感動の物語。

公開日: 2023-02-05
更新日: 2025-01-29

💻 「自宅PCで自動売買ってできるの?」の答え

結論:できます!しかも無料で! 🎉

私も最初は「自動売買って、高いサーバー借りないとダメなんでしょ?」って思ってました。

でもngrokという魔法のツールを知って、人生が変わりました。自宅のPCがあたかもプロのサーバーになったんです!

「え、こんな簡単な方法があったの?」

そんなあなたに、私の感動をお伝えしたくてこの記事を書きました。

概要

システム構成

TradingView → Webhook → ngrok → Python → MT4 EA

🛠️ 「何が必要なの?」チェックリスト

  • 🕳️ ngrok:「自宅PCを世界に公開する魔法のツール」(無料)
  • 🐍 Python:「TradingViewからの信号を受け取る司令塔」(無料)
  • 💹 MT4:「いつもの取引プラットフォーム」(無料)
  • 📊 TradingView Pro:「Webhook機能が使える版」(月額数千円)

お、ほとんど無料じゃん! これなら学生でもできるですね。

ngrokのセットアップ

1. アカウント作成とダウンロード

ngrokにログインしてアカウントを作成します。

ファイルをダウンロードして解凍します。

2. ngrokの起動と設定

ngrok.exeをダブルクリックで起動します。

コマンドプロンプトが表示されます。

3. 認証トークンの設定

ダッシュボードから認証コマンドをコピーして実行します。

認証コマンドを入力してエンターを押します。

アカウント情報が保存されます。

4. HTTPトンネルの開始

以下のコマンドでローカルサーバーを公開します。

ngrok http 80

この外部公開URLをメモしておきます。

重要: このURLは起動するたびに変わります。

Python Webアプリケーションの作成

1. Pythonのインストール

Python公式サイトからインストーラーをダウンロードします。

Python 3.10を選択してダウンロードします。

重要: インストール時に「Add to PATH」にチェックを入れてください。

2. Webアプリケーションの実装

以下のファイル構成でWebアプリを作成します。

app.py

from flask import Flask, request, jsonify
import json

app = Flask(__name__)

# グローバル変数で最新の注文を保存
latest_order = ""

@app.route('/', methods=['POST'])
def webhook():
    global latest_order
    
    try:
        # JSONデータを受信
        data = request.get_json()
        
        if data and 'order' in data:
            latest_order = data['order']
            print(f"受信した注文: {latest_order}")
            
        return jsonify({"status": "success"}), 200
    
    except Exception as e:
        print(f"エラー: {e}")
        return jsonify({"error": str(e)}), 400

@app.route('/', methods=['GET'])
def get_order():
    global latest_order
    
    # MT4からの注文取得リクエストに応答
    order = latest_order
    latest_order = ""  # 注文を返したらクリア
    
    return order

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80, debug=True)

3. 必要なライブラリのインストール

install.bat

pip install flask
pip install uvicorn
pause

kidou.bat

python app.py
pause

install.batを実行してライブラリをインストールします。

kidou.batを実行してWebアプリを起動します。

TradingViewアラート設定

1. Pine Scriptの作成

以下のPine Scriptコードを作成します。

//@version=5
strategy("Webhook Signal Strategy", overlay=true)

// シンプルなRSI戦略
rsi = ta.rsi(close, 14)

// エントリー条件
longCondition = ta.crossover(rsi, 30)
shortCondition = ta.crossunder(rsi, 70)

// エグジット条件
longExitCondition = ta.crossunder(rsi, 70)
shortExitCondition = ta.crossover(rsi, 30)

// 注文実行
if longCondition
    strategy.entry("Long", strategy.long, comment="buy")

if longExitCondition
    strategy.close("Long", comment="buy_close")

if shortCondition
    strategy.entry("Short", strategy.short, comment="sell")

if shortExitCondition
    strategy.close("Short", comment="sell_close")

2. アラートの設定

戦略にアラートを追加します。

3. Webhookメッセージフォーマット

アラート作成時に以下のJSONメッセージを設定します。

{
  "symbol": "{{ticker}}",
  "order": "{{strategy.order.comment}}"
}

Webhook URLにはngrokで取得したURLを設定します。

MT4とEAの設定

1. WebRequestの許可

MT4でWebRequestを有効にします。

ツール → オプション → エキスパートアドバイザー

「WebRequestを許可するURLリスト」に以下を追加:

  • http://127.0.0.1/
  • http://localhost/

2. EA(Trading View.mq4)の実装

#property strict

input string web_hook_url = "http://127.0.0.1/";
input string input_symbol = ""; // 通貨ペア(空白の場合は自動)
input int magic_number = 124455;
input double input_lots = 0.01; // ロットサイズ
input int input_spread = 30; // スプレッド制限
input int input_slippage = 20; // スリッページ制限

void OnTick()
{
    string order = "";
    
    // スプレッドチェック
    if(Ask - Bid <= input_spread * _Point)
    {
        order = web_request();
    }
    
    // ポジション管理
    if(position_count(OP_BUY) > 0)
    {
        if(order == "buy_close") 
        {
            position_close(OP_BUY);
        }
    }
    
    if(position_count(OP_SELL) > 0)
    {
        if(order == "sell_close") 
        {
            position_close(OP_SELL);
        }
    }
    
    // 新規注文
    if(order == "buy") 
    {
        position_entry(OP_BUY);
    }
    
    if(order == "sell") 
    {
        position_entry(OP_SELL);
    }
}

string web_request() 
{
    string url = web_hook_url;
    string headers;
    string data;
    char post[], result[];
    
    string symbol = Symbol();
    if(input_symbol != "") 
    {
        symbol = input_symbol;
    }
    
    headers = "Content-Type: application/json\r\n";
    data = "{\"symbol\":\"" + symbol + "\"}";
    
    ArrayResize(post, StringToCharArray(data, post, 0, WHOLE_ARRAY, CP_UTF8) - 1);
    
    int rest = WebRequest("GET", url, headers, 5000, post, result, headers);
    
    string order = CharArrayToString(result);
    StringReplace(order, "\"", "");
    
    if(rest != 200) 
    {
        Print(Symbol(), " error ", CharArrayToString(result));
    } 
    else 
    {
        if(order == "buy" || order == "buy_close" || order == "sell" || order == "sell_close") 
        {
            Print(Symbol(), " web_request order: ", order);
        }
        return order;
    }
    
    return "";
}

int position_count(int side)
{
    int count = 0;
    for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderType() == side)
            {
                if(OrderSymbol() == Symbol())
                {
                    if(OrderMagicNumber() == magic_number)
                    {
                        count++;
                    }
                }
            }
        }
    }
    return count;
}

void position_entry(int side)
{
    if(side == 0)
    {
        bool res = OrderSend(NULL, side, input_lots, Ask, input_slippage, 0, 0, NULL, magic_number, 0, clrGreen);
    }
    if(side == 1)
    {
        bool res = OrderSend(NULL, side, input_lots, Bid, input_slippage, 0, 0, NULL, magic_number, 0, clrRed);
    }
}

void position_close(int side)
{
    for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderType() == side)
            {
                if(OrderSymbol() == Symbol())
                {
                    if(OrderMagicNumber() == magic_number)
                    {
                        bool res = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, clrBlue);
                    }
                }
            }
        }
    }
}

3. EAの設定と動作確認

自動売買を許可します。

EAが正常に動作している場合、ニコちゃんマークが表示されます。

システム起動手順

1. ngrokの起動

  1. ngrok.exeをダブルクリック
  2. ngrok http 80 を実行
  3. 生成されたURLをメモ

2. TradingViewの設定更新

アラートのWebhook URLを新しいngrok URLに更新します。

3. Pythonアプリの起動

kidou.batをダブルクリックして実行します。

4. MT4の準備

  1. MT4を起動
  2. EAをチャートに適用
  3. 自動売買をON
  4. EA設定を確認

まとめ

🎉 あなたへのメッセージ(同じ夢を持つ仲間へ)

「本当に私にもできるの?」と不安なあなたへ

この記事を最後まで読んでくれて、ありがとうございます。

きっと今、こんな気持ちじゃないですか?

「ngrokって名前からして難しそう...」
「コマンドとか使うの怖い...」
「失敗したらお金を失いそう...」

その不安、すっごくわかります。

私も最初は「自分には絶対無理」って思ってました。コマンドプロンプトすら触ったことがなかったので。

でも大丈夫。あなたにもできます

✨ この記事で手に入れたもの

  • 🧠 知識:自宅PCでプロ級の自動売買システムが作れることを知った
  • 🛠 道具:ngrokという強力な味方を手に入れた
  • 💪 勇気:「やってみよう」という気持ち

🚀 これからやること

  1. デモ口座から始める:絶対にいきなり本番口座は使わない
  2. 小さく始める:最初は1つの通貨ペアから
  3. 記録をつける:何がうまくいって何がダメだったか

あなたの成功が楽しみです

数ヶ月後のあなた

  • 「あの時、諦めなくて良かった」
  • 「今では寝てる間も自動売買してくれる」
  • 「友達にも教えてあげたい」

そんな風になってるはず。

失敗しても大丈夫。私も何度も失敗しました。
でも、失敗するたびに強くなって、最後は成功しました。

あなたなら絶対にできます。応援してます! 🌟


もし途中で困ったことがあれば、遠慮なくコメントしてください。一緒に解決しましょう!

P.S. 初めて自動売買が成功した時の「やった!」という気持ちは、今でも忘れられません。あなたにもその瞬間が必ず訪れます。

この記事が役に立ったらシェアしてください

📚 プログラミング・開発 の関連記事