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/bootstrap@5.1.3/dist/css/bootstrap.min.css "
7
+ integrity ="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3 " crossorigin ="anonymous ">
8
+ < script src ="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/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