Table of Contents
仕組み
- TradingViewのオーダーシグナル → GCPのWebアプリ → GCPのDBへオーダーを保存
- MT4からWebアプリへアクセス → GCPのDBからオーダーを取得 →MT4で自動売買
データベースの準備
格安で使える「FIrestore」を使います。
データベースの準備
GCPのメニューからFirestore
ネイティブモード
ロケーション(地域)はシンガポールに決定
空っぽのデータベースが完成
WebアプリをCloud Functionsへコードをコピペで設置する
GCPのメニューからCloud Functions
関数の作成
構成
リージョンとは?
リージョンはサーバーが置いてある地域のことです。近い方が有利。Bybitはシンガポール拠点。
未認証の呼び出しを許可
未認証の呼び出しを許可すると外部からのアクセスを許可できます。
ランタイム
ランタイムをPythonへ変更
main.py
requirements.txt
TradingViewの詳細
アラート追加
メッセージ
URLはGCPのここ
main.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 |
def hello_world(request): request_json = request.get_json() order = "" symbol = "" if request_json and 'order' in request_json: order = request_json['order'] if request_json and 'symbol' in request_json: symbol = request_json['symbol'] if order == "": state = load_order(symbol) return state else: update_order(symbol,order) return{"res":"ok"} # {"symbol":"USDJPY"} # {"symbol":"USDJPY","order":"buy"} #--------------------------------------------------- # DB #--------------------------------------------------- from google.cloud import firestore def update_order(symbol,order): """ orderの上書き保存 """ if symbol: db = firestore.Client() doc_ref = db.collection("TradingView").document(symbol) doc_ref.set({ "order": order }) def load_order(symbol): """ orderの読み込み """ if symbol: db = firestore.Client() doc = db.collection("TradingView").document(symbol).get() #データベース読み込み print(doc.to_dict()) if doc.to_dict()!=None: return doc.to_dict()["order"] else: return "None" |
requirements.txt
1 |
google-cloud-firestore |
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}}”}
通知はGCPのURL
これで保存すれば完了。
これでTrading Viewの設定が完了です。
MT4の設定
WebRequestを許可にしておく
URLはcloud functionsのトリガーURLです。
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 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
//+------------------------------------------------------------------+ //| ProjectName | //| Copyright 2018, CompanyName | //| http://www.companyname.net | //+------------------------------------------------------------------+ #property strict input string web_hook_url = "URL"; input string input_symbol = "";//通貨ペア(空白の場合は自動) input int magic_number =124455; input int input_spread = 30;//スプレッド制限 input int input_slippage = 20;//スリッページ制限 input double qty = 0.1;//ロット数 //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick() { string order = ""; static datetime prev_time = iTime(NULL,0,0); if(Ask - Bid <= input_spread * _Point) { if(prev_time == iTime(NULL,0,0)) { return; } if(Seconds() < 2) { return; } prev_time = iTime(NULL,0,0); 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() { static string prev_state = ""; 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(prev_state == CharArrayToString(result)) { return ""; } if(prev_state == "") { prev_state = CharArrayToString(result); return ""; } prev_state = CharArrayToString(result); if(order=="buy" || order=="buy_close"|| order=="sell"|| order=="sell_close") { Print(Symbol()," ok order:",CharArrayToString(result)); 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,qty,Ask,0,0,0,NULL,magic_number,0,clrGreen); } if(side==1) { bool res= OrderSend(NULL,side,qty,Bid,0,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が完了です。
BybitがGoogleのIPアドレス規制をしているためです。国内のVPSなら使…
自分のbotで使ってるAPIキーを使用しているんですが、 You have br…
pybit 最新版にコードを変更しました。コードとrequirements.tx…
お返事ありがとうございます。はい。pybit==2.3.0になっております。
コードはあっていると思います。rewuirements.txtは「pybit==…