外部から自分のローカルPCにアクセスできるようにngrokを設定する










このURLはインスタントなので起動させる度に毎回変わります。
これでngrokの設定が完了です。
Pythonでwebアプリケーションを作る
今はパソコンにアクセスしてもアプリケーションが起動していないので何も表示されません。
PythonでWebアプリを作ってローカルで起動します。






あとはコードを書いていきます。
ファイル構成

app.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
import json from pydantic import BaseModel from fastapi import FastAPI from typing import Optional app = FastAPI() # リクエストbodyを定義 class Item(BaseModel): order:Optional[str] = None symbol:Optional[str] = None @app.get("/") def read_root(): return {"Hello": "World"} @app.post("/") def entryorder(item: Item): order = item.order symbol = item.symbol print(symbol) if order == None: state = load_order(symbol) if state != None: update_order(symbol,order) return state else: update_order(symbol,order) return{"res":"ok"} def load_order(symbol): """ positionの関連付けJSONファイルorderの読み込み """ if symbol: try: order_json=open(symbol+'order.json',"r") order=json.load(order_json) order_json.close except Exception as e: print("JSONの読み込みに失敗したのでJSONファイルを新規作成しました。") order_json=open(symbol+'order.json',"w") json.dump({"order":None},order_json) order_json.close order_json=open(symbol+'order.json',"r") order=json.load(order_json) order_json.close return order["order"] def update_order(symbol,order): """ JSONファイルorderの上書き保存 """ if symbol: order_json=open(symbol+'order.json',"w") json.dump({"order":order},order_json) order_json.close |
requirements.txt
1 2 3 |
fastapi uvicorn pyyaml |
install.bat
1 |
pip install -r requirements.txt |
kidou.bat
1 |
uvicorn app:app --port 80 |

installをダブルクリック

kidou.batをダブルクリック

黒い画面は閉じないでそのままにしておく
これでWebアプリケーションが完了です。
Trading Viewの設定
コードの注文のコードにcommentを入れる
1 2 3 4 5 6 7 |
//@version=5 strategy("test", overlay=true) if barstate.islast if strategy.position_size != 0 strategy.close_all(comment = "buy_close") else strategy.order("My Long Entry Id", strategy.long,comment = "buy") |
comment = “buy”
comment = “buy_close”
comment = “sell”
comment = “sell_close”
注文コマンドのcommentはこれです。
1 2 3 4 |
comment = "buy" comment = "buy_close" comment = "sell" comment = "sell_close" |
メッセージ欄はこれです。
1 |
{"symbol":"{{ticker}}","order":"{{strategy.order.comment}}"} |
コメントをwebアプリケーションへ送信します。
webhookを設定する




{“symbol”: “{{ticker}}” ,”order”:”{{strategy.order.comment}}”}

これで保存すれば完了。
これでTrading Viewの設定が完了です。
MT4の設定

WebRequestを許可にしておく
URLはローカルホストのURLです。
1 |
http://127.0.0.1/ |
MQLでWebRequestを使う
EA「Trading View」
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
#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("POST",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); } } } } } } |
これでMT4が完了です。
起動手順


ngrok.exe http 80



kidou.batをダブルクリック








お疲れ様でした。
以前同様の質問を頂きましたので、こちらの記事をお読みください。 https://…
初歩的な質問で申し訳ございません。 パラメータ設定画面でロット数を可変可能にする…
ホソノP様 初めまして山田と申します。 サイトに掲載されているバイナンス用のbo…
bybit版が上手く設定出来たので、バイナンスでもやろうと思ったのですがエラーが…
すみません、ビール送らせていただきますと書きましたが、欲しいものリストではなくて…