1+ <!DOCTYPE html>
2+ < html lang ="en ">
3+ < head >
4+ < meta charset ="UTF-8 ">
5+ < title > TradingView Webhooks Bot</ title >
6+ < link rel ="
stylesheet "
href ="
https://cdn.jsdelivr.net/npm/[email protected] /dist/css/bootstrap.min.css "
7+ integrity ="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3 " crossorigin ="anonymous ">
8+ < script src ="
https://cdn.jsdelivr.net/npm/[email protected] /dist/js/bootstrap.min.js "
9+ integrity ="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13 "
10+ crossorigin ="anonymous "> </ script >
11+ < link rel ="stylesheet " href ="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css "
12+ integrity ="sha512-KfkfwYDsLkIlwQp6LFnl8zNdLGxu9YAA1QvwINks4PhcElQSvqcyVLLD9aMhXd13uQjoXtEKNosOWaZqXgel0g== "
13+ crossorigin ="anonymous " referrerpolicy ="no-referrer "/>
14+ < script src ="https://code.jquery.com/jquery-3.6.0.min.js "
15+ integrity ="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4= " crossorigin ="anonymous "> </ script >
16+ < script src ='https://cdn.plot.ly/plotly-2.11.1.min.js '> </ script >
17+ < script src ="/static/js/jsonFormatting.js "> </ script >
18+ < script src ="/static/js/handleLogs.js "> </ script >
19+ < link href ="/static/css/pre.css " rel ="stylesheet ">
20+ < link href ="/static/css/main.css " rel ="stylesheet "/>
21+ </ head >
22+ < body >
23+ < div class ="container ">
24+ < div class ="row mb-5 ">
25+ < div class ="col-lg-6 ">
26+ < img src ="/static/img/tvwb-logo.png " style ="height: 128px " class ="py-3 my-2 ps-5 ms-5 "/>
27+ </ div >
28+ < div class ="col-lg-6 d-flex align-items-center ">
29+ < div >
30+ < div class ="text-muted fw-bolder "> MOTD: TVWB 0.5v released!</ div >
31+ < div class ="text-muted ">
32+ < i > tradingview-webhooks-bot is < b > not</ b > affiliated with TradingView.com</ i >
33+ < br > follow development < a href ="https://www.twitter.com/robswc " class ="link-secondary "> @robswc</ a >
34+ on < i class ="fa-brands fa-twitter fs-5 pe-3 text-muted "> </ i >
35+ </ div >
36+ </ div >
37+ </ div >
38+ < div style ="border-bottom: whitesmoke 2px dashed; "> </ div >
39+ </ div >
40+
41+ < div class ="row mb-3 ">
42+ < h1 > < i class ="fa-solid fa-user-gear pe-3 text-muted "> </ i > Settings</ h1 >
43+ < div class ="col-lg-12 ">
44+ < div class ="accordion accordion-flush " id ="accordionFlushExample ">
45+ < div class ="accordion-item ">
46+ < h2 class ="accordion-header " id ="flush-headingOne ">
47+ < button class ="accordion-button collapsed " type ="button " data-bs-toggle ="collapse "
48+ data-bs-target ="#flush-collapseOne " aria-expanded ="false "
49+ aria-controls ="flush-collapseOne ">
50+ < div class ="d-flex align-items-center gap-2 ">
51+ < div > Registered Actions</ div >
52+ < div class ="text-muted small "> ({{ action_list|length }})</ div >
53+ </ div >
54+ </ button >
55+ </ h2 >
56+ < div id ="flush-collapseOne " class ="accordion-collapse collapse " aria-labelledby ="flush-headingOne "
57+ data-bs-parent ="#accordionFlushExample ">
58+ < div class ="accordion-body ">
59+ {% if action_list %}
60+ {% for action in action_list %}
61+ < div class ="card shadow-sm mb-2 ">
62+ < div class ="card-body ">
63+ < div class ="d-flex align-items-center justify-content-between ">
64+ < div class ="d-flex align-items-center ">
65+ < i class ="fa-brands fa-python fs-3 pe-3 text-muted "> </ i >
66+ {{ action.name }}
67+ </ div >
68+ < i class ="fa-solid fa-circle-check fs-3 text-success "> </ i >
69+ </ div >
70+ </ div >
71+ </ div >
72+ {% endfor %}
73+ {% else %}
74+ < div class ="text-muted p-2 ">
75+ < div class ="fs-3 "> No < code > actions</ code > are currently registered.</ div >
76+ < p > < a href =""> See how to register actions</ a > on our GitHub Wiki.</ p >
77+ </ div >
78+ {% endif %}
79+ </ div >
80+ </ div >
81+ </ div >
82+ < div class ="accordion-item ">
83+ < h2 class ="accordion-header " id ="flush-headingTwo ">
84+ < button class ="accordion-button collapsed " type ="button " data-bs-toggle ="collapse "
85+ data-bs-target ="#flush-collapseTwo " aria-expanded ="false "
86+ aria-controls ="flush-collapseTwo ">
87+ < div class ="d-flex align-items-center gap-2 ">
88+ < div > Registered Events</ div >
89+ < div class ="text-muted small "> ({{ event_list|length }})</ div >
90+ </ div >
91+ </ button >
92+ </ h2 >
93+ < div id ="flush-collapseTwo " class ="accordion-collapse collapse " aria-labelledby ="flush-headingTwo "
94+ data-bs-parent ="#accordionFlushExample ">
95+ < div class ="accordion-body ">
96+ {% if event_list %}
97+ {% for event in event_list %}
98+ < div class ="card shadow-sm ">
99+ < div class ="card-body ">
100+ < div class ="d-flex align-items-center justify-content-between ">
101+ < div class ="d-flex align-items-center gap-4 ">
102+ < div class ='d-flex align-items-center '>
103+ < i class ="fa-brands fa-python fs-3 pe-3 text-muted "> </ i >
104+ < div > {{ event.name }}</ div >
105+ </ div >
106+ < div >
107+ < details >
108+ < summary class ="text-muted small "> details</ summary >
109+ < div class ='d-flex flex-column gap-2 ps-3 ms-1 border-start border-light '>
110+ < div class ="p-3 bg-light shadow-sm ">
111+ < div class ='fs-4 '> Triggers</ div >
112+ {% for action in event._actions %}
113+ < div class ='d-flex align-items-center '>
114+ < div class ="fw-bolder "> {{ action }}</ div >
115+ < div class ="ms-2 text-muted "> : action</ div >
116+ </ div >
117+ {% endfor %}
118+ </ div >
119+ < div class ="p-3 bg-light shadow-sm ">
120+ < div class ='fs-4 '> Key</ div >
121+ < div >
122+ < code id ="{{ key }}-field "> {{ event.key }}</ code >
123+ < button
124+ onclick ="copyToClipboard('#{{ key }}-field') "
125+ class ="btn btn-sm ms-2 px-2 py-1 shadow-sm "
126+ >
127+
128+ < i class ="fa-solid fa-copy "> </ i >
129+ </ button >
130+ </ div >
131+ </ div >
132+ </ div >
133+ </ details >
134+ </ div >
135+ </ div >
136+ < div >
137+ < i class ="fa-solid fa-circle-check fs-3 text-success "> </ i >
138+ </ div >
139+ </ div >
140+ </ div >
141+ </ div >
142+ {% endfor %}
143+ {% else %}
144+ < div class ="text-muted p-2 ">
145+ < div class ="fs-3 "> No < code > events</ code > are currently registered.</ div >
146+ < p > < a href =""> See how to register events</ a > on our GitHub Wiki.</ p >
147+ </ div >
148+ {% endif %}
149+ </ div >
150+ </ div >
151+ </ div >
152+ < div class ="accordion-item ">
153+ < h2 class ="accordion-header " id ="flush-headingThree ">
154+ < button class ="accordion-button collapsed " type ="button " data-bs-toggle ="collapse "
155+ data-bs-target ="#flush-collapseThree " aria-expanded ="false "
156+ aria-controls ="flush-collapseThree ">
157+ Registered Schemas
158+ </ button >
159+ </ h2 >
160+ < div id ="flush-collapseThree " class ="accordion-collapse collapse "
161+ aria-labelledby ="flush-headingThree "
162+ data-bs-parent ="#accordionFlushExample ">
163+ < div class ="accordion-body ">
164+ < div class ="row ">
165+ < p class ="text-muted ">
166+ Schemas can make reading data from Tradingview easier!
167+ < a href ="https://www.github.com " class ="link-secondary "> (Read more about schemas on
168+ the Wiki)</ a >
169+ Below are the schemas that have been registered in < code > settings.py</ code >
170+ from here, you can copy and paste the generated JSON into your tradingview webhook.
171+ </ p >
172+ </ div >
173+ < div class ="row ">
174+ {% for k, v in schema_list.items() %}
175+ < div class ="col-4 ">
176+ < div class ="card shadow-sm ">
177+ < div class ="card-body ">
178+ < span class ="fs-3 pe-2 "> {{ k }}</ span > < span
179+ class ="text-muted "> (JSON)</ span >
180+ < pre class ="json-snippet bg-dark text-light ">
181+ < code >
182+ {{ v }}
183+ </ code >
184+ </ pre >
185+ </ div >
186+ </ div >
187+ </ div >
188+ {% endfor %}
189+ </ div >
190+ </ div >
191+ </ div >
192+ </ div >
193+ </ div >
194+ </ div >
195+ </ div >
196+ < div class ="row mb-3 ">
197+ < h1 > < i class ="fa-solid fa-chart-area pe-3 text-muted "> </ i > Monitoring</ h1 >
198+ </ div >
199+ < div class ="row ">
200+ < div class ="col-lg-6 h-100 ">
201+ < div class ="p-1 text-muted fs-3 "> Graph</ div >
202+ < div class ="card h-100 shadow-sm ">
203+ < div class ="card-body h-100 ">
204+ {# < div id ="metricsTest "> </ div > #}
205+ < div class ="text-muted text-center "> More features coming soon!</ div >
206+ </ div >
207+ </ div >
208+ </ div >
209+ < div class ="col-lg-6 h-100 ">
210+ < div class ="p-1 text-muted fs-3 "> Logs</ div >
211+ < div class ="card h-100 shadow-sm ">
212+ < div class ="card-body ">
213+ < div id ="logContainer "> </ div >
214+ </ div >
215+ </ div >
216+ </ div >
217+ </ div >
218+ </ div >
219+
220+ < script >
221+ var data = [
222+ {
223+ x : [ 'giraffes' , 'orangutans' , 'monkeys' ] ,
224+ y : [ 20 , 14 , 23 ] ,
225+ type : 'bar'
226+ }
227+ ] ;
228+
229+ Plotly . newPlot ( 'metricsTest' , data ) ;
230+ </ script >
231+ < script >
232+ $ ( '.json-snippet' ) . each ( function ( ) {
233+ const jsonText = $ ( this ) . children ( ) . text ( ) ;
234+ console . log ( jsonText )
235+ const jsonObj = JSON . parse ( jsonText )
236+ console . log ( jsonObj )
237+ $ ( this ) . html ( library . json . prettyPrint ( jsonObj ) ) ;
238+ } ) ;
239+ </ script >
240+ < script >
241+ function copyToClipboard ( element ) {
242+ var $temp = $ ( "<input>" ) ;
243+ $ ( "body" ) . append ( $temp ) ;
244+ $temp . val ( $ ( element ) . text ( ) ) . select ( ) ;
245+ document . execCommand ( "copy" ) ;
246+ $temp . remove ( ) ;
247+ }
248+ </ script >
249+ < div class ="beta-border-bottom "> </ div >
250+ < div class ="beta-border-top "> </ div >
251+ < div class ="beta-tag ">
252+ TVWB BETA v{{ version }}
253+ </ div >
254+ </ body >
255+ </ html >
0 commit comments