トレーディングViewWebHookの直結戦略

作者: リン・ハーン小さな夢, 2020年8月3日 09時58分19秒
タグ:

関連記事:https://www.fmz.com/bbs-topic/5969

HTTPSサーバー自体は問題があるため,ThreadingHTTPSserverを代替に検討してください. 参考:https://docs.python.org/3.7/library/http.server.htmlPython 3.7 のバージョンが必要です.

HTTPServerに関する情報:https://www.zybuluo.com/JunQiu/note/1350528


'''
请求格式:http://x.x.x.x:xxxx/data?access_key=xxx&secret_key=yyy&type=buy&amount=0.001
策略机器人参数:
- 类型:加密字符串,AccessKey , SecretKey ,可以用FMZ平台的低权限的API KEY,或者自己生成KEY也可以。
- 类型:字符串,合约ID,ContractType
- 类型:数值,端口号,Port
'''

import re
import _thread
import json
from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler
from urllib.parse import parse_qs, urlparse

def url2Dict(url):
    query = urlparse(url).query  
    params = parse_qs(query)  
    result = {key: params[key][0] for key in params}  
    return result

class Executor(BaseHTTPRequestHandler):
    def do_GET(self):
        try:
            dictParam = url2Dict(self.path)
            Log("测试", dictParam)
        except Exception as e:
            Log("Provider do_GET error, e:", e)
    def do_POST(self):
        try:
            self.send_response(200)
            self.send_header("Content-type", "application/json")
            self.end_headers()
            dictParam = url2Dict(self.path)
            
            # 测试POST请求Body信息            
            data = self.rfile.read(200)   # 指定了读取长度
            Log("data:", data)            # 打印POST请求的数据,可以根据请求中的数据具体再让机器人执行对应的操作
            
            # 校验
            if len(dictParam) == 4 and dictParam["access_key"] == AccessKey and dictParam["secret_key"] == SecretKey:
                del dictParam["access_key"]
                del dictParam["secret_key"]
                Log("接收到请求", "参数:", dictParam, "#FF0000")
                '''
                map[access_key:xxx amount:0.001 secret_key:yyy type:buy]
                '''
                isSpot = True
                if exchange.GetName().find("Futures") != -1:
                    if ContractType != "":
                        exchange.SetContractType(ContractType)
                        isSpot = False 
                    else :
                        raise "未设置期货合约"
                                
                q = None
                if exchange.GetName() == "Futures_CTP" and UseMarketOrderForCTP == False:
                    q = ext.NewTaskQueue()
                
                if isSpot and dictParam["type"] == "buy":
                    exchange.Buy(-1, float(dictParam["amount"]))
                    Log(exchange.GetAccount())
                elif isSpot and dictParam["type"] == "sell":
                    exchange.Sell(-1, float(dictParam["amount"]))
                    Log(exchange.GetAccount())
                elif not isSpot and dictParam["type"] == "long":
                    exchange.SetDirection("buy")
                    if not q:
                        exchange.Buy(-1, float(dictParam["amount"]))
                    else :
                        q.pushTask(exchange, ContractType, "buy", float(dictParam["amount"]), lambda task, ret: Log(task["desc"], ret, "#FF0000"))
                    Log("持仓:", exchange.GetPosition())
                elif not isSpot and dictParam["type"] == "short":
                    exchange.SetDirection("sell")
                    if not q:
                        exchange.Sell(-1, float(dictParam["amount"]))
                    else :
                        q.pushTask(exchange, ContractType, "sell", float(dictParam["amount"]), lambda task, ret: Log(task["desc"], ret, "#FF0000"))
                    Log("持仓:", exchange.GetPosition())
                elif not isSpot and dictParam["type"] == "cover_long":
                    exchange.SetDirection("closebuy")
                    if not q:
                        exchange.Sell(-1, float(dictParam["amount"]))
                    else :
                        q.pushTask(exchange, ContractType, "closebuy", float(dictParam["amount"]), lambda task, ret: Log(task["desc"], ret, "#FF0000"))
                    Log("持仓:", exchange.GetPosition())
                elif not isSpot and dictParam["type"] == "cover_short":
                    exchange.SetDirection("closesell")
                    if not q:
                        exchange.Buy(-1, float(dictParam["amount"]))
                    else :
                        q.pushTask(exchange, ContractType, "closesell", float(dictParam["amount"]), lambda task, ret: Log(task["desc"], ret, "#FF0000"))
                    Log("持仓:", exchange.GetPosition())
                
                if q is not None:
                    while q.size() > 0:
                        q.poll()
                        Sleep(500)
            
            # 处理body数据
            if isDealBodyMsg:
                if exchange.GetName().find("Futures") != -1:
                    Log("data:", data.decode('utf-8'))  # 测试
                    if re.search(r'buy', data.decode('utf-8')):
                        Log("触发buy")
                        exchange.SetContractType(ct)
                        exchange.SetDirection("buy")
                        exchange.Buy(-1, amount)
                    elif re.search(r'sell', data.decode('utf-8')):
                        Log("触发sell")
                        exchange.SetContractType(ct)
                        exchange.SetDirection("sell")
                        exchange.Sell(-1, amount)
            
            # 写入数据应答
            self.wfile.write(json.dumps({"state": "ok"}).encode())
        except Exception as e:
            Log("Provider do_POST error, e:", e)


