TradingView adalah alat yang baik untuk menggambar kutipan pasar.
Peraturanpine
Naskah juga adalah keberadaan yang kuat!
Backtesting, alarm, dan berbagai docking adalah alat keuangan yang sangat lengkap.
Tapi ada dua masalah yang telah menghantui kita...
Hari ini artikel kami adalah untuk membawa Anda untuk memecahkan masalah pertukaran masalah docking.
Ide keseluruhan adalah seperti ini:
TV ((TradingView)pine
script -> sinyal alarmwebhook
-> lokalwebhook server
permintaan penyampaian -> FMZ bot menerima permintaan untuk beroperasi
Mari kita pergi langkah demi langkah.
Pergi ke situs TradingView:
Selanjutnya, kita pertama membuatAlert
, lihat gambar di bawah untuk rincian
Beberapa aspek dalam gambar perlu diperhatikan, ketika menghasilkanAlert
.
Periode validitas,webhook
alamat, danmessage
konten harus dilakukan dengan baik.
Tanggal kedaluwarsa, yang satu ini akan tahu sekilas, dan itu akan tidak sah ketika kedaluwarsa...
Webhook
URL, mari kita biarkan kosong pertama, kita akan mengisinya ketika lokalwebhook
Layanan selesai.
Message
di sini, yang terbaik kita memiliki penjelasan yang jelas, untuk membiarkanbot
membedakan dariAlert
messages.
Saya umumnya mengaturnya seperti ini: strategi XXX, jumlah pesanan dan arah perdagangan
Sejauh ini, bagian TradingView pada dasarnya selesai!
Selanjutnya, mari kita mendapatkan lokalwebhook
Pekerjaan pelayanan selesai!
Pekerjaan semacam ini, Google itu akan menunjukkan banyak hasil. artikel ini akan melewatkan bagian ini, Anda bisa melakukannya sendiri.
Berikut adalah kerangka kerja sederhana untuk Python:
GitHub: https://github.com/shawn-sterling/gitlab-webhook-receiver
Aman, bebas kekhawatiran dan nyaman, tapi ada juga masalah.
Kerangka kecil ini, itu akan!! Bunuh diri!! Tolong perhatikan masalah ini!
Jadi, saya menulis skrip lain di server, ketika
Selain itu, TradingView hanya mengenali port 80, jadi jangan mengacaukan port layanan.
Sejauh ini, Kami telah melakukanMessage
dariAlert
Selanjutnya, bagaimana kita mendapatkan Bot?
Saya tidak tahu apakah Anda telah memperhatikan dokumen antarmuka API FMZ di bagian bawah:
Kita bisa mengirim beberapa perintah ke robot kecil kita melalui API! Contoh permintaan spesifik ada di sini, kotak merah adalah permintaan yang kita butuhkan.
Di sini juga perlu beberapa pekerjaan persiapan. FMZ API (avatar-> pengaturan akun-> antarmuka API), Sebuah bot yang telah dimulai (kita ingin mendapatkan ID nya, jadi kita membuat ID baru pertama), nomor di URL dari robot umum adalah ID.
Selanjutnya, kami mengubah layanan webhook sehingga setelah menerima pesan, itu akan secara otomatis diteruskan ke FMZ Bot.
Akhirnya, jangan lupa untuk mengisi formulir yang telah diisiwebhook
alamat dalam TradingView Alert ((format: http://xx.xx.xx.xx:80)
Berikut ini adalahservice
kode yang saya ubah, Anda dapat menggunakannya sebagai referensi:
#!/usr/bin/python -tt
# -*- coding: UTF-8 -*-
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import json
import logging
import logging.handlers
import os
import re
import shutil
import subprocess
import time
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
try:
import md5
import urllib2
from urllib import urlencode
except:
import hashlib as md5
import urllib.request as urllib2
from urllib.parse import urlencode
############################################################
##### You will likely need to change some of the below #####
# log file for this script
log_file = '/root/webhook/VMA/webhook.log'
# Bot api licence
accessKey = ''
secretKey = ''
# HTTP config
log_max_size = 25165824 # 24 MB
log_level = logging.INFO
#log_level = logging.DEBUG # DEBUG is quite verbose
listen_port = 80
##### You should stop changing things unless you know what you are doing #####
##############################################################################
log = logging.getLogger('log')
log.setLevel(log_level)
log_handler = logging.handlers.RotatingFileHandler(log_file,
maxBytes=log_max_size,
backupCount=4)
f = logging.Formatter("%(asctime)s %(filename)s %(levelname)s %(message)s",
"%B %d %H:%M:%S")
log_handler.setFormatter(f)
log.addHandler(log_handler)
class webhookReceiver(BaseHTTPRequestHandler):
def run_it(self, cmd):
"""
runs a command
"""
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
log.debug('running:%s' % cmd)
p.wait()
if p.returncode != 0:
log.critical("Non zero exit code:%s executing: %s" % (p.returncode,
cmd))
return p.stdout
def bot_conmand(self, method, *args):
"""
send conmand request to bot api
"""
d = {
'version': '1.0',
'access_key': accessKey,
'method': method,
'args': json.dumps(list(args)),
'nonce': int(time.time() * 1000),
}
d['sign'] = md5.md5(('%s|%s|%s|%d|%s' % (d['version'], d['method'], d['args'], d['nonce'], secretKey)).encode('utf-8')).hexdigest()
return json.loads(urllib2.urlopen('https://www.fmz.com/api/v1', urlencode(d).encode('utf-8')).read().decode('utf-8'))
def do_POST(self):
"""
receives post, handles it
"""
log.debug('got post')
message = 'OK'
self.rfile._sock.settimeout(5)
data_string = self.rfile.read(int(self.headers['Content-Length']))
log.info(data_string)
self.send_response(200)
self.send_header("Content-type", "text")
self.send_header("Content-length", str(len(message)))
self.end_headers()
self.wfile.write(message)
log.debug('TV connection should be closed now.')
#log.info(self.bot_conmand('GetRobotList', -1, -1, -1)) # GetRobotList(offset, length, robotStatus int)Pass -1 to get all
log.info(self.bot_conmand('CommandRobot', 169788, data_string)) # CommandRobot(robotId int64, cmd string)Send commands to the robot
def log_message(self, formate, *args):
"""
disable printing to stdout/stderr for every post
"""
return
def main():
"""
the main event.
"""
try:
server = HTTPServer(('', listen_port), webhookReceiver)
log.info('started web server...')
server.serve_forever()
except KeyboardInterrupt:
log.info('ctrl-c pressed, shutting down.')
server.socket.close()
if __name__ == '__main__':
main()
Semua di atas dijelaskan penerapan komunikasi, strategi perdagangan Bot kami juga perlu diproses sesuai, agar kita memperbaiki proses sinyal penerima kami.
Misalnya, Pesan Peringatan yang dirancang di awal, Anda dapat memainkannya sesuai dengan preferensi dan kebutuhan spesifik Anda.
Kode adalah sebagai berikut, mendapatkan informasi, menyaring mereka, melakukan operasi, dan akhir.
function get_Command() { //Responsible function for interaction, interactively update relevant values in time, users can expand by themselves
var way = null; //route
var cmd = GetCommand(); // Get interactive command API
var cmd_arr = cmd.split(",");
if (cmd) {
// Define the route
if (cmd.indexOf("BUY,1") != -1) {
way = 1;
}
if (cmd.indexOf("SELL,1") != -1) {
way = 2;
}
if (cmd.indexOf("BUY,2") != -1) {
way = 3;
}
if (cmd.indexOf("SELL,2") != -1) {
way = 4;
}
// Branch selection operation
switch (way) {
case 1:
xxx
break;
case 2:
xxx
break;
case 3:
xxx
break;
case 4:
xxx
break;
default:
break;
}
}
}
Artikel ini selesai, semoga bisa membantu Anda!