├── .dockerignore ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── ai.ts ├── app.ts ├── backfind.ts ├── config.ts ├── config ├── Back-ADX.json ├── Back-AroonTristar.json ├── Back-Blade.json ├── Back-BollingerDayTrader.json ├── Back-CandleRepeater.json ├── Back-ChannelBreakout.json ├── Back-DEMA.json ├── Back-DayTrader.json ├── Back-DayTrendFollower.json ├── Back-DirectionRunner.json ├── Back-HoneyBadger.json ├── Back-IntervalExtremes.json ├── Back-MACD.json ├── Back-Mixed.json ├── Back-MomentumTurn.json ├── Back-OrderPartitioner.json ├── Back-PatternRepeater.json ├── Back-SimpleAndShort.json ├── Back-Testcase.json ├── Back-Trendatron.json ├── Back-VolumeSpike.json ├── Back-WaveSurfer.json ├── Back-WaveSurfer2.json ├── Back-WaveSurferTrend.json ├── BitmexContract.json ├── BitmexFastSignals.json ├── BitmexFisher.json ├── BitmexFishingTestnet.json ├── BitmexSignalsWithStops.json ├── BitmexStops.json ├── BitmexStopsContract1.json ├── BitmexStopsContract2.json ├── BitmexSwingSignals.json ├── BladeRunner.json ├── BladeRunner2.json ├── BollingerBands.json ├── BollingerBandsLong.json ├── BollingerBouncer.json ├── BollingerBreakouts.json ├── BollingerBreakoutsLong.json ├── BollingerStop.json ├── CCI.json ├── CandleTester.json ├── CoinStops.json ├── DEMA.json ├── DEMAFutures.json ├── DayTrader.json ├── DayTrendFollower.json ├── Deribit.json ├── DirectionFollower.json ├── DirectionFollowerFutures.json ├── DirectionRunner.json ├── DirectionRunnerFutures.json ├── Dummy.json ├── EarlyStopLoss.json ├── ExampleStrategy.json ├── FishingBitcoin.json ├── FishingFast.json ├── FishingNet.json ├── FishingSmall.json ├── FuturesTechnical.json ├── Ichimoku.json ├── IndicatorDivergence.json ├── IntervalExtremes.json ├── KAMA.json ├── LTC.json ├── MACD-Binance.json ├── MACD-Finex.json ├── MACD.json ├── MACDBitfinex.json ├── MACDBitfinexMore.json ├── MFI.json ├── MakerFeeOrder.json ├── MomentumTurn.json ├── Noop.json ├── NotificationTest.json ├── OBV.json ├── OneTimeOrder.json ├── OneTimeOrderRSI.json ├── OrderBookPressure.json ├── OrderBookPressureBitfinex.json ├── OrderPartitioner.json ├── PatternRepeater.json ├── PingPong.json ├── PivotPeaks.json ├── PivotSniper.json ├── PlanRunner.json ├── PlanRunner2.json ├── PlanRunnerDeribit.json ├── PlanRunnerFutures.json ├── PlanRunnerSimple.json ├── PoloStops.json ├── PoloStopsOnly.json ├── PositionReopener.json ├── PriceSpikeDetector.json ├── ProtectProfit.json ├── RSI.json ├── RSIScalper.json ├── SARStop.json ├── STC.json ├── Scalper.json ├── ScalperBitmex.json ├── SimpleAndhort.json ├── StopAndProfit.json ├── StopHunter.json ├── StopLossTime.json ├── StopLossTurn.json ├── StopLossTurn2.json ├── StopLossTurnPartial.json ├── StopTest.json ├── TakeProfit.json ├── TakeProfitAdvanced.json ├── TakeProfitPartial.json ├── TakeProfitStochRSI.json ├── TestBuy.json ├── TimeStop.json ├── TradingViewSignalOnly.json ├── TrailingStop.json ├── TrailingStopReverseEntry.json ├── TrendOscillator.json ├── Trendatron.json ├── TrendlineScalper.json ├── TripleTrend.json ├── UnlimitedMargin.json ├── VolumeProfileControl.json ├── VolumeProfiler.json ├── VolumeSpike.json ├── VolumeSpike2.json ├── VolumeSpikeBitfinex.json ├── VolumeSpikeDetector.json ├── VolumeSpikeDetectorBinance.json ├── VolumeSpikeStats.json ├── VolumeSpikeStopper.json ├── VolumeSpikeTrade.json ├── WaveStopper.json ├── WaveSurfer.json ├── WaveSurfer2.json ├── WaveSurfer2Bitfinex.json ├── WaveSurfer2BitfinexDay.json ├── WaveSurfer2BitfinexMore.json ├── WaveSurfer2Kraken.json ├── WaveSurfer2KrakenSlow.json ├── WaveSurfer2Slow.json ├── WaveSurferConst.json ├── WaveSurferFutures.json ├── WaveSurferFutures2.json ├── WaveSurferFutures2Slow.json ├── WaveSurferTrend.json ├── WhaleWatcher.json ├── arbitrage │ ├── Leverage.json │ ├── SimpleSpread.json │ ├── SimpleSpreadBTC.json │ └── SimpleSpreadPolo.json ├── backfind │ ├── Okex-Evo-BTC-DEMA.json │ ├── Okex-Evo-LTC-WaveSurfer.json │ ├── Okex-LTC-WaveSurfer.json │ ├── Polo-DASH-Bollinger.json │ ├── Polo-DASH.json │ ├── Polo-ETH-Bollinger.json │ ├── Polo-ETH-DayTrader.json │ ├── Polo-ETH-PatternRepeater.json │ ├── Polo-ETH-Trend.json │ ├── Polo-ETH-WaveSurfer.json │ ├── Polo-Evo-ETH-DEMA.json │ ├── Polo-Evo-ETH-WaveSurfer.json │ ├── Polo-Evo-XXX-Test.json │ ├── Polo-LTC-Trend-Down.json │ └── Polo-XRP-Trend.json ├── lending │ ├── Bitfinex.json │ └── Bitfinex2.json └── machine-learning │ ├── PricePrediction-ETH-day.json │ ├── PricePrediction-ETH-single.json │ ├── PricePrediction-ETH.json │ └── PricePrediction.json ├── configLocal-sample.ts ├── docker-compose.yml ├── gulpfile.js ├── imports.ts ├── internal.d.ts ├── package.json ├── public ├── css │ ├── _bootstrap-compass.scss │ ├── _bootstrap-mincer.scss │ ├── _bootstrap-sprockets.scss │ ├── _bootstrap.scss │ ├── _bootswatch.scss │ ├── _macros.scss │ ├── _responsive.scss │ ├── _sprites.scss │ ├── bootstrap-multiselect.css │ ├── bootstrap │ │ ├── _alerts.scss │ │ ├── _badges.scss │ │ ├── _breadcrumbs.scss │ │ ├── _button-groups.scss │ │ ├── _buttons.scss │ │ ├── _carousel.scss │ │ ├── _close.scss │ │ ├── _code.scss │ │ ├── _component-animations.scss │ │ ├── _dropdowns.scss │ │ ├── _forms.scss │ │ ├── _glyphicons.scss │ │ ├── _grid.scss │ │ ├── _input-groups.scss │ │ ├── _jumbotron.scss │ │ ├── _labels.scss │ │ ├── _list-group.scss │ │ ├── _media.scss │ │ ├── _mixins.scss │ │ ├── _modals.scss │ │ ├── _navbar.scss │ │ ├── _navs.scss │ │ ├── _normalize.scss │ │ ├── _pager.scss │ │ ├── _pagination.scss │ │ ├── _panels.scss │ │ ├── _popovers.scss │ │ ├── _print.scss │ │ ├── _progress-bars.scss │ │ ├── _responsive-embed.scss │ │ ├── _responsive-utilities.scss │ │ ├── _scaffolding.scss │ │ ├── _tables.scss │ │ ├── _theme.scss │ │ ├── _thumbnails.scss │ │ ├── _tooltip.scss │ │ ├── _type.scss │ │ ├── _utilities.scss │ │ ├── _variables.scss │ │ ├── _wells.scss │ │ └── mixins │ │ │ ├── _alerts.scss │ │ │ ├── _background-variant.scss │ │ │ ├── _border-radius.scss │ │ │ ├── _buttons.scss │ │ │ ├── _center-block.scss │ │ │ ├── _clearfix.scss │ │ │ ├── _forms.scss │ │ │ ├── _gradients.scss │ │ │ ├── _grid-framework.scss │ │ │ ├── _grid.scss │ │ │ ├── _hide-text.scss │ │ │ ├── _image.scss │ │ │ ├── _labels.scss │ │ │ ├── _list-group.scss │ │ │ ├── _nav-divider.scss │ │ │ ├── _nav-vertical-align.scss │ │ │ ├── _opacity.scss │ │ │ ├── _pagination.scss │ │ │ ├── _panels.scss │ │ │ ├── _progress-bar.scss │ │ │ ├── _reset-filter.scss │ │ │ ├── _reset-text.scss │ │ │ ├── _resize.scss │ │ │ ├── _responsive-visibility.scss │ │ │ ├── _size.scss │ │ │ ├── _tab-focus.scss │ │ │ ├── _table-row.scss │ │ │ ├── _text-emphasis.scss │ │ │ ├── _text-overflow.scss │ │ │ └── _vendor-prefixes.scss │ ├── dataTables.bootstrap.scss │ ├── fa │ │ ├── _animated.scss │ │ ├── _bordered-pulled.scss │ │ ├── _core.scss │ │ ├── _fixed-width.scss │ │ ├── _icons.scss │ │ ├── _larger.scss │ │ ├── _list.scss │ │ ├── _mixins.scss │ │ ├── _path.scss │ │ ├── _rotated-flipped.scss │ │ ├── _screen-reader.scss │ │ ├── _stacked.scss │ │ ├── _variables.scss │ │ └── font-awesome.scss │ ├── jquery.dataTables.scss │ ├── libs │ │ └── bootstrap-datetimepicker.min.css │ ├── style.css │ ├── style.css.map │ └── style.sass ├── fonts │ ├── FontAwesome.otf │ ├── bootstrap │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.svg │ ├── fontawesome-webfont.ttf │ ├── fontawesome-webfont.woff │ └── fontawesome-webfont.woff2 ├── icons │ └── fav │ │ ├── favicon.ico │ │ ├── icon_114.png │ │ ├── icon_57.png │ │ └── icon_72.png ├── images │ ├── bg1-bright.jpg │ ├── bg1.jpg │ ├── discord-ico.png │ ├── github-ico.png │ ├── sort_asc.png │ ├── sort_asc_disabled.png │ ├── sort_both.png │ ├── sort_desc.png │ └── sort_desc_disabled.png ├── index.html ├── js │ ├── bundle.js │ ├── bundle.js.map │ ├── classes │ │ ├── AbstractWidget.ts │ │ ├── BrowserEventEmitter.ts │ │ ├── HistoryRouter.ts │ │ └── WebSocket │ │ │ ├── ClientSocket.ts │ │ │ ├── LogReceiver.ts │ │ │ ├── LoginManager.ts │ │ │ └── TradingViewDatafeed.ts │ ├── constants.js │ ├── controllers │ │ ├── Backtesting.ts │ │ ├── CoinMarket.ts │ │ ├── Config.ts │ │ ├── Home.ts │ │ ├── Lending.ts │ │ ├── Oracle.ts │ │ ├── Scripts.ts │ │ ├── Social.ts │ │ ├── Status.ts │ │ ├── Strategies.ts │ │ ├── TradeHistory.ts │ │ └── base │ │ │ ├── AbstractController.ts │ │ │ ├── ChartController.ts │ │ │ ├── JsonEditor.ts │ │ │ └── TableController.ts │ ├── hooks.js │ ├── index.ts │ ├── internal.d.ts │ ├── libs │ │ ├── Chart.bundle.js │ │ ├── ace │ │ │ ├── ace.js │ │ │ ├── ext-beautify.js │ │ │ ├── ext-chromevox.js │ │ │ ├── ext-elastic_tabstops_lite.js │ │ │ ├── ext-emmet.js │ │ │ ├── ext-error_marker.js │ │ │ ├── ext-keybinding_menu.js │ │ │ ├── ext-language_tools.js │ │ │ ├── ext-linking.js │ │ │ ├── ext-modelist.js │ │ │ ├── ext-old_ie.js │ │ │ ├── ext-searchbox.js │ │ │ ├── ext-settings_menu.js │ │ │ ├── ext-spellcheck.js │ │ │ ├── ext-split.js │ │ │ ├── ext-static_highlight.js │ │ │ ├── ext-statusbar.js │ │ │ ├── ext-textarea.js │ │ │ ├── ext-themelist.js │ │ │ ├── ext-whitespace.js │ │ │ ├── keybinding-emacs.js │ │ │ ├── keybinding-vim.js │ │ │ ├── mode-abap.js │ │ │ ├── mode-abc.js │ │ │ ├── mode-actionscript.js │ │ │ ├── mode-ada.js │ │ │ ├── mode-apache_conf.js │ │ │ ├── mode-applescript.js │ │ │ ├── mode-asciidoc.js │ │ │ ├── mode-assembly_x86.js │ │ │ ├── mode-autohotkey.js │ │ │ ├── mode-batchfile.js │ │ │ ├── mode-bro.js │ │ │ ├── mode-c9search.js │ │ │ ├── mode-c_cpp.js │ │ │ ├── mode-cirru.js │ │ │ ├── mode-clojure.js │ │ │ ├── mode-cobol.js │ │ │ ├── mode-coffee.js │ │ │ ├── mode-coldfusion.js │ │ │ ├── mode-csharp.js │ │ │ ├── mode-css.js │ │ │ ├── mode-curly.js │ │ │ ├── mode-d.js │ │ │ ├── mode-dart.js │ │ │ ├── mode-diff.js │ │ │ ├── mode-django.js │ │ │ ├── mode-dockerfile.js │ │ │ ├── mode-dot.js │ │ │ ├── mode-drools.js │ │ │ ├── mode-eiffel.js │ │ │ ├── mode-ejs.js │ │ │ ├── mode-elixir.js │ │ │ ├── mode-elm.js │ │ │ ├── mode-erlang.js │ │ │ ├── mode-forth.js │ │ │ ├── mode-fortran.js │ │ │ ├── mode-ftl.js │ │ │ ├── mode-gcode.js │ │ │ ├── mode-gherkin.js │ │ │ ├── mode-gitignore.js │ │ │ ├── mode-glsl.js │ │ │ ├── mode-gobstones.js │ │ │ ├── mode-golang.js │ │ │ ├── mode-graphqlschema.js │ │ │ ├── mode-groovy.js │ │ │ ├── mode-haml.js │ │ │ ├── mode-handlebars.js │ │ │ ├── mode-haskell.js │ │ │ ├── mode-haskell_cabal.js │ │ │ ├── mode-haxe.js │ │ │ ├── mode-hjson.js │ │ │ ├── mode-html.js │ │ │ ├── mode-html_elixir.js │ │ │ ├── mode-html_ruby.js │ │ │ ├── mode-ini.js │ │ │ ├── mode-io.js │ │ │ ├── mode-jack.js │ │ │ ├── mode-jade.js │ │ │ ├── mode-java.js │ │ │ ├── mode-javascript.js │ │ │ ├── mode-json.js │ │ │ ├── mode-jsoniq.js │ │ │ ├── mode-jsp.js │ │ │ ├── mode-jsx.js │ │ │ ├── mode-julia.js │ │ │ ├── mode-kotlin.js │ │ │ ├── mode-latex.js │ │ │ ├── mode-lean.js │ │ │ ├── mode-less.js │ │ │ ├── mode-liquid.js │ │ │ ├── mode-lisp.js │ │ │ ├── mode-live_script.js │ │ │ ├── mode-livescript.js │ │ │ ├── mode-logiql.js │ │ │ ├── mode-lsl.js │ │ │ ├── mode-lua.js │ │ │ ├── mode-luapage.js │ │ │ ├── mode-lucene.js │ │ │ ├── mode-makefile.js │ │ │ ├── mode-markdown.js │ │ │ ├── mode-mask.js │ │ │ ├── mode-matlab.js │ │ │ ├── mode-maze.js │ │ │ ├── mode-mel.js │ │ │ ├── mode-mips_assembler.js │ │ │ ├── mode-mipsassembler.js │ │ │ ├── mode-mushcode.js │ │ │ ├── mode-mysql.js │ │ │ ├── mode-nix.js │ │ │ ├── mode-nsis.js │ │ │ ├── mode-objectivec.js │ │ │ ├── mode-ocaml.js │ │ │ ├── mode-pascal.js │ │ │ ├── mode-perl.js │ │ │ ├── mode-pgsql.js │ │ │ ├── mode-php.js │ │ │ ├── mode-pig.js │ │ │ ├── mode-plain_text.js │ │ │ ├── mode-powershell.js │ │ │ ├── mode-praat.js │ │ │ ├── mode-prolog.js │ │ │ ├── mode-properties.js │ │ │ ├── mode-protobuf.js │ │ │ ├── mode-python.js │ │ │ ├── mode-r.js │ │ │ ├── mode-razor.js │ │ │ ├── mode-rdoc.js │ │ │ ├── mode-rhtml.js │ │ │ ├── mode-rst.js │ │ │ ├── mode-ruby.js │ │ │ ├── mode-rust.js │ │ │ ├── mode-sass.js │ │ │ ├── mode-scad.js │ │ │ ├── mode-scala.js │ │ │ ├── mode-scheme.js │ │ │ ├── mode-scss.js │ │ │ ├── mode-sh.js │ │ │ ├── mode-sjs.js │ │ │ ├── mode-smarty.js │ │ │ ├── mode-snippets.js │ │ │ ├── mode-soy_template.js │ │ │ ├── mode-space.js │ │ │ ├── mode-sparql.js │ │ │ ├── mode-sql.js │ │ │ ├── mode-sqlserver.js │ │ │ ├── mode-stylus.js │ │ │ ├── mode-svg.js │ │ │ ├── mode-swift.js │ │ │ ├── mode-swig.js │ │ │ ├── mode-tcl.js │ │ │ ├── mode-tex.js │ │ │ ├── mode-text.js │ │ │ ├── mode-textile.js │ │ │ ├── mode-toml.js │ │ │ ├── mode-tsx.js │ │ │ ├── mode-turtle.js │ │ │ ├── mode-twig.js │ │ │ ├── mode-typescript.js │ │ │ ├── mode-vala.js │ │ │ ├── mode-vbscript.js │ │ │ ├── mode-velocity.js │ │ │ ├── mode-verilog.js │ │ │ ├── mode-vhdl.js │ │ │ ├── mode-wollok.js │ │ │ ├── mode-xml.js │ │ │ ├── mode-xquery.js │ │ │ ├── mode-yaml.js │ │ │ ├── snippets │ │ │ │ ├── abap.js │ │ │ │ ├── abc.js │ │ │ │ ├── actionscript.js │ │ │ │ ├── ada.js │ │ │ │ ├── apache_conf.js │ │ │ │ ├── applescript.js │ │ │ │ ├── asciidoc.js │ │ │ │ ├── assembly_x86.js │ │ │ │ ├── autohotkey.js │ │ │ │ ├── batchfile.js │ │ │ │ ├── bro.js │ │ │ │ ├── c9search.js │ │ │ │ ├── c_cpp.js │ │ │ │ ├── cirru.js │ │ │ │ ├── clojure.js │ │ │ │ ├── cobol.js │ │ │ │ ├── coffee.js │ │ │ │ ├── coldfusion.js │ │ │ │ ├── csharp.js │ │ │ │ ├── css.js │ │ │ │ ├── curly.js │ │ │ │ ├── d.js │ │ │ │ ├── dart.js │ │ │ │ ├── diff.js │ │ │ │ ├── django.js │ │ │ │ ├── dockerfile.js │ │ │ │ ├── dot.js │ │ │ │ ├── drools.js │ │ │ │ ├── eiffel.js │ │ │ │ ├── ejs.js │ │ │ │ ├── elixir.js │ │ │ │ ├── elm.js │ │ │ │ ├── erlang.js │ │ │ │ ├── forth.js │ │ │ │ ├── fortran.js │ │ │ │ ├── ftl.js │ │ │ │ ├── gcode.js │ │ │ │ ├── gherkin.js │ │ │ │ ├── gitignore.js │ │ │ │ ├── glsl.js │ │ │ │ ├── gobstones.js │ │ │ │ ├── golang.js │ │ │ │ ├── graphqlschema.js │ │ │ │ ├── groovy.js │ │ │ │ ├── haml.js │ │ │ │ ├── handlebars.js │ │ │ │ ├── haskell.js │ │ │ │ ├── haskell_cabal.js │ │ │ │ ├── haxe.js │ │ │ │ ├── hjson.js │ │ │ │ ├── html.js │ │ │ │ ├── html_elixir.js │ │ │ │ ├── html_ruby.js │ │ │ │ ├── ini.js │ │ │ │ ├── io.js │ │ │ │ ├── jack.js │ │ │ │ ├── jade.js │ │ │ │ ├── java.js │ │ │ │ ├── javascript.js │ │ │ │ ├── json.js │ │ │ │ ├── jsoniq.js │ │ │ │ ├── jsp.js │ │ │ │ ├── jsx.js │ │ │ │ ├── julia.js │ │ │ │ ├── kotlin.js │ │ │ │ ├── latex.js │ │ │ │ ├── lean.js │ │ │ │ ├── less.js │ │ │ │ ├── liquid.js │ │ │ │ ├── lisp.js │ │ │ │ ├── live_script.js │ │ │ │ ├── livescript.js │ │ │ │ ├── logiql.js │ │ │ │ ├── lsl.js │ │ │ │ ├── lua.js │ │ │ │ ├── luapage.js │ │ │ │ ├── lucene.js │ │ │ │ ├── makefile.js │ │ │ │ ├── markdown.js │ │ │ │ ├── mask.js │ │ │ │ ├── matlab.js │ │ │ │ ├── maze.js │ │ │ │ ├── mel.js │ │ │ │ ├── mips_assembler.js │ │ │ │ ├── mipsassembler.js │ │ │ │ ├── mushcode.js │ │ │ │ ├── mysql.js │ │ │ │ ├── nix.js │ │ │ │ ├── nsis.js │ │ │ │ ├── objectivec.js │ │ │ │ ├── ocaml.js │ │ │ │ ├── pascal.js │ │ │ │ ├── perl.js │ │ │ │ ├── pgsql.js │ │ │ │ ├── php.js │ │ │ │ ├── pig.js │ │ │ │ ├── plain_text.js │ │ │ │ ├── powershell.js │ │ │ │ ├── praat.js │ │ │ │ ├── prolog.js │ │ │ │ ├── properties.js │ │ │ │ ├── protobuf.js │ │ │ │ ├── python.js │ │ │ │ ├── r.js │ │ │ │ ├── razor.js │ │ │ │ ├── rdoc.js │ │ │ │ ├── rhtml.js │ │ │ │ ├── rst.js │ │ │ │ ├── ruby.js │ │ │ │ ├── rust.js │ │ │ │ ├── sass.js │ │ │ │ ├── scad.js │ │ │ │ ├── scala.js │ │ │ │ ├── scheme.js │ │ │ │ ├── scss.js │ │ │ │ ├── sh.js │ │ │ │ ├── sjs.js │ │ │ │ ├── smarty.js │ │ │ │ ├── snippets.js │ │ │ │ ├── soy_template.js │ │ │ │ ├── space.js │ │ │ │ ├── sparql.js │ │ │ │ ├── sql.js │ │ │ │ ├── sqlserver.js │ │ │ │ ├── stylus.js │ │ │ │ ├── svg.js │ │ │ │ ├── swift.js │ │ │ │ ├── swig.js │ │ │ │ ├── tcl.js │ │ │ │ ├── tex.js │ │ │ │ ├── text.js │ │ │ │ ├── textile.js │ │ │ │ ├── toml.js │ │ │ │ ├── tsx.js │ │ │ │ ├── turtle.js │ │ │ │ ├── twig.js │ │ │ │ ├── typescript.js │ │ │ │ ├── vala.js │ │ │ │ ├── vbscript.js │ │ │ │ ├── velocity.js │ │ │ │ ├── verilog.js │ │ │ │ ├── vhdl.js │ │ │ │ ├── wollok.js │ │ │ │ ├── xml.js │ │ │ │ ├── xquery.js │ │ │ │ └── yaml.js │ │ │ ├── theme-ambiance.js │ │ │ ├── theme-chaos.js │ │ │ ├── theme-chrome.js │ │ │ ├── theme-clouds.js │ │ │ ├── theme-clouds_midnight.js │ │ │ ├── theme-cobalt.js │ │ │ ├── theme-crimson_editor.js │ │ │ ├── theme-dawn.js │ │ │ ├── theme-dreamweaver.js │ │ │ ├── theme-eclipse.js │ │ │ ├── theme-github.js │ │ │ ├── theme-gob.js │ │ │ ├── theme-gruvbox.js │ │ │ ├── theme-idle_fingers.js │ │ │ ├── theme-iplastic.js │ │ │ ├── theme-katzenmilch.js │ │ │ ├── theme-kr_theme.js │ │ │ ├── theme-kuroir.js │ │ │ ├── theme-merbivore.js │ │ │ ├── theme-merbivore_soft.js │ │ │ ├── theme-mono_industrial.js │ │ │ ├── theme-monokai.js │ │ │ ├── theme-pastel_on_dark.js │ │ │ ├── theme-solarized_dark.js │ │ │ ├── theme-solarized_light.js │ │ │ ├── theme-sqlserver.js │ │ │ ├── theme-terminal.js │ │ │ ├── theme-textmate.js │ │ │ ├── theme-tomorrow.js │ │ │ ├── theme-tomorrow_night.js │ │ │ ├── theme-tomorrow_night_blue.js │ │ │ ├── theme-tomorrow_night_bright.js │ │ │ ├── theme-tomorrow_night_eighties.js │ │ │ ├── theme-twilight.js │ │ │ ├── theme-vibrant_ink.js │ │ │ ├── theme-xcode.js │ │ │ ├── worker-coffee.js │ │ │ ├── worker-css.js │ │ │ ├── worker-html.js │ │ │ ├── worker-javascript.js │ │ │ ├── worker-json.js │ │ │ ├── worker-lua.js │ │ │ ├── worker-php.js │ │ │ ├── worker-xml.js │ │ │ └── worker-xquery.js │ │ ├── bootstrap-datetimepicker.min.js │ │ ├── bootstrap-multiselect.js │ │ ├── browserutils.js │ │ ├── dataTables.bootstrap.js │ │ ├── eventemitter2.js │ │ ├── functions.js │ │ ├── helper.js │ │ ├── i18next.min.js │ │ ├── i18nextXHRBackend.min.js │ │ ├── jquery.dataTables.js │ │ ├── jsoneditor.min.js │ │ └── moment │ │ │ ├── locales │ │ │ └── de.min.js │ │ │ └── moment.min.js │ ├── polyfills.js │ ├── routes.ts │ ├── tsconfig.json │ ├── types │ │ ├── AppData.ts │ │ └── PageData.ts │ └── utils │ │ └── helper.ts ├── locales │ ├── de.json │ └── en.json └── manifest.json ├── src ├── AI │ ├── Brain.ts │ ├── BrainConfig.ts │ ├── BudFox.ts │ ├── IndicatorAdder.ts │ ├── LiveOracle.ts │ └── ModelManager.ts ├── AbstractAdvisor.ts ├── AbstractController.ts ├── AbstractSubController.ts ├── Arbitrage │ ├── ArbitrageConfig.ts │ ├── ExchangeCandles.ts │ ├── MaxSpreadCandles.ts │ └── Strategies │ │ ├── AbstractArbitrageStrategy.ts │ │ └── Spread.ts ├── Backfinder │ ├── AbstractBackfinder.ts │ ├── BackfindConfig.ts │ ├── Backfinder.ts │ ├── ConfigRange.ts │ ├── Evolution.ts │ └── ForexAnalytics.ts ├── Controller.ts ├── ExchangeController.ts ├── Exchanges │ ├── AbstractContractExchange.ts │ ├── AbstractExchange.ts │ ├── AbstractLendingExchange.ts │ ├── Bibox.ts │ ├── Binance.ts │ ├── BinanceCcxt.ts │ ├── BinanceUS.ts │ ├── BitForex.ts │ ├── BitMEX.ts │ ├── Bitfinex.ts │ ├── Bitkub.ts │ ├── Bitstamp.ts │ ├── Bittrex.ts │ ├── BxCo.ts │ ├── Bybit.ts │ ├── CcxtExchange.ts │ ├── CexIo.ts │ ├── Cobinhood.ts │ ├── CoinbasePro.ts │ ├── Coss.ts │ ├── Deribit.ts │ ├── DeribitCcxt.ts │ ├── ExternalTickerExchange.ts │ ├── FCoin.ts │ ├── FTX.ts │ ├── Gemini.ts │ ├── HistoryDataExchange.ts │ ├── HitBTC.ts │ ├── Huobi.ts │ ├── Kraken.ts │ ├── KrakenCcxt.ts │ ├── KrakenFutures.ts │ ├── KuCoin.ts │ ├── Liquid.ts │ ├── LoggerEx.ts │ ├── Nova.ts │ ├── OKCoin.ts │ ├── OKEX.ts │ ├── Peatio.ts │ ├── Poloniex.ts │ ├── TheRockTrading.ts │ ├── YoBit.ts │ └── feeds │ │ ├── AbstractMarketData.ts │ │ └── BitmexMarketData.ts ├── Fiat │ ├── AbstractCurrencyRates.ts │ └── ExchangeRates.ts ├── Indicators │ ├── ADL.ts │ ├── ADLine.ts │ ├── ADX.ts │ ├── AbstractCryptotraderIndicator.ts │ ├── AbstractIndicator.ts │ ├── Aroon.ts │ ├── AverageVolume.ts │ ├── BVOL.ts │ ├── BollingerBands.ts │ ├── CCI.ts │ ├── CVD.ts │ ├── Candlestick │ │ ├── AbstractCandlestickPatterns.ts │ │ └── NodeCandlestick.ts │ ├── DEMA.ts │ ├── DataPlotCollector.ts │ ├── EMA.ts │ ├── ESS.ts │ ├── EhlerTrendline.ts │ ├── GannSwing.ts │ ├── HullMA.ts │ ├── IchimokuClouds.ts │ ├── KAMA.ts │ ├── Kairi.ts │ ├── Liquidator.ts │ ├── MACD.ts │ ├── MFI.ts │ ├── MayerMultiple.ts │ ├── NVTSignal.ts │ ├── OBV.ts │ ├── OpenInterest.ts │ ├── OrderbookHeatmap.ts │ ├── PivotPoints.ts │ ├── PivotsHL.ts │ ├── RSI.ts │ ├── RVI.ts │ ├── SAR.ts │ ├── SMA.ts │ ├── STC.ts │ ├── Sentiment.ts │ ├── SocialSentiment.ts │ ├── StochRSI.ts │ ├── Stochastic.ts │ ├── TaLib.ts │ ├── Trendline │ │ ├── AbstractTrendline.ts │ │ ├── FibonacciRetracement.ts │ │ └── Trendlines.ts │ ├── TristarPattern.ts │ ├── VIX.ts │ ├── VWAP.ts │ ├── VWMA.ts │ ├── VolumeProfile.ts │ └── WMA.ts ├── InstanceChecker.ts ├── Lending │ ├── AbstractLendingTrader.ts │ ├── LendingAdvisor.ts │ ├── LendingConfig.ts │ ├── RealTimeLendingTrader.ts │ └── Strategies │ │ ├── AbstractLendingStrategy.ts │ │ ├── DEMA.ts │ │ └── TechnicalLendingStrategy.ts ├── LoginController.ts ├── MarginChecker.ts ├── Notifications │ ├── AbstractNotification.ts │ ├── NoNotificationService.ts │ ├── Notification.ts │ ├── Pushover.ts │ └── Telegram.ts ├── Social │ ├── AbstractWebPlugin.ts │ ├── CoinMarketCap.ts │ ├── PriceWatcher.ts │ ├── SocialConfig.ts │ ├── SocialController.ts │ └── TickerWatcher.ts ├── Strategies │ ├── AbstractCrawlerStrategy.ts │ ├── AbstractGenericStrategy.ts │ ├── AbstractMomentumIndicatorStrategy.ts │ ├── AbstractMomentumStrategy.ts │ ├── AbstractOrderer.ts │ ├── AbstractStopStrategy.ts │ ├── AbstractStrategy.ts │ ├── AbstractTakeProfitStrategy.ts │ ├── AbstractTimeoutStrategy.ts │ ├── AbstractTrailingStop.ts │ ├── AbstractTriggerOrder.ts │ ├── AbstractTurnStrategy.ts │ ├── AbstractWaveSurfer.ts │ ├── Accumulator.ts │ ├── AroonTristar.ts │ ├── BidAskSum.ts │ ├── BladeRunner.ts │ ├── BollingerBands.ts │ ├── BollingerBouncer.ts │ ├── BollingerBreakouts.ts │ ├── BollingerDayTrader.ts │ ├── BollingerStop.ts │ ├── BreakoutDetector.ts │ ├── CCI.ts │ ├── CandleRepeater.ts │ ├── CandleTester.ts │ ├── ChannelBreakout.ts │ ├── CopyTrader.ts │ ├── CounterTrader.ts │ ├── CurrencyPairArbitrage.ts │ ├── DEMA.ts │ ├── DEMALeverage.ts │ ├── DayTrader.ts │ ├── DayTrendFollower.ts │ ├── DirectionFollower.ts │ ├── DirectionRunner.ts │ ├── DirectionRunnerLeverage.ts │ ├── EarlyStopLoss.ts │ ├── ExampleStrategy.ts │ ├── Extrapolation.ts │ ├── FishingNet.ts │ ├── FlashCrash.ts │ ├── HoneyBadger.ts │ ├── Ichimoku.ts │ ├── IndicatorDivergence.ts │ ├── InterestIndicator.ts │ ├── IntervalExtremes.ts │ ├── KAMA.ts │ ├── LiquidationCatcher.ts │ ├── MACD.ts │ ├── MACDLeverage.ts │ ├── MFI.ts │ ├── MakerFeeOrder.ts │ ├── MarginCallBuyer.ts │ ├── MarginPositionRecovery.ts │ ├── MassOrderJumper.ts │ ├── Mixins │ │ ├── IndexStrategy.ts │ │ └── TechnicalAnalysis.ts │ ├── MomentumTurn.ts │ ├── MoneyFlowStrategy.ts │ ├── NOOP.ts │ ├── NotificationTest.ts │ ├── OBV.ts │ ├── OneTimeOrder.ts │ ├── OpenInterestMonitor.ts │ ├── OrderBookPressure.ts │ ├── OrderBookPressureLeverage.ts │ ├── OrderPartitioner.ts │ ├── OutOfRangeCatcher.ts │ ├── PatternDetector.ts │ ├── PatternRepeater.ts │ ├── PercentDEMA.ts │ ├── PingPong.ts │ ├── PivotPeaks.ts │ ├── PivotReversal.ts │ ├── PivotSniper.ts │ ├── PlanRunner.ts │ ├── PlanRunnerLeverage.ts │ ├── PositionReopener.ts │ ├── PriceDifference.ts │ ├── PriceRangeTrader.ts │ ├── PriceSpikeDetector.ts │ ├── PriceSpikeDetectorLeverage.ts │ ├── ProtectProfit.ts │ ├── RSI.ts │ ├── RSIOrderer.ts │ ├── RSIScalpOrderer.ts │ ├── RSIScalper.ts │ ├── RSIStarter.ts │ ├── RSIStarterLeverage.ts │ ├── ResistanceBuyer.ts │ ├── SARStop.ts │ ├── STC.ts │ ├── Scalper.ts │ ├── Sentiment.ts │ ├── SimpleAndShort.ts │ ├── SpeedCandles.ts │ ├── SpikeDetector.ts │ ├── StochRSI.ts │ ├── StopHunter.ts │ ├── StopLossTime.ts │ ├── StopLossTurn.ts │ ├── StopLossTurnPartial.ts │ ├── SwapInterestCollector.ts │ ├── SwingTrader.ts │ ├── TakeProfit.ts │ ├── TakeProfitPartial.ts │ ├── TakeProfitStochRSI.ts │ ├── TechnicalStrategy.ts │ ├── TimeOrder.ts │ ├── TimeStop.ts │ ├── TrailingStop.ts │ ├── TrailingStopReverseEntry.ts │ ├── TrendOscillator.ts │ ├── Trendatron.ts │ ├── TrendlineScalper.ts │ ├── TriggerOrder.ts │ ├── TripleTrend.ts │ ├── TurnReorder.ts │ ├── UnlimitedMargin.ts │ ├── VolumeProfileControl.ts │ ├── VolumeProfiler.ts │ ├── VolumeSpikeDetector.ts │ ├── VolumeSpikeDetectorLong.ts │ ├── VolumeSpikeStopper.ts │ ├── VolumeStopper.ts │ ├── WallDetector.ts │ ├── WaveOpener.ts │ ├── WaveOpenerLeverage.ts │ ├── WaveStopper.ts │ ├── WaveSurfer.ts │ ├── WaveSurferLeverage.ts │ ├── WhaleWatcher.ts │ └── Wyckoff.ts ├── Trade │ ├── AbstractConfig.ts │ ├── AbstractGenericTrader.ts │ ├── AbstractMarketStream.ts │ ├── AbstractOrderTracker.ts │ ├── AbstractTrader.ts │ ├── BacktestOrderTracker.ts │ ├── Backtester.ts │ ├── CandleMarketStream.ts │ ├── Candles │ │ ├── CandleBatcher.ts │ │ ├── CandleMaker.ts │ │ └── CandleStream.ts │ ├── EventStream.ts │ ├── MarketStream.ts │ ├── OrderBook.ts │ ├── PortfolioTrader.ts │ ├── RealTimeOrderTracker.ts │ ├── RealTimeTrader.ts │ ├── StrategyGroup.ts │ ├── TradeBook.ts │ ├── TradeConfig.ts │ ├── TradeNotifier.ts │ └── TradingViewTicker.ts ├── TradeAdvisor.ts ├── Web │ ├── FileResponder.ts │ ├── HttpProxy.ts │ ├── JsonResponse.ts │ └── errorCodes.ts ├── WebSocket │ ├── AppPublisher.ts │ ├── BacktestingUpdater.ts │ ├── CoinMarketUpdater.ts │ ├── ConfigEditor.ts │ ├── HomeUpdater.ts │ ├── LendingUpdater.ts │ ├── LogPublisher.ts │ ├── LoginUpdater.ts │ ├── OracleUpdater.ts │ ├── ScriptsUpdater.ts │ ├── ServerSocket.ts │ ├── SocialUpdater.ts │ ├── StatusUpdater.ts │ ├── StrategyUpdater.ts │ ├── TradeHistoryUpdater.ts │ ├── TradesUpdater.ts │ ├── TradingViewData.ts │ ├── opcodes.ts │ └── widgets │ │ └── Wizard.ts ├── WebSocketController.ts ├── database.ts ├── minify.ts ├── server │ └── data │ │ ├── Sensor.crt │ │ ├── Sensor.csr │ │ └── Sensor.key ├── structs │ ├── ExchangeTicker.ts │ ├── GlobalTradeSignal.ts │ ├── MarginAccountSummary.ts │ ├── MarginPosition.ts │ ├── MarketMakerOrders.ts │ ├── OfferResult.ts │ ├── OrderResult.ts │ ├── Portfolio.ts │ ├── TradePosition.ts │ └── UITrade.ts ├── updateHandler.ts └── utils │ ├── CSV.ts │ ├── Logger.ts │ ├── Mailbox.ts │ └── helper.ts ├── tests ├── consolidate.ts ├── data.csv ├── docs │ ├── WolfBot API.pdf │ ├── diagram-incoming.png │ └── diagram-outgoing.png ├── draw-custom-indicators.html ├── duplicates.ts ├── exchange.ts ├── fiat.ts ├── import.ts ├── init │ └── init.ts ├── marketdata.json ├── ml.ts ├── samples │ ├── WebSocketAPI.js │ ├── WebSocketApiBrowser.js │ └── websocket.html ├── talib.ts ├── temp.html └── trade.ts ├── tsconfig.json ├── views ├── Trader │ ├── trades.html │ └── trades.js ├── backtesting.html ├── coinMarketStats.html ├── config.html ├── home.html ├── layout.html ├── lending.html ├── login.html ├── misc.html ├── oracle.html ├── scripts.html ├── social.html ├── status.html ├── strategies.html ├── strategiesConfigPopup.html ├── supportedCurrencies.html ├── tables.html ├── tabs.html ├── tradeHistory.html ├── windows.html └── wizard.html ├── webpack.config.js └── yarn.lock /.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | .gitignore 3 | .dockerignore 4 | build 5 | docs 6 | node_modules 7 | packages 8 | Dockerfile 9 | docker-compose.yml 10 | mongodb 11 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:12-slim 2 | 3 | RUN set -x && \ 4 | apt-get update && \ 5 | apt-get install -y \ 6 | build-essential \ 7 | make \ 8 | python 9 | 10 | #Install Typescript 11 | RUN npm install typescript@4.1.3 -g 12 | 13 | WORKDIR /app 14 | 15 | COPY . . 16 | RUN chown -R node:node /app 17 | 18 | # yarn and tsc shouldn't be run as root 19 | USER node 20 | 21 | # shouldn't be needed 22 | ENV NODE_ENV=production 23 | 24 | RUN yarn install 25 | 26 | WORKDIR /app/node_modules/@ekliptor/apputils 27 | #Needs a exit 0 because of build errors 28 | RUN tsc --watch false; exit 0 29 | 30 | WORKDIR /app/node_modules/@ekliptor/bit-models 31 | #Needs a exit 0 because of build errors 32 | RUN tsc --watch false; exit 0 33 | 34 | WORKDIR /app/node_modules/@ekliptor/browserutils 35 | RUN tsc --watch false 36 | 37 | WORKDIR /app 38 | 39 | RUN tsc --watch false; exit 0 40 | 41 | WORKDIR /app/build 42 | 43 | # let WolfBot know it's running in a VM 44 | ENV WOLF_CONTAINER=docker 45 | 46 | CMD [ "node", "app.js", "--debug", "--config=Noop" ,"--trader=RealTimeTrader" ,"--noUpdate" ,"--noBrowser" ] 47 | -------------------------------------------------------------------------------- /ai.ts: -------------------------------------------------------------------------------- 1 | // node --use_strict --max-old-space-size=3096 backfind.js 2 | // parameters: --debug (debug, otherwise use config value) 3 | // --config: the name of the AI config file under /config/machine-learning/ to run find the optimal parameters 4 | // --train: train the network on history data 5 | // --predict: predict prices in live mode 6 | 7 | // file has been merged with app.js because we need a webserver to show our live price prediction from AI 8 | /* 9 | require('source-map-support').install(); 10 | import * as utils from "@ekliptor/apputils"; 11 | const nconf = utils.nconf 12 | const logger = require('./src/utils/Logger') 13 | const argv = require('minimist')(process.argv.slice(2)) 14 | if (argv.debug === true) 15 | nconf.set('debug', true) 16 | import {Brain} from "./src/AI/Brain"; 17 | 18 | 19 | nconf.set("ai", true); 20 | let brain = new Brain(argv.config); 21 | if (argv.train) 22 | brain.train(); 23 | */ -------------------------------------------------------------------------------- /config/Back-AroonTristar.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.0, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "AroonTristar": { 10 | "interval": 30, 11 | "breakout": 3, 12 | "pair": "BTC_ETH", 13 | "candleSize": 60, 14 | "enableLog": true 15 | }, 16 | "StopLossTurn": { 17 | "order": "closeLong", 18 | "setback": 9.99, 19 | "time": 14400, 20 | "candleSize": 1, 21 | "pair": "BTC_ETH", 22 | "enableLog": false 23 | } 24 | } 25 | } 26 | ] 27 | } -------------------------------------------------------------------------------- /config/Back-Blade.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": false, 6 | "tradeTotalBtc": 0.08, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "BladeRunner": { 10 | "order": "buy", 11 | "profit": 0.6, 12 | "fee": 0.25, 13 | "priceDiffPercent": 0.01, 14 | "pair": "BTC_ZEC", 15 | "candleSize": 2, 16 | "enableLog": true 17 | }, 18 | "StopLossTurn": { 19 | "order": "sell", 20 | "setback": 5.9, 21 | "time": 90, 22 | "candleSize": 1, 23 | "pair": "BTC_ZEC", 24 | "enableLog": false 25 | } 26 | } 27 | } 28 | ] 29 | } -------------------------------------------------------------------------------- /config/Back-ChannelBreakout.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.0, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "ChannelBreakout": { 10 | "pair": "BTC_LTC", 11 | "candleSize": 60 12 | }, 13 | "StopLossTurn": { 14 | "order": "closeLong", 15 | "setback": 4.5, 16 | "time": 3600, 17 | "candleSize": 60, 18 | "pair": "BTC_LTC", 19 | "enableLog": false 20 | } 21 | } 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /config/Back-DayTrader.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.0, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "DayTrader": { 10 | "interval": 30, 11 | "minVolatility": 0.04, 12 | "short": 2, 13 | "long": 7, 14 | "CrossMAType": "EMA", 15 | "pair": "BTC_ETH", 16 | "candleSize": 240, 17 | "enableLog": true 18 | }, 19 | "Scalper": { 20 | "interval": 14, 21 | "pair": "BTC_ETH", 22 | "candleSize": 240, 23 | "enableLog": true 24 | }, 25 | "StopLossTurn": { 26 | "order": "closeLong", 27 | "setback": 3.99, 28 | "time": 14400, 29 | "candleSize": 5, 30 | "pair": "BTC_ETH", 31 | "enableLog": false 32 | } 33 | } 34 | } 35 | ] 36 | } -------------------------------------------------------------------------------- /config/Back-HoneyBadger.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.0, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "HoneyBadger": { 10 | "pair": "BTC_ETH", 11 | "candleSize": 60, 12 | "enableLog": true 13 | }, 14 | "StopLossTurn": { 15 | "order": "closeLong", 16 | "setback": 9.99, 17 | "time": 14400, 18 | "candleSize": 5, 19 | "pair": "BTC_ETH", 20 | "enableLog": false 21 | } 22 | } 23 | } 24 | ] 25 | } -------------------------------------------------------------------------------- /config/Back-IntervalExtremes.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["Poloniex"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.7, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "IntervalExtremes": { 10 | "tradeDirection": "both", 11 | "mode": "bounce", 12 | "tradeInterval": "daily", 13 | "candleSize": 60, 14 | "pair": "BTC_ETH", 15 | "tradeStrategy": "RSIScalpOrderer", 16 | "enableLog": true 17 | }, 18 | "RSIScalpOrderer": { 19 | "low": 34, 20 | "high": 70, 21 | "expiry": 20, 22 | "candleSize": 5, 23 | "pair": "BTC_ETH", 24 | "enableLog": true 25 | }, 26 | "StopLossTurn": { 27 | "order": "closeLong", 28 | "setback": 3.5, 29 | "setbackLong": 5.5, 30 | "time": 7200, 31 | "reduceTimeByVolatility": false, 32 | "low": 52, 33 | "high": 56, 34 | "candleSize": 5, 35 | "pair": "BTC_ETH", 36 | "enableLog": false 37 | } 38 | } 39 | } 40 | ] 41 | } -------------------------------------------------------------------------------- /config/Back-MomentumTurn.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.0, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "MomentumTurn": { 10 | "low": 25, 11 | "high": 85, 12 | "interval": 14, 13 | "pair": "BTC_XRP", 14 | "candleSize": 10, 15 | "enableLog": true 16 | }, 17 | "StopLossTurn": { 18 | "order": "closeLong", 19 | "setback": 3.99, 20 | "time": 30, 21 | "candleSize": 5, 22 | "pair": "BTC_XRP", 23 | "enableLog": false 24 | }, 25 | "TakeProfit": { 26 | "order": "closeShort", 27 | "profit": 0.75, 28 | "time": 600, 29 | "candleSize": 5, 30 | "pair": "BTC_XRP", 31 | "enableLog": false 32 | } 33 | } 34 | } 35 | ] 36 | } -------------------------------------------------------------------------------- /config/Back-OrderPartitioner.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["Poloniex"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.7, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "OrderPartitioner": { 10 | "tradeCount": 20, 11 | "percentChange": 0.35, 12 | "whalePercentage": 5, 13 | "fishPercentage": 1.1, 14 | "volumeBuySellLongThreshold": 70, 15 | "volumeBuySellShortThreshold": 30, 16 | "pair": "BTC_ETH", 17 | "candleSize": 60, 18 | "enableLog": false 19 | }, 20 | "StopLossTurn": { 21 | "order": "closeLong", 22 | "setback": 3.5, 23 | "setbackLong": 5.5, 24 | "time": 7200, 25 | "reduceTimeByVolatility": false, 26 | "low": 52, 27 | "high": 56, 28 | "candleSize": 5, 29 | "pair": "BTC_ETH", 30 | "enableLog": false 31 | } 32 | } 33 | } 34 | ] 35 | } -------------------------------------------------------------------------------- /config/Back-PatternRepeater.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.0, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "PatternRepeater": { 10 | "patternSize": 20, 11 | "patternRepeat": 2, 12 | "maxOffset": 1, 13 | "pair": "BTC_ETH", 14 | "candleSize": 60, 15 | "enableLog": true 16 | }, 17 | "StopLossTurn": { 18 | "order": "closeLong", 19 | "setback": 3.99, 20 | "time": 14400, 21 | "candleSize": 5, 22 | "pair": "BTC_ETH", 23 | "enableLog": false 24 | } 25 | } 26 | } 27 | ] 28 | } -------------------------------------------------------------------------------- /config/Back-SimpleAndShort.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.3, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "SimpleAndShort": { 10 | "stopStart": 3.0, 11 | "takeProfitStart": 4.0, 12 | "pair": "BTC_ETH", 13 | "candleSize": 30, 14 | "enableLog": true 15 | }, 16 | "Scalper": { 17 | "interval": 14, 18 | "pair": "BTC_ETH", 19 | "candleSize": 60, 20 | "enableLog": true 21 | }, 22 | "StopLossTurn": { 23 | "order": "closeLong", 24 | "setback": 3.99, 25 | "time": 14400, 26 | "candleSize": 5, 27 | "pair": "BTC_ETH", 28 | "enableLog": false 29 | } 30 | } 31 | } 32 | ] 33 | } -------------------------------------------------------------------------------- /config/Back-Trendatron.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.0, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "Trendatron": { 10 | "interval": 18, 11 | "pair": "BTC_ETH", 12 | "candleSize": 15, 13 | "enableLog": true 14 | }, 15 | "StopLossTurn": { 16 | "order": "closeLong", 17 | "setback": 14, 18 | "time": 7200, 19 | "candleSize": 5, 20 | "pair": "BTC_ETH", 21 | "enableLog": false 22 | } 23 | } 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /config/Back-VolumeSpike.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.1, 7 | "tradeDirection": "up", 8 | "warmUpMin": 0, 9 | "strategies": { 10 | "VolumeSpikeDetector": { 11 | "spikeFactor": 2.1, 12 | "minVolBtc": 80, 13 | "candleSize": 5, 14 | "pair": "BTC_DASH", 15 | "enableLog": true 16 | }, 17 | "StopLossTurn": { 18 | "order": "closeLong", 19 | "setback": 0.99, 20 | "time": 90, 21 | "candleSize": 1, 22 | "pair": "BTC_DASH", 23 | "enableLog": false 24 | }, 25 | "TakeProfit": { 26 | "order": "closeLong", 27 | "profit": 1.15, 28 | "time": 300, 29 | "candleSize": 1, 30 | "pair": "BTC_DASH", 31 | "enableLog": false 32 | } 33 | } 34 | } 35 | ] 36 | } -------------------------------------------------------------------------------- /config/Back-WaveSurfer.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["OKEX"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 200, 7 | "tradeDirection": "both", 8 | "warmUpMin": 0, 9 | "strategies": { 10 | "MACD": { 11 | "takeProfitTicks": 3, 12 | "closeSidewaysMarkets": true, 13 | "short": 12, 14 | "long": 26, 15 | "signal": 9, 16 | "interval": 48, 17 | "trendCandleThreshold": 50, 18 | "pair": "USD_BTC", 19 | "candleSize": 60, 20 | "tradeStrategy": "RSIScalpOrderer", 21 | "enableLog": true 22 | }, 23 | "RSIScalpOrderer": { 24 | "low": 34, 25 | "high": 70, 26 | "expiry": 20, 27 | "candleSize": 5, 28 | "pair": "USD_BTC", 29 | "enableLog": true 30 | }, 31 | "StopLossTurn": { 32 | "order": "closeLong", 33 | "setback": 3.5, 34 | "setbackLong": 5.5, 35 | "time": 7200, 36 | "reduceTimeByVolatility": false, 37 | "low": 52, 38 | "high": 56, 39 | "candleSize": 5, 40 | "pair": "USD_BTC", 41 | "enableLog": false 42 | } 43 | } 44 | } 45 | ] 46 | } -------------------------------------------------------------------------------- /config/BitmexContract.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": [ 5 | "BitMEX" 6 | ], 7 | "marginTrading": true, 8 | "tradeTotalBtc": 200, 9 | "notifyTrades": true, 10 | "warmUpMin": 0, 11 | "exchangeParams": [ 12 | "XBTZ19", 13 | "USD_BTC" 14 | ], 15 | "strategies": { 16 | "TradingViewSignal": { 17 | "email": "tradingview@wolfbot.org", 18 | "password": "", 19 | "host": "", 20 | "port": 0, 21 | "tls": true, 22 | "checkMailSec": 120, 23 | "tradeDirection": "both", 24 | "buyWords": "buy", 25 | "sellWords": "sell", 26 | "closeWords": "close", 27 | "alwaysAllowPosIncrease": false, 28 | "forceMaker": false, 29 | "pair": "USD_BTC", 30 | "candleSize": 1, 31 | "tradeStrategy": "", 32 | "enableLog": true 33 | } 34 | } 35 | } 36 | ] 37 | } -------------------------------------------------------------------------------- /config/BitmexStopsContract1.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": [ 5 | "BitMEX" 6 | ], 7 | "marginTrading": true, 8 | "tradeTotalBtc": 200.0, 9 | "notifyTrades": true, 10 | "warmUpMin": 0, 11 | "exchangeParams": [ 12 | "XBTZ19", 13 | "USD_BTC" 14 | ], 15 | "strategies": { 16 | "StopLossTurn": { 17 | "order": "closeShort", 18 | "stop": 10670.6, 19 | "stopLong": 7170.3, 20 | "time": 30, 21 | "closePosition": "always", 22 | "reduceTimeByVolatility": false, 23 | "keepTrendOpen": false, 24 | "notifyBeforeStopSec": 120, 25 | "low": 40, 26 | "high": 65, 27 | "candleSize": 5, 28 | "pair": "USD_BTC", 29 | "enableLog": true 30 | } 31 | } 32 | } 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /config/BitmexStopsContract2.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": [ 5 | "BitMEX" 6 | ], 7 | "marginTrading": true, 8 | "tradeTotalBtc": 200.0, 9 | "notifyTrades": true, 10 | "warmUpMin": 0, 11 | "exchangeParams": [ 12 | "XBTH20", 13 | "USD_BTC" 14 | ], 15 | "strategies": { 16 | "StopLossTurn": { 17 | "order": "closeShort", 18 | "stop": 10120.6, 19 | "stopLong": 7170.3, 20 | "time": 30, 21 | "closePosition": "always", 22 | "reduceTimeByVolatility": false, 23 | "keepTrendOpen": false, 24 | "notifyBeforeStopSec": 120, 25 | "low": 40, 26 | "high": 65, 27 | "candleSize": 5, 28 | "pair": "USD_BTC", 29 | "enableLog": true 30 | } 31 | } 32 | } 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /config/BollingerStop.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["Bitfinex"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 200.0, 7 | "notifyTrades": false, 8 | "strategies": { 9 | "BollingerStop": { 10 | "time": 300, 11 | "notifyBeforeStopSec": 0, 12 | "stopBand": "opposite", 13 | "delayTicks": 2, 14 | "candleSize": 60, 15 | "pair": "USD_BTC", 16 | "enableLog": false 17 | } 18 | } 19 | } 20 | ] 21 | } -------------------------------------------------------------------------------- /config/CandleTester.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": [ 5 | "Bitfinex" 6 | ], 7 | "marginTrading": true, 8 | "tradeTotalBtc": 0, 9 | "warmUpMin": 0, 10 | "updateIndicatorsOnTrade": false, 11 | "flipPosition": false, 12 | "closePositionFirst": false, 13 | "strategies": { 14 | "CandleTester": { 15 | "pair": "USD_BTC", 16 | "candleSize": 3, 17 | "enableLog": true 18 | } 19 | } 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /config/Dummy.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["OKEX"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 100, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "MACD": { 10 | "short": 4, 11 | "long": 5, 12 | "signal": 3, 13 | "pair": "USD_BTC", 14 | "candleSize": 2, 15 | "enableLog": true 16 | } 17 | } 18 | }, 19 | { 20 | "exchanges": ["OKEX"], 21 | "marginTrading": true, 22 | "tradeTotalBtc": 100, 23 | "warmUpMin": 0, 24 | "strategies": { 25 | "MACD": { 26 | "short": 4, 27 | "long": 5, 28 | "signal": 3, 29 | "pair": "USD_LTC", 30 | "candleSize": 2, 31 | "enableLog": true 32 | } 33 | } 34 | } 35 | ] 36 | } -------------------------------------------------------------------------------- /config/EarlyStopLoss.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["Bitfinex"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 200.0, 7 | "notifyTrades": false, 8 | "strategies": { 9 | "EarlyStopLoss": { 10 | "order": "closeLong", 11 | "low": 21, 12 | "high": 79, 13 | "profitLow": 35, 14 | "profitHigh": 70, 15 | "spikeClose": 1.1, 16 | "candleSize": 3, 17 | "pair": "USD_BTC", 18 | "enableLog": false 19 | } 20 | } 21 | } 22 | ] 23 | } -------------------------------------------------------------------------------- /config/ExampleStrategy.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "Poloniex", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.7, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "ExampleStrategy": { 10 | "interval": 35, 11 | "mySettingSwitch": true, 12 | "pair": "BTC_ETH", 13 | "candleSize": 60, 14 | "enableLog": true 15 | }, 16 | "StopLossTurn": { 17 | "order": "closeLong", 18 | "setback": 3.0, 19 | "setbackLong": 4.5, 20 | "time": 7200, 21 | "reduceTimeByVolatility": false, 22 | "low": 52, 23 | "high": 56, 24 | "candleSize": 6, 25 | "pair": "BTC_ETH", 26 | "enableLog": false 27 | } 28 | } 29 | } 30 | ] 31 | } -------------------------------------------------------------------------------- /config/MACD-Binance.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "Binance", 5 | "marginTrading": false, 6 | "tradeTotalBtc": 0.15, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "MACD": { 10 | "short": 10, 11 | "long": 26, 12 | "signal": 9, 13 | "pair": "USDT_BTC", 14 | "candleSize": 30, 15 | "tradeStrategy": "RSIScalpOrderer", 16 | "enableLog": true 17 | }, 18 | "RSIScalpOrderer": { 19 | "low": 34, 20 | "high": 70, 21 | "expiry": 20, 22 | "candleSize": 3, 23 | "pair": "USDT_BTC", 24 | "enableLog": true 25 | }, 26 | "StopLossTurn": { 27 | "order": "closeShort", 28 | "setback": 2.1, 29 | "time": 180, 30 | "candleSize": 5, 31 | "pair": "USDT_BTC", 32 | "enableLog": true 33 | }, 34 | "TakeProfit": { 35 | "order": "closeShort", 36 | "profit": 2.2, 37 | "time": 900, 38 | "candleSize": 5, 39 | "pair": "USDT_BTC", 40 | "enableLog": true 41 | } 42 | } 43 | } 44 | ] 45 | } -------------------------------------------------------------------------------- /config/MakerFeeOrder.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["Kraken"], 5 | "marginTrading": false, 6 | "tradeTotalBtc": 0.035, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "MakerFeeOrder": { 10 | "order": "buy", 11 | "pair": "USD_BTC", 12 | "enableLog": true 13 | } 14 | } 15 | } 16 | ] 17 | } -------------------------------------------------------------------------------- /config/Noop.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": [ 5 | "Bitfinex" 6 | ], 7 | "marginTrading": true, 8 | "tradeTotalBtc": 0, 9 | "warmUpMin": 0, 10 | "updateIndicatorsOnTrade": false, 11 | "flipPosition": false, 12 | "closePositionFirst": false, 13 | "strategies": { 14 | "NOOP": { 15 | "sample": "in here come strategy parameteres & config in real trading strategies", 16 | "pair": "USD_BTC", 17 | "candleSize": 2, 18 | "enableLog": true 19 | } 20 | } 21 | } 22 | ] 23 | } -------------------------------------------------------------------------------- /config/NotificationTest.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": [ 5 | "BitMEX" 6 | ], 7 | "marginTrading": true, 8 | "tradeTotalBtc": 0, 9 | "warmUpMin": 0, 10 | "updateIndicatorsOnTrade": false, 11 | "flipPosition": false, 12 | "strategies": { 13 | "NotificationTest": { 14 | "message": "This is a test message", 15 | "pair": "USD_BTC", 16 | "candleSize": 2, 17 | "enableLog": true 18 | } 19 | } 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /config/OneTimeOrder.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.22, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "OneTimeOrder": { 10 | "order": "buy", 11 | "comp": "", 12 | "stop": 0.00020240, 13 | "forceMaker": false, 14 | "pair": "BTC_XRP", 15 | "enableLog": true 16 | } 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /config/OneTimeOrderRSI.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "Poloniex", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 100, 7 | "warmUpMin": 0, 8 | "notifyTrades": true, 9 | "strategies": { 10 | "OneTimeOrder": { 11 | "order": "buy", 12 | "stop": 0.0000001, 13 | "comp": "<", 14 | "pair": "BTC_SC", 15 | "tradeStrategy": "RSIScalpOrderer", 16 | "enableLog": true 17 | }, 18 | "RSIScalpOrderer": { 19 | "low": 34, 20 | "high": 70, 21 | "interval": 6, 22 | "expiry": 20, 23 | "candleSize": 3, 24 | "pair": "BTC_SC", 25 | "enableLog": true 26 | }, 27 | "StopLossTurn": { 28 | "order": "sell", 29 | "setback": 5.2, 30 | "setbackLong": 5.5, 31 | "time": 7200, 32 | "notifyBeforeStopSec": 300, 33 | "reduceTimeByVolatility": false, 34 | "low": 52, 35 | "high": 56, 36 | "candleSize": 5, 37 | "pair": "BTC_SC", 38 | "enableLog": false 39 | } 40 | } 41 | } 42 | ] 43 | } -------------------------------------------------------------------------------- /config/OrderPartitioner.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["Bitfinex"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 200.0, 7 | "notifyTrades": false, 8 | "strategies": { 9 | "OrderPartitioner": { 10 | "tradeCount": 20, 11 | "percentChange": 0.35, 12 | "whalePercentage": 5, 13 | "fishPercentage": 1.1, 14 | "pair": "USD_BTC", 15 | "candleSize": 60, 16 | "enableLog": true 17 | } 18 | } 19 | } 20 | ] 21 | } -------------------------------------------------------------------------------- /config/PlanRunner2.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | 4 | ] 5 | } -------------------------------------------------------------------------------- /config/PriceSpikeDetector.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["Bitfinex"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 200.0, 7 | "notifyTrades": false, 8 | "strategies": { 9 | "PriceSpikeDetector": { 10 | "spikePercent": 3.0, 11 | "tradeDirection": "notify", 12 | "candleSize": 5, 13 | "pair": "USD_BTC", 14 | "enableLog": true 15 | } 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /config/ProtectProfit.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["Bitfinex"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 200.0, 7 | "notifyTrades": false, 8 | "strategies": { 9 | "ProtectProfit": { 10 | "profit": 0.7, 11 | "time": 30, 12 | "candleSize": 1, 13 | "pair": "USD_BTC", 14 | "enableLog": true 15 | } 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /config/RSIScalper.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["Poloniex"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.7, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "RSIScalper": { 10 | "percentage": 50, 11 | "low": 35, 12 | "high": 70, 13 | "candleSize": 15, 14 | "openPosition": true, 15 | "pair": "BTC_LTC", 16 | "tradeStrategy": "RSIOrderer", 17 | "enableLog": true 18 | }, 19 | "RSIOrderer": { 20 | "low": 35, 21 | "high": 65, 22 | "immediateLow": 34, 23 | "immediateHigh": 66, 24 | "waitBounceBack": false, 25 | "expiry": 20, 26 | "candleSize": 5, 27 | "pair": "BTC_LTC", 28 | "enableLog": true 29 | }, 30 | "ProtectProfit": { 31 | "profit": 0.7, 32 | "time": 30, 33 | "candleSize": 1, 34 | "pair": "BTC_LTC", 35 | "enableLog": true 36 | } 37 | } 38 | } 39 | ] 40 | } -------------------------------------------------------------------------------- /config/SARStop.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["Bitfinex"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 200.0, 7 | "notifyTrades": false, 8 | "strategies": { 9 | "SARStop": { 10 | "initialStop": true, 11 | "accelerationFactor": 0.02, 12 | "accelerationMax": 0.2, 13 | "time": 300, 14 | "keepTrendOpen": true, 15 | "candleSize": 5, 16 | "pair": "USD_BTC", 17 | "enableLog": false 18 | } 19 | } 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /config/Scalper.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.2, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "Scalper": { 10 | "interval": 9, 11 | "pair": "BTC_LTC", 12 | "candleSize": 3, 13 | "enableLog": true 14 | } 15 | } 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /config/StopLossTurn.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": [ 5 | "OKEX" 6 | ], 7 | "marginTrading": true, 8 | "tradeTotalBtc": 0.031, 9 | "notifyTrades": false, 10 | "strategies": { 11 | "StopLossTurn": { 12 | "order": "closeLong", 13 | "setback": 5, 14 | "setbackLong": 5.5, 15 | "updateTrailingStop": true, 16 | "time": 300, 17 | "setbackProfit": 2.7, 18 | "triggerProfit": 4.3, 19 | "timeProfit": 120, 20 | "notifyBeforeStopSec": 0, 21 | "stopPriceType": "avg", 22 | "reduceTimeByVolatility": false, 23 | "keepTrendOpen": true, 24 | "minOpenTime": 0, 25 | "low": 52, 26 | "high": 56, 27 | "candleSize": 5, 28 | "pair": "USD_BTC", 29 | "enableLog": false 30 | } 31 | } 32 | } 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /config/StopLossTurnPartial.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["OKEX"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.031, 7 | "notifyTrades": false, 8 | "strategies": { 9 | "StopLossTurnPartial": { 10 | "percentage": 50, 11 | "order": "closeLong", 12 | "setback": 5.0, 13 | "setbackLong": 5.5, 14 | "time": 300, 15 | "setbackProfit": 2.7, 16 | "triggerProfit": 4.3, 17 | "timeProfit": 120, 18 | "notifyBeforeStopSec": 0, 19 | "reduceTimeByVolatility": false, 20 | "low": 52, 21 | "high": 56, 22 | "candleSize": 5, 23 | "pair": "USD_BTC", 24 | "enableLog": false 25 | } 26 | } 27 | } 28 | ] 29 | } -------------------------------------------------------------------------------- /config/StopTest.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "markets": [ 6 | "BTC_ETH" 7 | ], 8 | "marginTrading": true, 9 | "tradeTotalBtc": 0.1, 10 | "warmUpMin": 0, 11 | "strategies": { 12 | "StopLossTime": { 13 | "order": "buy", 14 | "stop": 0.06333500, 15 | "time": 10, 16 | "limit": 0.06333500, 17 | "amount": 1, 18 | "pair": "BTC_ETH", 19 | "enableLog": false 20 | } 21 | } 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /config/TakeProfit.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["Bitfinex"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.15, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "TakeProfit": { 10 | "order": "closeLong", 11 | "profit": 5.2, 12 | "updateTrailingStop": true, 13 | "time": 3600, 14 | "reduceTimeByVolatility": false, 15 | "keepTrendOpen": true, 16 | "forceMaker": true, 17 | "minRate": 0.0, 18 | "stopPriceType": "avg", 19 | "candleSize": 6, 20 | "pair": "USD_BTC", 21 | "enableLog": false 22 | } 23 | } 24 | } 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /config/TakeProfitPartial.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["Bitfinex"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.15, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "TakeProfitPartial": { 10 | "percentage": 50, 11 | "order": "closeLong", 12 | "profit": 5.2, 13 | "time": 3600, 14 | "reduceTimeByVolatility": false, 15 | "keepTrendOpen": true, 16 | "forceMaker": true, 17 | "minRate": 0.0, 18 | "stopPriceType": "avg", 19 | "candleSize": 6, 20 | "pair": "USD_BTC", 21 | "enableLog": false 22 | } 23 | } 24 | } 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /config/TakeProfitStochRSI.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["Bitfinex"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 200.0, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "TakeProfitStochRSI": { 10 | "percentage": 50, 11 | "low": 11, 12 | "high": 87, 13 | "interval": 25, 14 | "optInFastK_Period": 5, 15 | "optInFastD_Period": 3, 16 | "optInFastD_MAType": 0, 17 | "closeRateFactor": 0.9992, 18 | "time": 300, 19 | "keepTrendOpen": true, 20 | "alwaysIncreaseStop": false, 21 | "ensureProfit": true, 22 | "minOpenTicks": 12, 23 | "stopPriceType": "avg", 24 | "candleSize": 60, 25 | "orderStrategy": "TriggerOrder", 26 | "pair": "USD_BTC", 27 | "enableLog": true 28 | }, 29 | "TriggerOrder": { 30 | "candleSize": 1, 31 | "pair": "USD_BTC", 32 | "enableLog": true 33 | } 34 | } 35 | } 36 | ] 37 | } 38 | -------------------------------------------------------------------------------- /config/TestBuy.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.021, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "RSI": { 10 | "amount": 1, 11 | "pair": "BTC_XRP", 12 | "candleSize": 1, 13 | "enableLog": true, 14 | "interval": 3, 15 | "low": 30, 16 | "high": 70 17 | }, 18 | "StopLossTurn": { 19 | "order": "closeShort", 20 | "setback": 0.29, 21 | "time": 30, 22 | "amount": 1, 23 | "candleSize": 1, 24 | "pair": "BTC_XRP", 25 | "enableLog": true 26 | } 27 | } 28 | } 29 | ] 30 | } -------------------------------------------------------------------------------- /config/TrailingStop.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": [ 5 | "Binance" 6 | ], 7 | "marginTrading": true, 8 | "tradeTotalBtc": 0, 9 | "warmUpMin": 0, 10 | "updateIndicatorsOnTrade": false, 11 | "flipPosition": false, 12 | "strategies": { 13 | "TrailingStop": { 14 | "rate": 6000, 15 | "comp": "<", 16 | "trailingStopPerc": 0.5, 17 | "closePosition": "always", 18 | "time": 0, 19 | "pair": "USDT_BTC", 20 | "candleSize": 5, 21 | "enableLog": true 22 | } 23 | } 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /config/Trendatron.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.6, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "Trendatron": { 10 | "interval": 9, 11 | "pair": "BTC_LTC", 12 | "candleSize": 60, 13 | "enableLog": true 14 | }, 15 | "StopLossTurn": { 16 | "order": "closeLong", 17 | "setback": 9.99, 18 | "time": 14400, 19 | "candleSize": 1, 20 | "pair": "BTC_LTC", 21 | "enableLog": false 22 | } 23 | } 24 | }, 25 | { 26 | "exchanges": "default", 27 | "marginTrading": true, 28 | "tradeTotalBtc": 0.6, 29 | "warmUpMin": 0, 30 | "strategies": { 31 | "Trendatron": { 32 | "interval": 14, 33 | "pair": "BTC_ETH", 34 | "candleSize": 60, 35 | "enableLog": true 36 | }, 37 | "StopLossTurn": { 38 | "order": "closeLong", 39 | "setback": 8.99, 40 | "time": 14400, 41 | "candleSize": 1, 42 | "pair": "BTC_ETH", 43 | "enableLog": false 44 | } 45 | } 46 | } 47 | ] 48 | } -------------------------------------------------------------------------------- /config/UnlimitedMargin.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["Bitfinex"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 10.0, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "UnlimitedMargin": { 10 | "profitTargetPercent": 1.5, 11 | "interval": 24, 12 | "minVolumeSpike": 1.1, 13 | "entryIndicator": "RSI", 14 | "low": 28, 15 | "high": 72, 16 | "maxGoLongPrice": 0.0, 17 | "minGoShortPrice": 0.0, 18 | "pair": "USD_BTC", 19 | "candleSize": 60, 20 | "tradeStrategy": "RSIScalpOrderer", 21 | "enableLog": true 22 | }, 23 | "RSIScalpOrderer": { 24 | "low": 34, 25 | "high": 70, 26 | "expiry": 20, 27 | "candleSize": 5, 28 | "pair": "USD_BTC", 29 | "enableLog": true 30 | } 31 | } 32 | } 33 | ] 34 | } -------------------------------------------------------------------------------- /config/VolumeSpikeDetector.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["Bitfinex"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 200.0, 7 | "notifyTrades": false, 8 | "strategies": { 9 | "VolumeSpikeDetector": { 10 | "spikeFactor": 3, 11 | "minVolBtc": 1.2, 12 | "tradeDirection": "notify", 13 | "candleSize": 10, 14 | "pair": "USD_BTC", 15 | "enableLog": false 16 | } 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /config/VolumeSpikeStopper.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["Bitfinex"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 200.0, 7 | "notifyTrades": false, 8 | "strategies": { 9 | "VolumeSpikeStopper": { 10 | "spikeFactor": 1.7, 11 | "keepCandleCount": 3, 12 | "candleSize": 5, 13 | "pair": "USD_BTC", 14 | "enableLog": false 15 | } 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /config/VolumeSpikeTrade.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.1, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "VolumeSpikeDetector": { 10 | "spikeFactor": 2.1, 11 | "minVolBtc": 550, 12 | "candleSize": 5, 13 | "pair": "BTC_ETH", 14 | "enableLog": true 15 | }, 16 | "StopLossTurn": { 17 | "order": "closeLong", 18 | "setback": 0.99, 19 | "time": 90, 20 | "candleSize": 1, 21 | "pair": "BTC_ETH", 22 | "enableLog": true 23 | }, 24 | "TakeProfit": { 25 | "order": "closeLong", 26 | "profit": 1.15, 27 | "time": 300, 28 | "candleSize": 1, 29 | "pair": "BTC_ETH", 30 | "enableLog": true 31 | }, 32 | "TimeOrder": { 33 | "order": "buy", 34 | "executeMin": 180, 35 | "candleSize": 5, 36 | "pair": "BTC_ETH", 37 | "enableLog": true 38 | } 39 | } 40 | } 41 | ] 42 | } -------------------------------------------------------------------------------- /config/WaveStopper.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["Bitfinex"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 200.0, 7 | "notifyTrades": false, 8 | "strategies": { 9 | "WaveStopper": { 10 | "minSurfCandles": 1, 11 | "takeProfitCandleSize": 1, 12 | "pair": "USD_BTC", 13 | "candleSize": 5, 14 | "enableLog": true 15 | } 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /config/WhaleWatcher.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.1, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "WhaleWatcher": { 10 | "triggerAmountBtc": 50.0, 11 | "pair": "BTC_LTC", 12 | "enableLog": true 13 | }, 14 | "VolumeSpikeDetector": { 15 | "spikeFactor": 2.1, 16 | "minVolBtc": 550, 17 | "candleSize": 5, 18 | "pair": "BTC_LTC", 19 | "enableLog": true 20 | }, 21 | "PriceSpikeDetector": { 22 | "spikePercent": 3.5, 23 | "candleSize": 5, 24 | "pair": "BTC_LTC", 25 | "enableLog": true 26 | }, 27 | "RSI": { 28 | "pair": "BTC_LTC", 29 | "candleSize": 5, 30 | "enableLog": true, 31 | "interval": 14, 32 | "low": 30, 33 | "high": 70 34 | } 35 | } 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /config/arbitrage/Leverage.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["Bitfinex", "OKEX"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": 100.0, 7 | "notifyTrades": true, 8 | "longShortRatio": 1.0, 9 | "maxTradeBalancePercentage": 99.0, 10 | "strategies": { 11 | "Spread": { 12 | "spreadEntry": 0.8, 13 | "spreadTarget": 0.5, 14 | "trailingSpreadStop": 0.08, 15 | "statelessArbitrage": false, 16 | "tradingFees": { 17 | "Bitfinex": { 18 | "maker": 0.1, 19 | "taker": 0.2 20 | }, 21 | "OKEX": { 22 | "maker": 0.03, 23 | "taker": 0.05 24 | } 25 | }, 26 | "candleSize": 1, 27 | "pair": "USD_BTC", 28 | "tradeStrategy": "", 29 | "enableLog": true 30 | } 31 | } 32 | } 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /config/arbitrage/SimpleSpread.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": [ 5 | "Binance", 6 | "CoinbasePro" 7 | ], 8 | "marginTrading": true, 9 | "tradeTotalBtc": 100, 10 | "notifyTrades": true, 11 | "longShortRatio": 1, 12 | "maxTradeBalancePercentage": 99, 13 | "strategies": { 14 | "Spread": { 15 | "spreadEntry": 0.85, 16 | "spreadTarget": 0.5, 17 | "trailingSpreadStop": 0.08, 18 | "statelessArbitrage": false, 19 | "tradingFees": { 20 | "Binance": { 21 | "maker": 0.1, 22 | "taker": 0.1 23 | }, 24 | "CoinbasePro": { 25 | "maker": 0, 26 | "taker": 0.03 27 | } 28 | }, 29 | "candleSize": 1, 30 | "pair": "USDC_ETH", 31 | "tradeStrategy": "", 32 | "enableLog": true 33 | } 34 | } 35 | } 36 | ] 37 | } -------------------------------------------------------------------------------- /config/arbitrage/SimpleSpreadPolo.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": [ 5 | "Binance", 6 | "Poloniex" 7 | ], 8 | "marginTrading": false, 9 | "tradeTotalBtc": 0.0021, 10 | "notifyTrades": false, 11 | "longShortRatio": 1, 12 | "maxTradeBalancePercentage": 99, 13 | "strategies": { 14 | "Spread": { 15 | "spreadEntry": 0.75, 16 | "spreadTarget": 0.45, 17 | "trailingSpreadStop": 0.08, 18 | "statelessArbitrage": true, 19 | "tradingFees": { 20 | "Binance": { 21 | "maker": 0.075, 22 | "taker": 0.075 23 | }, 24 | "Kraken": { 25 | "maker": 0.16, 26 | "taker": 0.26 27 | }, 28 | "Poloniex": { 29 | "maker": 0.075, 30 | "taker": 0.075 31 | } 32 | }, 33 | "candleSize": 1, 34 | "pair": "BTC_ETC", 35 | "tradeStrategy": "", 36 | "enableLog": true 37 | } 38 | } 39 | } 40 | ] 41 | } 42 | -------------------------------------------------------------------------------- /config/backfind/Okex-Evo-BTC-DEMA.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["OKEX"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": [60], 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "DEMA": { 10 | "CrossMAType": ["DEMA", "EMA", "SMA"], 11 | "autoSensitivity": true, 12 | "short": [1, 100], 13 | "long": [2, 500], 14 | "pair": "USD_LTC", 15 | "candleSize": [15, 60, 600], 16 | "thresholds": { 17 | "down": -0.55, 18 | "up": 0.4 19 | }, 20 | "enableLog": true 21 | }, 22 | "StopLossTurn": { 23 | "order": "closeLong", 24 | "setback": [1.0, 2.5, 3.99], 25 | "time": [60, 3600], 26 | "candleSize": [5, 30], 27 | "pair": "USD_LTC", 28 | "enableLog": false 29 | }, 30 | "TakeProfit": { 31 | "order": "closeLong", 32 | "profit": [1.5, 3.0, 4.0, 15.5], 33 | "time": [60, 7200], 34 | "candleSize": [5, 30], 35 | "pair": "USD_LTC", 36 | "enableLog": false 37 | } 38 | } 39 | } 40 | ] 41 | } -------------------------------------------------------------------------------- /config/backfind/Okex-LTC-WaveSurfer.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": ["OKEX"], 5 | "marginTrading": true, 6 | "tradeTotalBtc": [200], 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "WaveSurfer": { 10 | "minSurfCandles": 2, 11 | "pair": "USD_BTC", 12 | "candleSize": 360, 13 | "enableLog": true 14 | }, 15 | "StopLossTurn": { 16 | "order": "closeLong", 17 | "setback": 1.9, 18 | "time": 1800, 19 | "candleSize": 30, 20 | "pair": "USD_BTC", 21 | "enableLog": false 22 | }, 23 | "TakeProfit": { 24 | "order": "closeLong", 25 | "profit": 3.0, 26 | "time": 3600, 27 | "candleSize": 60, 28 | "pair": "USD_BTC", 29 | "enableLog": false 30 | } 31 | } 32 | } 33 | ] 34 | } -------------------------------------------------------------------------------- /config/backfind/Polo-DASH-Bollinger.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.1, 7 | "tradeDirection": "both", 8 | "warmUpMin": 0, 9 | "strategies": { 10 | "BollingerBreakouts": { 11 | "breakout": [2, 3], 12 | "MAType": 1, 13 | "pair": "BTC_DASH", 14 | "candleSize": [15, 30, 45], 15 | "enableLog": true 16 | }, 17 | "StopLossTurn": { 18 | "order": "closeShort", 19 | "setback": 1.79, 20 | "time": 120, 21 | "candleSize": 1, 22 | "pair": "BTC_DASH", 23 | "enableLog": false 24 | }, 25 | "TakeProfit": { 26 | "order": "closeShort", 27 | "profit": 1.95, 28 | "time": 720, 29 | "candleSize": 1, 30 | "pair": "BTC_DASH", 31 | "enableLog": false 32 | } 33 | } 34 | } 35 | ] 36 | } -------------------------------------------------------------------------------- /config/backfind/Polo-DASH.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.1, 7 | "tradeDirection": ["up"], 8 | "warmUpMin": 0, 9 | "strategies": { 10 | "VolumeSpikeDetector": { 11 | "spikeFactor": [1.2, 1.4, 1.6, 2.0], 12 | "minVolBtc": 80, 13 | "candleSize": 5, 14 | "pair": "BTC_DASH", 15 | "enableLog": false 16 | }, 17 | "PriceSpikeDetector": { 18 | "spikePercent": [2.0, 2.5, 2.9], 19 | "candleSize": 5, 20 | "pair": "BTC_DASH", 21 | "enableLog": false 22 | }, 23 | "StopLossTurn": { 24 | "order": "closeLong", 25 | "setback": [0.5, 0.7, 0.99], 26 | "time": 90, 27 | "candleSize": 1, 28 | "pair": "BTC_DASH", 29 | "enableLog": false 30 | }, 31 | "TakeProfit": { 32 | "order": "closeLong", 33 | "profit": [1.15, 1.7, 2.1, 2.5, 3.5], 34 | "time": 300, 35 | "candleSize": 1, 36 | "pair": "BTC_DASH", 37 | "enableLog": false 38 | } 39 | } 40 | } 41 | ] 42 | } -------------------------------------------------------------------------------- /config/backfind/Polo-ETH-Bollinger.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.1, 7 | "tradeDirection": "both", 8 | "warmUpMin": 0, 9 | "strategies": { 10 | "BollingerBreakouts": { 11 | "breakout": [2, 3], 12 | "MAType": 1, 13 | "pair": "BTC_ETH", 14 | "candleSize": [15, 30, 45], 15 | "enableLog": true 16 | }, 17 | "StopLossTurn": { 18 | "order": "closeShort", 19 | "setback": [1.79, 2.5], 20 | "time": 120, 21 | "candleSize": 1, 22 | "pair": "BTC_ETH", 23 | "enableLog": false 24 | }, 25 | "TakeProfit": { 26 | "order": "closeShort", 27 | "profit": 1.95, 28 | "time": 720, 29 | "candleSize": 1, 30 | "pair": "BTC_ETH", 31 | "enableLog": false 32 | } 33 | } 34 | } 35 | ] 36 | } -------------------------------------------------------------------------------- /config/backfind/Polo-ETH-DayTrader.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.0, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "DayTrader": { 10 | "interval": 30, 11 | "minVolatility": 0.04, 12 | "short": 2, 13 | "long": 7, 14 | "CrossMAType": "EMA", 15 | "pair": "BTC_ETH", 16 | "candleSize": 240, 17 | "enableLog": true 18 | }, 19 | "StopLossTurn": { 20 | "order": "closeLong", 21 | "setback": 3.99, 22 | "time": 14400, 23 | "candleSize": 5, 24 | "pair": "BTC_ETH", 25 | "enableLog": false 26 | }, 27 | "TakeProfit": { 28 | "order": "closeLong", 29 | "profit": [1.0, 2.5, 5.0, 15.0, 100], 30 | "time": 14400, 31 | "candleSize": 60, 32 | "pair": "BTC_ETH", 33 | "enableLog": false 34 | } 35 | } 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /config/backfind/Polo-ETH-PatternRepeater.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.0, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "PatternRepeater": { 10 | "patternSize": [6, 20, 30], 11 | "patternRepeat": [2, 4], 12 | "maxOffset": [1, 2], 13 | "pair": "BTC_XRP", 14 | "candleSize": [30, 60, 120], 15 | "enableLog": true 16 | }, 17 | "StopLossTurn": { 18 | "order": "closeLong", 19 | "setback": 3.99, 20 | "time": 14400, 21 | "candleSize": 5, 22 | "pair": "BTC_XRP", 23 | "enableLog": false 24 | } 25 | } 26 | } 27 | ] 28 | } -------------------------------------------------------------------------------- /config/backfind/Polo-ETH-Trend.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.0, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "Trendatron": { 10 | "interval": [9, 14, 18, 24], 11 | "pair": "BTC_ETH", 12 | "candleSize": [15, 30, 60, 120], 13 | "enableLog": true 14 | }, 15 | "StopLossTurn": { 16 | "order": "closeLong", 17 | "setback": [9.99, 14], 18 | "time": [7200, 14400], 19 | "candleSize": 5, 20 | "pair": "BTC_ETH", 21 | "enableLog": false 22 | } 23 | } 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /config/backfind/Polo-ETH-WaveSurfer.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.7, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "WaveSurfer": { 10 | "minSurfCandles": [2, 3], 11 | "pair": "BTC_LTC", 12 | "candleSize": [240], 13 | "enableLog": false 14 | }, 15 | "StopLossTurn": { 16 | "order": "closeLong", 17 | "setback": 3.99, 18 | "time": [3600, 14400], 19 | "candleSize": 60, 20 | "pair": "BTC_LTC", 21 | "enableLog": false 22 | }, 23 | "TakeProfit": { 24 | "order": "closeLong", 25 | "profit": [2.5, 4.0, 7.0 ,15.0], 26 | "time": 3600, 27 | "candleSize": 60, 28 | "pair": "BTC_LTC", 29 | "enableLog": false 30 | } 31 | } 32 | } 33 | ] 34 | } -------------------------------------------------------------------------------- /config/backfind/Polo-Evo-ETH-DEMA.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.7, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "DEMA": { 10 | "CrossMAType": ["DEMA", "EMA", "SMA"], 11 | "short": [1, 100], 12 | "long": [2, 500], 13 | "pair": "BTC_ETH", 14 | "candleSize": [15, 60, 600], 15 | "enableLog": false 16 | }, 17 | "StopLossTurn": { 18 | "order": "closeLong", 19 | "setback": [1.5, 3.99, 5.0], 20 | "time": [3600, 14400], 21 | "candleSize": [10, 60], 22 | "pair": "BTC_ETH", 23 | "enableLog": false 24 | }, 25 | "TakeProfit": { 26 | "order": "closeLong", 27 | "profit": [1.5, 4.0, 7.0, 15.0], 28 | "time": [3600, 14400], 29 | "candleSize": [10, 60], 30 | "pair": "BTC_ETH", 31 | "enableLog": false 32 | } 33 | } 34 | } 35 | ] 36 | } -------------------------------------------------------------------------------- /config/backfind/Polo-Evo-ETH-WaveSurfer.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.7, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "WaveSurfer": { 10 | "minSurfCandles": [1, 2, 3, 30], 11 | "pair": "BTC_DASH", 12 | "candleSize": [15, 240, 600], 13 | "enableLog": false 14 | }, 15 | "StopLossTurn": { 16 | "order": "closeLong", 17 | "setback": [1.5, 3.99, 5.0], 18 | "time": [3600, 14400], 19 | "candleSize": [10, 60], 20 | "pair": "BTC_DASH", 21 | "enableLog": false 22 | }, 23 | "TakeProfit": { 24 | "order": "closeLong", 25 | "profit": [1.5, 4.0, 7.0, 15.0], 26 | "time": [3600, 14400], 27 | "candleSize": [10, 60], 28 | "pair": "BTC_DASH", 29 | "enableLog": false 30 | } 31 | } 32 | } 33 | ] 34 | } -------------------------------------------------------------------------------- /config/backfind/Polo-Evo-XXX-Test.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.7, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "DEMA": { 10 | "CrossMAType": ["DEMA", "EMA", "SMA"], 11 | "short": [1, 100], 12 | "long": [2, 500], 13 | "pair": "BTC_ETH", 14 | "candleSize": [15, 60, 600], 15 | "enableLog": false 16 | }, 17 | "StopLossTurn": { 18 | "order": "closeLong", 19 | "setback": [1.5, 3.99, 5.0], 20 | "time": [3600, 14400], 21 | "candleSize": [10, 60], 22 | "pair": "BTC_ETH", 23 | "enableLog": false 24 | }, 25 | "TakeProfit": { 26 | "order": "closeLong", 27 | "profit": [1.5, 4.0, 7.0, 15.0], 28 | "time": [3600, 14400], 29 | "candleSize": [10, 60], 30 | "pair": "BTC_ETH", 31 | "enableLog": false 32 | } 33 | } 34 | } 35 | ] 36 | } -------------------------------------------------------------------------------- /config/backfind/Polo-LTC-Trend-Down.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.0, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "Trendatron": { 10 | "interval": [3, 4, 9, 14, 18], 11 | "pair": "BTC_LTC", 12 | "candleSize": [60, 120], 13 | "enableLog": true 14 | }, 15 | "StopLossTurn": { 16 | "order": "closeLong", 17 | "setback": [9.99, 14], 18 | "time": [7200, 14400], 19 | "candleSize": [1, 5, 30], 20 | "pair": "BTC_LTC", 21 | "enableLog": false 22 | } 23 | } 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /config/backfind/Polo-XRP-Trend.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "marginTrading": true, 6 | "tradeTotalBtc": 0.0, 7 | "warmUpMin": 0, 8 | "strategies": { 9 | "Trendatron": { 10 | "interval": [3, 4, 9, 14, 18], 11 | "pair": "BTC_XRP", 12 | "candleSize": [30, 60, 120], 13 | "enableLog": true 14 | }, 15 | "StopLossTurn": { 16 | "order": "closeLong", 17 | "setback": [9.99, 14], 18 | "time": [7200, 14400], 19 | "candleSize": [1, 5, 30], 20 | "pair": "BTC_XRP", 21 | "enableLog": false 22 | } 23 | } 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /config/machine-learning/PricePrediction-ETH-day.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "pricePoints": 11, 6 | "candleSize": 1440, 7 | "markets": ["BTC_ETH", "USDT_BTC", "USDT_ETH"], 8 | "indicators": [] 9 | } 10 | ] 11 | } -------------------------------------------------------------------------------- /config/machine-learning/PricePrediction-ETH-single.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "pricePoints": 11, 6 | "candleSize": 360, 7 | "markets": ["BTC_ETH", "USDT_ETH"], 8 | "indicators": [] 9 | } 10 | ] 11 | } -------------------------------------------------------------------------------- /config/machine-learning/PricePrediction.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "exchanges": "default", 5 | "pricePoints": 11, 6 | "candleSize": 240, 7 | "markets": ["BTC_ETH", "BTC_LTC", "BTC_DASH", "BTC_XMR", "USDT_BTC", "USDT_ETH", "USDT_LTC", "USDT_DASH", "USDT_XMR"] 8 | } 9 | ] 10 | } -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | services: 3 | wolfbot: 4 | build: . 5 | image: wolfbot-docker/latest 6 | restart: always 7 | ports: 8 | - "8331:8331" 9 | - "8332:8332" 10 | depends_on: 11 | - mongodb 12 | mongodb: 13 | image: mongo:latest 14 | environment: 15 | - MONGO_DATA_DIR=/data/db 16 | - MONGO_LOG_DIR=/dev/null 17 | volumes: 18 | - ./mongodb/data/db:/data/db 19 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | const gulp = require('gulp'); 2 | const typedoc = require("gulp-typedoc"); 3 | 4 | /* 5 | gulp.task('default', function() { 6 | // place code for your default task here 7 | }); 8 | */ 9 | gulp.task('default', ['typedoc']); // or just run "gulp typedoc" 10 | 11 | // http://typedoc.org/api/ 12 | gulp.task("typedoc", function() { 13 | return gulp 14 | .src(["src/**/*.ts"]) 15 | .pipe(typedoc({ 16 | module: "commonjs", 17 | target: "es6", 18 | //includeDeclarations: true, 19 | out: "docs/", 20 | name: "WolfBot", 21 | ignoreCompilerErrors: true, 22 | version: true, 23 | excludePrivate: true, 24 | excludeProtected: false 25 | })); 26 | }); -------------------------------------------------------------------------------- /internal.d.ts: -------------------------------------------------------------------------------- 1 | // object extensions from apputils 2 | //import {IncomingMessage} from "http"; // if we import anything in a .d.ts file it won't be recognized globally anymore 3 | 4 | interface String { 5 | replaceAll: (search: string, replace: string) => string; 6 | } 7 | 8 | interface Map { 9 | toObject: () => any; 10 | toArray: () => any[]; 11 | toToupleArray: () => [string, V][]; // MapToupleArray 12 | } 13 | 14 | interface Set { 15 | toObject: () => any; 16 | toArray: () => any[]; 17 | } 18 | 19 | interface Array { 20 | mathMax: () => number; 21 | mathMin: () => number; 22 | 23 | arrayDiff: (arr: any[]) => any[]; 24 | shuffle: () => void; 25 | } 26 | 27 | interface WebSocket { 28 | id: string; 29 | } 30 | 31 | declare module "http" { 32 | interface IncomingMessage { // part of multihttpdispatcher module 33 | query: { 34 | [key: string] : string; 35 | } 36 | params: { 37 | [key: string] : string; 38 | } 39 | formFields: { 40 | [key: string] : string; 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /public/css/_bootstrap-compass.scss: -------------------------------------------------------------------------------- 1 | @function twbs-font-path($path) { 2 | @return font-url($path, true); 3 | } 4 | 5 | @function twbs-image-path($path) { 6 | @return image-url($path, true); 7 | } 8 | 9 | $bootstrap-sass-asset-helper: true; 10 | -------------------------------------------------------------------------------- /public/css/_bootstrap-mincer.scss: -------------------------------------------------------------------------------- 1 | // Mincer asset helper functions 2 | // 3 | // This must be imported into a .css.ejs.scss file. 4 | // Then, <% %>-interpolations will be parsed as strings by Sass, and evaluated by EJS after Sass compilation. 5 | 6 | 7 | @function twbs-font-path($path) { 8 | // do something like following 9 | // from "path/to/font.ext#suffix" to "<%- asset_path(path/to/font.ext)) + #suffix %>" 10 | // from "path/to/font.ext?#suffix" to "<%- asset_path(path/to/font.ext)) + ?#suffix %>" 11 | // or from "path/to/font.ext" just "<%- asset_path(path/to/font.ext)) %>" 12 | @return "<%- asset_path("#{$path}".replace(/[#?].*$/, '')) + "#{$path}".replace(/(^[^#?]*)([#?]?.*$)/, '$2') %>"; 13 | } 14 | 15 | @function twbs-image-path($file) { 16 | @return "<%- asset_path("#{$file}") %>"; 17 | } 18 | 19 | $bootstrap-sass-asset-helper: true; 20 | -------------------------------------------------------------------------------- /public/css/_bootstrap-sprockets.scss: -------------------------------------------------------------------------------- 1 | @function twbs-font-path($path) { 2 | @return font-path($path); 3 | } 4 | 5 | @function twbs-image-path($path) { 6 | @return image-path($path); 7 | } 8 | 9 | $bootstrap-sass-asset-helper: true; 10 | -------------------------------------------------------------------------------- /public/css/_macros.scss: -------------------------------------------------------------------------------- 1 | /* Text Helpers */ 2 | .strong { 3 | font-weight: bold!important; 4 | } 5 | .sTxt { 6 | font-weight: bold !important; 7 | color: darken(#428bca, 6.5%); //$brand-primary; 8 | } 9 | .wrapWord { 10 | word-wrap: break-word; 11 | } 12 | .scrollContainer { 13 | overflow-y: auto 14 | } 15 | 16 | /* Layout Helpers */ 17 | .block { 18 | display: block; 19 | } 20 | .samePage { 21 | page-break-inside: avoid; 22 | } 23 | 24 | /* Margin Helpers */ 25 | .top5 {margin-top: 5px;} 26 | .top10 {margin-top: 10px;} 27 | .top15 {margin-top: 15px;} 28 | .top20 {margin-top: 20px;} 29 | .top25 {margin-top: 25px;} 30 | .top30 {margin-top: 30px;} 31 | .top50 {margin-top: 50px;} 32 | .top75 {margin-top: 75px;} 33 | .top100 {margin-top: 100px;} 34 | 35 | .bottom5 {margin-bottom: 5px;} 36 | .bottom10 {margin-bottom: 10px;} 37 | .bottom15 {margin-bottom: 15px;} 38 | .bottom20 {margin-bottom: 20px;} 39 | .bottom25 {margin-bottom: 25px;} 40 | .bottom30 {margin-bottom: 30px;} 41 | .bottom50 {margin-bottom: 50px;} 42 | .bottom75 {margin-bottom: 75px;} 43 | .bottom100 {margin-bottom: 100px;} 44 | 45 | .left5 {margin-left: 5px;} 46 | .left10 {margin-left: 10px;} 47 | 48 | .right5 {margin-right: 5px;} 49 | .right10 {margin-right: 10px;} 50 | -------------------------------------------------------------------------------- /public/css/_responsive.scss: -------------------------------------------------------------------------------- 1 | @media (max-width: 480px) { /*phones*/ 2 | } 3 | 4 | @media(max-width:767px) /*xs only*/ { 5 | } 6 | 7 | @media(min-width:768px) /*>= sm*/ { 8 | } 9 | 10 | @media(min-width:768px) and (max-width:991px) /*sm only*/ { 11 | } 12 | 13 | @media(min-width:992px) /*>= md*/ { 14 | .wideTableRow { 15 | display: table-cell; 16 | } 17 | .textContent { 18 | width: 55%; 19 | margin-left: 200px; 20 | } 21 | .rightMdMargin { 22 | margin-right: 500px; 23 | } 24 | .rightMdMarginSmall { 25 | margin-right: 220px; 26 | } 27 | } 28 | 29 | @media(min-width:992px) and (max-width:1199px) /*md only*/ { 30 | // ... 31 | } 32 | 33 | @media(min-width:1200px) /*>= lg*/ { 34 | .xWideTableRow { 35 | display: table-cell; 36 | } 37 | } -------------------------------------------------------------------------------- /public/css/_sprites.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/css/_sprites.scss -------------------------------------------------------------------------------- /public/css/bootstrap/_breadcrumbs.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Breadcrumbs 3 | // -------------------------------------------------- 4 | 5 | 6 | .breadcrumb { 7 | padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal; 8 | margin-bottom: $line-height-computed; 9 | list-style: none; 10 | background-color: $breadcrumb-bg; 11 | border-radius: $border-radius-base; 12 | 13 | > li { 14 | display: inline-block; 15 | 16 | + li:before { 17 | // [converter] Workaround for https://github.com/sass/libsass/issues/1115 18 | $nbsp: "\00a0"; 19 | content: "#{$breadcrumb-separator}#{$nbsp}"; // Unicode space added since inline-block means non-collapsing white-space 20 | padding: 0 5px; 21 | color: $breadcrumb-color; 22 | } 23 | } 24 | 25 | > .active { 26 | color: $breadcrumb-active-color; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /public/css/bootstrap/_close.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Close icons 3 | // -------------------------------------------------- 4 | 5 | 6 | .close { 7 | float: right; 8 | font-size: ($font-size-base * 1.5); 9 | font-weight: $close-font-weight; 10 | line-height: 1; 11 | color: $close-color; 12 | text-shadow: $close-text-shadow; 13 | @include opacity(.2); 14 | 15 | &:hover, 16 | &:focus { 17 | color: $close-color; 18 | text-decoration: none; 19 | cursor: pointer; 20 | @include opacity(.5); 21 | } 22 | 23 | // [converter] extracted button& to button.close 24 | } 25 | 26 | // Additional properties for button version 27 | // iOS requires the button element instead of an anchor tag. 28 | // If you want the anchor version, it requires `href="#"`. 29 | // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile 30 | button.close { 31 | padding: 0; 32 | cursor: pointer; 33 | background: transparent; 34 | border: 0; 35 | -webkit-appearance: none; 36 | } 37 | -------------------------------------------------------------------------------- /public/css/bootstrap/_component-animations.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component animations 3 | // -------------------------------------------------- 4 | 5 | // Heads up! 6 | // 7 | // We don't use the `.opacity()` mixin here since it causes a bug with text 8 | // fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552. 9 | 10 | .fade { 11 | opacity: 0; 12 | @include transition(opacity .15s linear); 13 | &.in { 14 | opacity: 1; 15 | } 16 | } 17 | 18 | .collapse { 19 | display: none; 20 | 21 | &.in { display: block; } 22 | // [converter] extracted tr&.in to tr.collapse.in 23 | // [converter] extracted tbody&.in to tbody.collapse.in 24 | } 25 | 26 | tr.collapse.in { display: table-row; } 27 | 28 | tbody.collapse.in { display: table-row-group; } 29 | 30 | .collapsing { 31 | position: relative; 32 | height: 0; 33 | overflow: hidden; 34 | @include transition-property(height, visibility); 35 | @include transition-duration(.35s); 36 | @include transition-timing-function(ease); 37 | } 38 | -------------------------------------------------------------------------------- /public/css/bootstrap/_media.scss: -------------------------------------------------------------------------------- 1 | .media { 2 | // Proper spacing between instances of .media 3 | margin-top: 15px; 4 | 5 | &:first-child { 6 | margin-top: 0; 7 | } 8 | } 9 | 10 | .media, 11 | .media-body { 12 | zoom: 1; 13 | overflow: hidden; 14 | } 15 | 16 | .media-body { 17 | width: 10000px; 18 | } 19 | 20 | .media-object { 21 | display: block; 22 | 23 | // Fix collapse in webkit from max-width: 100% and display: table-cell. 24 | &.img-thumbnail { 25 | max-width: none; 26 | } 27 | } 28 | 29 | .media-right, 30 | .media > .pull-right { 31 | padding-left: 10px; 32 | } 33 | 34 | .media-left, 35 | .media > .pull-left { 36 | padding-right: 10px; 37 | } 38 | 39 | .media-left, 40 | .media-right, 41 | .media-body { 42 | display: table-cell; 43 | vertical-align: top; 44 | } 45 | 46 | .media-middle { 47 | vertical-align: middle; 48 | } 49 | 50 | .media-bottom { 51 | vertical-align: bottom; 52 | } 53 | 54 | // Reset margins on headings for tighter default spacing 55 | .media-heading { 56 | margin-top: 0; 57 | margin-bottom: 5px; 58 | } 59 | 60 | // Media list variation 61 | // 62 | // Undo default ul/ol styles 63 | .media-list { 64 | padding-left: 0; 65 | list-style: none; 66 | } 67 | -------------------------------------------------------------------------------- /public/css/bootstrap/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------------------------------- 3 | 4 | // Utilities 5 | @import "mixins/hide-text"; 6 | @import "mixins/opacity"; 7 | @import "mixins/image"; 8 | @import "mixins/labels"; 9 | @import "mixins/reset-filter"; 10 | @import "mixins/resize"; 11 | @import "mixins/responsive-visibility"; 12 | @import "mixins/size"; 13 | @import "mixins/tab-focus"; 14 | @import "mixins/reset-text"; 15 | @import "mixins/text-emphasis"; 16 | @import "mixins/text-overflow"; 17 | @import "mixins/vendor-prefixes"; 18 | 19 | // Components 20 | @import "mixins/alerts"; 21 | @import "mixins/buttons"; 22 | @import "mixins/panels"; 23 | @import "mixins/pagination"; 24 | @import "mixins/list-group"; 25 | @import "mixins/nav-divider"; 26 | @import "mixins/forms"; 27 | @import "mixins/progress-bar"; 28 | @import "mixins/table-row"; 29 | 30 | // Skins 31 | @import "mixins/background-variant"; 32 | @import "mixins/border-radius"; 33 | @import "mixins/gradients"; 34 | 35 | // Layout 36 | @import "mixins/clearfix"; 37 | @import "mixins/center-block"; 38 | @import "mixins/nav-vertical-align"; 39 | @import "mixins/grid-framework"; 40 | @import "mixins/grid"; 41 | -------------------------------------------------------------------------------- /public/css/bootstrap/_pager.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Pager pagination 3 | // -------------------------------------------------- 4 | 5 | 6 | .pager { 7 | padding-left: 0; 8 | margin: $line-height-computed 0; 9 | list-style: none; 10 | text-align: center; 11 | @include clearfix; 12 | li { 13 | display: inline; 14 | > a, 15 | > span { 16 | display: inline-block; 17 | padding: 5px 14px; 18 | background-color: $pager-bg; 19 | border: 1px solid $pager-border; 20 | border-radius: $pager-border-radius; 21 | } 22 | 23 | > a:hover, 24 | > a:focus { 25 | text-decoration: none; 26 | background-color: $pager-hover-bg; 27 | } 28 | } 29 | 30 | .next { 31 | > a, 32 | > span { 33 | float: right; 34 | } 35 | } 36 | 37 | .previous { 38 | > a, 39 | > span { 40 | float: left; 41 | } 42 | } 43 | 44 | .disabled { 45 | > a, 46 | > a:hover, 47 | > a:focus, 48 | > span { 49 | color: $pager-disabled-color; 50 | background-color: $pager-bg; 51 | cursor: $cursor-disabled; 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /public/css/bootstrap/_responsive-embed.scss: -------------------------------------------------------------------------------- 1 | // Embeds responsive 2 | // 3 | // Credit: Nicolas Gallagher and SUIT CSS. 4 | 5 | .embed-responsive { 6 | position: relative; 7 | display: block; 8 | height: 0; 9 | padding: 0; 10 | overflow: hidden; 11 | 12 | .embed-responsive-item, 13 | iframe, 14 | embed, 15 | object, 16 | video { 17 | position: absolute; 18 | top: 0; 19 | left: 0; 20 | bottom: 0; 21 | height: 100%; 22 | width: 100%; 23 | border: 0; 24 | } 25 | } 26 | 27 | // Modifier class for 16:9 aspect ratio 28 | .embed-responsive-16by9 { 29 | padding-bottom: 56.25%; 30 | } 31 | 32 | // Modifier class for 4:3 aspect ratio 33 | .embed-responsive-4by3 { 34 | padding-bottom: 75%; 35 | } 36 | -------------------------------------------------------------------------------- /public/css/bootstrap/_thumbnails.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Thumbnails 3 | // -------------------------------------------------- 4 | 5 | 6 | // Mixin and adjust the regular image class 7 | .thumbnail { 8 | display: block; 9 | padding: $thumbnail-padding; 10 | margin-bottom: $line-height-computed; 11 | line-height: $line-height-base; 12 | background-color: $thumbnail-bg; 13 | border: 1px solid $thumbnail-border; 14 | border-radius: $thumbnail-border-radius; 15 | @include transition(border .2s ease-in-out); 16 | 17 | > img, 18 | a > img { 19 | @include img-responsive; 20 | margin-left: auto; 21 | margin-right: auto; 22 | } 23 | 24 | // [converter] extracted a&:hover, a&:focus, a&.active to a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active 25 | 26 | // Image captions 27 | .caption { 28 | padding: $thumbnail-caption-padding; 29 | color: $thumbnail-caption-color; 30 | } 31 | } 32 | 33 | // Add a hover state for linked versions only 34 | a.thumbnail:hover, 35 | a.thumbnail:focus, 36 | a.thumbnail.active { 37 | border-color: $link-color; 38 | } 39 | -------------------------------------------------------------------------------- /public/css/bootstrap/_utilities.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Utility classes 3 | // -------------------------------------------------- 4 | 5 | 6 | // Floats 7 | // ------------------------- 8 | 9 | .clearfix { 10 | @include clearfix; 11 | } 12 | .center-block { 13 | @include center-block; 14 | } 15 | .pull-right { 16 | float: right !important; 17 | } 18 | .pull-left { 19 | float: left !important; 20 | } 21 | 22 | 23 | // Toggling content 24 | // ------------------------- 25 | 26 | // Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1 27 | .hide { 28 | display: none !important; 29 | } 30 | .show { 31 | display: block !important; 32 | } 33 | .invisible { 34 | visibility: hidden; 35 | } 36 | .text-hide { 37 | @include text-hide; 38 | } 39 | 40 | 41 | // Hide from screenreaders and browsers 42 | // 43 | // Credit: HTML5 Boilerplate 44 | 45 | .hidden { 46 | display: none !important; 47 | } 48 | 49 | 50 | // For Affix plugin 51 | // ------------------------- 52 | 53 | .affix { 54 | position: fixed; 55 | } 56 | -------------------------------------------------------------------------------- /public/css/bootstrap/_wells.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Wells 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .well { 8 | min-height: 20px; 9 | padding: 19px; 10 | margin-bottom: 20px; 11 | background-color: $well-bg; 12 | border: 1px solid $well-border; 13 | border-radius: $border-radius-base; 14 | @include box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); 15 | blockquote { 16 | border-color: #ddd; 17 | border-color: rgba(0,0,0,.15); 18 | } 19 | } 20 | 21 | // Sizes 22 | .well-lg { 23 | padding: 24px; 24 | border-radius: $border-radius-large; 25 | } 26 | .well-sm { 27 | padding: 9px; 28 | border-radius: $border-radius-small; 29 | } 30 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_alerts.scss: -------------------------------------------------------------------------------- 1 | // Alerts 2 | 3 | @mixin alert-variant($background, $border, $text-color) { 4 | background-color: $background; 5 | border-color: $border; 6 | color: $text-color; 7 | 8 | hr { 9 | border-top-color: darken($border, 5%); 10 | } 11 | .alert-link { 12 | color: darken($text-color, 10%); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_background-variant.scss: -------------------------------------------------------------------------------- 1 | // Contextual backgrounds 2 | 3 | // [converter] $parent hack 4 | @mixin bg-variant($parent, $color) { 5 | #{$parent} { 6 | background-color: $color; 7 | } 8 | a#{$parent}:hover, 9 | a#{$parent}:focus { 10 | background-color: darken($color, 10%); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_border-radius.scss: -------------------------------------------------------------------------------- 1 | // Single side border-radius 2 | 3 | @mixin border-top-radius($radius) { 4 | border-top-right-radius: $radius; 5 | border-top-left-radius: $radius; 6 | } 7 | @mixin border-right-radius($radius) { 8 | border-bottom-right-radius: $radius; 9 | border-top-right-radius: $radius; 10 | } 11 | @mixin border-bottom-radius($radius) { 12 | border-bottom-right-radius: $radius; 13 | border-bottom-left-radius: $radius; 14 | } 15 | @mixin border-left-radius($radius) { 16 | border-bottom-left-radius: $radius; 17 | border-top-left-radius: $radius; 18 | } 19 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_center-block.scss: -------------------------------------------------------------------------------- 1 | // Center-align a block level element 2 | 3 | @mixin center-block() { 4 | display: block; 5 | margin-left: auto; 6 | margin-right: auto; 7 | } 8 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_clearfix.scss: -------------------------------------------------------------------------------- 1 | // Clearfix 2 | // 3 | // For modern browsers 4 | // 1. The space content is one way to avoid an Opera bug when the 5 | // contenteditable attribute is included anywhere else in the document. 6 | // Otherwise it causes space to appear at the top and bottom of elements 7 | // that are clearfixed. 8 | // 2. The use of `table` rather than `block` is only necessary if using 9 | // `:before` to contain the top-margins of child elements. 10 | // 11 | // Source: http://nicolasgallagher.com/micro-clearfix-hack/ 12 | 13 | @mixin clearfix() { 14 | &:before, 15 | &:after { 16 | content: " "; // 1 17 | display: table; // 2 18 | } 19 | &:after { 20 | clear: both; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_hide-text.scss: -------------------------------------------------------------------------------- 1 | // CSS image replacement 2 | // 3 | // Heads up! v3 launched with only `.hide-text()`, but per our pattern for 4 | // mixins being reused as classes with the same name, this doesn't hold up. As 5 | // of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. 6 | // 7 | // Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757 8 | 9 | // Deprecated as of v3.0.1 (has been removed in v4) 10 | @mixin hide-text() { 11 | font: 0/0 a; 12 | color: transparent; 13 | text-shadow: none; 14 | background-color: transparent; 15 | border: 0; 16 | } 17 | 18 | // New mixin to use as of v3.0.1 19 | @mixin text-hide() { 20 | @include hide-text; 21 | } 22 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_labels.scss: -------------------------------------------------------------------------------- 1 | // Labels 2 | 3 | @mixin label-variant($color) { 4 | background-color: $color; 5 | 6 | &[href] { 7 | &:hover, 8 | &:focus { 9 | background-color: darken($color, 10%); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_list-group.scss: -------------------------------------------------------------------------------- 1 | // List Groups 2 | 3 | @mixin list-group-item-variant($state, $background, $color) { 4 | .list-group-item-#{$state} { 5 | color: $color; 6 | background-color: $background; 7 | 8 | // [converter] extracted a&, button& to a.list-group-item-#{$state}, button.list-group-item-#{$state} 9 | } 10 | 11 | a.list-group-item-#{$state}, 12 | button.list-group-item-#{$state} { 13 | color: $color; 14 | 15 | .list-group-item-heading { 16 | color: inherit; 17 | } 18 | 19 | &:hover, 20 | &:focus { 21 | color: $color; 22 | background-color: darken($background, 5%); 23 | } 24 | &.active, 25 | &.active:hover, 26 | &.active:focus { 27 | color: #fff; 28 | background-color: $color; 29 | border-color: $color; 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_nav-divider.scss: -------------------------------------------------------------------------------- 1 | // Horizontal dividers 2 | // 3 | // Dividers (basically an hr) within dropdowns and nav lists 4 | 5 | @mixin nav-divider($color: #e5e5e5) { 6 | height: 1px; 7 | margin: (($line-height-computed / 2) - 1) 0; 8 | overflow: hidden; 9 | background-color: $color; 10 | } 11 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_nav-vertical-align.scss: -------------------------------------------------------------------------------- 1 | // Navbar vertical align 2 | // 3 | // Vertically center elements in the navbar. 4 | // Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin. 5 | 6 | @mixin navbar-vertical-align($element-height) { 7 | margin-top: (($navbar-height - $element-height) / 2); 8 | margin-bottom: (($navbar-height - $element-height) / 2); 9 | } 10 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_opacity.scss: -------------------------------------------------------------------------------- 1 | // Opacity 2 | 3 | @mixin opacity($opacity) { 4 | opacity: $opacity; 5 | // IE8 filter 6 | $opacity-ie: ($opacity * 100); 7 | filter: alpha(opacity=$opacity-ie); 8 | } 9 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_pagination.scss: -------------------------------------------------------------------------------- 1 | // Pagination 2 | 3 | @mixin pagination-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) { 4 | > li { 5 | > a, 6 | > span { 7 | padding: $padding-vertical $padding-horizontal; 8 | font-size: $font-size; 9 | line-height: $line-height; 10 | } 11 | &:first-child { 12 | > a, 13 | > span { 14 | @include border-left-radius($border-radius); 15 | } 16 | } 17 | &:last-child { 18 | > a, 19 | > span { 20 | @include border-right-radius($border-radius); 21 | } 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_panels.scss: -------------------------------------------------------------------------------- 1 | // Panels 2 | 3 | @mixin panel-variant($border, $heading-text-color, $heading-bg-color, $heading-border) { 4 | border-color: $border; 5 | 6 | & > .panel-heading { 7 | color: $heading-text-color; 8 | background-color: $heading-bg-color; 9 | border-color: $heading-border; 10 | 11 | + .panel-collapse > .panel-body { 12 | border-top-color: $border; 13 | } 14 | .badge { 15 | color: $heading-bg-color; 16 | background-color: $heading-text-color; 17 | } 18 | } 19 | & > .panel-footer { 20 | + .panel-collapse > .panel-body { 21 | border-bottom-color: $border; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_progress-bar.scss: -------------------------------------------------------------------------------- 1 | // Progress bars 2 | 3 | @mixin progress-bar-variant($color) { 4 | background-color: $color; 5 | 6 | // Deprecated parent class requirement as of v3.2.0 7 | .progress-striped & { 8 | @include gradient-striped; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_reset-filter.scss: -------------------------------------------------------------------------------- 1 | // Reset filters for IE 2 | // 3 | // When you need to remove a gradient background, do not forget to use this to reset 4 | // the IE filter for IE9 and below. 5 | 6 | @mixin reset-filter() { 7 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 8 | } 9 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_reset-text.scss: -------------------------------------------------------------------------------- 1 | @mixin reset-text() { 2 | font-family: $font-family-base; 3 | // We deliberately do NOT reset font-size. 4 | font-style: normal; 5 | font-weight: normal; 6 | letter-spacing: normal; 7 | line-break: auto; 8 | line-height: $line-height-base; 9 | text-align: left; // Fallback for where `start` is not supported 10 | text-align: start; 11 | text-decoration: none; 12 | text-shadow: none; 13 | text-transform: none; 14 | white-space: normal; 15 | word-break: normal; 16 | word-spacing: normal; 17 | word-wrap: normal; 18 | } 19 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_resize.scss: -------------------------------------------------------------------------------- 1 | // Resize anything 2 | 3 | @mixin resizable($direction) { 4 | resize: $direction; // Options: horizontal, vertical, both 5 | overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible` 6 | } 7 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_responsive-visibility.scss: -------------------------------------------------------------------------------- 1 | // Responsive utilities 2 | 3 | // 4 | // More easily include all the states for responsive-utilities.less. 5 | // [converter] $parent hack 6 | @mixin responsive-visibility($parent) { 7 | #{$parent} { 8 | display: block !important; 9 | } 10 | table#{$parent} { display: table !important; } 11 | tr#{$parent} { display: table-row !important; } 12 | th#{$parent}, 13 | td#{$parent} { display: table-cell !important; } 14 | } 15 | 16 | // [converter] $parent hack 17 | @mixin responsive-invisibility($parent) { 18 | #{$parent} { 19 | display: none !important; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_size.scss: -------------------------------------------------------------------------------- 1 | // Sizing shortcuts 2 | 3 | @mixin size($width, $height) { 4 | width: $width; 5 | height: $height; 6 | } 7 | 8 | @mixin square($size) { 9 | @include size($size, $size); 10 | } 11 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_tab-focus.scss: -------------------------------------------------------------------------------- 1 | // WebKit-style focus 2 | 3 | @mixin tab-focus() { 4 | // WebKit-specific. Other browsers will keep their default outline style. 5 | // (Initially tried to also force default via `outline: initial`, 6 | // but that seems to erroneously remove the outline in Firefox altogether.) 7 | outline: 5px auto -webkit-focus-ring-color; 8 | outline-offset: -2px; 9 | } 10 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_table-row.scss: -------------------------------------------------------------------------------- 1 | // Tables 2 | 3 | @mixin table-row-variant($state, $background) { 4 | // Exact selectors below required to override `.table-striped` and prevent 5 | // inheritance to nested tables. 6 | .table > thead > tr, 7 | .table > tbody > tr, 8 | .table > tfoot > tr { 9 | > td.#{$state}, 10 | > th.#{$state}, 11 | &.#{$state} > td, 12 | &.#{$state} > th { 13 | background-color: $background; 14 | } 15 | } 16 | 17 | // Hover states for `.table-hover` 18 | // Note: this is not available for cells or rows within `thead` or `tfoot`. 19 | .table-hover > tbody > tr { 20 | > td.#{$state}:hover, 21 | > th.#{$state}:hover, 22 | &.#{$state}:hover > td, 23 | &:hover > .#{$state}, 24 | &.#{$state}:hover > th { 25 | background-color: darken($background, 5%); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_text-emphasis.scss: -------------------------------------------------------------------------------- 1 | // Typography 2 | 3 | // [converter] $parent hack 4 | @mixin text-emphasis-variant($parent, $color) { 5 | #{$parent} { 6 | color: $color; 7 | } 8 | a#{$parent}:hover, 9 | a#{$parent}:focus { 10 | color: darken($color, 10%); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /public/css/bootstrap/mixins/_text-overflow.scss: -------------------------------------------------------------------------------- 1 | // Text overflow 2 | // Requires inline-block or block for proper styling 3 | 4 | @mixin text-overflow() { 5 | overflow: hidden; 6 | text-overflow: ellipsis; 7 | white-space: nowrap; 8 | } 9 | -------------------------------------------------------------------------------- /public/css/fa/_animated.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .#{$fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /public/css/fa/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .#{$fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /public/css/fa/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /public/css/fa/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /public/css/fa/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /public/css/fa/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /public/css/fa/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /public/css/fa/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /public/css/fa/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { @include sr-only(); } 5 | .sr-only-focusable { @include sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /public/css/fa/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /public/css/fa/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | @import "screen-reader"; 19 | -------------------------------------------------------------------------------- /public/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /public/fonts/bootstrap/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/fonts/bootstrap/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /public/fonts/bootstrap/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/fonts/bootstrap/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /public/fonts/bootstrap/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/fonts/bootstrap/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /public/fonts/bootstrap/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/fonts/bootstrap/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /public/icons/fav/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/icons/fav/favicon.ico -------------------------------------------------------------------------------- /public/icons/fav/icon_114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/icons/fav/icon_114.png -------------------------------------------------------------------------------- /public/icons/fav/icon_57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/icons/fav/icon_57.png -------------------------------------------------------------------------------- /public/icons/fav/icon_72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/icons/fav/icon_72.png -------------------------------------------------------------------------------- /public/images/bg1-bright.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/images/bg1-bright.jpg -------------------------------------------------------------------------------- /public/images/bg1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/images/bg1.jpg -------------------------------------------------------------------------------- /public/images/discord-ico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/images/discord-ico.png -------------------------------------------------------------------------------- /public/images/github-ico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/images/github-ico.png -------------------------------------------------------------------------------- /public/images/sort_asc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/images/sort_asc.png -------------------------------------------------------------------------------- /public/images/sort_asc_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/images/sort_asc_disabled.png -------------------------------------------------------------------------------- /public/images/sort_both.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/images/sort_both.png -------------------------------------------------------------------------------- /public/images/sort_desc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/images/sort_desc.png -------------------------------------------------------------------------------- /public/images/sort_desc_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/images/sort_desc_disabled.png -------------------------------------------------------------------------------- /public/js/classes/BrowserEventEmitter.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * A simple event emitter for web browsers. 3 | * Its API is modeled on the EventEmitter class of NodeJS. 4 | * Also see https://github.com/Olical/EventEmitter and https://github.com/asyncly/EventEmitter2 5 | * we use EventEmitter2 for now 6 | */ 7 | /* 8 | export class BrowserEventEmitter { 9 | constructor() { 10 | } 11 | } 12 | */ -------------------------------------------------------------------------------- /public/js/controllers/base/JsonEditor.ts: -------------------------------------------------------------------------------- 1 | //import {AbstractWidget} from "../classes/AbstractWidget"; 2 | import {ClientSocketReceiver, ClientSocket} from "../../classes/WebSocket/ClientSocket"; 3 | import * as $ from "jquery"; 4 | import * as i18next from "i18next"; 5 | import {AbstractController} from "./AbstractController"; 6 | 7 | export abstract class JsonEditor extends AbstractController { 8 | constructor(socket: ClientSocket) { 9 | super(socket) 10 | } 11 | 12 | // ################################################################ 13 | // ###################### PRIVATE FUNCTIONS ####################### 14 | 15 | } -------------------------------------------------------------------------------- /public/js/hooks.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function() { 2 | // add your custom code here... 3 | console.log( "ready!" ); 4 | }); -------------------------------------------------------------------------------- /public/js/internal.d.ts: -------------------------------------------------------------------------------- 1 | interface JQuery { 2 | datetimepicker: (options: any) => JQuery; 3 | } -------------------------------------------------------------------------------- /public/js/libs/ace/ext-error_marker.js: -------------------------------------------------------------------------------- 1 | ; 2 | (function() { 3 | window.require(["ace/ext/error_marker"], function() {}); 4 | })(); 5 | -------------------------------------------------------------------------------- /public/js/libs/ace/ext-linking.js: -------------------------------------------------------------------------------- 1 | define("ace/ext/linking",["require","exports","module","ace/editor","ace/config"],function(e,t,n){function i(e){var n=e.editor,r=e.getAccelKey();if(r){var n=e.editor,i=e.getDocumentPosition(),s=n.session,o=s.getTokenAt(i.row,i.column);t.previousLinkingHover&&t.previousLinkingHover!=o&&n._emit("linkHoverOut"),n._emit("linkHover",{position:i,token:o}),t.previousLinkingHover=o}else t.previousLinkingHover&&(n._emit("linkHoverOut"),t.previousLinkingHover=!1)}function s(e){var t=e.getAccelKey(),n=e.getButton();if(n==0&&t){var r=e.editor,i=e.getDocumentPosition(),s=r.session,o=s.getTokenAt(i.row,i.column);r._emit("linkClick",{position:i,token:o})}}var r=e("ace/editor").Editor;e("../config").defineOptions(r.prototype,"editor",{enableLinking:{set:function(e){e?(this.on("click",s),this.on("mousemove",i)):(this.off("click",s),this.off("mousemove",i))},value:!1}}),t.previousLinkingHover=!1}); 2 | (function() { 3 | window.require(["ace/ext/linking"], function() {}); 4 | })(); 5 | -------------------------------------------------------------------------------- /public/js/libs/ace/ext-statusbar.js: -------------------------------------------------------------------------------- 1 | define("ace/ext/statusbar",["require","exports","module","ace/lib/dom","ace/lib/lang"],function(e,t,n){"use strict";var r=e("ace/lib/dom"),i=e("ace/lib/lang"),s=function(e,t){this.element=r.createElement("div"),this.element.className="ace_status-indicator",this.element.style.cssText="display: inline-block;",t.appendChild(this.element);var n=i.delayedCall(function(){this.updateStatus(e)}.bind(this)).schedule.bind(null,100);e.on("changeStatus",n),e.on("changeSelection",n),e.on("keyboardActivity",n)};(function(){this.updateStatus=function(e){function n(e,n){e&&t.push(e,n||"|")}var t=[];n(e.keyBinding.getStatusText(e)),e.commands.recording&&n("REC");var r=e.selection,i=r.lead;if(!r.isEmpty()){var s=e.getSelectionRange();n("("+(s.end.row-s.start.row)+":"+(s.end.column-s.start.column)+")"," ")}n(i.row+":"+i.column," "),r.rangeCount&&n("["+r.rangeCount+"]"," "),t.pop(),this.element.textContent=t.join("")}}).call(s.prototype),t.StatusBar=s}); 2 | (function() { 3 | window.require(["ace/ext/statusbar"], function() {}); 4 | })(); 5 | -------------------------------------------------------------------------------- /public/js/libs/ace/mode-gitignore.js: -------------------------------------------------------------------------------- 1 | define("ace/mode/gitignore_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment",regex:/^\s*#.*$/},{token:"keyword",regex:/^\s*!.*$/}]},this.normalizeRules()};s.metaData={fileTypes:["gitignore"],name:"Gitignore"},r.inherits(s,i),t.GitignoreHighlightRules=s}),define("ace/mode/gitignore",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/gitignore_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./gitignore_highlight_rules").GitignoreHighlightRules,o=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(o,i),function(){this.lineCommentStart="#",this.$id="ace/mode/gitignore"}.call(o.prototype),t.Mode=o}) -------------------------------------------------------------------------------- /public/js/libs/ace/mode-lucene.js: -------------------------------------------------------------------------------- 1 | define("ace/mode/lucene_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=function(){this.$rules={start:[{token:"constant.character.negation",regex:"[\\-]"},{token:"constant.character.interro",regex:"[\\?]"},{token:"constant.character.asterisk",regex:"[\\*]"},{token:"constant.character.proximity",regex:"~[0-9]+\\b"},{token:"keyword.operator",regex:"(?:AND|OR|NOT)\\b"},{token:"paren.lparen",regex:"[\\(]"},{token:"paren.rparen",regex:"[\\)]"},{token:"keyword",regex:"[\\S]+:"},{token:"string",regex:'".*?"'},{token:"text",regex:"\\s+"}]}};r.inherits(o,s),t.LuceneHighlightRules=o}),define("ace/mode/lucene",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/lucene_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./lucene_highlight_rules").LuceneHighlightRules,o=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(o,i),function(){this.$id="ace/mode/lucene"}.call(o.prototype),t.Mode=o}) -------------------------------------------------------------------------------- /public/js/libs/ace/mode-plain_text.js: -------------------------------------------------------------------------------- 1 | define("ace/mode/plain_text",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/text_highlight_rules","ace/mode/behaviour"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./text_highlight_rules").TextHighlightRules,o=e("./behaviour").Behaviour,u=function(){this.HighlightRules=s,this.$behaviour=new o};r.inherits(u,i),function(){this.type="text",this.getNextLineIndent=function(e,t,n){return""},this.$id="ace/mode/plain_text"}.call(u.prototype),t.Mode=u}) -------------------------------------------------------------------------------- /public/js/libs/ace/mode-properties.js: -------------------------------------------------------------------------------- 1 | define("ace/mode/properties_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e=/\\u[0-9a-fA-F]{4}|\\/;this.$rules={start:[{token:"comment",regex:/[!#].*$/},{token:"keyword",regex:/[=:]$/},{token:"keyword",regex:/[=:]/,next:"value"},{token:"constant.language.escape",regex:e},{defaultToken:"variable"}],value:[{regex:/\\$/,token:"string",next:"value"},{regex:/$/,token:"string",next:"start"},{token:"constant.language.escape",regex:e},{defaultToken:"string"}]}};r.inherits(s,i),t.PropertiesHighlightRules=s}),define("ace/mode/properties",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/properties_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./properties_highlight_rules").PropertiesHighlightRules,o=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(o,i),function(){this.$id="ace/mode/properties"}.call(o.prototype),t.Mode=o}) -------------------------------------------------------------------------------- /public/js/libs/ace/mode-text.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/js/libs/ace/mode-text.js -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/abap.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/abap",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="abap"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/abc.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/abc",["require","exports","module"],function(e,t,n){"use strict";t.snippetText='\nsnippet zupfnoter.print\n %%%%hn.print {"startpos": ${1:pos_y}, "t":"${2:title}", "v":[${3:voices}], "s":[[${4:syncvoices}1,2]], "f":[${5:flowlines}], "sf":[${6:subflowlines}], "j":[${7:jumplines}]}\n\nsnippet zupfnoter.note\n %%%%hn.note {"pos": [${1:pos_x},${2:pos_y}], "text": "${3:text}", "style": "${4:style}"}\n\nsnippet zupfnoter.annotation\n %%%%hn.annotation {"id": "${1:id}", "pos": [${2:pos}], "text": "${3:text}"}\n\nsnippet zupfnoter.lyrics\n %%%%hn.lyrics {"pos": [${1:x_pos},${2:y_pos}]}\n\nsnippet zupfnoter.legend\n %%%%hn.legend {"pos": [${1:x_pos},${2:y_pos}]}\n\n\n\nsnippet zupfnoter.target\n "^:${1:target}"\n\nsnippet zupfnoter.goto\n "^@${1:target}@${2:distance}"\n\nsnippet zupfnoter.annotationref\n "^#${1:target}"\n\nsnippet zupfnoter.annotation\n "^!${1:text}@${2:x_offset},${3:y_offset}"\n\n\n',t.scope="abc"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/ada.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/ada",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="ada"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/apache_conf.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/apache_conf",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="apache_conf"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/applescript.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/applescript",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="applescript"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/asciidoc.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/asciidoc",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="asciidoc"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/assembly_x86.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/assembly_x86",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="assembly_x86"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/autohotkey.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/autohotkey",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="autohotkey"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/batchfile.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/batchfile",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="batchfile"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/bro.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/bro",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope=""}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/c9search.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/c9search",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="c9search"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/cirru.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/cirru",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="cirru"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/cobol.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/cobol",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="cobol"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/coldfusion.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/coldfusion",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="coldfusion"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/csharp.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/csharp",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="csharp"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/curly.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/curly",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="curly"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/d.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/d",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="d"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/diff.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/diff",["require","exports","module"],function(e,t,n){"use strict";t.snippetText='# DEP-3 (http://dep.debian.net/deps/dep3/) style patch header\nsnippet header DEP-3 style header\n Description: ${1}\n Origin: ${2:vendor|upstream|other}, ${3:url of the original patch}\n Bug: ${4:url in upstream bugtracker}\n Forwarded: ${5:no|not-needed|url}\n Author: ${6:`g:snips_author`}\n Reviewed-by: ${7:name and email}\n Last-Update: ${8:`strftime("%Y-%m-%d")`}\n Applied-Upstream: ${9:upstream version|url|commit}\n\n',t.scope="diff"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/dockerfile.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/dockerfile",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="dockerfile"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/dot.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/dot",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="dot"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/drools.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/drools",["require","exports","module"],function(e,t,n){"use strict";t.snippetText='\nsnippet rule\n rule "${1?:rule_name}"\n when\n ${2:// when...} \n then\n ${3:// then...}\n end\n\nsnippet query\n query ${1?:query_name}\n ${2:// find} \n end\n \nsnippet declare\n declare ${1?:type_name}\n ${2:// attributes} \n end\n\n',t.scope="drools"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/eiffel.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/eiffel",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="eiffel"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/ejs.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/ejs",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="ejs"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/elixir.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/elixir",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope=""}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/elm.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/elm",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="elm"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/forth.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/forth",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="forth"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/fortran.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/fortran",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="fortran"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/ftl.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/ftl",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="ftl"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/gcode.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/gcode",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="gcode"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/gherkin.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/gherkin",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="gherkin"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/gitignore.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/gitignore",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="gitignore"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/glsl.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/glsl",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="glsl"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/gobstones.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/gobstones",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="# Procedure\nsnippet proc\n procedure ${1?:name}(${2:argument}) {\n ${3:// body...}\n }\n\n# Function\nsnippet fun\n function ${1?:name}(${2:argument}) {\n return ${3:// body...}\n }\n\n# Repeat\nsnippet rep\n repeat ${1?:times} {\n ${2:// body...}\n }\n\n# For\nsnippet for\n foreach ${1?:e} in ${2?:list} {\n ${3:// body...} \n }\n\n# If\nsnippet if\n if (${1?:condition}) {\n ${3:// body...} \n }\n\n# While\n while (${1?:condition}) {\n ${2:// body...} \n }\n",t.scope="gobstones"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/golang.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/golang",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="golang"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/graphqlschema.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/graphqlschema",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="# Type Snippet\ntrigger type\nsnippet type\n type ${1:type_name} {\n ${2:type_siblings}\n }\n\n# Input Snippet\ntrigger input\nsnippet input\n input ${1:input_name} {\n ${2:input_siblings}\n }\n\n# Interface Snippet\ntrigger interface\nsnippet interface\n interface ${1:interface_name} {\n ${2:interface_siblings}\n }\n\n# Interface Snippet\ntrigger union\nsnippet union\n union ${1:union_name} = ${2:type} | ${3: type}\n\n# Enum Snippet\ntrigger enum\nsnippet enum\n enum ${1:enum_name} {\n ${2:enum_siblings}\n }\n",t.scope="graphqlschema"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/groovy.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/groovy",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="groovy"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/haml.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/haml",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="snippet t\n %table\n %tr\n %th\n ${1:headers}\n %tr\n %td\n ${2:headers}\nsnippet ul\n %ul\n %li\n ${1:item}\n %li\nsnippet =rp\n = render :partial => '${1:partial}'\nsnippet =rpl\n = render :partial => '${1:partial}', :locals => {}\nsnippet =rpc\n = render :partial => '${1:partial}', :collection => @$1\n\n",t.scope="haml"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/handlebars.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/handlebars",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="handlebars"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/haskell_cabal.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/haskell_cabal",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="haskell_cabal"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/haxe.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/haxe",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="haxe"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/hjson.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/hjson",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope=""}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/html_elixir.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/html_elixir",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="html_elixir"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/html_ruby.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/html_ruby",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="html_ruby"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/ini.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/ini",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="ini"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/io.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/io",["require","exports","module"],function(e,t,n){"use strict";t.snippets=[{content:"assertEquals(${1:expected}, ${2:expr})",name:"assertEquals",scope:"io",tabTrigger:"ae"},{content:"${1:${2:newValue} := ${3:Object} }clone do(\n $0\n)",name:"clone do",scope:"io",tabTrigger:"cdo"},{content:'docSlot("${1:slotName}", "${2:documentation}")',name:"docSlot",scope:"io",tabTrigger:"ds"},{content:"(${1:header,}\n ${2:body}\n)$0",keyEquivalent:"@(",name:"Indented Bracketed Line",scope:"io",tabTrigger:"("},{content:"\n $0\n",keyEquivalent:"\r",name:"Special: Return Inside Empty Parenthesis",scope:"io meta.empty-parenthesis.io, io meta.comma-parenthesis.io"},{content:"${1:methodName} := method(${2:args,}\n $0\n)",name:"method",scope:"io",tabTrigger:"m"},{content:'newSlot("${1:slotName}", ${2:defaultValue}, "${3:docString}")$0',name:"newSlot",scope:"io",tabTrigger:"ns"},{content:"${1:name} := Object clone do(\n $0\n)",name:"Object clone do",scope:"io",tabTrigger:"ocdo"},{content:"test${1:SomeFeature} := method(\n $0\n)",name:"testMethod",scope:"io",tabTrigger:"ts"},{content:"${1:Something}Test := ${2:UnitTest} clone do(\n $0\n)",name:"UnitTest",scope:"io",tabTrigger:"ut"}],t.scope="io"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/jack.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/jack",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="jack"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/jade.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/jade",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="jade"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/json.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/json",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="json"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/jsx.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/jsx",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="jsx"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/julia.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/julia",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="julia"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/kotlin.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/kotlin",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope=""}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/latex.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/latex",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="latex"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/lean.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/lean",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="lean"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/less.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/less",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="less"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/liquid.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/liquid",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="liquid"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/lisp.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/lisp",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="lisp"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/live_script.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/live_script",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope=""}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/livescript.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/livescript",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="livescript"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/logiql.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/logiql",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="logiql"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/lua.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/lua",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="snippet #!\n #!/usr/bin/env lua\n $1\nsnippet local\n local ${1:x} = ${2:1}\nsnippet fun\n function ${1:fname}(${2:...})\n ${3:-- body}\n end\nsnippet for\n for ${1:i}=${2:1},${3:10} do\n ${4:print(i)}\n end\nsnippet forp\n for ${1:i},${2:v} in pairs(${3:table_name}) do\n ${4:-- body}\n end\nsnippet fori\n for ${1:i},${2:v} in ipairs(${3:table_name}) do\n ${4:-- body}\n end\n",t.scope="lua"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/luapage.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/luapage",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="luapage"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/lucene.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/lucene",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="lucene"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/makefile.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/makefile",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="snippet ifeq\n ifeq (${1:cond0},${2:cond1})\n ${3:code}\n endif\n",t.scope="makefile"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/mask.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/mask",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="mask"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/matlab.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/matlab",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="matlab"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/maze.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/maze",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="snippet >\ndescription assignment\nscope maze\n -> ${1}= ${2}\n\nsnippet >\ndescription if\nscope maze\n -> IF ${2:**} THEN %${3:L} ELSE %${4:R}\n",t.scope="maze"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/mel.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/mel",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="mel"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/mips_assembler.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/mips_assembler",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="mips_assembler"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/mipsassembler.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/mipsassembler",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope=""}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/mushcode.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/mushcode",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="mushcode"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/mysql.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/mysql",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="mysql"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/nix.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/nix",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="nix"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/nsis.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/nsis",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope=""}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/objectivec.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/objectivec",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="objectivec"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/ocaml.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/ocaml",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="ocaml"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/pascal.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/pascal",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="pascal"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/pgsql.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/pgsql",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="pgsql"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/pig.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/pig",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="pig"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/plain_text.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/plain_text",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="plain_text"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/powershell.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/powershell",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="powershell"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/praat.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/praat",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="praat"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/prolog.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/prolog",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="prolog"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/properties.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/properties",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="properties"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/protobuf.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/protobuf",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="",t.scope="protobuf"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/razor.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/razor",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="snippet if\n(${1} == ${2}) {\n ${3}\n}",t.scope="razor"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/rdoc.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/rdoc",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="rdoc"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/rhtml.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/rhtml",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="rhtml"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/rst.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/rst",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="# rst\n\nsnippet :\n :${1:field name}: ${2:field body}\nsnippet *\n *${1:Emphasis}*\nsnippet **\n **${1:Strong emphasis}**\nsnippet _\n \\`${1:hyperlink-name}\\`_\n .. _\\`$1\\`: ${2:link-block}\nsnippet =\n ${1:Title}\n =====${2:=}\n ${3}\nsnippet -\n ${1:Title}\n -----${2:-}\n ${3}\nsnippet cont:\n .. contents::\n \n",t.scope="rst"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/rust.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/rust",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="rust"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/sass.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/sass",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="sass"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/scad.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/scad",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="scad"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/scala.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/scala",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="scala"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/scheme.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/scheme",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="scheme"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/scss.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/scss",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="scss"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/sjs.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/sjs",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="sjs"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/smarty.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/smarty",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="smarty"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/snippets.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/snippets",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="# snippets for making snippets :)\nsnippet snip\n snippet ${1:trigger}\n ${2}\nsnippet msnip\n snippet ${1:trigger} ${2:description}\n ${3}\nsnippet v\n {VISUAL}\n",t.scope="snippets"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/soy_template.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/soy_template",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="soy_template"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/space.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/space",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="space"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/sparql.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/sparql",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope=""}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/sql.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/sql",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="snippet tbl\n create table ${1:table} (\n ${2:columns}\n );\nsnippet col\n ${1:name} ${2:type} ${3:default ''} ${4:not null}\nsnippet ccol\n ${1:name} varchar2(${2:size}) ${3:default ''} ${4:not null}\nsnippet ncol\n ${1:name} number ${3:default 0} ${4:not null}\nsnippet dcol\n ${1:name} date ${3:default sysdate} ${4:not null}\nsnippet ind\n create index ${3:$1_$2} on ${1:table}(${2:column});\nsnippet uind\n create unique index ${1:name} on ${2:table}(${3:column});\nsnippet tblcom\n comment on table ${1:table} is '${2:comment}';\nsnippet colcom\n comment on column ${1:table}.${2:column} is '${3:comment}';\nsnippet addcol\n alter table ${1:table} add (${2:column} ${3:type});\nsnippet seq\n create sequence ${1:name} start with ${2:1} increment by ${3:1} minvalue ${4:1};\nsnippet s*\n select * from ${1:table}\n",t.scope="sql"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/stylus.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/stylus",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="stylus"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/svg.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/svg",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="svg"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/swift.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/swift",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="swift"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/swig.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/swig",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="swig"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/text.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/text",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="text"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/textile.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/textile",["require","exports","module"],function(e,t,n){"use strict";t.snippetText='# Jekyll post header\nsnippet header\n ---\n title: ${1:title}\n layout: post\n date: ${2:date} ${3:hour:minute:second} -05:00\n ---\n\n# Image\nsnippet img\n !${1:url}(${2:title}):${3:link}!\n\n# Table\nsnippet |\n |${1}|${2}\n\n# Link\nsnippet link\n "${1:link text}":${2:url}\n\n# Acronym\nsnippet (\n (${1:Expand acronym})${2}\n\n# Footnote\nsnippet fn\n [${1:ref number}] ${3}\n\n fn$1. ${2:footnote}\n \n',t.scope="textile"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/toml.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/toml",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="toml"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/tsx.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/tsx",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="tsx"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/turtle.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/turtle",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope=""}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/twig.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/twig",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="twig"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/typescript.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/typescript",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="typescript"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/vbscript.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/vbscript",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="vbscript"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/velocity.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/velocity",["require","exports","module"],function(e,t,n){"use strict";t.snippetText='# macro\nsnippet #macro\n #macro ( ${1:macroName} ${2:\\$var1, [\\$var2, ...]} )\n ${3:## macro code}\n #end\n# foreach\nsnippet #foreach\n #foreach ( ${1:\\$item} in ${2:\\$collection} )\n ${3:## foreach code}\n #end\n# if\nsnippet #if\n #if ( ${1:true} )\n ${0}\n #end\n# if ... else\nsnippet #ife\n #if ( ${1:true} )\n ${2}\n #else\n ${0}\n #end\n#import\nsnippet #import\n #import ( "${1:path/to/velocity/format}" )\n# set\nsnippet #set\n #set ( $${1:var} = ${0} )\n',t.scope="velocity",t.includeScopes=["html","javascript","css"]}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/verilog.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/verilog",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="verilog"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/vhdl.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/vhdl",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="vhdl"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/wollok.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/wollok",["require","exports","module"],function(e,t,n){"use strict";t.snippetText='##\n## Basic Java packages and import\nsnippet im\n import\nsnippet w.l\n wollok.lang\nsnippet w.i\n wollok.lib\n\n## Class and object\nsnippet cl\n class ${1:`Filename("", "untitled")`} ${2}\nsnippet obj\n object ${1:`Filename("", "untitled")`} ${2:inherits Parent}${3}\nsnippet te\n test ${1:`Filename("", "untitled")`}\n\n##\n## Enhancements\nsnippet inh\n inherits\n\n##\n## Comments\nsnippet /*\n /*\n * ${1}\n */\n\n##\n## Control Statements\nsnippet el\n else\nsnippet if\n if (${1}) ${2}\n\n##\n## Create a Method\nsnippet m\n method ${1:method}(${2}) ${5}\n\n## \n## Tests\nsnippet as\n assert.equals(${1:expected}, ${2:actual})\n\n##\n## Exceptions\nsnippet ca\n catch ${1:e} : (${2:Exception} ) ${3}\nsnippet thr\n throw\nsnippet try\n try {\n ${3}\n } catch ${1:e} : ${2:Exception} {\n }\n\n##\n## Javadocs\nsnippet /**\n /**\n * ${1}\n */\n\n##\n## Print Methods\nsnippet print\n console.println("${1:Message}")\n\n##\n## Setter and Getter Methods\nsnippet set\n method set${1:}(${2:}) {\n $1 = $2\n }\nsnippet get\n method get${1:}() {\n return ${1:};\n }\n\n##\n## Terminate Methods or Loops\nsnippet re\n return',t.scope="wollok"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/xml.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/xml",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="xml"}) -------------------------------------------------------------------------------- /public/js/libs/ace/snippets/yaml.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/yaml",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="yaml"}) -------------------------------------------------------------------------------- /public/js/polyfills.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/public/js/polyfills.js -------------------------------------------------------------------------------- /public/js/routes.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO add routes here based on a simple Router class that listens for URL fragment changes -------------------------------------------------------------------------------- /public/js/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "typeRoots": ["../../node_modules/@types"], 6 | "rootDir": "./", 7 | "outDir": "./build", 8 | "allowJs": true, 9 | "sourceMap": true, 10 | "pretty": true, 11 | "alwaysStrict": true, 12 | "experimentalDecorators": true, 13 | "emitDecoratorMetadata": true, 14 | "watch": true 15 | }, 16 | "compileOnSave": true, 17 | "exclude": [ 18 | "node_modules", 19 | "packages", 20 | "build", 21 | "libs" 22 | ] 23 | } -------------------------------------------------------------------------------- /public/js/types/AppData.ts: -------------------------------------------------------------------------------- 1 | 2 | export interface AppData { 3 | lang: string; 4 | locale: string; 5 | tvReady: boolean; 6 | siteUrl: string; 7 | } -------------------------------------------------------------------------------- /public/js/types/PageData.ts: -------------------------------------------------------------------------------- 1 | import {user} from "@ekliptor/bit-models"; 2 | 3 | export interface PageData { 4 | debug: boolean; 5 | host: string; 6 | defaultLang: string; 7 | pathRoot: string; 8 | path: { 9 | [name: string]: string; 10 | }; 11 | version: string; 12 | removeDownloadFrameSec: number; 13 | timezoneDiffMin: number; 14 | maxLoadRetries: number; 15 | cookieLifeDays: number; 16 | cookiePath: string; 17 | debugLog: boolean; 18 | sessionName: string; 19 | successMsgRemoveSec: number; 20 | multiselect: { 21 | maxSelect: number; 22 | } 23 | user: typeof user.LEVEL; 24 | 25 | data: any; 26 | 27 | html: { 28 | [filename: string]: { 29 | [block: string]: string; 30 | }; 31 | } 32 | } -------------------------------------------------------------------------------- /public/js/utils/helper.ts: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Returns the % difference between value1 and value2 4 | * @param value1 5 | * @param value2 6 | * @returns {number} the % difference > 0 if value1 > value2, < 0 otherwise 7 | */ 8 | export function getDiffPercent(value1: number, value2: number) { 9 | return ((value1 - value2) / value2) * 100; // ((y2 - y1) / y1)*100 - positive % if value1 > value2 10 | } 11 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "WolfBot", 3 | "name": "BitBrain trading bot", 4 | "icons": [ 5 | { 6 | "src": "/icons/fav/icon_72.png", 7 | "sizes": "72x72", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/images/img_320x460.png", 12 | "sizes": "320x460", 13 | "type": "image/png" 14 | }, 15 | { 16 | "src": "/images/img_640x920.png", 17 | "sizes": "640x920", 18 | "type": "image/png" 19 | } 20 | ], 21 | "start_url": "/?start=webapp", 22 | "display": "fullscreen", 23 | "orientation": "portrait" 24 | } -------------------------------------------------------------------------------- /src/Arbitrage/MaxSpreadCandles.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | import {Candle, Currency, Trade, Order, Ticker, MarketOrder} from "@ekliptor/bit-models"; 5 | import * as helper from "../utils/helper"; 6 | 7 | 8 | export class MaxSpreadCandles { 9 | protected minCandle: Candle.Candle; 10 | protected maxCandle: Candle.Candle; 11 | 12 | constructor(minCandle: Candle.Candle, maxCandle: Candle.Candle) { 13 | this.minCandle = minCandle; 14 | this.maxCandle = maxCandle; 15 | } 16 | 17 | public getMinCandle() { 18 | return this.minCandle; 19 | } 20 | 21 | public getMaxCandle() { 22 | return this.maxCandle; 23 | } 24 | 25 | public getSpreadPercentage() { 26 | return Math.abs(helper.getDiffPercent(this.minCandle.close, this.maxCandle.close)) 27 | } 28 | 29 | // ################################################################ 30 | // ###################### PRIVATE FUNCTIONS ####################### 31 | } -------------------------------------------------------------------------------- /src/Exchanges/Bibox.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | import {MarketOrder, Ticker, Trade, TradeHistory, Currency} from "@ekliptor/bit-models"; 5 | import {CcxtExchange} from "./CcxtExchange"; 6 | import {ExOptions, OpenOrders, OrderParameters} from "./AbstractExchange"; 7 | import * as ccxt from "ccxt"; 8 | import {OrderResult} from "../structs/OrderResult"; 9 | 10 | 11 | export default class Bibox extends CcxtExchange { 12 | constructor(options: ExOptions) { 13 | super(options); 14 | this.exchangeLabel = Currency.Exchange.BIBOX; 15 | this.minTradingValue = 0.001; 16 | this.fee = 0.001; 17 | this.currencies.setSwitchCurrencyPair(true); 18 | this.apiClient = new ccxt.bibox(this.getExchangeConfig()); 19 | this.apiClient.loadMarkets().then(() => { 20 | this.onExchangeReady(); 21 | }).catch((err) => { 22 | logger.error("Error loading %s markets", this.className, err); 23 | }); 24 | } 25 | 26 | // ################################################################ 27 | // ###################### PRIVATE FUNCTIONS ####################### 28 | 29 | } -------------------------------------------------------------------------------- /src/Exchanges/BitForex.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | import {MarketOrder, Ticker, Trade, TradeHistory, Currency} from "@ekliptor/bit-models"; 5 | import {CcxtExchange} from "./CcxtExchange"; 6 | import {ExOptions, OpenOrders, OrderParameters} from "./AbstractExchange"; 7 | import * as ccxt from "ccxt"; 8 | import {OrderResult} from "../structs/OrderResult"; 9 | 10 | 11 | export default class BitForex extends CcxtExchange { 12 | constructor(options: ExOptions) { 13 | super(options); 14 | this.exchangeLabel = Currency.Exchange.BITFOREX; 15 | this.minTradingValue = 0.001; 16 | this.fee = 0.0005; 17 | this.currencies.setSwitchCurrencyPair(true); 18 | this.apiClient = new ccxt.bitforex(this.getExchangeConfig()); 19 | this.apiClient.loadMarkets().then(() => { 20 | this.onExchangeReady(); 21 | }).catch((err) => { 22 | logger.error("Error loading %s markets", this.className, err); 23 | }); 24 | } 25 | 26 | // ################################################################ 27 | // ###################### PRIVATE FUNCTIONS ####################### 28 | 29 | } -------------------------------------------------------------------------------- /src/Exchanges/Cobinhood.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | import {MarketOrder, Ticker, Trade, TradeHistory, Currency} from "@ekliptor/bit-models"; 5 | import {CcxtExchange} from "./CcxtExchange"; 6 | import {ExOptions, OpenOrders, OrderParameters} from "./AbstractExchange"; 7 | import * as ccxt from "ccxt"; 8 | import {OrderResult} from "../structs/OrderResult"; 9 | 10 | 11 | export default class Cobinhood extends CcxtExchange { 12 | constructor(options: ExOptions) { 13 | super(options); 14 | this.exchangeLabel = Currency.Exchange.COBINHOOD; 15 | this.minTradingValue = 0.001; 16 | this.fee = 0.0; 17 | this.currencies.setSwitchCurrencyPair(true); 18 | this.apiClient = new ccxt.cobinhood(this.getExchangeConfig()); 19 | this.apiClient.loadMarkets().then(() => { 20 | this.onExchangeReady(); 21 | }).catch((err) => { 22 | logger.error("Error loading %s markets", this.className, err); 23 | }); 24 | } 25 | 26 | // ################################################################ 27 | // ###################### PRIVATE FUNCTIONS ####################### 28 | 29 | } -------------------------------------------------------------------------------- /src/Exchanges/FCoin.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | import {MarketOrder, Ticker, Trade, TradeHistory, Currency} from "@ekliptor/bit-models"; 5 | import {CcxtExchange} from "./CcxtExchange"; 6 | import {ExOptions, OpenOrders, OrderParameters} from "./AbstractExchange"; 7 | import * as ccxt from "ccxt"; 8 | import {OrderResult} from "../structs/OrderResult"; 9 | 10 | 11 | export default class FCoin extends CcxtExchange { 12 | constructor(options: ExOptions) { 13 | super(options); 14 | this.exchangeLabel = Currency.Exchange.FCOIN; 15 | this.minTradingValue = 0.001; 16 | this.fee = 0.001; 17 | this.currencies.setSwitchCurrencyPair(true); 18 | this.apiClient = new ccxt.fcoin(this.getExchangeConfig()); 19 | this.apiClient.loadMarkets().then(() => { 20 | this.onExchangeReady(); 21 | }).catch((err) => { 22 | logger.error("Error loading %s markets", this.className, err); 23 | }); 24 | } 25 | 26 | // ################################################################ 27 | // ###################### PRIVATE FUNCTIONS ####################### 28 | 29 | } -------------------------------------------------------------------------------- /src/Exchanges/Gemini.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | import {MarketOrder, Ticker, Trade, TradeHistory, Currency} from "@ekliptor/bit-models"; 5 | import {CcxtExchange} from "./CcxtExchange"; 6 | import {ExOptions, OpenOrders, OrderParameters} from "./AbstractExchange"; 7 | import * as ccxt from "ccxt"; 8 | import {OrderResult} from "../structs/OrderResult"; 9 | 10 | 11 | export default class Gemini extends CcxtExchange { 12 | constructor(options: ExOptions) { 13 | super(options); 14 | this.exchangeLabel = Currency.Exchange.GEMINI; 15 | this.minTradingValue = 0.001; 16 | this.fee = 0.0035; 17 | this.currencies.setSwitchCurrencyPair(true); 18 | this.apiClient = new ccxt.gemini(this.getExchangeConfig()); 19 | this.apiClient.loadMarkets().then(() => { 20 | this.onExchangeReady(); 21 | }).catch((err) => { 22 | logger.error("Error loading %s markets", this.className, err); 23 | }); 24 | } 25 | 26 | // ################################################################ 27 | // ###################### PRIVATE FUNCTIONS ####################### 28 | 29 | } -------------------------------------------------------------------------------- /src/Exchanges/HitBTC.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | import {MarketOrder, Ticker, Trade, TradeHistory, Currency} from "@ekliptor/bit-models"; 5 | import {CcxtExchange} from "./CcxtExchange"; 6 | import {ExOptions, OpenOrders, OrderParameters} from "./AbstractExchange"; 7 | import * as ccxt from "ccxt"; 8 | import {OrderResult} from "../structs/OrderResult"; 9 | 10 | 11 | export default class HitBTC extends CcxtExchange { 12 | constructor(options: ExOptions) { 13 | super(options); 14 | this.exchangeLabel = Currency.Exchange.HITBTC; 15 | this.minTradingValue = 0.001; 16 | this.fee = 0.002; 17 | this.currencies.setSwitchCurrencyPair(true); 18 | this.apiClient = new ccxt.hitbtc2(this.getExchangeConfig()); 19 | this.apiClient.loadMarkets().then(() => { 20 | this.onExchangeReady(); 21 | }).catch((err) => { 22 | logger.error("Error loading %s markets", this.className, err); 23 | }); 24 | } 25 | 26 | // ################################################################ 27 | // ###################### PRIVATE FUNCTIONS ####################### 28 | 29 | } -------------------------------------------------------------------------------- /src/Exchanges/Huobi.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | import {MarketOrder, Ticker, Trade, TradeHistory, Currency} from "@ekliptor/bit-models"; 5 | import {CcxtExchange} from "./CcxtExchange"; 6 | import {ExOptions, OpenOrders, OrderParameters} from "./AbstractExchange"; 7 | import * as ccxt from "ccxt"; 8 | import {OrderResult} from "../structs/OrderResult"; 9 | 10 | 11 | export default class Huobi extends CcxtExchange { 12 | constructor(options: ExOptions) { 13 | super(options); 14 | this.exchangeLabel = Currency.Exchange.HUOBI; 15 | this.minTradingValue = 0.001; 16 | this.fee = 0.002; 17 | this.currencies.setSwitchCurrencyPair(true); 18 | this.apiClient = new ccxt.huobipro(this.getExchangeConfig()); 19 | this.apiClient.loadMarkets().then(() => { 20 | this.onExchangeReady(); 21 | }).catch((err) => { 22 | logger.error("Error loading %s markets", this.className, err); 23 | }); 24 | } 25 | 26 | // ################################################################ 27 | // ###################### PRIVATE FUNCTIONS ####################### 28 | 29 | } -------------------------------------------------------------------------------- /src/Exchanges/KrakenFutures.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO 3 | // https://support.kraken.com/hc/en-us/categories/360001806372-Futures-API 4 | // not yet supported by CCXT 5 | // http://app.impact.com/campaign-campaign-info-v2/Kraken.brand 6 | 7 | -------------------------------------------------------------------------------- /src/Exchanges/Liquid.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | import {MarketOrder, Ticker, Trade, TradeHistory, Currency} from "@ekliptor/bit-models"; 5 | import {CcxtExchange} from "./CcxtExchange"; 6 | import {ExOptions, OpenOrders, OrderParameters} from "./AbstractExchange"; 7 | import * as ccxt from "ccxt"; 8 | import {OrderResult} from "../structs/OrderResult"; 9 | 10 | 11 | export default class Liquid extends CcxtExchange { 12 | constructor(options: ExOptions) { 13 | super(options); 14 | this.exchangeLabel = Currency.Exchange.LIQUID; 15 | this.minTradingValue = 0.001; 16 | this.fee = 0.001; // 0.0005 if paid in QASH 17 | this.currencies.setSwitchCurrencyPair(true); 18 | this.apiClient = new ccxt.liquid(this.getExchangeConfig()); 19 | this.apiClient.loadMarkets().then(() => { 20 | this.onExchangeReady(); 21 | }).catch((err) => { 22 | logger.error("Error loading %s markets", this.className, err); 23 | }); 24 | } 25 | 26 | // ################################################################ 27 | // ###################### PRIVATE FUNCTIONS ####################### 28 | 29 | } -------------------------------------------------------------------------------- /src/Exchanges/Nova.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | import {MarketOrder, Ticker, Trade, TradeHistory, Currency} from "@ekliptor/bit-models"; 5 | import {CcxtExchange} from "./CcxtExchange"; 6 | import {ExOptions, OpenOrders, OrderParameters} from "./AbstractExchange"; 7 | import * as ccxt from "ccxt"; 8 | import {OrderResult} from "../structs/OrderResult"; 9 | 10 | 11 | export default class Nova extends CcxtExchange { 12 | constructor(options: ExOptions) { 13 | super(options); 14 | this.exchangeLabel = Currency.Exchange.NOVA; 15 | this.minTradingValue = 0.001; 16 | this.fee = 0.0025; 17 | this.currencies.setSwitchCurrencyPair(true); 18 | this.apiClient = new ccxt.nova(this.getExchangeConfig()); 19 | this.apiClient.loadMarkets().then(() => { 20 | this.onExchangeReady(); 21 | }).catch((err) => { 22 | logger.error("Error loading %s markets", this.className, err); 23 | }); 24 | } 25 | 26 | // ################################################################ 27 | // ###################### PRIVATE FUNCTIONS ####################### 28 | 29 | } -------------------------------------------------------------------------------- /src/Exchanges/OKCoin.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO https://www.okcoin.com/about/rest_api.do 3 | // similar to OKEX, but different currencies, margins, api parameters... so that a common parent class makes it more complicated 4 | -------------------------------------------------------------------------------- /src/Exchanges/TheRockTrading.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | import {MarketOrder, Ticker, Trade, TradeHistory, Currency} from "@ekliptor/bit-models"; 5 | import {CcxtExchange} from "./CcxtExchange"; 6 | import {ExOptions, OpenOrders, OrderParameters} from "./AbstractExchange"; 7 | import * as ccxt from "ccxt"; 8 | 9 | 10 | export default class TheRockTrading extends CcxtExchange { 11 | constructor(options: ExOptions) { 12 | super(options); 13 | this.exchangeLabel = Currency.Exchange.THEROCKTRADING; 14 | this.minTradingValue = 0.001; // TODO? 15 | this.fee = 0.0025; 16 | this.currencies.setSwitchCurrencyPair(true); 17 | let config = this.getExchangeConfig(); 18 | this.apiClient = new ccxt.therock(config); 19 | this.apiClient.loadMarkets().then(() => { 20 | this.onExchangeReady(); 21 | }).catch((err) => { 22 | logger.error("Error loading %s markets", this.className, err); 23 | }); 24 | } 25 | 26 | // ################################################################ 27 | // ###################### PRIVATE FUNCTIONS ####################### 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/Exchanges/YoBit.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | import {MarketOrder, Ticker, Trade, TradeHistory, Currency} from "@ekliptor/bit-models"; 5 | import {CcxtExchange} from "./CcxtExchange"; 6 | import {ExOptions, OpenOrders, OrderParameters} from "./AbstractExchange"; 7 | import * as ccxt from "ccxt"; 8 | import {OrderResult} from "../structs/OrderResult"; 9 | 10 | 11 | export default class YoBit extends CcxtExchange { 12 | constructor(options: ExOptions) { 13 | super(options); 14 | this.exchangeLabel = Currency.Exchange.YOBIT; 15 | this.minTradingValue = 0.001; 16 | this.fee = 0.002; 17 | this.currencies.setSwitchCurrencyPair(true); 18 | this.apiClient = new ccxt.yobit(this.getExchangeConfig()); // apiSecret is empty 19 | this.apiClient.loadMarkets().then(() => { 20 | this.onExchangeReady(); 21 | }).catch((err) => { 22 | logger.error("Error loading %s markets", this.className, err); 23 | }); 24 | } 25 | 26 | // ################################################################ 27 | // ###################### PRIVATE FUNCTIONS ####################### 28 | 29 | } -------------------------------------------------------------------------------- /src/Indicators/ADL.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO add Accumulation Distribution Line 3 | // a more advanced OBV taking high/low/close + volume into account 4 | // multiplier: positive if close in upper half, negative if close in lower half 5 | // https://school.stockcharts.com/doku.php?id=technical_indicators:accumulation_distribution_line 6 | // not in talib 7 | -------------------------------------------------------------------------------- /src/Indicators/ADLine.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO https://stockcharts.com/school/doku.php?id=chart_school:market_indicators:ad_line 3 | // not available in ta-lib 4 | -------------------------------------------------------------------------------- /src/Indicators/BVOL.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO https://www.bitmex.com/app/index/.BVOL24H for different timeframes -------------------------------------------------------------------------------- /src/Indicators/CVD.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO add Cumulative Volume Delta as alternative to OBV 3 | // https://coinalyze.net/blog/cumulative-volume-delta-cvd-indicator-analyzing-buyer-and-seller-activities/ 4 | // not in talib 5 | -------------------------------------------------------------------------------- /src/Indicators/Candlestick/NodeCandlestick.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | import {Currency, Trade, Order, Candle} from "@ekliptor/bit-models"; 5 | import {AbstractCandlestickPatterns} from "./AbstractCandlestickPatterns"; 6 | import {bullish, bearish} from "technicalindicators"; 7 | 8 | 9 | export default class NodeCandlestick extends AbstractCandlestickPatterns { 10 | constructor() { 11 | super() 12 | } 13 | 14 | public isBullishAny() { 15 | return bullish(this.candleInput); 16 | } 17 | 18 | public isBearishAny() { 19 | return bearish(this.candleInput); 20 | } 21 | 22 | // ################################################################ 23 | // ###################### PRIVATE FUNCTIONS ####################### 24 | } -------------------------------------------------------------------------------- /src/Indicators/EhlerTrendline.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO https://cryptotrader.org/topics/230210/ehler-s-instantaneous-trendline 3 | // line cross indicator, a bit faster (less lag) than EMA -------------------------------------------------------------------------------- /src/Indicators/Kairi.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO not in talib, alternative to RSI 3 | // https://www.investopedia.com/articles/forex/09/kairi-relative-strength-index.asp 4 | // https://www.tradingview.com/script/2viDaDnF-Kairi-Relative-Index/ 5 | -------------------------------------------------------------------------------- /src/Indicators/MayerMultiple.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO enter the value https://www.theinvestorspodcast.com/bitcoin-mayer-multiple/ 3 | // and choose a time period (200 day MA). should be used for long-term investment 4 | -------------------------------------------------------------------------------- /src/Indicators/NVTSignal.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO https://woobull.com/nvt-signal-a-new-trading-indicator-to-pick-tops-and-bottoms/ 3 | // network valuation / transaction value 4 | // daily chart http://charts.woobull.com/bitcoin-nvt-signal/ 5 | 6 | // see also https://www.coinfairvalue.com/ -------------------------------------------------------------------------------- /src/Indicators/OpenInterest.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO add open interest per candle using BitmexMarketData class 3 | // curl -X GET --header 'Accept: application/json' 'https://www.bitmex.com/api/v1/instrument/active' 4 | // https://www.bitmex.com/api/explorer/#!/Instrument/Instrument_getActive 5 | -------------------------------------------------------------------------------- /src/Indicators/RVI.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO https://www.fidelity.com/learning-center/trading-investing/technical-analysis/technical-indicator-guide/relative-vigor-index 3 | // sometimes called RVGI 4 | // not supported by TA-Lib 5 | -------------------------------------------------------------------------------- /src/Indicators/SocialSentiment.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO add a generic indicator to be used by other (open source) devs that authenticates 3 | // with WolfBot sentiment data (paid & free) 4 | // https://wolfbot.org/social-sentiment/ 5 | -------------------------------------------------------------------------------- /src/Indicators/Stochastic.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO add Stochastic Oscillator 3 | // http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:stochastic_oscillator_fast_slow_and_full 4 | // combine with MFI: Stochastic up, MFI down -> fake out 5 | -------------------------------------------------------------------------------- /src/Indicators/VWAP.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO https://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:vwap_intraday 3 | // not part of talib, but very simple to calculate. see avgMarketPrice in strategies 4 | // also add a MA of it? 5 | -------------------------------------------------------------------------------- /src/Indicators/VWMA.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO https://www.tradingsetupsreview.com/volume-weighted-moving-average-vwma/ -------------------------------------------------------------------------------- /src/Notifications/NoNotificationService.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | import {AbstractNotification, NotificationOpts} from "./AbstractNotification"; 5 | import Notification from "./Notification"; 6 | 7 | /** 8 | * This class serves as a placeholder instead of a real notification service. 9 | * The purpose of it is that we always have a notifier object and don't have to check for !== null 10 | */ 11 | export default class NoNotificationService extends AbstractNotification { 12 | 13 | constructor(options: NotificationOpts) { 14 | super(options) 15 | } 16 | 17 | // ################################################################ 18 | // ###################### PRIVATE FUNCTIONS ####################### 19 | 20 | protected sendNotification(notification: Notification, forceAdmin: boolean) { 21 | return new Promise((resolve, reject) => { 22 | logger.info("%s: %s - %s", this.className, notification.title, notification.text) 23 | resolve() 24 | }) 25 | } 26 | } -------------------------------------------------------------------------------- /src/Notifications/Notification.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | 5 | export default class Notification { 6 | public title: string; 7 | public text: string; 8 | public requireConfirmation = false; 9 | 10 | constructor(title: string, text: string, requireConfirmation = false) { 11 | this.title = title; 12 | this.text = this.filterInvalidChars(text); 13 | this.requireConfirmation = requireConfirmation; 14 | } 15 | 16 | /** 17 | * Return the messenger text message containing title + message text to be used for Telegram, etc... 18 | */ 19 | public getMessengerText(): string { 20 | let message = this.title; 21 | if (this.text.length !== 0) 22 | message += ":\r\n" + this.text; 23 | return message; 24 | } 25 | 26 | // ################################################################ 27 | // ###################### PRIVATE FUNCTIONS ####################### 28 | 29 | protected filterInvalidChars(text: string) { 30 | if (!text) 31 | return ""; 32 | //return text.replaceAll("@", "-"); 33 | return text; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/Strategies/Accumulator.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO a strategy that accumulates a position as x% of total trading balance in a defined buy range. 3 | // defined via config or TA 4 | // then optionally: it will sell that position in a defined distribution range 5 | -------------------------------------------------------------------------------- /src/Strategies/CopyTrader.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO 3 | // strategy that copies trades from another wolfbot instance (identified by ID, url,..) 4 | // the main trader doesn't have to use wolfbot for trading 5 | // this strategy just repeatedly queries the masters position size 6 | // and then adjusts it's own position accordingly 7 | // required input: 8 | // - master bot ID/URL 9 | // - master max capital (can be from wolfbot or adjusted?) 10 | // - own trade balance for copy trader (as with any wolfbot trader) 11 | 12 | // Advantages for mater: trades happen later, no front running. Additional liquidity following his direction 13 | -------------------------------------------------------------------------------- /src/Strategies/CounterTrader.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO 3 | // https://bitcoinvsaltcoins.com/ 4 | // Look at the trades of other bots and trade against bots with consistently bad trades (PnL). 5 | // Can also be used to copy trades of successful bots. 6 | -------------------------------------------------------------------------------- /src/Strategies/FlashCrash.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO Strategy that submits an order after price crashes > x% (flash crash). 3 | // Works well onl low candle size (5min) together with RSCIScalOrderer on low candle size. 4 | // Strategy doesn't close a position, so it needs stop-loss and take-profit strategies along with it. 5 | 6 | 7 | import * as utils from "@ekliptor/apputils"; 8 | const logger = utils.logger 9 | , nconf = utils.nconf; 10 | import {AbstractStrategy, StrategyAction} from "./AbstractStrategy"; 11 | import {Currency, Trade} from "@ekliptor/bit-models"; 12 | 13 | 14 | /** 15 | */ 16 | export default class FlashCrash extends AbstractStrategy { 17 | constructor(options) { 18 | super(options) 19 | throw new Error(this.className + " is not yet implemented"); 20 | } 21 | 22 | // ################################################################ 23 | // ###################### PRIVATE FUNCTIONS ####################### 24 | 25 | protected tick(trades: Trade.Trade[]) { 26 | return new Promise((resolve, reject) => { 27 | resolve() 28 | }) 29 | } 30 | } -------------------------------------------------------------------------------- /src/Strategies/MarginCallBuyer.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO measure sharp drops in prices (or even better check on huge orders that cause those drops in advance?) 3 | // forced liquidation at 20% -> deposit/value = 1/5 < 0.2 will cause many more more sells 4 | // assume: 1 coin deposit last check / value now (relative to current coin and to BTC as deposit) 5 | 6 | 7 | import * as utils from "@ekliptor/apputils"; 8 | const logger = utils.logger 9 | , nconf = utils.nconf; 10 | import {AbstractStrategy, StrategyAction} from "./AbstractStrategy"; 11 | import {Currency, Trade} from "@ekliptor/bit-models"; 12 | 13 | 14 | /** 15 | */ 16 | export default class MarginCallBuyer extends AbstractStrategy { 17 | constructor(options) { 18 | super(options) 19 | throw new Error(this.className + " is not yet implemented"); 20 | } 21 | 22 | // ################################################################ 23 | // ###################### PRIVATE FUNCTIONS ####################### 24 | 25 | protected tick(trades: Trade.Trade[]) { 26 | return new Promise((resolve, reject) => { 27 | resolve() 28 | }) 29 | } 30 | } -------------------------------------------------------------------------------- /src/Strategies/MoneyFlowStrategy.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO A strategy that finds patterns where the money flows between currencies. 3 | // For example BTC goes down and XRP or BCH up. 4 | // TODO requires strategy API to access other currencies within a strategy 5 | 6 | import * as utils from "@ekliptor/apputils"; 7 | const logger = utils.logger 8 | , nconf = utils.nconf; 9 | import {AbstractStrategy, StrategyAction} from "./AbstractStrategy"; 10 | import {Currency, Trade} from "@ekliptor/bit-models"; 11 | 12 | 13 | /** 14 | */ 15 | export default class MoneyFlowStrategy extends AbstractStrategy { 16 | constructor(options) { 17 | super(options) 18 | throw new Error(this.className + " is not yet implemented"); 19 | } 20 | 21 | // ################################################################ 22 | // ###################### PRIVATE FUNCTIONS ####################### 23 | 24 | protected tick(trades: Trade.Trade[]) { 25 | return new Promise((resolve, reject) => { 26 | resolve() 27 | }) 28 | } 29 | } -------------------------------------------------------------------------------- /src/Strategies/NOOP.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | import {AbstractStrategy, StrategyAction} from "./AbstractStrategy"; 5 | import {TechnicalStrategy, TechnicalStrategyAction} from "./TechnicalStrategy"; 6 | import {AbstractIndicator} from "../Indicators/AbstractIndicator"; 7 | import {Currency, Trade, Candle} from "@ekliptor/bit-models"; 8 | 9 | interface NOOPAction extends TechnicalStrategyAction { 10 | sample: string; 11 | } 12 | 13 | /** 14 | * This strategy does nothing. It is just a sample and placeholder. 15 | */ 16 | export default class NOOP extends TechnicalStrategy { 17 | public action: NOOPAction; 18 | 19 | constructor(options) { 20 | super(options) 21 | this.addInfoFunction("sample", () => { 22 | return this.action.sample; 23 | }); 24 | } 25 | 26 | public getMinWarumCandles() { 27 | return 0; // ensure we don't start any trade imports with this strategy 28 | } 29 | 30 | // ################################################################ 31 | // ###################### PRIVATE FUNCTIONS ####################### 32 | 33 | protected checkIndicators() { 34 | // this strategy does nothing 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/Strategies/OutOfRangeCatcher.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO a strategy that places orders outside of the trading range on high price-volume nodes of the 3 | // volume profile. Used best with an execution strategy such as RSIScalpOrderer with a very low candleSize (1-3min). 4 | // could be based on PingPong 5 | // TODO problem: if it's out of the trading range, the short term volume profile will only have low value nodes too there 6 | 7 | 8 | import * as utils from "@ekliptor/apputils"; 9 | const logger = utils.logger 10 | , nconf = utils.nconf; 11 | import {AbstractStrategy, StrategyAction} from "./AbstractStrategy"; 12 | import {Currency, Trade} from "@ekliptor/bit-models"; 13 | 14 | 15 | /** 16 | */ 17 | export default class OutOfRangeCatcher extends AbstractStrategy { 18 | constructor(options) { 19 | super(options) 20 | throw new Error(this.className + " is not yet implemented"); 21 | } 22 | 23 | // ################################################################ 24 | // ###################### PRIVATE FUNCTIONS ####################### 25 | 26 | protected tick(trades: Trade.Trade[]) { 27 | return new Promise((resolve, reject) => { 28 | resolve() 29 | }) 30 | } 31 | } -------------------------------------------------------------------------------- /src/Strategies/PatternDetector.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO detect common paterns of candlestick data and trade accordingly 3 | // IntervalExtremes already implements this and counts patterns (no trading based on them yet) 4 | // http://www.investopedia.com/terms/e/eveningstar.asp 5 | 6 | 7 | import * as utils from "@ekliptor/apputils"; 8 | const logger = utils.logger 9 | , nconf = utils.nconf; 10 | import {AbstractStrategy, StrategyAction} from "./AbstractStrategy"; 11 | import {Currency, Trade} from "@ekliptor/bit-models"; 12 | 13 | 14 | /** 15 | */ 16 | export default class PatternDetector extends AbstractStrategy { 17 | constructor(options) { 18 | super(options) 19 | throw new Error(this.className + " is not yet implemented"); 20 | } 21 | 22 | // ################################################################ 23 | // ###################### PRIVATE FUNCTIONS ####################### 24 | 25 | protected tick(trades: Trade.Trade[]) { 26 | return new Promise((resolve, reject) => { 27 | resolve() 28 | }) 29 | } 30 | } -------------------------------------------------------------------------------- /src/Strategies/PriceDifference.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO expand API to crawl data from multiple exchanges 3 | // TODO detect if prices for a coin are different, should work well on smaller exchanges 4 | // then open a position towards the direction of the bigger market 5 | // kind of like arbitrage, but without moving coins between exchanges 6 | 7 | 8 | import * as utils from "@ekliptor/apputils"; 9 | const logger = utils.logger 10 | , nconf = utils.nconf; 11 | import {AbstractStrategy, StrategyAction} from "./AbstractStrategy"; 12 | import {Currency, Trade} from "@ekliptor/bit-models"; 13 | 14 | 15 | /** 16 | */ 17 | export default class PriceDifference extends AbstractStrategy { 18 | constructor(options) { 19 | super(options) 20 | throw new Error(this.className + " is not yet implemented"); 21 | } 22 | 23 | // ################################################################ 24 | // ###################### PRIVATE FUNCTIONS ####################### 25 | 26 | protected tick(trades: Trade.Trade[]) { 27 | return new Promise((resolve, reject) => { 28 | resolve() 29 | }) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/Strategies/SpeedCandles.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO follow the candle trend of the last candle. Works well with small candle sizes (5min) 3 | // in fast moving markets (such as wen big dumps happen). 4 | 5 | 6 | import * as utils from "@ekliptor/apputils"; 7 | const logger = utils.logger 8 | , nconf = utils.nconf; 9 | import {AbstractStrategy, StrategyAction} from "./AbstractStrategy"; 10 | import {Currency, Trade} from "@ekliptor/bit-models"; 11 | 12 | 13 | /** 14 | */ 15 | export default class SpeedCandles extends AbstractStrategy { 16 | constructor(options) { 17 | super(options) 18 | throw new Error(this.className + " is not yet implemented"); 19 | } 20 | 21 | // ################################################################ 22 | // ###################### PRIVATE FUNCTIONS ####################### 23 | 24 | protected tick(trades: Trade.Trade[]) { 25 | return new Promise((resolve, reject) => { 26 | resolve() 27 | }) 28 | } 29 | } -------------------------------------------------------------------------------- /src/Strategies/SwapInterestCollector.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO 3 | // 1. add interest API calls for OKEX and BitMEX and Deribit perpetual swaps 4 | // 2. open long/short position to collect interest 5 | // 3. optionally close positions when interest changes for x candles or increase size to close at profit 6 | -------------------------------------------------------------------------------- /src/Strategies/SwingTrader.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO look at the trend of the last x candles and follow it 3 | 4 | 5 | import * as utils from "@ekliptor/apputils"; 6 | const logger = utils.logger 7 | , nconf = utils.nconf; 8 | import {AbstractStrategy, StrategyAction} from "./AbstractStrategy"; 9 | import {Currency, Trade} from "@ekliptor/bit-models"; 10 | 11 | 12 | /** 13 | */ 14 | export default class SwingTrader extends AbstractStrategy { 15 | constructor(options) { 16 | super(options) 17 | throw new Error(this.className + " is not yet implemented"); 18 | } 19 | 20 | // ################################################################ 21 | // ###################### PRIVATE FUNCTIONS ####################### 22 | 23 | protected tick(trades: Trade.Trade[]) { 24 | return new Promise((resolve, reject) => { 25 | resolve() 26 | }) 27 | } 28 | } -------------------------------------------------------------------------------- /src/Strategies/VolumeStopper.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO use avg volume indicator on 30min or 1h candles. immediately stop if there is a 2x volume spike against our position 3 | // with at least x% price change of the current candle 4 | 5 | import * as utils from "@ekliptor/apputils"; 6 | const logger = utils.logger 7 | , nconf = utils.nconf; 8 | import {AbstractStrategy, StrategyAction} from "./AbstractStrategy"; 9 | import {Currency, Trade} from "@ekliptor/bit-models"; 10 | 11 | 12 | /** 13 | * Also see VolumeSpikeStopper for direct Volume. 14 | */ 15 | export default class VolumeStopper extends AbstractStrategy { 16 | constructor(options) { 17 | super(options) 18 | throw new Error(this.className + " is not yet implemented"); 19 | } 20 | 21 | // ################################################################ 22 | // ###################### PRIVATE FUNCTIONS ####################### 23 | 24 | protected tick(trades: Trade.Trade[]) { 25 | return new Promise((resolve, reject) => { 26 | resolve() 27 | }) 28 | } 29 | } -------------------------------------------------------------------------------- /src/Strategies/WallDetector.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO look at the order book and see if there are (sudden) buy/sell walls 3 | // also see OrderBookPressure 4 | 5 | 6 | import * as utils from "@ekliptor/apputils"; 7 | const logger = utils.logger 8 | , nconf = utils.nconf; 9 | import {AbstractStrategy, StrategyAction} from "./AbstractStrategy"; 10 | import {Currency, Trade} from "@ekliptor/bit-models"; 11 | 12 | 13 | /** 14 | */ 15 | export default class WallDetector extends AbstractStrategy { 16 | constructor(options) { 17 | super(options) 18 | throw new Error(this.className + " is not yet implemented"); 19 | } 20 | 21 | // ################################################################ 22 | // ###################### PRIVATE FUNCTIONS ####################### 23 | 24 | protected tick(trades: Trade.Trade[]) { 25 | return new Promise((resolve, reject) => { 26 | resolve() 27 | }) 28 | } 29 | } -------------------------------------------------------------------------------- /src/Strategies/WaveSurfer.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | import {AbstractStrategy, StrategyAction, TradeAction, ScheduledTrade} from "./AbstractStrategy"; 5 | import {AbstractWaveSurfer, WaveSurferAction} from "./AbstractWaveSurfer"; 6 | import {AbstractIndicator, TrendDirection} from "../Indicators/AbstractIndicator"; 7 | import {Currency, Trade, Candle, Order} from "@ekliptor/bit-models"; 8 | import {TradeInfo} from "../Trade/AbstractTrader"; 9 | import {MarginPosition} from "../structs/MarginPosition"; 10 | 11 | /** 12 | * The default implementation of WaveSurfer which can handle buys and sells. 13 | */ 14 | export default class WaveSurfer extends AbstractWaveSurfer { 15 | 16 | constructor(options) { 17 | super(options) 18 | } 19 | 20 | // ################################################################ 21 | // ###################### PRIVATE FUNCTIONS ####################### 22 | 23 | } -------------------------------------------------------------------------------- /src/Trade/AbstractConfig.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | import {Currency, BotTrade} from "@ekliptor/bit-models"; 5 | 6 | export type BotConfigMode = BotTrade.TradingMode | "ai" | "social"; 7 | 8 | export class AbstractConfig { 9 | public readonly name: string = ""; 10 | public readonly configNr: number = 0; 11 | 12 | protected static nextConfigNr: number = 0; 13 | 14 | constructor(json: any, configName: string) { 15 | this.name = configName.replace(/\.json$/, ""); 16 | this.configNr = ++AbstractConfig.nextConfigNr; 17 | } 18 | 19 | public static resetCounter() { 20 | AbstractConfig.nextConfigNr = 0; 21 | } 22 | 23 | public static getExchangeNames(exchanges: string[]) { // in Strategies on client and AbstractConfig on server 24 | return exchanges.toString().replace(/,/g, ", "); 25 | } 26 | 27 | protected validateConfig() { 28 | // nothing to validate in parent class yet 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/Web/JsonResponse.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | 5 | export class JsonResponse { 6 | public error = false; 7 | public errorCode = 0; 8 | public errorMsg = ""; 9 | 10 | public data: any[] = []; 11 | 12 | constructor() { 13 | } 14 | 15 | public setError(code: number, msg: string = "") { 16 | this.error = true; 17 | this.errorCode = code; 18 | this.errorMsg = msg; 19 | } 20 | } -------------------------------------------------------------------------------- /src/Web/errorCodes.ts: -------------------------------------------------------------------------------- 1 | 2 | export const enum WebErrorCode { 3 | // values below 100 are from website 4 | API_ERR_INVALID_EMAIL = 1, 5 | API_ERR_NO_INSTANCE = 2, 6 | API_ERR_INTERNAL = 3, 7 | API_USER_DOESNT_EXIST = 4, 8 | NO_BOT_SUBSCRIPTIONS_FOUND = 5, 9 | 10 | TRADEBOOK_NOT_AVAILABLE = 100, 11 | TRADEBOOK_ERROR_QUERY = 101, 12 | TRADEBOOK_ERROR_PARAMS = 102 13 | } -------------------------------------------------------------------------------- /src/WebSocket/HomeUpdater.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | import * as WebSocket from "ws"; 5 | import * as http from "http"; 6 | import * as path from "path"; 7 | import {ServerSocketPublisher, ServerSocket, ClientSocketOnServer} from "./ServerSocket"; 8 | import {AppPublisher} from "./AppPublisher"; 9 | import {WebSocketOpcode} from "./opcodes"; 10 | import {AbstractAdvisor} from "../AbstractAdvisor"; 11 | 12 | 13 | export class HomeUpdater extends AppPublisher { 14 | public readonly opcode = WebSocketOpcode.HOME; 15 | 16 | constructor(serverSocket: ServerSocket, advisor: AbstractAdvisor) { 17 | super(serverSocket, advisor) 18 | } 19 | 20 | public onSubscription(clientSocket: ClientSocketOnServer, initialRequest: http.IncomingMessage): void { 21 | // static page. nothing to send via websockets here yet 22 | } 23 | 24 | // ################################################################ 25 | // ###################### PRIVATE FUNCTIONS ####################### 26 | 27 | protected onData(data: any, clientSocket: ClientSocketOnServer, initialRequest: http.IncomingMessage): void { 28 | 29 | } 30 | } -------------------------------------------------------------------------------- /src/WebSocket/opcodes.ts: -------------------------------------------------------------------------------- 1 | 2 | export const enum WebSocketOpcode { 3 | // general opcodes 4 | FATAL_ERROR = 1, // an error that closes the connection 5 | ERROR = 2, 6 | WARNING = 3, 7 | CLOSE = 4, 8 | PING = 5, 9 | 10 | // application opcodes 11 | STATUS = 10, 12 | LOG = 11, 13 | STRATEGIES = 12, 14 | CONFIG = 13, 15 | ORACLE = 14, 16 | LENDING = 15, 17 | SOCIAL = 16, 18 | COINMARKET = 17, 19 | TRADINGVIEW = 18, 20 | TRADE_HISTORY = 19, 21 | BACKTESTING = 20, 22 | SCRIPTS = 21, 23 | HOME = 22, 24 | LOGIN = 23, 25 | TRADES = 24 26 | } 27 | 28 | export type WebSocketError = "Unauthorized" | "UnauthorizedPremium"; 29 | 30 | export type JSONFormat = "JSON" | "EJSON"; 31 | export const AppJSONFormat: JSONFormat = "EJSON"; -------------------------------------------------------------------------------- /src/server/data/Sensor.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDHjCCAgYCCQDDdShjNQ1vVzANBgkqhkiG9w0BAQsFADBRMQswCQYDVQQGEwJE 3 | RTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0 4 | cyBQdHkgTHRkMQowCAYDVQQDDAEqMB4XDTE2MTAxOTIxMjM0MFoXDTE5MDYxMTIx 5 | MjM0MFowUTELMAkGA1UEBhMCREUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNV 6 | BAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEKMAgGA1UEAwwBKjCCASIwDQYJ 7 | KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMkNSDWrnvM+c71/phDdsX4Y7ieIzR9R 8 | Cwrg/hDba72hK9APojeMAgm8Pbxlbm26FK9AQzuYtgYyca6J4OfmfuR+6SC3ui69 9 | TyMWJV9qoMlaWps8an6nz7JzR18zX1N2FbW2Z6fNTP0aq4kQ9/ozlp2ZCTCpO/Jk 10 | R3m7y2pCZ03AYSs52cD+dxjMGpH+zLJnWBjXD9FL/MqBicLSaOsN8hoeAmPBIBYZ 11 | kFE8NkKwLE/Ln844/MYPEe5ILiluz7J37kwGMIy+7tQptIEfxG16H5P+aAdbmUDr 12 | RJpvBIFW6iMUtEqpkMCX5UfD8jXL9xZ+W+6en1H2xAL6dPqzXryCz7MCAwEAATAN 13 | BgkqhkiG9w0BAQsFAAOCAQEAZ/2PtapMMVQ+c+I9hH4D3OQP8pdtntN0O7jV+SNk 14 | MWc5ce099GUxg+vtdZ/2Zm8o1QEnlajX8ct9dwFFTIFjLwQY/x2aRTddL8GKbm0O 15 | zPg8Lu2lRUj7fR6I/dWxl2Gzi5Bok8fGk8yoJRJhLC/1xlF69o9p+lPUNzTPMbE1 16 | 7s14yQd+LKv6q5lsB2tu19sLQVAdLNv/uJf3xqjFW61JZa5nz1vX2G50yyEJtEQ2 17 | GjWwObdBh27hOkZODUOoW1awa6GFifXD0HNnbpc+UUhGbdqESgrQV94klZI8fyX+ 18 | 40R7eIylIn/XX1wF/EGbtDtTuoy5h/TO0VbsXpAwJWs2AA== 19 | -----END CERTIFICATE----- 20 | -------------------------------------------------------------------------------- /src/server/data/Sensor.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIICljCCAX4CAQAwUTELMAkGA1UEBhMCREUxEzARBgNVBAgMClNvbWUtU3RhdGUx 3 | ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEKMAgGA1UEAwwBKjCC 4 | ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMkNSDWrnvM+c71/phDdsX4Y 5 | 7ieIzR9RCwrg/hDba72hK9APojeMAgm8Pbxlbm26FK9AQzuYtgYyca6J4OfmfuR+ 6 | 6SC3ui69TyMWJV9qoMlaWps8an6nz7JzR18zX1N2FbW2Z6fNTP0aq4kQ9/ozlp2Z 7 | CTCpO/JkR3m7y2pCZ03AYSs52cD+dxjMGpH+zLJnWBjXD9FL/MqBicLSaOsN8hoe 8 | AmPBIBYZkFE8NkKwLE/Ln844/MYPEe5ILiluz7J37kwGMIy+7tQptIEfxG16H5P+ 9 | aAdbmUDrRJpvBIFW6iMUtEqpkMCX5UfD8jXL9xZ+W+6en1H2xAL6dPqzXryCz7MC 10 | AwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQCiOkRbx7fSzf6JLg7Vi1CSsek8u677 11 | 0rz4mABJKqtaLoNoqo2PclRnTx0GPV0NcP4mvQ+Zm2WGbTkFwI/it1I3u9trcDvi 12 | YCAVb7ldrjHE959frAOTADUZLEiMCZHXo98t9s/aFmgspTbu+i1jTxhdE/HDqUl/ 13 | Qtu7sGadsGEfRP3CmFVKw4MPRPv8Dap7jx5p5vTfxVjgIb1RGzIv+vhCt7NfPrY0 14 | ojcR4OeixuqSdxJLP0VeRPlYZq/ccJO+tpDyiy+wuNGDZITAffUELpZiWoDYPwjE 15 | DKUB7es5bQq9GyPBf8HLYrq7EONOUSmwHRtT6oxARRjXqQs6OjPpy9fo 16 | -----END CERTIFICATE REQUEST----- 17 | -------------------------------------------------------------------------------- /src/structs/GlobalTradeSignal.ts: -------------------------------------------------------------------------------- 1 | 2 | export class GlobalTradeSignal extends Map { // (unique ID, signal) 3 | protected counter: number = 0; 4 | 5 | constructor(iterable?: Iterable<[number, string]>) { 6 | super(iterable); 7 | } 8 | 9 | /* 10 | public set(id: number, signal: string): this { 11 | throw new Error("set() should not be called on GlobalTradeSignal. Use addSignal() instead."); 12 | return this; 13 | } 14 | */ 15 | 16 | public addSignal(signal: string): boolean { 17 | this.set(++this.counter, signal); 18 | return true; 19 | } 20 | 21 | // ################################################################ 22 | // ###################### PRIVATE FUNCTIONS ####################### 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/structs/MarginAccountSummary.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | 5 | export default class MarginAccountSummary { 6 | totalValue: number = 0; 7 | pl: number = 0; // profit/loss 8 | lendingFees: number = 0; 9 | netValue: number = 0; 10 | totalBorrowedValue: number = 0; 11 | currentMargin: number = 0; 12 | 13 | constructor() { 14 | } 15 | 16 | public static fromJson(json): MarginAccountSummary { 17 | // some exchanges (poloniex/kraken) return all numbers as strings 18 | let account = new MarginAccountSummary(); 19 | for (let prop in json) 20 | { 21 | if (account[prop] === undefined) 22 | continue; 23 | account[prop] = parseFloat(json[prop]) 24 | if (account[prop] === Number.NaN) { 25 | logger.warn("Error parsing MarginAccountSummary: key %s, value %s", prop, json[prop]) 26 | account[prop] = 0 27 | } 28 | } 29 | return account; 30 | } 31 | } 32 | 33 | // force loading dynamic imports for TypeScript 34 | import "./ExchangeTicker"; // not used anymore, needed for updater // TODO remove? -------------------------------------------------------------------------------- /src/utils/Logger.ts: -------------------------------------------------------------------------------- 1 | // this file allows us to create a custom logger config for our app later 2 | import * as utils from "@ekliptor/apputils"; 3 | export = utils.logger -------------------------------------------------------------------------------- /tests/docs/WolfBot API.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/tests/docs/WolfBot API.pdf -------------------------------------------------------------------------------- /tests/docs/diagram-incoming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/tests/docs/diagram-incoming.png -------------------------------------------------------------------------------- /tests/docs/diagram-outgoing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ekliptor/WolfBot/0f45aae699713c5947020ae79d9c4acf423bca59/tests/docs/diagram-outgoing.png -------------------------------------------------------------------------------- /tests/fiat.ts: -------------------------------------------------------------------------------- 1 | import * as utils from "@ekliptor/apputils"; 2 | const logger = utils.logger 3 | , nconf = utils.nconf; 4 | import {controller as Controller} from '../src/Controller'; 5 | import {Currency} from "@ekliptor/bit-models"; 6 | import * as fs from "fs"; 7 | import * as path from "path"; 8 | import {ExchangeRates} from "../src/Fiat/ExchangeRates"; 9 | import {CoinMarketCap} from "../src/Social/CoinMarketCap"; 10 | 11 | let testFiatRates = async () => { 12 | let rates = new ExchangeRates(); 13 | let usdThb = await rates.getRate("USD", "THB"); 14 | console.log("USD THB RATE", usdThb) 15 | let usdThb2 = await rates.getRate("USD", "THB"); 16 | console.log("USD THB RATE", usdThb2) 17 | console.log("CACHED RATE", rates.getRateFromCache("USD", "THB")) 18 | 19 | console.log("convert 500 USD", await rates.convert("USD", "THB", 500)) 20 | } 21 | 22 | let testCoinmarketcap = async () => { 23 | const coinMarketCap = new CoinMarketCap({apiKey: nconf.get("serverConfig:apiKey:coinMarketCap:apiKey")}); 24 | //coinMarketCap.getCurrencyTickerById() 25 | } 26 | 27 | Controller.loadServerConfig(() => { 28 | //testFiatRates() 29 | testCoinmarketcap() 30 | }) 31 | -------------------------------------------------------------------------------- /tests/samples/websocket.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | WebSocket Wolfbot 6 | 7 | 8 | WolfBot WebSocket example connection. Please open the console or network tab to see the websocket data. 9 | 10 | 11 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "typeRoots": ["./node_modules/@types"], 6 | "rootDir": "./", 7 | "outDir": "./build", 8 | "allowJs": false, 9 | "sourceMap": true, 10 | "pretty": true, 11 | "alwaysStrict": true, 12 | "experimentalDecorators": true, 13 | "emitDecoratorMetadata": true, 14 | "watch": true 15 | }, 16 | "compileOnSave": true, 17 | "exclude": [ 18 | "node_modules", 19 | "packages", 20 | "build", 21 | "public" 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /views/oracle.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |

{tr:oracleTxt}

5 |

{tr:oracleWaiting}

6 |
7 |
8 |
9 | 10 | 11 |
12 |
13 |
14 | {currencyPair} {currentRate} 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
{tr:prediction}{tr:realValue}
27 |
28 |
29 | 30 | 31 | 32 | {prediction} 33 | {realValue} 34 | 35 | -------------------------------------------------------------------------------- /views/scripts.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 | ToDo show code editor of strategies for devs 5 |
6 |
7 | -------------------------------------------------------------------------------- /views/strategiesConfigPopup.html: -------------------------------------------------------------------------------- 1 | 2 | 15 | -------------------------------------------------------------------------------- /views/supportedCurrencies.html: -------------------------------------------------------------------------------- 1 | 2 | 30 | -------------------------------------------------------------------------------- /views/tables.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {nrDisplay} 4 | 5 | -------------------------------------------------------------------------------- /views/tabs.html: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /views/windows.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {title} - {tr:siteName} 7 | 8 | 9 | 10 | 11 |
12 | {loadingMsg} 13 |
14 | 15 | 16 | --------------------------------------------------------------------------------