def createServer(host):
    try:
        server = ThreadingHTTPServer(host, Executor)
        Log("Starting server, listen at: %s:%s" % host)
        server.serve_forever()
    except Exception as e:
        Log("createServer error, e:", e)
        raise Exception("stop")

def main():
    # 开启一个线程
    try:
        _thread.start_new_thread(createServer, (("0.0.0.0", Port), ))         # VPS服务器上测试           
    except Exception as e:        
        Log("错误信息:", e)
        raise Exception("stop")    
    if exchange.GetName().find("Futures") != -1:
        exchange.SetContractType(ContractType)
    Log("账户资产信息:", _C(exchange.GetAccount))
    while True:
        if exchange.GetName() == "Futures_CTP":
            if exchange.IO("status"):
                LogStatus(_D(), "CTP连接")
            else:
                LogStatus(_D(), "CTP未连接")
        else:
            LogStatus(_D())
        Sleep(2000)

もっと

エス8888/upload/asset/2457669d9c32568732cb7.jpg リアルディスクを開くと,このエラーが表示されます.

エス8888/upload/asset/2457669d9c32568732cb7.jpg リアルディスクを開くと,このエラーが表示されます.

華山の剣について(先生) 微信を入れますか?

華山の剣について2021/11/21 11:53:33 CMD 199866 buy=0.1, 管理者がこのメッセージを受け取ったが,ロボットは動いていない.

オーバーオンV:maybeyeah.V:maybeyeah.V:maybeyeah.V:maybeyeah.V:maybeyeah.V:maybeyeah.

哲1ビデオの動画を視聴する人は,テレビの信号をすべてダウンロードして,Bodyの情報を入手する方法の例を書けるでしょうか.

デイトクアント先生,どうやって2つの通貨を1台で増やせるか?

夢は8桁の数字でOKv5のシミュレーション盤を出すことはできますか? 小白な1枚,どうやって作るかわからない,実盤は敢えて話さない.

ssxxxd管理者のバージョンは 3.7 ですか? どうやって更新しますか? 何度も提案してみました. 2021-08-11 11:08:55 エラー トレースバック (most recent call last): ファイル "", line 999, in __init_ctx__ ファイル "", line 4, in インポート エラー: import name 'ThreadingHTTPServer' ができない 2021-08-11 11:08:55 情報 商品先物取引カテゴリデータベースの読み込み成功 2021-08-11 11:08:55 お知らせ あなたが使用しているホストの python コンパイル環境の python バージョンは 3.5 です.

QQ3390214355"夜も見て理解できませんでした. どうしたら連絡できるでしょうか?"

チェン・ナサンソン先生 こんにちは,テレビで直接アラーム取引の方向を警告する戦略のwebhookの住所はどうですか?

ランンありがとう,先生,試してみます!

ランン先生,こんにちは,契約書にコードを書いての詳細を教えてください. プログラミングは本当に大変です. ありがとうございました!

小さな夢FMZ API 文書には,最後に OKEX 切り替え模擬ディスクの関数がある.

wbe3-小さなフライパンテレビ信号を受け取る戦略,アナログディスクを切り替える方法? いつも環境が合わないことを教えてくれます.

小さな夢Python に関連するモジュールThreadingHTTPServer が存在しないため,このエラーが表示されました.

キー986この問題は解決していませんか?

エス8888明らかに

小さな夢動画の動画を視聴する場合は,FZの拡張APIを使ってください. 動画のデータベースには記事があります.

小さな夢この戦略は,商品先物として,デジタル通貨を走行するには,契約コードを設定する必要がある場合,戦略を変更します.

小さな夢この戦略の例は直接的なもので,戦略ロボットはテレビからの信号要求を盗聴するためのサービスを構築している. ` ` #POSTをテストするBodyの情報要求 data = self.rfile.read ((200) # 読み取りの長さを指定する Log (("data:", data) # POST リクエストのデータをプリントし,リクエスト内のデータに基づいて,ロボットに対応する操作を行うことができます. ` ` このコードには,TVからの要求を処理するボディメッセージが書かれています.

小さな夢戦略を自分のニーズに合わせて変更する.

小さな夢FMZで OKEX の模擬ディスクを設定するAPI KEY を追加し,コードに"``交換.IO" (シミュレート,true) ``交換を追加します.

小さな夢この記事へのトラックバック一覧です.

チェン・ナサンソンありがとう,もし私のwebhookのアドレスが買い方だと書いてあったら,tvの戦略アラームのヒントは売り方ですか?

小さな夢この記事の記事や戦略には, https://www.fmz.com/bbs-topic/5969の例があります.

小さな夢https://www.fmz.com/api#exchange.setcontracttype... 関数の記述には,参照してください.

PY008契約コードとは何か?

小さな夢嫌なことをする.

小さな夢取引所の契約の場合,テレビのWebhookのアドレスに 契約を締結する ` ` http://x.x.x.x:xxxx/data?access_key=xxx&secret_key=yyy&type=long&amount=1 公開されたデータ ` ` 契約書には"つだけあります ` ` http://x.x.x.x:xxxx/data?access_key=xxx&secret_key=yyy&type=cover_long&amount=1 公開されたデータ ` ` 戦略パラメータに契約コードを設定することを覚えてください.