diff --git a/_sources/releases.txt b/_sources/releases.txt index 635f2e95..9289d56a 100644 --- a/_sources/releases.txt +++ b/_sources/releases.txt @@ -2,6 +2,22 @@ Release Notes ============= +Version 0.5.1 +^^^^^^^^^^^^^ +**Release Date**: 2018-02-07 + +Bug Fixes +~~~~~~~~~ +- Fixed an issue with orders that stay open :issue:`211` +- Fixed Jupyter issues :issue:`179` +- Fetching multiple tickers in one call to minimize rate limit risks :issue:`174` +- Improved live state presentation :issue:`171` + + +Build +~~~~~ +- Introducing the Enigma Marketplace + Version 0.4.7 ^^^^^^^^^^^^^ **Release Date**: 2018-01-19 diff --git a/_static/css/badge_only.css b/_static/css/badge_only.css index 6362912b..7e17fb14 100644 --- a/_static/css/badge_only.css +++ b/_static/css/badge_only.css @@ -1,2 +1,2 @@ -.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../font/fontawesome_webfont.eot");src:url("../font/fontawesome_webfont.eot?#iefix") format("embedded-opentype"),url("../font/fontawesome_webfont.woff") format("woff"),url("../font/fontawesome_webfont.ttf") format("truetype"),url("../font/fontawesome_webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:0.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} +.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../font/fontawesome_webfont.eot");src:url("../font/fontawesome_webfont.eot?#iefix") format("embedded-opentype"),url("../font/fontawesome_webfont.woff") format("woff"),url("../font/fontawesome_webfont.ttf") format("truetype"),url("../font/fontawesome_webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:0.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}} /*# sourceMappingURL=badge_only.css.map */ diff --git a/_static/css/theme.css b/_static/css/theme.css index c1631d84..57b98fe6 100644 --- a/_static/css/theme.css +++ b/_static/css/theme.css @@ -1,5 +1,5 @@ -*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:hover,a:active{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:bold}pre,code,.rst-content tt,.rst-content code,kbd,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}ul,ol,dl{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;*margin-left:-7px;padding:0;white-space:normal}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*width:13px;*height:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:0.2em 0;background:#ccc;color:#000;padding:0.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{html,body,section{background:none !important}*{box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,.rst-content .toctree-wrapper p.caption,h3{orphans:3;widows:3}h2,.rst-content .toctree-wrapper p.caption,h3{page-break-after:avoid}}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}/*! - * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome +*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:hover,a:active{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:bold}pre,code,.rst-content tt,.rst-content code,kbd,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}ul,ol,dl{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;*margin-left:-7px;padding:0;white-space:normal}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*width:13px;*height:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:0.2em 0;background:#ccc;color:#000;padding:0.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{html,body,section{background:none !important}*{box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,.rst-content p.caption,h3{orphans:3;widows:3}h2,.rst-content p.caption,h3{page-break-after:avoid}}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.6.3");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff2?v=4.6.3") format("woff2"),url("../fonts/fontawesome-webfont.woff?v=4.6.3") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.6.3") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.wy-menu-vertical li span.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-left.toctree-expand,.wy-menu-vertical li.current>a span.fa-pull-left.toctree-expand,.rst-content .fa-pull-left.admonition-title,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content dl dt .fa-pull-left.headerlink,.rst-content p.caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.rst-content code.download span.fa-pull-left:first-child,.fa-pull-left.icon{margin-right:.3em}.fa.fa-pull-right,.wy-menu-vertical li span.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-right.toctree-expand,.wy-menu-vertical li.current>a span.fa-pull-right.toctree-expand,.rst-content .fa-pull-right.admonition-title,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content dl dt .fa-pull-right.headerlink,.rst-content p.caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.rst-content code.download span.fa-pull-right:first-child,.fa-pull-right.icon{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.wy-menu-vertical li span.pull-left.toctree-expand,.wy-menu-vertical li.on a span.pull-left.toctree-expand,.wy-menu-vertical li.current>a span.pull-left.toctree-expand,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.rst-content p.caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.rst-content code.download span.pull-left:first-child,.pull-left.icon{margin-right:.3em}.fa.pull-right,.wy-menu-vertical li span.pull-right.toctree-expand,.wy-menu-vertical li.on a span.pull-right.toctree-expand,.wy-menu-vertical li.current>a span.pull-right.toctree-expand,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.rst-content p.caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.rst-content code.download span.pull-right:first-child,.pull-right.icon{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li span.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-hotel:before,.fa-bed:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-yc:before,.fa-y-combinator:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-tv:before,.fa-television:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:""}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-signing:before,.fa-sign-language:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{font-family:inherit}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{font-family:"FontAwesome";display:inline-block;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa,a .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .rst-content p.caption .headerlink,.rst-content p.caption a .headerlink,a .rst-content tt.download span:first-child,.rst-content tt.download a span:first-child,a .rst-content code.download span:first-child,.rst-content code.download a span:first-child,a .icon{display:inline-block;text-decoration:inherit}.btn .fa,.btn .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .btn span.toctree-expand,.btn .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .btn span.toctree-expand,.btn .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .btn span.toctree-expand,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .rst-content p.caption .headerlink,.rst-content p.caption .btn .headerlink,.btn .rst-content tt.download span:first-child,.rst-content tt.download .btn span:first-child,.btn .rst-content code.download span:first-child,.rst-content code.download .btn span:first-child,.btn .icon,.nav .fa,.nav .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .nav span.toctree-expand,.nav .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .nav span.toctree-expand,.nav .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .nav span.toctree-expand,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .rst-content p.caption .headerlink,.rst-content p.caption .nav .headerlink,.nav .rst-content tt.download span:first-child,.rst-content tt.download .nav span:first-child,.nav .rst-content code.download span:first-child,.rst-content code.download .nav span:first-child,.nav .icon{display:inline}.btn .fa.fa-large,.btn .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .btn span.fa-large.toctree-expand,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .btn .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .btn span.fa-large:first-child,.btn .rst-content code.download span.fa-large:first-child,.rst-content code.download .btn span.fa-large:first-child,.btn .fa-large.icon,.nav .fa.fa-large,.nav .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .nav span.fa-large.toctree-expand,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .nav .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.nav .rst-content code.download span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.nav .fa-large.icon{line-height:0.9em}.btn .fa.fa-spin,.btn .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .btn span.fa-spin.toctree-expand,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .btn .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .btn span.fa-spin:first-child,.btn .rst-content code.download span.fa-spin:first-child,.rst-content code.download .btn span.fa-spin:first-child,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .nav span.fa-spin.toctree-expand,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .nav .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.nav .rst-content code.download span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.nav .fa-spin.icon{display:inline-block}.btn.fa:before,.wy-menu-vertical li span.btn.toctree-expand:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.rst-content p.caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.rst-content code.download span.btn:first-child:before,.btn.icon:before{opacity:0.5;-webkit-transition:opacity 0.05s ease-in;-moz-transition:opacity 0.05s ease-in;transition:opacity 0.05s ease-in}.btn.fa:hover:before,.wy-menu-vertical li span.btn.toctree-expand:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content p.caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.rst-content code.download span.btn:first-child:hover:before,.btn.icon:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li .btn-mini span.toctree-expand:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .rst-content p.caption .headerlink:before,.rst-content p.caption .btn-mini .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.rst-content tt.download .btn-mini span:first-child:before,.btn-mini .rst-content code.download span:first-child:before,.rst-content code.download .btn-mini span:first-child:before,.btn-mini .icon:before{font-size:14px;vertical-align:-15%}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:#6ab0de;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.admonition-todo{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso,.rst-content .admonition-todo{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .admonition-todo .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .admonition-todo .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso,.rst-content .wy-alert-info.admonition-todo{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title,.rst-content .wy-alert-info.admonition-todo .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.admonition-todo{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.admonition-todo .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.admonition-todo{background:#f3f6f6}.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .admonition-title{color:#404040;background:#e1e4e5}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.admonition-todo a{color:#2980B9}.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child,.rst-content .admonition-todo p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0px;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all 0.3s ease-in;-moz-transition:all 0.3s ease-in;transition:all 0.3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27AE60}.wy-tray-container li.wy-tray-item-info{background:#2980B9}.wy-tray-container li.wy-tray-item-warning{background:#E67E22}.wy-tray-container li.wy-tray-item-danger{background:#E74C3C}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width: 768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);background-color:#27AE60;text-decoration:none;font-weight:normal;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset;outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all 0.1s linear;-moz-transition:all 0.1s linear;transition:all 0.1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset;padding:8px 12px 6px 12px}.btn:visited{color:#fff}.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980B9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-neutral:visited{color:#404040 !important}.btn-success{background-color:#27AE60 !important}.btn-success:hover{background-color:#295 !important}.btn-danger{background-color:#E74C3C !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#E67E22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f !important}.btn-link{background-color:transparent !important;color:#2980B9;box-shadow:none;border-color:transparent !important}.btn-link:hover{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:active{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:visited{color:#9B59B6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980B9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type="search"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980B9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 .3125em 0;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#E74C3C}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{width:100%}.wy-control-group .wy-form-full{float:left;display:block;margin-right:2.35765%;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child{margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n+1){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child{margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control{margin:6px 0 0 0;font-size:90%}.wy-control-no-input{display:inline-block;margin:6px 0 0 0;font-size:90%}.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:0.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;*overflow:visible}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}input[type="datetime-local"]{padding:.34375em .625em}input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{outline:0;outline:thin dotted \9;border-color:#333}input.no-focus:focus{border-color:#ccc !important}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:1px auto #129FEA}input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#E74C3C;border:1px solid #E74C3C}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#E74C3C}input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{outline-color:#E74C3C}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type="radio"][disabled],input[type="checkbox"][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{width:36px;height:12px;margin:12px 0;position:relative;border-radius:4px;background:#ccc;cursor:pointer;-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.wy-switch:before{position:absolute;content:"";display:block;width:18px;height:18px;border-radius:4px;background:#999;left:-3px;top:-3px;-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.wy-switch:after{content:"false";position:absolute;left:48px;display:block;font-size:12px;color:#ccc}.wy-switch.active{background:#1e8449}.wy-switch.active:before{left:24px;background:#27AE60}.wy-switch.active:after{content:"true"}.wy-switch.disabled,.wy-switch.active.disabled{cursor:not-allowed}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#E74C3C}.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{border:solid 1px #E74C3C}.wy-control-group.wy-control-group-error textarea{border:solid 1px #E74C3C}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27AE60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#E74C3C}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#E67E22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980B9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width: 480px){.wy-form button[type="submit"]{margin:0.7em 0 0}.wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0.3em;display:block}.wy-form label{margin-bottom:0.3em;display:block}.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:0.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width: 768px){.tablet-hide{display:none}}@media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px}.wy-table td p:last-child,.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child{margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0 !important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980B9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9B59B6}html{height:100%;overflow-x:hidden}body{font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#E67E22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980B9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27AE60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#E74C3C !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}h1,h2,.rst-content .toctree-wrapper p.caption,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2,.rst-content .toctree-wrapper p.caption{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}code,.rst-content tt,.rst-content code{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;color:#E74C3C;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li p:last-child,.rst-content .section ul li p:last-child,.rst-content .toctree-wrapper ul li p:last-child,article ul li p:last-child{margin-bottom:0}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{list-style:square}.wy-plain-list-disc li ol li,.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,article ul li ol li{list-style:decimal}.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{list-style:decimal;margin-left:24px}.wy-plain-list-decimal li p:last-child,.rst-content .section ol li p:last-child,.rst-content ol.arabic li p:last-child,article ol li p:last-child{margin-bottom:0}.wy-plain-list-decimal li ul,.rst-content .section ol li ul,.rst-content ol.arabic li ul,article ol li ul{margin-bottom:0}.wy-plain-list-decimal li ul li,.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,article ol li ul li{list-style:disc}.codeblock-example{border:1px solid #e1e4e5;border-bottom:none;padding:24px;padding-top:48px;font-weight:500;background:#fff;position:relative}.codeblock-example:after{content:"Example";position:absolute;top:0px;left:0px;background:#9B59B6;color:#fff;padding:6px 12px}.codeblock-example.prettyprint-example-only{border:1px solid #e1e4e5;margin-bottom:24px}.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight']{border:1px solid #e1e4e5;padding:0px;overflow-x:auto;background:#fff;margin:1px 0 24px 0}.codeblock div[class^='highlight'],pre.literal-block div[class^='highlight'],.rst-content .literal-block div[class^='highlight'],div[class^='highlight'] div[class^='highlight']{border:none;background:none;margin:0}div[class^='highlight'] td.code{width:100%}.linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;font-size:12px;line-height:1.5;color:#d9d9d9}div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;font-size:12px;line-height:1.5;display:block;overflow:auto;color:#404040}@media print{.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight'],div[class^='highlight'] pre{white-space:pre-wrap}}.hll{background-color:#ffc;margin:0 -12px;padding:0 12px;display:block}.c{color:#998;font-style:italic}.err{color:#a61717;background-color:#e3d2d2}.k{font-weight:bold}.o{font-weight:bold}.cm{color:#998;font-style:italic}.cp{color:#999;font-weight:bold}.c1{color:#998;font-style:italic}.cs{color:#999;font-weight:bold;font-style:italic}.gd{color:#000;background-color:#fdd}.gd .x{color:#000;background-color:#faa}.ge{font-style:italic}.gr{color:#a00}.gh{color:#999}.gi{color:#000;background-color:#dfd}.gi .x{color:#000;background-color:#afa}.go{color:#888}.gp{color:#555}.gs{font-weight:bold}.gu{color:purple;font-weight:bold}.gt{color:#a00}.kc{font-weight:bold}.kd{font-weight:bold}.kn{font-weight:bold}.kp{font-weight:bold}.kr{font-weight:bold}.kt{color:#458;font-weight:bold}.m{color:#099}.s{color:#d14}.n{color:#333}.na{color:teal}.nb{color:#0086b3}.nc{color:#458;font-weight:bold}.no{color:teal}.ni{color:purple}.ne{color:#900;font-weight:bold}.nf{color:#900;font-weight:bold}.nn{color:#555}.nt{color:navy}.nv{color:teal}.ow{font-weight:bold}.w{color:#bbb}.mf{color:#099}.mh{color:#099}.mi{color:#099}.mo{color:#099}.sb{color:#d14}.sc{color:#d14}.sd{color:#d14}.s2{color:#d14}.se{color:#d14}.sh{color:#d14}.si{color:#d14}.sx{color:#d14}.sr{color:#009926}.s1{color:#d14}.ss{color:#990073}.bp{color:#999}.vc{color:teal}.vg{color:teal}.vi{color:teal}.il{color:#099}.gc{color:#999;background-color:#EAF2F5}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs li code,.wy-breadcrumbs li .rst-content tt,.rst-content .wy-breadcrumbs li tt{padding:5px;border:none;background:none}.wy-breadcrumbs li code.literal,.wy-breadcrumbs li .rst-content tt.literal,.rst-content .wy-breadcrumbs li tt.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width: 480px){.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{height:32px;display:inline-block;line-height:32px;padding:0 1.618em;margin-bottom:0;display:block;font-weight:bold;text-transform:uppercase;font-size:80%;color:#555;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:gray;border-right:solid 1px #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.wy-menu-vertical li code,.wy-menu-vertical li .rst-content tt,.rst-content .wy-menu-vertical li tt{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li span.toctree-expand{display:block;float:left;margin-left:-1.2em;font-size:0.8em;line-height:1.6em;color:#4d4d4d}.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{color:#404040;padding:.4045em 1.618em;font-weight:bold;position:relative;background:#fcfcfc;border:none;border-bottom:solid 1px #c9c9c9;border-top:solid 1px #c9c9c9;padding-left:1.618em -4px}.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc}.wy-menu-vertical li.on a:hover span.toctree-expand,.wy-menu-vertical li.current>a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand{display:block;font-size:0.8em;line-height:1.6em;color:#333}.wy-menu-vertical li.toctree-l1.current li.toctree-l2>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>ul{display:none}.wy-menu-vertical li.toctree-l1.current li.toctree-l2.current>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current>ul{display:block}.wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{display:block;background:#c9c9c9;padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l2 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l2 span.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3{font-size:0.9em}.wy-menu-vertical li.toctree-l3.current>a{background:#bdbdbd;padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{display:block;background:#bdbdbd;padding:.4045em 5.663em;border-top:none;border-bottom:none}.wy-menu-vertical li.toctree-l3 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l3 span.toctree-expand{color:#969696}.wy-menu-vertical li.toctree-l4{font-size:0.9em}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical .local-toc li ul{display:block}.wy-menu-vertical li ul li a{margin-bottom:0;color:#b3b3b3;font-weight:normal}.wy-menu-vertical a{display:inline-block;line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#b3b3b3}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover span.toctree-expand{color:#b3b3b3}.wy-menu-vertical a:active{background-color:#2980B9;cursor:pointer;color:#fff}.wy-menu-vertical a:active span.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980B9;text-align:center;padding:.809em;display:block;color:#fcfcfc;margin-bottom:.809em}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em auto;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{color:#fcfcfc;font-size:100%;font-weight:bold;display:inline-block;padding:4px 6px;margin-bottom:.809em}.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-side-nav-search>a img.logo,.wy-side-nav-search .wy-dropdown>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search>a.icon img.logo,.wy-side-nav-search .wy-dropdown>a.icon img.logo{margin-top:0.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:normal;color:rgba(255,255,255,0.3)}.wy-nav .wy-menu-vertical header{color:#2980B9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980B9;color:#fff}[data-menu-wrap]{-webkit-transition:all 0.2s ease-in;-moz-transition:all 0.2s ease-in;transition:all 0.2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:left repeat-y #fcfcfc;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxOERBMTRGRDBFMUUxMUUzODUwMkJCOThDMEVFNURFMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOERBMTRGRTBFMUUxMUUzODUwMkJCOThDMEVFNURFMCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjE4REExNEZCMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjE4REExNEZDMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+EwrlwAAAAA5JREFUeNpiMDU0BAgwAAE2AJgB9BnaAAAAAElFTkSuQmCC);background-size:300px 1px}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980B9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:before,.wy-nav-top:after{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:#999}footer p{margin-bottom:12px}footer span.commit code,footer span.commit .rst-content tt,.rst-content footer span.commit tt{padding:0px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;font-size:1em;background:none;border:none;color:#999}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:before,.rst-breadcrumbs-buttons:after{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%}@media screen and (max-width: 768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-side-scroll{width:auto}.wy-side-nav-search{width:auto}.wy-menu.wy-menu-vertical{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width: 1400px){.wy-nav-content-wrap{background:rgba(0,0,0,0.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,footer,.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version span.toctree-expand,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content p.caption .headerlink,.rst-content p.caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content img{max-width:100%;height:auto !important}.rst-content .highlight>pre{line-height:normal}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure p.caption{font-style:italic}.rst-content div.figure.align-center{text-align:center}.rst-content .section>img,.rst-content .section>a>img{margin-bottom:24px}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last,.rst-content .admonition-todo .last{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{list-style:upper-alpha}.rst-content .section ol p,.rst-content .section ul p{margin-bottom:12px}.rst-content .line-block{margin-left:24px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto;display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content .toctree-wrapper p.caption .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink{display:none;visibility:hidden;font-size:14px}.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content .toctree-wrapper p.caption .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after,.rst-content p.caption .headerlink:after{visibility:visible;content:"";font-family:FontAwesome;display:inline-block}.rst-content h1:hover .headerlink,.rst-content h2:hover .headerlink,.rst-content .toctree-wrapper p.caption:hover .headerlink,.rst-content h3:hover .headerlink,.rst-content h4:hover .headerlink,.rst-content h5:hover .headerlink,.rst-content h6:hover .headerlink,.rst-content dl dt:hover .headerlink,.rst-content p.caption:hover .headerlink{display:inline-block}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#F1C40F;display:inline-block;font-weight:bold;padding:0 6px}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:super;font-size:90%}.rst-content table.docutils.citation,.rst-content table.docutils.footnote{background:none;border:none;color:#999}.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}.rst-content table.docutils.citation tt,.rst-content table.docutils.citation code,.rst-content table.docutils.footnote tt,.rst-content table.docutils.footnote code{color:#555}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none;padding-top:5px}.rst-content table.field-list td>strong{display:inline-block;margin-top:3px}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left;padding-left:0}.rst-content tt,.rst-content tt,.rst-content code{color:#000;padding:2px 5px}.rst-content tt big,.rst-content tt em,.rst-content tt big,.rst-content code big,.rst-content tt em,.rst-content code em{font-size:100% !important;line-height:normal}.rst-content tt.literal,.rst-content tt.literal,.rst-content code.literal{color:#E74C3C}.rst-content tt.xref,a .rst-content tt,.rst-content tt.xref,.rst-content code.xref,a .rst-content tt,a .rst-content code{font-weight:bold;color:#404040}.rst-content a tt,.rst-content a tt,.rst-content a code{color:#2980B9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px !important}.rst-content dl dd{margin:0 0 12px 24px}.rst-content dl:not(.docutils){margin-bottom:24px}.rst-content dl:not(.docutils) dt{display:inline-block;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980B9;border-top:solid 3px #6ab0de;padding:6px;position:relative}.rst-content dl:not(.docutils) dt:before{color:#6ab0de}.rst-content dl:not(.docutils) dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dl dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:#555}.rst-content dl:not(.docutils) dl dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dt:first-child{margin-top:0}.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) code{font-weight:bold}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) code.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname{font-weight:bold}.rst-content dl:not(.docutils) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}.rst-content dl:not(.docutils) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27AE60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:bold}.rst-content tt.download,.rst-content code.download{background:inherit;padding:inherit;font-weight:normal;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content tt.download span:first-child,.rst-content code.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}@media screen and (max-width: 480px){.rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040}.math{text-align:center}@font-face{font-family:"Inconsolata";font-style:normal;font-weight:400;src:local("Inconsolata"),local("Inconsolata-Regular"),url(../fonts/Inconsolata-Regular.ttf) format("truetype")}@font-face{font-family:"Inconsolata";font-style:normal;font-weight:700;src:local("Inconsolata Bold"),local("Inconsolata-Bold"),url(../fonts/Inconsolata-Bold.ttf) format("truetype")}@font-face{font-family:"Lato";font-style:normal;font-weight:400;src:local("Lato Regular"),local("Lato-Regular"),url(../fonts/Lato-Regular.ttf) format("truetype")}@font-face{font-family:"Lato";font-style:normal;font-weight:700;src:local("Lato Bold"),local("Lato-Bold"),url(../fonts/Lato-Bold.ttf) format("truetype")}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:400;src:local("Roboto Slab Regular"),local("RobotoSlab-Regular"),url(../fonts/RobotoSlab-Regular.ttf) format("truetype")}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:700;src:local("Roboto Slab Bold"),local("RobotoSlab-Bold"),url(../fonts/RobotoSlab-Bold.ttf) format("truetype")} + */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.2.0");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff?v=4.2.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.2.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content p.caption .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:0.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.wy-menu-vertical li span.pull-left.toctree-expand,.wy-menu-vertical li.on a span.pull-left.toctree-expand,.wy-menu-vertical li.current>a span.pull-left.toctree-expand,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content p.caption .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.rst-content code.download span.pull-left:first-child,.pull-left.icon{margin-right:.3em}.fa.pull-right,.wy-menu-vertical li span.pull-right.toctree-expand,.wy-menu-vertical li.on a span.pull-right.toctree-expand,.wy-menu-vertical li.current>a span.pull-right.toctree-expand,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content p.caption .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.rst-content code.download span.pull-right:first-child,.pull-right.icon{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li span.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content p.caption .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{font-family:inherit}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{font-family:"FontAwesome";display:inline-block;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa,a .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content p.caption .headerlink,.rst-content p.caption a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .rst-content tt.download span:first-child,.rst-content tt.download a span:first-child,a .rst-content code.download span:first-child,.rst-content code.download a span:first-child,a .icon{display:inline-block;text-decoration:inherit}.btn .fa,.btn .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .btn span.toctree-expand,.btn .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .btn span.toctree-expand,.btn .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .btn span.toctree-expand,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content p.caption .headerlink,.rst-content p.caption .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .rst-content tt.download span:first-child,.rst-content tt.download .btn span:first-child,.btn .rst-content code.download span:first-child,.rst-content code.download .btn span:first-child,.btn .icon,.nav .fa,.nav .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .nav span.toctree-expand,.nav .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .nav span.toctree-expand,.nav .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .nav span.toctree-expand,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content p.caption .headerlink,.rst-content p.caption .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .rst-content tt.download span:first-child,.rst-content tt.download .nav span:first-child,.nav .rst-content code.download span:first-child,.rst-content code.download .nav span:first-child,.nav .icon{display:inline}.btn .fa.fa-large,.btn .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .btn span.fa-large.toctree-expand,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .btn span.fa-large:first-child,.btn .rst-content code.download span.fa-large:first-child,.rst-content code.download .btn span.fa-large:first-child,.btn .fa-large.icon,.nav .fa.fa-large,.nav .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .nav span.fa-large.toctree-expand,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.nav .rst-content code.download span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.nav .fa-large.icon{line-height:0.9em}.btn .fa.fa-spin,.btn .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .btn span.fa-spin.toctree-expand,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .btn span.fa-spin:first-child,.btn .rst-content code.download span.fa-spin:first-child,.rst-content code.download .btn span.fa-spin:first-child,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .nav span.fa-spin.toctree-expand,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.nav .rst-content code.download span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.nav .fa-spin.icon{display:inline-block}.btn.fa:before,.wy-menu-vertical li span.btn.toctree-expand:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content p.caption .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.rst-content code.download span.btn:first-child:before,.btn.icon:before{opacity:0.5;-webkit-transition:opacity 0.05s ease-in;-moz-transition:opacity 0.05s ease-in;transition:opacity 0.05s ease-in}.btn.fa:hover:before,.wy-menu-vertical li span.btn.toctree-expand:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content p.caption .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.rst-content code.download span.btn:first-child:hover:before,.btn.icon:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li .btn-mini span.toctree-expand:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content p.caption .headerlink:before,.rst-content p.caption .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.rst-content tt.download .btn-mini span:first-child:before,.btn-mini .rst-content code.download span:first-child:before,.rst-content code.download .btn-mini span:first-child:before,.btn-mini .icon:before{font-size:14px;vertical-align:-15%}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:#6ab0de;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.admonition-todo{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso,.rst-content .admonition-todo{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .admonition-todo .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .admonition-todo .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso,.rst-content .wy-alert-info.admonition-todo{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title,.rst-content .wy-alert-info.admonition-todo .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.admonition-todo{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.admonition-todo .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.admonition-todo{background:#f3f6f6}.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .admonition-title{color:#404040;background:#e1e4e5}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.admonition-todo a{color:#2980B9}.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child,.rst-content .admonition-todo p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0px;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all 0.3s ease-in;-moz-transition:all 0.3s ease-in;transition:all 0.3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27AE60}.wy-tray-container li.wy-tray-item-info{background:#2980B9}.wy-tray-container li.wy-tray-item-warning{background:#E67E22}.wy-tray-container li.wy-tray-item-danger{background:#E74C3C}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width: 768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);background-color:#27AE60;text-decoration:none;font-weight:normal;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset;outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all 0.1s linear;-moz-transition:all 0.1s linear;transition:all 0.1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset;padding:8px 12px 6px 12px}.btn:visited{color:#fff}.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980B9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-neutral:visited{color:#404040 !important}.btn-success{background-color:#27AE60 !important}.btn-success:hover{background-color:#295 !important}.btn-danger{background-color:#E74C3C !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#E67E22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f !important}.btn-link{background-color:transparent !important;color:#2980B9;box-shadow:none;border-color:transparent !important}.btn-link:hover{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:active{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:visited{color:#9B59B6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980B9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type="search"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980B9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 0.3125em 0;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#E74C3C}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{width:100%}.wy-control-group .wy-form-full{float:left;display:block;margin-right:2.35765%;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child{margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n+1){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child{margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control{margin:6px 0 0 0;font-size:90%}.wy-control-no-input{display:inline-block;margin:6px 0 0 0;font-size:90%}.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:0.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:0.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;*overflow:visible}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}input[type="datetime-local"]{padding:0.34375em 0.625em}input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:0.3125em;*height:13px;*width:13px}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{outline:0;outline:thin dotted \9;border-color:#333}input.no-focus:focus{border-color:#ccc !important}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:1px auto #129FEA}input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#E74C3C;border:1px solid #E74C3C}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#E74C3C}input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{outline-color:#E74C3C}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif}select,textarea{padding:0.5em 0.625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type="radio"][disabled],input[type="checkbox"][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{width:36px;height:12px;margin:12px 0;position:relative;border-radius:4px;background:#ccc;cursor:pointer;-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.wy-switch:before{position:absolute;content:"";display:block;width:18px;height:18px;border-radius:4px;background:#999;left:-3px;top:-3px;-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.wy-switch:after{content:"false";position:absolute;left:48px;display:block;font-size:12px;color:#ccc}.wy-switch.active{background:#1e8449}.wy-switch.active:before{left:24px;background:#27AE60}.wy-switch.active:after{content:"true"}.wy-switch.disabled,.wy-switch.active.disabled{cursor:not-allowed}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#E74C3C}.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{border:solid 1px #E74C3C}.wy-control-group.wy-control-group-error textarea{border:solid 1px #E74C3C}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:0.5em 0.625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27AE60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#E74C3C}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#E67E22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980B9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width: 480px){.wy-form button[type="submit"]{margin:0.7em 0 0}.wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0.3em;display:block}.wy-form label{margin-bottom:0.3em;display:block}.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:0.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width: 768px){.tablet-hide{display:none}}@media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px}.wy-table td p:last-child,.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child{margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0 !important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980B9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9B59B6}html{height:100%;overflow-x:hidden}body{font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#E67E22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980B9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27AE60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#E74C3C !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}h1,h2,.rst-content p.caption,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2,.rst-content p.caption{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}code,.rst-content tt,.rst-content code{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;color:#E74C3C;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li p:last-child,.rst-content .section ul li p:last-child,.rst-content .toctree-wrapper ul li p:last-child,article ul li p:last-child{margin-bottom:0}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{list-style:square}.wy-plain-list-disc li ol li,.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,article ul li ol li{list-style:decimal}.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{list-style:decimal;margin-left:24px}.wy-plain-list-decimal li p:last-child,.rst-content .section ol li p:last-child,.rst-content ol.arabic li p:last-child,article ol li p:last-child{margin-bottom:0}.wy-plain-list-decimal li ul,.rst-content .section ol li ul,.rst-content ol.arabic li ul,article ol li ul{margin-bottom:0}.wy-plain-list-decimal li ul li,.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,article ol li ul li{list-style:disc}.codeblock-example{border:1px solid #e1e4e5;border-bottom:none;padding:24px;padding-top:48px;font-weight:500;background:#fff;position:relative}.codeblock-example:after{content:"Example";position:absolute;top:0px;left:0px;background:#9B59B6;color:#fff;padding:6px 12px}.codeblock-example.prettyprint-example-only{border:1px solid #e1e4e5;margin-bottom:24px}.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight']{border:1px solid #e1e4e5;padding:0px;overflow-x:auto;background:#fff;margin:1px 0 24px 0}.codeblock div[class^='highlight'],pre.literal-block div[class^='highlight'],.rst-content .literal-block div[class^='highlight'],div[class^='highlight'] div[class^='highlight']{border:none;background:none;margin:0}div[class^='highlight'] td.code{width:100%}.linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;font-size:12px;line-height:1.5;color:#d9d9d9}div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;font-size:12px;line-height:1.5;display:block;overflow:auto;color:#404040}@media print{.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight'],div[class^='highlight'] pre{white-space:pre-wrap}}.hll{background-color:#ffc;margin:0 -12px;padding:0 12px;display:block}.c{color:#998;font-style:italic}.err{color:#a61717;background-color:#e3d2d2}.k{font-weight:bold}.o{font-weight:bold}.cm{color:#998;font-style:italic}.cp{color:#999;font-weight:bold}.c1{color:#998;font-style:italic}.cs{color:#999;font-weight:bold;font-style:italic}.gd{color:#000;background-color:#fdd}.gd .x{color:#000;background-color:#faa}.ge{font-style:italic}.gr{color:#a00}.gh{color:#999}.gi{color:#000;background-color:#dfd}.gi .x{color:#000;background-color:#afa}.go{color:#888}.gp{color:#555}.gs{font-weight:bold}.gu{color:purple;font-weight:bold}.gt{color:#a00}.kc{font-weight:bold}.kd{font-weight:bold}.kn{font-weight:bold}.kp{font-weight:bold}.kr{font-weight:bold}.kt{color:#458;font-weight:bold}.m{color:#099}.s{color:#d14}.n{color:#333}.na{color:teal}.nb{color:#0086b3}.nc{color:#458;font-weight:bold}.no{color:teal}.ni{color:purple}.ne{color:#900;font-weight:bold}.nf{color:#900;font-weight:bold}.nn{color:#555}.nt{color:navy}.nv{color:teal}.ow{font-weight:bold}.w{color:#bbb}.mf{color:#099}.mh{color:#099}.mi{color:#099}.mo{color:#099}.sb{color:#d14}.sc{color:#d14}.sd{color:#d14}.s2{color:#d14}.se{color:#d14}.sh{color:#d14}.si{color:#d14}.sx{color:#d14}.sr{color:#009926}.s1{color:#d14}.ss{color:#990073}.bp{color:#999}.vc{color:teal}.vg{color:teal}.vi{color:teal}.il{color:#099}.gc{color:#999;background-color:#EAF2F5}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width: 480px){.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical header,.wy-menu-vertical p.caption{height:32px;display:inline-block;line-height:32px;padding:0 1.618em;margin-bottom:0;display:block;font-weight:bold;text-transform:uppercase;font-size:80%;color:#555;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:gray;border-right:solid 1px #c9c9c9;padding:0.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.wy-menu-vertical li code,.wy-menu-vertical li .rst-content tt,.rst-content .wy-menu-vertical li tt{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li span.toctree-expand{display:block;float:left;margin-left:-1.2em;font-size:0.8em;line-height:1.6em;color:#4d4d4d}.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{color:#404040;padding:0.4045em 1.618em;font-weight:bold;position:relative;background:#fcfcfc;border:none;border-bottom:solid 1px #c9c9c9;border-top:solid 1px #c9c9c9;padding-left:1.618em -4px}.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc}.wy-menu-vertical li.on a:hover span.toctree-expand,.wy-menu-vertical li.current>a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand{display:block;font-size:0.8em;line-height:1.6em;color:#333}.wy-menu-vertical li.toctree-l1.current li.toctree-l2>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>ul{display:none}.wy-menu-vertical li.toctree-l1.current li.toctree-l2.current>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current>ul{display:block}.wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9;padding:0.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{display:block;background:#c9c9c9;padding:0.4045em 4.045em}.wy-menu-vertical li.toctree-l2 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l2 span.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3{font-size:0.9em}.wy-menu-vertical li.toctree-l3.current>a{background:#bdbdbd;padding:0.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{display:block;background:#bdbdbd;padding:0.4045em 5.663em;border-top:none;border-bottom:none}.wy-menu-vertical li.toctree-l3 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l3 span.toctree-expand{color:#969696}.wy-menu-vertical li.toctree-l4{font-size:0.9em}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical .local-toc li ul{display:block}.wy-menu-vertical li ul li a{margin-bottom:0;color:#b3b3b3;font-weight:normal}.wy-menu-vertical a{display:inline-block;line-height:18px;padding:0.4045em 1.618em;display:block;position:relative;font-size:90%;color:#b3b3b3}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover span.toctree-expand{color:#b3b3b3}.wy-menu-vertical a:active{background-color:#2980B9;cursor:pointer;color:#fff}.wy-menu-vertical a:active span.toctree-expand{color:#fff}.wy-side-nav-search{z-index:200;background-color:#2980B9;text-align:center;padding:0.809em;display:block;color:#fcfcfc;margin-bottom:0.809em}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto 0.809em auto;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{color:#fcfcfc;font-size:100%;font-weight:bold;display:inline-block;padding:4px 6px;margin-bottom:0.809em}.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-side-nav-search>a img.logo,.wy-side-nav-search .wy-dropdown>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search>a.icon img.logo,.wy-side-nav-search .wy-dropdown>a.icon img.logo{margin-top:0.85em}.wy-nav .wy-menu-vertical header{color:#2980B9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980B9;color:#fff}[data-menu-wrap]{-webkit-transition:all 0.2s ease-in;-moz-transition:all 0.2s ease-in;transition:all 0.2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:left repeat-y #fcfcfc;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxOERBMTRGRDBFMUUxMUUzODUwMkJCOThDMEVFNURFMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOERBMTRGRTBFMUUxMUUzODUwMkJCOThDMEVFNURFMCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjE4REExNEZCMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjE4REExNEZDMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+EwrlwAAAAA5JREFUeNpiMDU0BAgwAAE2AJgB9BnaAAAAAElFTkSuQmCC);background-size:300px 1px}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:scroll;min-height:100%;background:#343131;z-index:200}.wy-nav-top{display:none;background:#2980B9;color:#fff;padding:0.4045em 0.809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:before,.wy-nav-top:after{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:#999}footer p{margin-bottom:12px}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:""}.rst-footer-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%}@media screen and (max-width: 768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width: 1400px){.wy-nav-content-wrap{background:rgba(0,0,0,0.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,footer,.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version span.toctree-expand,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content p.caption .headerlink,.rst-content p.caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}}.rst-content img{max-width:100%;height:auto !important}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure.align-center{text-align:center}.rst-content .section>img,.rst-content .section>a>img{margin-bottom:24px}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last,.rst-content .admonition-todo .last{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{list-style:upper-alpha}.rst-content .section ol p,.rst-content .section ul p{margin-bottom:12px}.rst-content .line-block{margin-left:24px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto;display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content p.caption .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink{display:none;visibility:hidden;font-size:14px}.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content p.caption .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after,.rst-content p.caption .headerlink:after{visibility:visible;content:"";font-family:FontAwesome;display:inline-block}.rst-content h1:hover .headerlink,.rst-content h2:hover .headerlink,.rst-content p.caption:hover .headerlink,.rst-content h3:hover .headerlink,.rst-content h4:hover .headerlink,.rst-content h5:hover .headerlink,.rst-content h6:hover .headerlink,.rst-content dl dt:hover .headerlink,.rst-content p.caption:hover .headerlink{display:inline-block}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#F1C40F;display:inline-block;font-weight:bold;padding:0 6px}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:super;font-size:90%}.rst-content table.docutils.citation,.rst-content table.docutils.footnote{background:none;border:none;color:#999}.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none;padding-top:5px}.rst-content table.field-list td>strong{display:inline-block;margin-top:3px}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left;padding-left:0}.rst-content tt,.rst-content tt,.rst-content code{color:#000}.rst-content tt big,.rst-content tt em,.rst-content tt big,.rst-content code big,.rst-content tt em,.rst-content code em{font-size:100% !important;line-height:normal}.rst-content tt .xref,a .rst-content tt,.rst-content tt .xref,.rst-content code .xref,a .rst-content tt,a .rst-content code{font-weight:bold}.rst-content a tt,.rst-content a tt,.rst-content a code{color:#2980B9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px !important}.rst-content dl dd{margin:0 0 12px 24px}.rst-content dl:not(.docutils){margin-bottom:24px}.rst-content dl:not(.docutils) dt{display:inline-block;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980B9;border-top:solid 3px #6ab0de;padding:6px;position:relative}.rst-content dl:not(.docutils) dt:before{color:#6ab0de}.rst-content dl:not(.docutils) dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dl dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:gray}.rst-content dl:not(.docutils) dl dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dt:first-child{margin-top:0}.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) code{font-weight:bold}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) code.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname{font-weight:bold}.rst-content dl:not(.docutils) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}.rst-content dl:not(.docutils) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27AE60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:bold}.rst-content tt.download,.rst-content code.download{background:inherit;padding:inherit;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{margin-right:4px}@media screen and (max-width: 480px){.rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040}.math{text-align:center}@font-face{font-family:"Inconsolata";font-style:normal;font-weight:400;src:local("Inconsolata"),url(../fonts/Inconsolata.ttf) format("truetype")}@font-face{font-family:"Inconsolata";font-style:normal;font-weight:700;src:local("Inconsolata Bold"),local("Inconsolata-Bold"),url(../fonts/Inconsolata-Bold.ttf) format("truetype")}@font-face{font-family:"Lato";font-style:normal;font-weight:400;src:local("Lato Regular"),local("Lato-Regular"),url(../fonts/Lato-Regular.ttf) format("truetype")}@font-face{font-family:"Lato";font-style:normal;font-weight:700;src:local("Lato Bold"),local("Lato-Bold"),url(../fonts/Lato-Bold.ttf) format("truetype")}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:400;src:local("Roboto Slab Regular"),local("RobotoSlab-Regular"),url(../fonts/RobotoSlab-Regular.ttf) format("truetype")}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:700;src:local("Roboto Slab Bold"),local("RobotoSlab-Bold"),url(../fonts/RobotoSlab-Bold.ttf) format("truetype")} /*# sourceMappingURL=theme.css.map */ diff --git a/_static/fonts/Inconsolata-Bold.ttf b/_static/fonts/Inconsolata-Bold.ttf index 809c1f58..360a232d 100644 Binary files a/_static/fonts/Inconsolata-Bold.ttf and b/_static/fonts/Inconsolata-Bold.ttf differ diff --git a/_static/fonts/Inconsolata-Regular.ttf b/_static/fonts/Inconsolata-Regular.ttf deleted file mode 100644 index fc981ce7..00000000 Binary files a/_static/fonts/Inconsolata-Regular.ttf and /dev/null differ diff --git a/_static/fonts/Lato-Bold.ttf b/_static/fonts/Lato-Bold.ttf index 1d23c706..e8b9bf6a 100644 Binary files a/_static/fonts/Lato-Bold.ttf and b/_static/fonts/Lato-Bold.ttf differ diff --git a/_static/fonts/Lato-Regular.ttf b/_static/fonts/Lato-Regular.ttf index 0f3d0f83..7608bc3e 100644 Binary files a/_static/fonts/Lato-Regular.ttf and b/_static/fonts/Lato-Regular.ttf differ diff --git a/_static/fonts/RobotoSlab-Bold.ttf b/_static/fonts/RobotoSlab-Bold.ttf index df5d1df2..e6ed0de5 100644 Binary files a/_static/fonts/RobotoSlab-Bold.ttf and b/_static/fonts/RobotoSlab-Bold.ttf differ diff --git a/_static/fonts/RobotoSlab-Regular.ttf b/_static/fonts/RobotoSlab-Regular.ttf index eb52a790..141d6c08 100644 Binary files a/_static/fonts/RobotoSlab-Regular.ttf and b/_static/fonts/RobotoSlab-Regular.ttf differ diff --git a/_static/fonts/fontawesome-webfont.eot b/_static/fonts/fontawesome-webfont.eot index c7b00d2b..7c79c6a6 100644 Binary files a/_static/fonts/fontawesome-webfont.eot and b/_static/fonts/fontawesome-webfont.eot differ diff --git a/_static/fonts/fontawesome-webfont.svg b/_static/fonts/fontawesome-webfont.svg index 8b66187f..45fdf338 100644 --- a/_static/fonts/fontawesome-webfont.svg +++ b/_static/fonts/fontawesome-webfont.svg @@ -14,11 +14,10 @@ - - + - + @@ -31,7 +30,7 @@ - + @@ -53,7 +52,7 @@ - + @@ -78,11 +77,11 @@ - - - - - + + + + + @@ -110,8 +109,8 @@ - - + + @@ -144,17 +143,17 @@ - - + + - + - + - + @@ -169,7 +168,7 @@ - + @@ -177,14 +176,14 @@ - - + + - + @@ -219,8 +218,8 @@ - - + + @@ -248,10 +247,10 @@ - + - + @@ -275,7 +274,7 @@ - + @@ -346,8 +345,8 @@ - - + + @@ -362,14 +361,14 @@ - - + + - - + + @@ -380,7 +379,7 @@ - + @@ -399,287 +398,17 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/_static/fonts/fontawesome-webfont.ttf b/_static/fonts/fontawesome-webfont.ttf index f221e50a..e89738de 100644 Binary files a/_static/fonts/fontawesome-webfont.ttf and b/_static/fonts/fontawesome-webfont.ttf differ diff --git a/_static/fonts/fontawesome-webfont.woff b/_static/fonts/fontawesome-webfont.woff index 6e7483cf..8c1748aa 100644 Binary files a/_static/fonts/fontawesome-webfont.woff and b/_static/fonts/fontawesome-webfont.woff differ diff --git a/_static/js/theme.js b/_static/js/theme.js index af661a92..749e58f4 100644 --- a/_static/js/theme.js +++ b/_static/js/theme.js @@ -1,169 +1,113 @@ -require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o"); - - // Add expand links to all parents of nested ul - $('.wy-menu-vertical ul').not('.simple').siblings('a').each(function () { - var link = $(this); - expand = $(''); - expand.on('click', function (ev) { - self.toggleCurrent(link); - ev.stopPropagation(); - return false; - }); - link.prepend(expand); - }); - }; - - nav.reset = function () { - // Get anchor from URL and open up nested nav - var anchor = encodeURI(window.location.hash); - if (anchor) { - try { - var link = $('.wy-menu-vertical') - .find('[href="' + anchor + '"]'); - // If we didn't find a link, it may be because we clicked on - // something that is not in the sidebar (eg: when using - // sphinxcontrib.httpdomain it generates headerlinks but those - // aren't picked up and placed in the toctree). So let's find - // the closest header in the document and try with that one. - if (link.length === 0) { - var doc_link = $('.document a[href="' + anchor + '"]'); - var closest_section = doc_link.closest('div.section'); - // Try again with the closest section entry. - link = $('.wy-menu-vertical') - .find('[href="#' + closest_section.attr("id") + '"]'); - - } - $('.wy-menu-vertical li.toctree-l1 li.current') - .removeClass('current'); - link.closest('li.toctree-l2').addClass('current'); - link.closest('li.toctree-l3').addClass('current'); - link.closest('li.toctree-l4').addClass('current'); - } - catch (err) { - console.log("Error expanding nav for anchor", err); - } - } - }; - - nav.onScroll = function () { - this.winScroll = false; - var newWinPosition = this.win.scrollTop(), - winBottom = newWinPosition + this.winHeight, - navPosition = this.navBar.scrollTop(), - newNavPosition = navPosition + (newWinPosition - this.winPosition); - if (newWinPosition < 0 || winBottom > this.docHeight) { - return; - } - this.navBar.scrollTop(newNavPosition); - this.winPosition = newWinPosition; - }; - - nav.onResize = function () { - this.winResize = false; - this.winHeight = this.win.height(); - this.docHeight = $(document).height(); - }; - - nav.hashChange = function () { - this.linkScroll = true; - this.win.one('hashchange', function () { - this.linkScroll = false; - }); - }; - - nav.toggleCurrent = function (elem) { - var parent_li = elem.closest('li'); - parent_li.siblings('li.current').removeClass('current'); - parent_li.siblings().find('li.current').removeClass('current'); - parent_li.find('> ul li.current').removeClass('current'); - parent_li.toggleClass('current'); - } - - return nav; -}; - -module.exports.ThemeNav = ThemeNav(); - -if (typeof(window) != 'undefined') { - window.SphinxRtdTheme = { StickyNav: module.exports.ThemeNav }; +function toggleCurrent (elem) { + var parent_li = elem.closest('li'); + parent_li.siblings('li.current').removeClass('current'); + parent_li.siblings().find('li.current').removeClass('current'); + parent_li.find('> ul li.current').removeClass('current'); + parent_li.toggleClass('current'); } -},{"jquery":"jquery"}]},{},["sphinx-rtd-theme"]); +$(document).ready(function() { + // Shift nav in mobile when clicking the menu. + $(document).on('click', "[data-toggle='wy-nav-top']", function() { + $("[data-toggle='wy-nav-shift']").toggleClass("shift"); + $("[data-toggle='rst-versions']").toggleClass("shift"); + }); + // Nav menu link click operations + $(document).on('click', ".wy-menu-vertical .current ul li a", function() { + var target = $(this); + // Close menu when you click a link. + $("[data-toggle='wy-nav-shift']").removeClass("shift"); + $("[data-toggle='rst-versions']").toggleClass("shift"); + // Handle dynamic display of l3 and l4 nav lists + toggleCurrent(target); + if (typeof(window.SphinxRtdTheme) != 'undefined') { + window.SphinxRtdTheme.StickyNav.hashChange(); + } + }); + $(document).on('click', "[data-toggle='rst-current-version']", function() { + $("[data-toggle='rst-versions']").toggleClass("shift-up"); + }); + // Make tables responsive + $("table.docutils:not(.field-list)").wrap("
"); + + // Add expand links to all parents of nested ul + $('.wy-menu-vertical ul').siblings('a').each(function () { + var link = $(this); + expand = $(''); + expand.on('click', function (ev) { + toggleCurrent(link); + ev.stopPropagation(); + return false; + }); + link.prepend(expand); + }); +}); + +// Sphinx theme state +window.SphinxRtdTheme = (function (jquery) { + var stickyNav = (function () { + var navBar, + win, + winScroll = false, + linkScroll = false, + winPosition = 0, + enable = function () { + init(); + reset(); + win.on('hashchange', reset); + + // Set scrolling + win.on('scroll', function () { + if (!linkScroll) { + winScroll = true; + } + }); + setInterval(function () { + if (winScroll) { + winScroll = false; + var newWinPosition = win.scrollTop(), + navPosition = navBar.scrollTop(), + newNavPosition = navPosition + (newWinPosition - winPosition); + navBar.scrollTop(newNavPosition); + winPosition = newWinPosition; + } + }, 25); + }, + init = function () { + navBar = jquery('nav.wy-nav-side:first'); + win = jquery(window); + }, + reset = function () { + // Get anchor from URL and open up nested nav + var anchor = encodeURI(window.location.hash); + if (anchor) { + try { + var link = $('.wy-menu-vertical') + .find('[href="' + anchor + '"]'); + $('.wy-menu-vertical li.toctree-l1 li.current') + .removeClass('current'); + link.closest('li.toctree-l2').addClass('current'); + link.closest('li.toctree-l3').addClass('current'); + link.closest('li.toctree-l4').addClass('current'); + } + catch (err) { + console.log("Error expanding nav for anchor", err); + } + } + }, + hashChange = function () { + linkScroll = true; + win.one('hashchange', function () { + linkScroll = false; + }); + }; + jquery(init); + return { + enable: enable, + hashChange: hashChange + }; + }()); + return { + StickyNav: stickyNav + }; +}($)); diff --git a/appendix.html b/appendix.html index 7c285775..07d1f3b2 100644 --- a/appendix.html +++ b/appendix.html @@ -13,8 +13,6 @@ - - @@ -41,28 +39,21 @@ -
- - - - - - - - - - - - - - - - -
- +
- -
-
-
+

API Reference

@@ -255,10 +392,6 @@ data. This mapping is immutable and should only be updated through
-
-
- -
@@ -268,10 +401,9 @@ data. This mapping is immutable and should only be updated through

© Copyright 2018, Enigma MPC, Inc.. -

- Built with Sphinx using a theme provided by Read the Docs. + Built with Sphinx using a theme provided by Read the Docs.
@@ -292,8 +424,7 @@ data. This mapping is immutable and should only be updated through VERSION:'0.4', COLLAPSE_INDEX:false, FILE_SUFFIX:'.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '' + HAS_SOURCE: true }; diff --git a/beginner-tutorial.html b/beginner-tutorial.html index a207dea2..7492b193 100644 --- a/beginner-tutorial.html +++ b/beginner-tutorial.html @@ -13,8 +13,6 @@ - - @@ -43,28 +41,21 @@ -
- - - - - - - - - - - - - - - - -
- +
- -
-
-
+

Catalyst Beginner Tutorial

@@ -222,16 +340,16 @@ crypto asset in your universe.

My first algorithm

Lets take a look at a very simple algorithm from the examples directory: buy_btc_simple.py:

-
from catalyst.api import order, record, symbol
+
from catalyst.api import order, record, symbol
 
 
 def initialize(context):
-    context.asset = symbol('btc_usd')
+    context.asset = symbol('btc_usd')
 
 
 def handle_data(context, data):
     order(context.asset, 1)
-    record(btc = data.current(context.asset, 'price'))
+    record(btc = data.current(context.asset, 'price'))
 

As you can see, we first have to import some functions we would like to @@ -256,7 +374,7 @@ pricing data that Catalyst needs to run your simulation through a process called form from the Enigma servers (which eventually will migrate to the Enigma Data Marketplace), and stores it locally to make it available at runtime.

In order to ingest data, you need to run a command like the following:

-
catalyst ingest-exchange -x bitfinex -i btc_usd
+
catalyst ingest-exchange -x bitfinex -i btc_usd
 

This instructs Catalyst to download pricing data from the Bitfinex exchange @@ -266,10 +384,10 @@ our algorithm using historical pricing data from the Bitfinex exchange. By default, Catalyst assumes that you want data with daily frequency (one candle bar per day). If you want instead minute frequency (one candle bar for every minute), you would need to specify it as follows:

-
catalyst ingest-exchange -x bitfinex -i btc_usd -f minute
+
catalyst ingest-exchange -x bitfinex -i btc_usd -f minute
 
-
Ingesting exchange bundle bitfinex...
+
Ingesting exchange bundle bitfinex...
   [====================================]  Ingesting daily price data on bitfinex:  100%
 
@@ -296,7 +414,7 @@ to the exchange.

The ingest-exchange command in catalyst offers additional parameters to further tweak the data ingestion process. You can learn more by running the following from the command line:

-
catalyst ingest-exchange --help
+
catalyst ingest-exchange --help
 
@@ -321,11 +439,11 @@ have assimilated the contents of this tutorial.

After you installed Catalyst, you should be able to execute the following from your command line (e.g. cmd.exe or the Anaconda Prompt on Windows, or the Terminal application on MacOS).

-
$ catalyst --help
+
$ catalyst --help
 

This is the resulting output, simplified for eductional purposes:

-
Usage: catalyst [OPTIONS] COMMAND [ARGS]...
+
Usage: catalyst [OPTIONS] COMMAND [ARGS]...
 
   Top level catalyst entry point.
 
@@ -346,10 +464,10 @@ given exchange, and the third mode 
$ catalyst run --help
+
$ catalyst run --help
 
-
Usage: catalyst run [OPTIONS]
+
Usage: catalyst run [OPTIONS]
 
   Run a backtest for the given algorithm.
 
@@ -400,10 +518,10 @@ conveniently pass to the -c
 

Thus, to execute our algorithm from above and save the results to buy_btc_simple_out.pickle we would call catalyst run as follows:

-
catalyst run -f buy_btc_simple.py -x bitfinex --start 2016-1-1 --end 2017-9-30 -c usd --capital-base 100000 -o buy_btc_simple_out.pickle
+
catalyst run -f buy_btc_simple.py -x bitfinex --start 2016-1-1 --end 2017-9-30 -c usd --capital-base 100000 -o buy_btc_simple_out.pickle
 
-
INFO: run_algo: running algo in backtest mode
+
INFO: run_algo: running algo in backtest mode
 INFO: exchange_algorithm: initialized trading algorithm in backtest mode
 INFO: Performance: Simulated 639 trading days out of 639.
 INFO: Performance: first open: 2016-01-01 00:00:00+00:00
@@ -428,13 +546,13 @@ the fantastic pandascatalyst makes heavy usage of pandas,
 especially for data analysis and outputting so it’s worth spending some time to
 learn it.

-
import pandas as pd
-perf = pd.read_pickle('buy_btc_simple_out.pickle') # read in perf DataFrame
+
import pandas as pd
+perf = pd.read_pickle('buy_btc_simple_out.pickle') # read in perf DataFrame
 print(perf.head())
 

Which we execute by running:

-
$ python print_results.py
+
$ python print_results.py
 
@@ -607,23 +725,23 @@ which is the pandas dataframe containing the performance data for our algorithm that we reviewed above. Inside the analyze() function is where we can analyze and visualize the results of our strategy. Here’s the revised simple algorithm (note the addition of Line 1, and Lines 11-18)

-
import matplotlib.pyplot as plt
+
import matplotlib.pyplot as plt
 from catalyst.api import order, record, symbol
 
 def initialize(context):
-    context.asset = symbol('btc_usd')
+    context.asset = symbol('btc_usd')
 
 def handle_data(context, data):
     order(context.asset, 1)
-    record(btc = data.current(context.asset, 'price'))
+    record(btc = data.current(context.asset, 'price'))
 
 def analyze(context, perf):
     ax1 = plt.subplot(211)
     perf.portfolio_value.plot(ax=ax1)
-    ax1.set_ylabel('portfolio value')
+    ax1.set_ylabel('portfolio value')
     ax2 = plt.subplot(212, sharex=ax1)
     perf.btc.plot(ax=ax2)
-    ax2.set_ylabel('bitcoin price')
+    ax2.set_ylabel('bitcoin price')
     plt.show()
 
@@ -632,7 +750,7 @@ algorithm (note the addition of Line 1, and Lines 11-18)

alongside enigma-catalyst (with the exception of the Conda install, where it was included by default inside the conda environment we created). If for any reason you don’t have it installed, you can add it by running:

-
(catalyst)$ pip install matplotlib
+
(catalyst)$ pip install matplotlib
 

If everything works well, you’ll see the following chart:

@@ -645,11 +763,11 @@ only bought bitcoin every chance it got.

results refer to MacOS + Matplotlib. Alternatively, some users have reported the following error when running an algo in a Linux environment:

-
ImportError: No module named _tkinter, please install the python-tk package
+
ImportError: No module named _tkinter, please install the python-tk package
 

Which can easily solved by running (in Ubuntu/Debian-based systems):

-
sudo apt install python-tk
+
sudo apt install python-tk
 
@@ -681,7 +799,7 @@ follow. Most of the added some complexity has been added to beautify the output, which you can skim through for now. A copy of this algorithm is available in the examples directory: dual_moving_average.py.

-
import numpy as np
+
import numpy as np
 import pandas as pd
 from logbook import Logger
 import matplotlib.pyplot as plt
@@ -691,91 +809,91 @@ the examples dire
         get_open_orders)
 from catalyst.exchange.utils.stats_utils import extract_transactions
 
-NAMESPACE = 'dual_moving_average'
+NAMESPACE = 'dual_moving_average'
 log = Logger(NAMESPACE)
 
 def initialize(context):
     context.i = 0
-    context.asset = symbol('ltc_usd')
+    context.asset = symbol('ltc_usd')
     context.base_price = None
 
 
 def handle_data(context, data):
-    # define the windows for the moving averages
+    # define the windows for the moving averages
     short_window = 50
     long_window = 200
 
-    # Skip as many bars as long_window to properly compute the average
+    # Skip as many bars as long_window to properly compute the average
     context.i += 1
     if context.i < long_window:
        return
 
-    # Compute moving averages calling data.history() for each
-    # moving average with the appropriate parameters. We choose to use
-    # minute bars for this simulation -> freq="1m"
-    # Returns a pandas dataframe.
-    short_mavg = data.history(context.asset, 'price',
-                        bar_count=short_window, frequency="1m").mean()
-    long_mavg = data.history(context.asset, 'price',
-                        bar_count=long_window, frequency="1m").mean()
+    # Compute moving averages calling data.history() for each
+    # moving average with the appropriate parameters. We choose to use
+    # minute bars for this simulation -> freq="1m"
+    # Returns a pandas dataframe.
+    short_mavg = data.history(context.asset, 'price',
+                        bar_count=short_window, frequency="1m").mean()
+    long_mavg = data.history(context.asset, 'price',
+                        bar_count=long_window, frequency="1m").mean()
 
-    # Let's keep the price of our asset in a more handy variable
-    price = data.current(context.asset, 'price')
+    # Let's keep the price of our asset in a more handy variable
+    price = data.current(context.asset, 'price')
 
-    # If base_price is not set, we use the current value. This is the
-    # price at the first bar which we reference to calculate price_change.
+    # If base_price is not set, we use the current value. This is the
+    # price at the first bar which we reference to calculate price_change.
     if context.base_price is None:
         context.base_price = price
     price_change = (price - context.base_price) / context.base_price
 
-    # Save values for later inspection
+    # Save values for later inspection
     record(price=price,
            cash=context.portfolio.cash,
            price_change=price_change,
            short_mavg=short_mavg,
            long_mavg=long_mavg)
 
-    # Since we are using limit orders, some orders may not execute immediately
-    # we wait until all orders are executed before considering more trades.
+    # Since we are using limit orders, some orders may not execute immediately
+    # we wait until all orders are executed before considering more trades.
     orders = get_open_orders(context.asset)
     if len(orders) > 0:
         return
 
-    # Exit if we cannot trade
+    # Exit if we cannot trade
     if not data.can_trade(context.asset):
         return
 
-    # We check what's our position on our portfolio and trade accordingly
+    # We check what's our position on our portfolio and trade accordingly
     pos_amount = context.portfolio.positions[context.asset].amount
 
-    # Trading logic
+    # Trading logic
     if short_mavg > long_mavg and pos_amount == 0:
-       # we buy 100% of our portfolio for this asset
+       # we buy 100% of our portfolio for this asset
        order_target_percent(context.asset, 1)
     elif short_mavg < long_mavg and pos_amount > 0:
-       # we sell all our positions for this asset
+       # we sell all our positions for this asset
        order_target_percent(context.asset, 0)
 
 
 def analyze(context, perf):
 
-    # Get the base_currency that was passed as a parameter to the simulation
+    # Get the base_currency that was passed as a parameter to the simulation
     exchange = list(context.exchanges.values())[0]
     base_currency = exchange.base_currency.upper()
 
-    # First chart: Plot portfolio value using base_currency
+    # First chart: Plot portfolio value using base_currency
     ax1 = plt.subplot(411)
-    perf.loc[:, ['portfolio_value']].plot(ax=ax1)
+    perf.loc[:, ['portfolio_value']].plot(ax=ax1)
     ax1.legend_.remove()
-    ax1.set_ylabel('Portfolio Value\n({})'.format(base_currency))
+    ax1.set_ylabel('Portfolio Value\n({})'.format(base_currency))
     start, end = ax1.get_ylim()
     ax1.yaxis.set_ticks(np.arange(start, end, (end-start)/5))
 
-    # Second chart: Plot asset price, moving averages and buys/sells
+    # Second chart: Plot asset price, moving averages and buys/sells
     ax2 = plt.subplot(412, sharex=ax1)
-    perf.loc[:, ['price','short_mavg','long_mavg']].plot(ax=ax2, label='Price')
+    perf.loc[:, ['price','short_mavg','long_mavg']].plot(ax=ax2, label='Price')
     ax2.legend_.remove()
-    ax2.set_ylabel('{asset}\n({base})'.format(
+    ax2.set_ylabel('{asset}\n({base})'.format(
         asset = context.asset.symbol,
         base = base_currency
         ))
@@ -784,71 +902,71 @@ the examples dire
 
     transaction_df = extract_transactions(perf)
     if not transaction_df.empty:
-        buy_df = transaction_df[transaction_df['amount'] > 0]
-        sell_df = transaction_df[transaction_df['amount'] < 0]
+        buy_df = transaction_df[transaction_df['amount'] > 0]
+        sell_df = transaction_df[transaction_df['amount'] < 0]
         ax2.scatter(
             buy_df.index.to_pydatetime(),
-            perf.loc[buy_df.index, 'price'],
-            marker='^',
+            perf.loc[buy_df.index, 'price'],
+            marker='^',
             s=100,
-            c='green',
-            label=''
+            c='green',
+            label=''
         )
         ax2.scatter(
             sell_df.index.to_pydatetime(),
-            perf.loc[sell_df.index, 'price'],
-            marker='v',
+            perf.loc[sell_df.index, 'price'],
+            marker='v',
             s=100,
-            c='red',
-            label=''
+            c='red',
+            label=''
         )
 
-    # Third chart: Compare percentage change between our portfolio
-    # and the price of the asset
+    # Third chart: Compare percentage change between our portfolio
+    # and the price of the asset
     ax3 = plt.subplot(413, sharex=ax1)
-    perf.loc[:, ['algorithm_period_return', 'price_change']].plot(ax=ax3)
+    perf.loc[:, ['algorithm_period_return', 'price_change']].plot(ax=ax3)
     ax3.legend_.remove()
-    ax3.set_ylabel('Percent Change')
+    ax3.set_ylabel('Percent Change')
     start, end = ax3.get_ylim()
     ax3.yaxis.set_ticks(np.arange(start, end, (end-start)/5))
 
-    # Fourth chart: Plot our cash
+    # Fourth chart: Plot our cash
     ax4 = plt.subplot(414, sharex=ax1)
     perf.cash.plot(ax=ax4)
-    ax4.set_ylabel('Cash\n({})'.format(base_currency))
+    ax4.set_ylabel('Cash\n({})'.format(base_currency))
     start, end = ax4.get_ylim()
     ax4.yaxis.set_ticks(np.arange(0, end, end/5))
 
     plt.show()
 
 
-if __name__ == '__main__':
+if __name__ == '__main__':
     run_algorithm(
             capital_base=1000,
-            data_frequency='minute',
+            data_frequency='minute',
             initialize=initialize,
             handle_data=handle_data,
             analyze=analyze,
-            exchange_name='bitfinex',
+            exchange_name='bitfinex',
             algo_namespace=NAMESPACE,
-            base_currency='usd',
-            start=pd.to_datetime('2017-9-22', utc=True),
-            end=pd.to_datetime('2017-9-23', utc=True),
+            base_currency='usd',
+            start=pd.to_datetime('2017-9-22', utc=True),
+            end=pd.to_datetime('2017-9-23', utc=True),
         )
 

In order to run the code above, you have to ingest the needed data first:

-
catalyst ingest-exchange -x bitfinex -f minute -i ltc_usd
+
catalyst ingest-exchange -x bitfinex -f minute -i ltc_usd
 

And then run the code above with the following command:

-
catalyst run -f dual_moving_average.py -x bitfinex -s 2017-9-22 -e 2017-9-23 --capital-base 1000 --base-currency usd --data-frequency minute -o out.pickle
+
catalyst run -f dual_moving_average.py -x bitfinex -s 2017-9-22 -e 2017-9-23 --capital-base 1000 --base-currency usd --data-frequency minute -o out.pickle
 

Alternatively, we can make use of the run_algorithm() function included at the end of the file, where we can specify all the simulation parameters, and execute this file as a Python script:

-
python dual_moving_average.py
+
python dual_moving_average.py
 

Either way, we obtain the following charts:

@@ -909,11 +1027,11 @@ running algorithms through the command line.

In order to use Jupyter Notebook, you first have to install it inside your environment. It’s available as pip package, so regardless of how you installed Catalyst, go inside your catalyst environemnt and run:

-
(catalyst)$ pip install jupyter
+
(catalyst)$ pip install jupyter
 

Once you have Jupyter Notebook installed, every time you want to use it run:

-
(catalyst)$ jupyter notebook
+
(catalyst)$ jupyter notebook
 

A local server will launch, and will open a new window on your browser. That’s @@ -924,7 +1042,7 @@ the interface through which you will interact with Jupyter Notebook.

Before running your algorithms inside the Jupyter Notebook, remember to ingest the data from the command line interface (CLI). In the example below, you would need to run first:

-
catalyst ingest-exchange -x bitfinex -i btc_usd
+
catalyst ingest-exchange -x bitfinex -i btc_usd
 

To use Catalyst inside a Jupyter Noebook, you have to write your algorithm in a @@ -935,18 +1053,18 @@ takes the same arguments as the command line interface. Thus to run the algorithm just supply the same parameters as the CLI but without the -f and -o arguments. We just have to execute the following cell after importing catalyst to register the magic.

-
# Register the catalyst magic
+
# Register the catalyst magic
 %load_ext catalyst
 
-
# Setup matplotlib to display graphs inline in this Notebook
+
# Setup matplotlib to display graphs inline in this Notebook
 %matplotlib inline
 

Note below that we do not have to specify an input file (-f) since the magic will use the contents of the cell and look for your algorithm functions.

-
%%catalyst --start 2015-3-2 --end 2017-6-28 --capital-base 100000 -x bitfinex -c usd
+
%%catalyst --start 2015-3-2 --end 2017-6-28 --capital-base 100000 -x bitfinex -c usd
 
 from catalyst.finance.slippage import VolumeShareSlippage
 
@@ -1071,7 +1189,7 @@ def analyze(context=None, results=None):
     plt.show()
 
-
[2017-08-11 07:19:46.411748] INFO: Loader: Loading benchmark data for 'USDT_BTC' from 1989-12-31 00:00:00+00:00 to 2017-08-09 00:00:00+00:00
+
[2017-08-11 07:19:46.411748] INFO: Loader: Loading benchmark data for 'USDT_BTC' from 1989-12-31 00:00:00+00:00 to 2017-08-09 00:00:00+00:00
 [2017-08-11 07:19:46.418983] INFO: Loader: Loading data for /Users/<snipped>/.catalyst/data/USDT_BTC_benchmark.csv failed with error [Unknown string format].
 [2017-08-11 07:19:46.419740] INFO: Loader: Cache at /Users/<snipped>/.catalyst/data/USDT_BTC_benchmark.csv does not have data from 1990-01-01 00:00:00+00:00 to 2017-08-09 00:00:00+00:00.
 
@@ -2453,7 +2571,7 @@ def analyze(context=None, results=None):
 

Also, instead of defining an output file we are accessing it via the “_” variable that will be created in the name space and contain the performance DataFrame.

-
_.head()
+
_.head()
 

algo_volatility

@@ -2602,19 +2720,15 @@ problems on our - - @@ -2648,8 +2761,7 @@ problems on our diff --git a/bundles.html b/bundles.html index 1768c4de..8fdb5db5 100644 --- a/bundles.html +++ b/bundles.html @@ -13,8 +13,6 @@ - - @@ -41,28 +39,21 @@ -
- - - - - - - - - - - - - - - - -
- +
- -
-
-
+

Data Bundles

@@ -165,12 +302,12 @@ backtests and store the data for future runs.

Zipline comes with a few bundles by default as well as the ability to register new bundles. To see which bundles we have have available, we may run the bundles command, for example:

-
$ zipline bundles
-my-custom-bundle 2016-05-05 20:35:19.809398
-my-custom-bundle 2016-05-05 20:34:53.654082
-my-custom-bundle 2016-05-05 20:34:48.401767
+
$ zipline bundles
+my-custom-bundle 2016-05-05 20:35:19.809398
+my-custom-bundle 2016-05-05 20:34:53.654082
+my-custom-bundle 2016-05-05 20:34:48.401767
 quandl <no ingestions>
-quantopian-quandl 2016-05-05 20:06:40.894956
+quantopian-quandl 2016-05-05 20:06:40.894956
 

The output here shows that there are 3 bundles available:

@@ -193,7 +330,7 @@ standard location that zipline can find. By default the location where ingested data will be written is $ZIPLINE_ROOT/data/<bundle> where by default ZIPLINE_ROOT=~/.zipline. The ingestion step may take some time as it could involve downloading and processing a lot of data. This can be run with:

-
$ zipline ingest [-b <bundle>]
+
$ zipline ingest [-b <bundle>]
 

where <bundle> is the name of the bundle to ingest, defaulting to @@ -212,17 +349,17 @@ we can list all of the ingestions with the clean, which will clear data bundles based on some time constraints.

For example:

-
# clean everything older than <date>
-$ zipline clean [-b <bundle>] --before <date>
+
# clean everything older than <date>
+$ zipline clean [-b <bundle>] --before <date>
 
-# clean everything newer than <date>
-$ zipline clean [-b <bundle>] --after <date>
+# clean everything newer than <date>
+$ zipline clean [-b <bundle>] --after <date>
 
-# keep everything in the range of [before, after] and delete the rest
-$ zipline clean [-b <bundle>] --before <date> --after <after>
+# keep everything in the range of [before, after] and delete the rest
+$ zipline clean [-b <bundle>] --before <date> --after <after>
 
-# clean all but the last <int> runs
-$ zipline clean [-b <bundle>] --keep-last <int>
+# clean all but the last <int> runs
+$ zipline clean [-b <bundle>] --keep-last <int>
 
@@ -231,7 +368,7 @@ $ zipline clean [-b <bundle>]Now that the data has been ingested we can use it to run backtests with the run command. The bundle to use can be specified with the --bundle option like:

-
$ zipline run --bundle <bundle> --algofile algo.py ...
+
$ zipline run --bundle <bundle> --algofile algo.py ...
 

We may also specify the date to use to look up the bundle data with the @@ -253,7 +390,7 @@ includes daily pricing data, splits, cash dividends, and asset metadata. To ingest the quandl data bundle we recommend creating an account on quandl.com to get an API key to be able to make more API requests per day. Once we have an API key we may run:

-
$ QUANDL_API_KEY=<api-key> zipline ingest -b quandl
+
$ QUANDL_API_KEY=<api-key> zipline ingest -b quandl
 

though we may still run ingest as an anonymous quandl user (with no API @@ -284,23 +421,23 @@ cache the data for a set of equities from yahoo. The yahoo bundles include daily pricing data along with splits, cash dividends, and inferred asset metadata. To create a bundle from a set of equities, add the following to your ~/.zipline/extensions.py file:

-
from zipline.data.bundles import register, yahoo_equities
+
from zipline.data.bundles import register, yahoo_equities
 
-# these are the tickers you would like data for
+# these are the tickers you would like data for
 equities = {
-    'AAPL',
-    'MSFT',
-    'GOOG',
+    'AAPL',
+    'MSFT',
+    'GOOG',
 }
 register(
-    'my-yahoo-equities-bundle',  # name this whatever you like
+    'my-yahoo-equities-bundle',  # name this whatever you like
     yahoo_equities(equities),
 )
 

This may now be used like:

-
$ zipline ingest -b my-yahoo-equities-bundle
-$ zipline run -f algo.py --bundle my-yahoo-equities-bundle
+
$ zipline ingest -b my-yahoo-equities-bundle
+$ zipline run -f algo.py --bundle my-yahoo-equities-bundle
 

More than one yahoo equities bundle may be registered as long as they use @@ -320,7 +457,7 @@ writers that will write the data to the correct location transactionally. If an ingestion fails part way through the bundle will not be written in an incomplete state.

The signature of the ingest function should be:

-
ingest(environ,
+
ingest(environ,
        asset_db_writer,
        minute_bar_writer,
        daily_bar_writer,
@@ -456,10 +593,6 @@ bundle uses this to directly untar the bundle into the 
-            
-           
@@ -469,10 +602,9 @@ bundle uses this to directly untar the bundle into the

© Copyright 2018, Enigma MPC, Inc.. -

- Built with Sphinx using a
theme provided by Read the Docs. + Built with Sphinx using a theme provided by Read the Docs. @@ -493,8 +625,7 @@ bundle uses this to directly untar the bundle into the diff --git a/development-guidelines.html b/development-guidelines.html index 2dd0d3ba..cc74aef5 100644 --- a/development-guidelines.html +++ b/development-guidelines.html @@ -13,8 +13,6 @@ - - @@ -43,28 +41,21 @@ -
- - - - - - - - - - - - - - - - -
- +
- -
-
-
+

Development Guidelines

@@ -171,23 +301,23 @@

Creating a Development Environment

First, you’ll need to clone Catalyst by running:

-
$ git clone git@github.com:enigmampc/catalyst.git
+
$ git clone git@github.com:enigmampc/catalyst.git
 

Then check out to a new branch where you can make your changes:

-
$ git checkout -b some-short-descriptive-name
+
$ git checkout -b some-short-descriptive-name
 

If you don’t already have them, you’ll need some C library dependencies. You can follow the install guide to get the appropriate dependencies.

The following section assumes you already have virtualenvwrapper and pip installed on your system. Suggested installation of Python library dependencies used for development:

-
$ mkvirtualenv catalyst
-$ ./etc/ordered_pip.sh ./etc/requirements.txt
-$ pip install -r ./etc/requirements_dev.txt
-$ pip install -r ./etc/requirements_blaze.txt
+
$ mkvirtualenv catalyst
+$ ./etc/ordered_pip.sh ./etc/requirements.txt
+$ pip install -r ./etc/requirements_dev.txt
+$ pip install -r ./etc/requirements_blaze.txt
 

Finally, you can build the C extensions by running:

-
$ python setup.py build_ext --inplace
+
$ python setup.py build_ext --inplace
 

..If you want to work with zipline using a `Docker`__ container, you’ll need to build the Dockerfile in the Zipline root directory, and then build Dockerfile-dev. Instructions for building both containers can be found in Dockerfile and Dockerfile-dev, respectively.

@@ -201,20 +331,20 @@ $ pip install -r ./etc/requirements_blaze.txt

Contributing to the Docs

If you’d like to contribute to the documentation on enigmampc.github.io, you can navigate to docs/source/ where each reStructuredText file is a separate section there. To add a section, create a new file called some-descriptive-name.rst and add some-descriptive-name to index.rst. To edit a section, simply open up one of the existing files, make your changes, and save them.

We use Sphinx to generate documentation for Catalyst, which you will need to install by running:

-
$ pip install -r ./etc/requirements_docs.txt
+
$ pip install -r ./etc/requirements_docs.txt
 

To build and view the docs locally, run:

-
# assuming you're in the Catalyst root directory
-$ cd docs
-$ make html
-$ {BROWSER} build/html/index.html
+
# assuming you're in the Catalyst root directory
+$ cd docs
+$ make html
+$ {BROWSER} build/html/index.html
 

There is a documented issue with sphinx and docutils that causes the error below when trying to build the docs.

-
Exception occurred:
+
Exception occurred:
   File "(...)/env-c/lib/python2.7/site-packages/docutils/writers/_html_base.py", line 671, in depart_document
     assert not self.context, 'len(context) = %s' % len(self.context)
 AssertionError: len(context) = 3
@@ -222,14 +352,14 @@ AssertionError: len(context) = 3
 

If you get this error, you need to downgrade your version of docutils as follows, and build the docs again:

-
$ pip install docutils==0.12
+
$ pip install docutils==0.12
 

Commit messages

Standard prefixes to start a commit message:

-
BLD: change related to building Catalyst
+
BLD: change related to building Catalyst
 BUG: bug fix
 DEP: deprecate something, or remove a deprecated object
 DEV: development tool or utility
@@ -246,7 +376,7 @@ PERF: performance enhancements
 

Some commit style guidelines:

Commit lines should be no longer than 72 characters. The first line of the commit should include one of the above prefixes. There should be an empty line between the commit subject and the body of the commit. In general, the message should be in the imperative tense. Best practice is to include not only what the change is, but why the change was made.

Example:

-
MAINT: Remove unused calculations of max_leverage, et al.
+
MAINT: Remove unused calculations of max_leverage, et al.
 
 In the performance period the max_leverage, max_capital_used,
 cumulative_capital_used were calculated but not used.
@@ -268,19 +398,15 @@ the algorithm has little cash on hand.
 
-
-
- -
@@ -314,8 +439,7 @@ the algorithm has little cash on hand. VERSION:'0.4', COLLAPSE_INDEX:false, FILE_SUFFIX:'.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '' + HAS_SOURCE: true }; diff --git a/example-algos.html b/example-algos.html index 1de84e4c..d9d3f4db 100644 --- a/example-algos.html +++ b/example-algos.html @@ -13,8 +13,6 @@ - - @@ -43,28 +41,21 @@ -
- - - - - - - - - - - - - - - - -
- +
- -
-
-
+

@@ -210,7 +338,7 @@ writting the following article:

Buy BTC Simple Algorithm

Source code: examples/buy_btc_simple.py

-
'''
+
'''
   Run this example, by executing the following from your terminal:
     catalyst ingest-exchange -x bitfinex -f daily -i btc_usdt
     catalyst run -f buy_btc_simple.py -x bitfinex --start 2016-1-1 --end 2017-9-30 -o buy_btc_simple_out.pickle
@@ -232,11 +360,11 @@ writting the following article:
 from catalyst.api import order, record, symbol
 
 def initialize(context):
-    context.asset = symbol('btc_usd')
+    context.asset = symbol('btc_usd')
 
 def handle_data(context, data):
     order(context.asset, 1)
-    record(btc = data.current(context.asset, 'price'))
+    record(btc = data.current(context.asset, 'price'))
 

This simple algorithm does not produce any output nor displays any chart.

@@ -245,16 +373,16 @@ writting the following article:

Buy and Hodl Algorithm

Source code: examples/buy_and_hodl.py

First ingest the historical pricing data needed to run this algorithm:

-
catalyst ingest-exchange -x bitfinex -f daily -i btc_usd
+
catalyst ingest-exchange -x bitfinex -f daily -i btc_usd
 

Then, you can run the code below with the following command:

-
catalyst run -f buy_and_hodl.py --start 2015-3-1 --end 2017-10-31 --capital-base 100000 -x bitfinex -c btc -o bah.pickle
+
catalyst run -f buy_and_hodl.py --start 2015-3-1 --end 2017-10-31 --capital-base 100000 -x bitfinex -c btc -o bah.pickle
 

or using the same parameters specified in the run_algorithm() function at the end of the file:

-
python buy_and_hodl.py
+
python buy_and_hodl.py
 

This command will run the trading algorithm in the specified time range and @@ -263,22 +391,22 @@ date interval with the --start< that 2015-3-1 is the earliest date that Catalyst supports (if you choose an earlier date, you’ll get an error), and the most recent date you can choose is one day prior to the current date.

-
#!/usr/bin/env python
-#
-# Copyright 2017 Enigma MPC, Inc.
-# Copyright 2015 Quantopian, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
+
#!/usr/bin/env python
+#
+# Copyright 2017 Enigma MPC, Inc.
+# Copyright 2015 Quantopian, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 import pandas as pd
 import matplotlib.pyplot as plt
 
@@ -288,7 +416,7 @@ one day prior to the current date.

def initialize(context): - context.ASSET_NAME = 'btc_usd' + context.ASSET_NAME = 'btc_usd' context.TARGET_HODL_RATIO = 0.8 context.RESERVE_RATIO = 1.0 - context.TARGET_HODL_RATIO @@ -305,23 +433,23 @@ one day prior to the current date.

target_hodl_value = context.TARGET_HODL_RATIO * starting_cash reserve_value = context.RESERVE_RATIO * starting_cash - # Cancel any outstanding orders + # Cancel any outstanding orders orders = get_open_orders(context.asset) or [] for order in orders: cancel_order(order) - # Stop buying after passing the reserve threshold + # Stop buying after passing the reserve threshold cash = context.portfolio.cash if cash <= reserve_value: context.is_buying = False - # Retrieve current asset price from pricing data - price = data.current(context.asset, 'price') + # Retrieve current asset price from pricing data + price = data.current(context.asset, 'price') - # Check if still buying and could (approximately) afford another purchase + # Check if still buying and could (approximately) afford another purchase if context.is_buying and cash > price: - print('buying') - # Place order to make position in asset equal to target_hodl_value + print('buying') + # Place order to make position in asset equal to target_hodl_value order_target_value( context.asset, target_hodl_value, @@ -330,7 +458,7 @@ one day prior to the current date.

record( price=price, - volume=data.current(context.asset, 'volume'), + volume=data.current(context.asset, 'volume'), cash=cash, starting_cash=context.portfolio.starting_cash, leverage=context.account.leverage, @@ -339,77 +467,77 @@ one day prior to the current date.

def analyze(context=None, results=None): - # Plot the portfolio and asset data. + # Plot the portfolio and asset data. ax1 = plt.subplot(611) - results[['portfolio_value']].plot(ax=ax1) - ax1.set_ylabel('Portfolio Value (USD)') + results[['portfolio_value']].plot(ax=ax1) + ax1.set_ylabel('Portfolio Value (USD)') ax2 = plt.subplot(612, sharex=ax1) - ax2.set_ylabel('{asset} (USD)'.format(asset=context.ASSET_NAME)) - results[['price']].plot(ax=ax2) + ax2.set_ylabel('{asset} (USD)'.format(asset=context.ASSET_NAME)) + results[['price']].plot(ax=ax2) trans = results.ix[[t != [] for t in results.transactions]] buys = trans.ix[ - [t[0]['amount'] > 0 for t in trans.transactions] + [t[0]['amount'] > 0 for t in trans.transactions] ] ax2.scatter( buys.index.to_pydatetime(), results.price[buys.index], - marker='^', + marker='^', s=100, - c='g', - label='' + c='g', + label='' ) ax3 = plt.subplot(613, sharex=ax1) - results[['leverage', 'alpha', 'beta']].plot(ax=ax3) - ax3.set_ylabel('Leverage ') + results[['leverage', 'alpha', 'beta']].plot(ax=ax3) + ax3.set_ylabel('Leverage ') ax4 = plt.subplot(614, sharex=ax1) - results[['starting_cash', 'cash']].plot(ax=ax4) - ax4.set_ylabel('Cash (USD)') + results[['starting_cash', 'cash']].plot(ax=ax4) + ax4.set_ylabel('Cash (USD)') results[[ - 'treasury', - 'algorithm', - 'benchmark', + 'treasury', + 'algorithm', + 'benchmark', ]] = results[[ - 'treasury_period_return', - 'algorithm_period_return', - 'benchmark_period_return', + 'treasury_period_return', + 'algorithm_period_return', + 'benchmark_period_return', ]] ax5 = plt.subplot(615, sharex=ax1) results[[ - 'treasury', - 'algorithm', - 'benchmark', + 'treasury', + 'algorithm', + 'benchmark', ]].plot(ax=ax5) - ax5.set_ylabel('Percent Change') + ax5.set_ylabel('Percent Change') ax6 = plt.subplot(616, sharex=ax1) - results[['volume']].plot(ax=ax6) - ax6.set_ylabel('Volume (mCoins/5min)') + results[['volume']].plot(ax=ax6) + ax6.set_ylabel('Volume (mCoins/5min)') plt.legend(loc=3) - # Show the plot. + # Show the plot. plt.gcf().set_size_inches(18, 8) plt.show() -if __name__ == '__main__': +if __name__ == '__main__': run_algorithm( capital_base=10000, - data_frequency='daily', + data_frequency='daily', initialize=initialize, handle_data=handle_data, analyze=analyze, - exchange_name='bitfinex', - algo_namespace='buy_and_hodl', - base_currency='usd', - start=pd.to_datetime('2015-03-01', utc=True), - end=pd.to_datetime('2017-10-31', utc=True), + exchange_name='bitfinex', + algo_namespace='buy_and_hodl', + base_currency='usd', + start=pd.to_datetime('2015-03-01', utc=True), + end=pd.to_datetime('2017-10-31', utc=True), )
@@ -420,7 +548,7 @@ one day prior to the current date.

Source Code: examples/dual_moving_average.py

This strategy is covered in detail in the last part of this tutorial.

-
import numpy as np
+
import numpy as np
 import pandas as pd
 from logbook import Logger
 import matplotlib.pyplot as plt
@@ -430,90 +558,90 @@ one day prior to the current date.

get_open_orders) from catalyst.exchange.stats_utils import extract_transactions -NAMESPACE = 'dual_moving_average' +NAMESPACE = 'dual_moving_average' log = Logger(NAMESPACE) def initialize(context): context.i = 0 - context.asset = symbol('ltc_usd') + context.asset = symbol('ltc_usd') context.base_price = None def handle_data(context, data): - # define the windows for the moving averages + # define the windows for the moving averages short_window = 50 long_window = 200 - # Skip as many bars as long_window to properly compute the average + # Skip as many bars as long_window to properly compute the average context.i += 1 if context.i < long_window: return - # Compute moving averages calling data.history() for each - # moving average with the appropriate parameters. We choose to use - # minute bars for this simulation -> freq="1m" - # Returns a pandas dataframe. - short_mavg = data.history(context.asset, 'price', - bar_count=short_window, frequency="1m").mean() - long_mavg = data.history(context.asset, 'price', - bar_count=long_window, frequency="1m").mean() + # Compute moving averages calling data.history() for each + # moving average with the appropriate parameters. We choose to use + # minute bars for this simulation -> freq="1m" + # Returns a pandas dataframe. + short_mavg = data.history(context.asset, 'price', + bar_count=short_window, frequency="1m").mean() + long_mavg = data.history(context.asset, 'price', + bar_count=long_window, frequency="1m").mean() - # Let's keep the price of our asset in a more handy variable - price = data.current(context.asset, 'price') + # Let's keep the price of our asset in a more handy variable + price = data.current(context.asset, 'price') - # If base_price is not set, we use the current value. This is the - # price at the first bar which we reference to calculate price_change. + # If base_price is not set, we use the current value. This is the + # price at the first bar which we reference to calculate price_change. if context.base_price is None: context.base_price = price price_change = (price - context.base_price) / context.base_price - # Save values for later inspection + # Save values for later inspection record(price=price, cash=context.portfolio.cash, price_change=price_change, short_mavg=short_mavg, long_mavg=long_mavg) - # Since we are using limit orders, some orders may not execute immediately - # we wait until all orders are executed before considering more trades. + # Since we are using limit orders, some orders may not execute immediately + # we wait until all orders are executed before considering more trades. orders = get_open_orders(context.asset) if len(orders) > 0: return - # Exit if we cannot trade + # Exit if we cannot trade if not data.can_trade(context.asset): return - # We check what's our position on our portfolio and trade accordingly + # We check what's our position on our portfolio and trade accordingly pos_amount = context.portfolio.positions[context.asset].amount - # Trading logic + # Trading logic if short_mavg > long_mavg and pos_amount == 0: - # we buy 100% of our portfolio for this asset + # we buy 100% of our portfolio for this asset order_target_percent(context.asset, 1) elif short_mavg < long_mavg and pos_amount > 0: - # we sell all our positions for this asset + # we sell all our positions for this asset order_target_percent(context.asset, 0) def analyze(context, perf): - # Get the base_currency that was passed as a parameter to the simulation + # Get the base_currency that was passed as a parameter to the simulation base_currency = context.exchanges.values()[0].base_currency.upper() - # First chart: Plot portfolio value using base_currency + # First chart: Plot portfolio value using base_currency ax1 = plt.subplot(411) - perf.loc[:, ['portfolio_value']].plot(ax=ax1) + perf.loc[:, ['portfolio_value']].plot(ax=ax1) ax1.legend_.remove() - ax1.set_ylabel('Portfolio Value\n({})'.format(base_currency)) + ax1.set_ylabel('Portfolio Value\n({})'.format(base_currency)) start, end = ax1.get_ylim() ax1.yaxis.set_ticks(np.arange(start, end, (end-start)/5)) - # Second chart: Plot asset price, moving averages and buys/sells + # Second chart: Plot asset price, moving averages and buys/sells ax2 = plt.subplot(412, sharex=ax1) - perf.loc[:, ['price','short_mavg','long_mavg']].plot(ax=ax2, label='Price') + perf.loc[:, ['price','short_mavg','long_mavg']].plot(ax=ax2, label='Price') ax2.legend_.remove() - ax2.set_ylabel('{asset}\n({base})'.format( + ax2.set_ylabel('{asset}\n({base})'.format( asset = context.asset.symbol, base = base_currency )) @@ -522,56 +650,56 @@ one day prior to the current date.

transaction_df = extract_transactions(perf) if not transaction_df.empty: - buy_df = transaction_df[transaction_df['amount'] > 0] - sell_df = transaction_df[transaction_df['amount'] < 0] + buy_df = transaction_df[transaction_df['amount'] > 0] + sell_df = transaction_df[transaction_df['amount'] < 0] ax2.scatter( buy_df.index.to_pydatetime(), - perf.loc[buy_df.index, 'price'], - marker='^', + perf.loc[buy_df.index, 'price'], + marker='^', s=100, - c='green', - label='' + c='green', + label='' ) ax2.scatter( sell_df.index.to_pydatetime(), - perf.loc[sell_df.index, 'price'], - marker='v', + perf.loc[sell_df.index, 'price'], + marker='v', s=100, - c='red', - label='' + c='red', + label='' ) - # Third chart: Compare percentage change between our portfolio - # and the price of the asset + # Third chart: Compare percentage change between our portfolio + # and the price of the asset ax3 = plt.subplot(413, sharex=ax1) - perf.loc[:, ['algorithm_period_return', 'price_change']].plot(ax=ax3) + perf.loc[:, ['algorithm_period_return', 'price_change']].plot(ax=ax3) ax3.legend_.remove() - ax3.set_ylabel('Percent Change') + ax3.set_ylabel('Percent Change') start, end = ax3.get_ylim() ax3.yaxis.set_ticks(np.arange(start, end, (end-start)/5)) - # Fourth chart: Plot our cash + # Fourth chart: Plot our cash ax4 = plt.subplot(414, sharex=ax1) perf.cash.plot(ax=ax4) - ax4.set_ylabel('Cash\n({})'.format(base_currency)) + ax4.set_ylabel('Cash\n({})'.format(base_currency)) start, end = ax4.get_ylim() ax4.yaxis.set_ticks(np.arange(0, end, end/5)) plt.show() -if __name__ == '__main__': +if __name__ == '__main__': run_algorithm( capital_base=1000, - data_frequency='minute', + data_frequency='minute', initialize=initialize, handle_data=handle_data, analyze=analyze, - exchange_name='bitfinex', + exchange_name='bitfinex', algo_namespace=NAMESPACE, - base_currency='usd', - start=pd.to_datetime('2017-9-22', utc=True), - end=pd.to_datetime('2017-9-23', utc=True), + base_currency='usd', + start=pd.to_datetime('2017-9-22', utc=True), + end=pd.to_datetime('2017-9-23', utc=True), )
@@ -586,16 +714,16 @@ Hopefully, we’ll ride the waves.

We are choosing to backtest this trading algorithm with the neo_usd currency pairon the Bitfinex exchange. Thus, first ingest the historical pricing data that we need, with minute resolution:

-
catalyst ingest-exchange -x bitfinex -f minute -i neo_usd
+
catalyst ingest-exchange -x bitfinex -f minute -i neo_usd
 

To run this algorithm, we are opting for the Python interpreter, instead of the command line (CLI). All of the parameters for the simulation are specified in lines 218-245, so in order to run the algorithm we just type:

-
python mean_reversion_simple.py
+
python mean_reversion_simple.py
 
-
import os
+
import os
 import tempfile
 import time
 
@@ -607,124 +735,124 @@ lines 218-245, so in order to run the algorithm we just type:

from catalyst import run_algorithm from catalyst.api import symbol, record, order_target_percent, get_open_orders from catalyst.exchange.stats_utils import extract_transactions -# We give a name to the algorithm which Catalyst will use to persist its state. -# In this example, Catalyst will create the `.catalyst/data/live_algos` -# directory. If we stop and start the algorithm, Catalyst will resume its -# state using the files included in the folder. +# We give a name to the algorithm which Catalyst will use to persist its state. +# In this example, Catalyst will create the `.catalyst/data/live_algos` +# directory. If we stop and start the algorithm, Catalyst will resume its +# state using the files included in the folder. from catalyst.utils.paths import ensure_directory -NAMESPACE = 'mean_reversion_simple' +NAMESPACE = 'mean_reversion_simple' log = Logger(NAMESPACE) -# To run an algorithm in Catalyst, you need two functions: initialize and -# handle_data. +# To run an algorithm in Catalyst, you need two functions: initialize and +# handle_data. def initialize(context): - # This initialize function sets any data or variables that you'll use in - # your algorithm. For instance, you'll want to define the trading pair (or - # trading pairs) you want to backtest. You'll also want to define any - # parameters or values you're going to use. + # This initialize function sets any data or variables that you'll use in + # your algorithm. For instance, you'll want to define the trading pair (or + # trading pairs) you want to backtest. You'll also want to define any + # parameters or values you're going to use. - # In our example, we're looking at Neo in USD. - context.neo_eth = symbol('neo_usd') + # In our example, we're looking at Neo in USD. + context.neo_eth = symbol('neo_usd') context.base_price = None context.current_day = None context.RSI_OVERSOLD = 30 context.RSI_OVERBOUGHT = 80 - context.CANDLE_SIZE = '15T' + context.CANDLE_SIZE = '15T' context.start_time = time.time() def handle_data(context, data): - # This handle_data function is where the real work is done. Our data is - # minute-level tick data, and each minute is called a frame. This function - # runs on each frame of the data. + # This handle_data function is where the real work is done. Our data is + # minute-level tick data, and each minute is called a frame. This function + # runs on each frame of the data. - # We flag the first period of each day. - # Since cryptocurrencies trade 24/7 the `before_trading_starts` handle - # would only execute once. This method works with minute and daily - # frequencies. - today = data.current_dt.floor('1D') + # We flag the first period of each day. + # Since cryptocurrencies trade 24/7 the `before_trading_starts` handle + # would only execute once. This method works with minute and daily + # frequencies. + today = data.current_dt.floor('1D') if today != context.current_day: context.traded_today = False context.current_day = today - # We're computing the volume-weighted-average-price of the security - # defined above, in the context.neo_eth variable. For this example, we're - # using three bars on the 15 min bars. + # We're computing the volume-weighted-average-price of the security + # defined above, in the context.neo_eth variable. For this example, we're + # using three bars on the 15 min bars. - # The frequency attribute determine the bar size. We use this convention - # for the frequency alias: - # http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases + # The frequency attribute determine the bar size. We use this convention + # for the frequency alias: + # http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases prices = data.history( context.neo_eth, - fields='close', + fields='close', bar_count=50, frequency=context.CANDLE_SIZE ) - # Ta-lib calculates various technical indicator based on price and - # volume arrays. + # Ta-lib calculates various technical indicator based on price and + # volume arrays. - # In this example, we are comp + # In this example, we are comp rsi = talib.RSI(prices.values, timeperiod=14) - # We need a variable for the current price of the security to compare to - # the average. Since we are requesting two fields, data.current() - # returns a DataFrame with - current = data.current(context.neo_eth, fields=['close', 'volume']) - price = current['close'] + # We need a variable for the current price of the security to compare to + # the average. Since we are requesting two fields, data.current() + # returns a DataFrame with + current = data.current(context.neo_eth, fields=['close', 'volume']) + price = current['close'] - # If base_price is not set, we use the current value. This is the - # price at the first bar which we reference to calculate price_change. + # If base_price is not set, we use the current value. This is the + # price at the first bar which we reference to calculate price_change. if context.base_price is None: context.base_price = price price_change = (price - context.base_price) / context.base_price cash = context.portfolio.cash - # Now that we've collected all current data for this frame, we use - # the record() method to save it. This data will be available as - # a parameter of the analyze() function for further analysis. + # Now that we've collected all current data for this frame, we use + # the record() method to save it. This data will be available as + # a parameter of the analyze() function for further analysis. record( price=price, - volume=current['volume'], + volume=current['volume'], price_change=price_change, rsi=rsi[-1], cash=cash ) - # We are trying to avoid over-trading by limiting our trades to - # one per day. + # We are trying to avoid over-trading by limiting our trades to + # one per day. if context.traded_today: return - # Since we are using limit orders, some orders may not execute immediately - # we wait until all orders are executed before considering more trades. + # Since we are using limit orders, some orders may not execute immediately + # we wait until all orders are executed before considering more trades. orders = get_open_orders(context.neo_eth) if len(orders) > 0: return - # Exit if we cannot trade + # Exit if we cannot trade if not data.can_trade(context.neo_eth): return - # Another powerful built-in feature of the Catalyst backtester is the - # portfolio object. The portfolio object tracks your positions, cash, - # cost basis of specific holdings, and more. In this line, we calculate - # how long or short our position is at this minute. + # Another powerful built-in feature of the Catalyst backtester is the + # portfolio object. The portfolio object tracks your positions, cash, + # cost basis of specific holdings, and more. In this line, we calculate + # how long or short our position is at this minute. pos_amount = context.portfolio.positions[context.neo_eth].amount if rsi[-1] <= context.RSI_OVERSOLD and pos_amount == 0: log.info( - '{}: buying - price: {}, rsi: {}'.format( + '{}: buying - price: {}, rsi: {}'.format( data.current_dt, price, rsi[-1] ) ) - # Set a style for limit orders, + # Set a style for limit orders, limit_price = price * 1.005 order_target_percent( context.neo_eth, 1, limit_price=limit_price @@ -733,7 +861,7 @@ lines 218-245, so in order to run the algorithm we just type:

elif rsi[-1] >= context.RSI_OVERBOUGHT and pos_amount > 0: log.info( - '{}: selling - price: {}, rsi: {}'.format( + '{}: selling - price: {}, rsi: {}'.format( data.current_dt, price, rsi[-1] ) ) @@ -746,129 +874,129 @@ lines 218-245, so in order to run the algorithm we just type:

def analyze(context=None, perf=None): end = time.time() - log.info('elapsed time: {}'.format(end - context.start_time)) + log.info('elapsed time: {}'.format(end - context.start_time)) import matplotlib.pyplot as plt - # The base currency of the algo exchange + # The base currency of the algo exchange base_currency = context.exchanges.values()[0].base_currency.upper() - # Plot the portfolio value over time. + # Plot the portfolio value over time. ax1 = plt.subplot(611) - perf.loc[:, 'portfolio_value'].plot(ax=ax1) - ax1.set_ylabel('Portfolio\nValue\n({})'.format(base_currency)) + perf.loc[:, 'portfolio_value'].plot(ax=ax1) + ax1.set_ylabel('Portfolio\nValue\n({})'.format(base_currency)) - # Plot the price increase or decrease over time. + # Plot the price increase or decrease over time. ax2 = plt.subplot(612, sharex=ax1) - perf.loc[:, 'price'].plot(ax=ax2, label='Price') + perf.loc[:, 'price'].plot(ax=ax2, label='Price') - ax2.set_ylabel('{asset}\n({base})'.format( + ax2.set_ylabel('{asset}\n({base})'.format( asset=context.neo_eth.symbol, base=base_currency )) transaction_df = extract_transactions(perf) if not transaction_df.empty: - buy_df = transaction_df[transaction_df['amount'] > 0] - sell_df = transaction_df[transaction_df['amount'] < 0] + buy_df = transaction_df[transaction_df['amount'] > 0] + sell_df = transaction_df[transaction_df['amount'] < 0] ax2.scatter( buy_df.index.to_pydatetime(), - perf.loc[buy_df.index.floor('1 min'), 'price'], - marker='^', + perf.loc[buy_df.index.floor('1 min'), 'price'], + marker='^', s=100, - c='green', - label='' + c='green', + label='' ) ax2.scatter( sell_df.index.to_pydatetime(), - perf.loc[sell_df.index.floor('1 min'), 'price'], - marker='v', + perf.loc[sell_df.index.floor('1 min'), 'price'], + marker='v', s=100, - c='red', - label='' + c='red', + label='' ) ax4 = plt.subplot(613, sharex=ax1) - perf.loc[:, 'cash'].plot( - ax=ax4, label='Base Currency ({})'.format(base_currency) + perf.loc[:, 'cash'].plot( + ax=ax4, label='Base Currency ({})'.format(base_currency) ) - ax4.set_ylabel('Cash\n({})'.format(base_currency)) + ax4.set_ylabel('Cash\n({})'.format(base_currency)) - perf['algorithm'] = perf.loc[:, 'algorithm_period_return'] + perf['algorithm'] = perf.loc[:, 'algorithm_period_return'] ax5 = plt.subplot(614, sharex=ax1) - perf.loc[:, ['algorithm', 'price_change']].plot(ax=ax5) - ax5.set_ylabel('Percent\nChange') + perf.loc[:, ['algorithm', 'price_change']].plot(ax=ax5) + ax5.set_ylabel('Percent\nChange') ax6 = plt.subplot(615, sharex=ax1) - perf.loc[:, 'rsi'].plot(ax=ax6, label='RSI') - ax6.set_ylabel('RSI') - ax6.axhline(context.RSI_OVERBOUGHT, color='darkgoldenrod') - ax6.axhline(context.RSI_OVERSOLD, color='darkgoldenrod') + perf.loc[:, 'rsi'].plot(ax=ax6, label='RSI') + ax6.set_ylabel('RSI') + ax6.axhline(context.RSI_OVERBOUGHT, color='darkgoldenrod') + ax6.axhline(context.RSI_OVERSOLD, color='darkgoldenrod') if not transaction_df.empty: ax6.scatter( buy_df.index.to_pydatetime(), - perf.loc[buy_df.index.floor('1 min'), 'rsi'], - marker='^', + perf.loc[buy_df.index.floor('1 min'), 'rsi'], + marker='^', s=100, - c='green', - label='' + c='green', + label='' ) ax6.scatter( sell_df.index.to_pydatetime(), - perf.loc[sell_df.index.floor('1 min'), 'rsi'], - marker='v', + perf.loc[sell_df.index.floor('1 min'), 'rsi'], + marker='v', s=100, - c='red', - label='' + c='red', + label='' ) plt.legend(loc=3) start, end = ax6.get_ylim() ax6.yaxis.set_ticks(np.arange(0, end, end/5)) - # Show the plot. + # Show the plot. plt.gcf().set_size_inches(18, 8) plt.show() pass -if __name__ == '__main__': - # The execution mode: backtest or live - MODE = 'backtest' +if __name__ == '__main__': + # The execution mode: backtest or live + MODE = 'backtest' - if MODE == 'backtest': + if MODE == 'backtest': folder = os.path.join( - tempfile.gettempdir(), 'catalyst', NAMESPACE + tempfile.gettempdir(), 'catalyst', NAMESPACE ) ensure_directory(folder) - timestr = time.strftime('%Y%m%d-%H%M%S') - out = os.path.join(folder, '{}.p'.format(timestr)) - # catalyst run -f catalyst/examples/mean_reversion_simple.py -x bitfinex -s 2017-10-1 -e 2017-11-10 -c usdt -n mean-reversion --data-frequency minute --capital-base 10000 + timestr = time.strftime('%Y%m%d-%H%M%S') + out = os.path.join(folder, '{}.p'.format(timestr)) + # catalyst run -f catalyst/examples/mean_reversion_simple.py -x bitfinex -s 2017-10-1 -e 2017-11-10 -c usdt -n mean-reversion --data-frequency minute --capital-base 10000 run_algorithm( capital_base=10000, - data_frequency='minute', + data_frequency='minute', initialize=initialize, handle_data=handle_data, analyze=analyze, - exchange_name='bitfinex', + exchange_name='bitfinex', algo_namespace=NAMESPACE, - base_currency='usd', - start=pd.to_datetime('2017-10-01', utc=True), - end=pd.to_datetime('2017-11-10', utc=True), + base_currency='usd', + start=pd.to_datetime('2017-10-01', utc=True), + end=pd.to_datetime('2017-11-10', utc=True), output=out ) - log.info('saved perf stats: {}'.format(out)) + log.info('saved perf stats: {}'.format(out)) - elif MODE == 'live': + elif MODE == 'live': run_algorithm( capital_base=0.5, initialize=initialize, handle_data=handle_data, analyze=analyze, - exchange_name='bittrex', + exchange_name='bittrex', live=True, algo_namespace=NAMESPACE, - base_currency='usd', + base_currency='usd', live_graph=False )
@@ -903,14 +1031,14 @@ environment). The first one retrieves all the pricing data needed for this script to run (only needs to be run once), and the second one executes this script with the parameters specified in the run_algorithm() call at the end of the file:

-
catalyst ingest-exchange -x bitfinex -f minute
+
catalyst ingest-exchange -x bitfinex -f minute
 
-
python simple_universe.py
+
python simple_universe.py
 

Credits: This code was originally submitted by Abner Ayala-Acevedo. Thank you!

-
from datetime import timedelta
+
from datetime import timedelta
 
 import numpy as np
 import pandas as pd
@@ -921,55 +1049,55 @@ of the file:

def initialize(context): - context.i = -1 # minute counter + context.i = -1 # minute counter context.exchange = context.exchanges.values()[0].name.lower() context.base_currency = context.exchanges.values()[0].base_currency.lower() def handle_data(context, data): context.i += 1 - lookback_days = 7 # 7 days + lookback_days = 7 # 7 days - # current date & time in each iteration formatted into a string + # current date & time in each iteration formatted into a string now = data.current_dt - date, time = now.strftime('%Y-%m-%d %H:%M:%S').split(' ') + date, time = now.strftime('%Y-%m-%d %H:%M:%S').split(' ') lookback_date = now - timedelta(days=lookback_days) - # keep only the date as a string, discard the time - lookback_date = lookback_date.strftime('%Y-%m-%d %H:%M:%S').split(' ')[0] + # keep only the date as a string, discard the time + lookback_date = lookback_date.strftime('%Y-%m-%d %H:%M:%S').split(' ')[0] - one_day_in_minutes = 1440 # 60 * 24 assumes data_frequency='minute' - # update universe everyday at midnight + one_day_in_minutes = 1440 # 60 * 24 assumes data_frequency='minute' + # update universe everyday at midnight if not context.i % one_day_in_minutes: context.universe = universe(context, lookback_date, date) - # get data every 30 minutes + # get data every 30 minutes minutes = 30 - # get lookback_days of history data: that is 'lookback' number of bins + # get lookback_days of history data: that is 'lookback' number of bins lookback = one_day_in_minutes / minutes * lookback_days if not context.i % minutes and context.universe: - # we iterate for every pair in the current universe + # we iterate for every pair in the current universe for coin in context.coins: pair = str(coin.symbol) - # Get 30 minute interval OHLCV data. This is the standard data - # required for candlestick or indicators/signals. Return Pandas - # DataFrames. 30T means 30-minute re-sampling of one minute data. - # Adjust it to your desired time interval as needed. - opened = fill(data.history(coin, 'open', - bar_count=lookback, frequency='30T')).values - high = fill(data.history(coin, 'high', - bar_count=lookback, frequency='30T')).values - low = fill(data.history(coin, 'low', - bar_count=lookback, frequency='30T')).values - close = fill(data.history(coin, 'price', - bar_count=lookback, frequency='30T')).values - volume = fill(data.history(coin, 'volume', - bar_count=lookback, frequency='30T')).values + # Get 30 minute interval OHLCV data. This is the standard data + # required for candlestick or indicators/signals. Return Pandas + # DataFrames. 30T means 30-minute re-sampling of one minute data. + # Adjust it to your desired time interval as needed. + opened = fill(data.history(coin, 'open', + bar_count=lookback, frequency='30T')).values + high = fill(data.history(coin, 'high', + bar_count=lookback, frequency='30T')).values + low = fill(data.history(coin, 'low', + bar_count=lookback, frequency='30T')).values + close = fill(data.history(coin, 'price', + bar_count=lookback, frequency='30T')).values + volume = fill(data.history(coin, 'volume', + bar_count=lookback, frequency='30T')).values - # close[-1] is the last value in the set, which is the equivalent - # to current price (as in the most recent value) - # displays the minute price for each pair every 30 minutes - print('{now}: {pair} -\tO:{o},\tH:{h},\tL:{c},\tC{c},\tV:{v}'.format( + # close[-1] is the last value in the set, which is the equivalent + # to current price (as in the most recent value) + # displays the minute price for each pair every 30 minutes + print('{now}: {pair} -\tO:{o},\tH:{h},\tL:{c},\tC{c},\tV:{v}'.format( now=now, pair=pair, o=opened[-1], @@ -979,37 +1107,37 @@ of the file:

v=volume[-1], )) - # ------------------------------------------------------------- - # --------------- Insert Your Strategy Here ------------------- - # ------------------------------------------------------------- + # ------------------------------------------------------------- + # --------------- Insert Your Strategy Here ------------------- + # ------------------------------------------------------------- def analyze(context=None, results=None): pass -# Get the universe for a given exchange and a given base_currency market -# Example: Poloniex BTC Market +# Get the universe for a given exchange and a given base_currency market +# Example: Poloniex BTC Market def universe(context, lookback_date, current_date): - # get all the pairs for the given exchange + # get all the pairs for the given exchange json_symbols = get_exchange_symbols(context.exchange) - # convert into a DataFrame for easier processing + # convert into a DataFrame for easier processing df = pd.DataFrame.from_dict(json_symbols).transpose().astype(str) - df['base_currency'] = df.apply(lambda row: row.symbol.split('_')[1],axis=1) - df['market_currency'] = df.apply(lambda row: row.symbol.split('_')[0],axis=1) + df['base_currency'] = df.apply(lambda row: row.symbol.split('_')[1],axis=1) + df['market_currency'] = df.apply(lambda row: row.symbol.split('_')[0],axis=1) - # Filter all the pairs to get only the ones for a given base_currency - df = df[df['base_currency'] == context.base_currency] + # Filter all the pairs to get only the ones for a given base_currency + df = df[df['base_currency'] == context.base_currency] - # Filter all the pairs to ensure that pair existed in the current date range + # Filter all the pairs to ensure that pair existed in the current date range df = df[df.start_date < lookback_date] df = df[df.end_daily >= current_date] - context.coins = symbols(*df.symbol) # convert all the pairs to symbols + context.coins = symbols(*df.symbol) # convert all the pairs to symbols return df.symbol.tolist() -# Replace all NA, NAN or infinite values with its nearest value +# Replace all NA, NAN or infinite values with its nearest value def fill(series): if isinstance(series, pd.Series): return series.replace([np.inf, -np.inf], np.nan).ffill().bfill() @@ -1021,21 +1149,21 @@ of the file:

return series -if __name__ == '__main__': - start_date = pd.to_datetime('2017-11-10', utc=True) - end_date = pd.to_datetime('2017-11-13', utc=True) +if __name__ == '__main__': + start_date = pd.to_datetime('2017-11-10', utc=True) + end_date = pd.to_datetime('2017-11-13', utc=True) performance = run_algorithm(start=start_date, end=end_date, - capital_base=100.0, # amount of base_currency + capital_base=100.0, # amount of base_currency initialize=initialize, handle_data=handle_data, analyze=analyze, - exchange_name='bitfinex', - data_frequency='minute', - base_currency='btc', + exchange_name='bitfinex', + data_frequency='minute', + base_currency='btc', live=False, live_graph=False, - algo_namespace='simple_universe') + algo_namespace='simple_universe')
@@ -1046,7 +1174,7 @@ select the portfolio with the maximum Sharpe Ratio. The parameters are set to use 180 days of historical data and rebalance every 30 days. This code was used in writting the following article: Markowitz Portfolio Optimization for Cryptocurrencies.

-
'''
+
'''
    You can run this code using the Python interpreter:
 
    $ python portfolio_optimization.py
@@ -1064,49 +1192,49 @@ in writting the following article:
 from catalyst.api import record, symbol, symbols, order_target_percent
 from catalyst.utils.run_algo import run_algorithm
 
-np.set_printoptions(threshold='nan', suppress=True)
+np.set_printoptions(threshold='nan', suppress=True)
 
 
 def initialize(context):
-   # Portfolio assets list
-   context.assets = symbols('btc_usdt', 'eth_usdt', 'ltc_usdt', 'dash_usdt',
-                            'xmr_usdt')
+   # Portfolio assets list
+   context.assets = symbols('btc_usdt', 'eth_usdt', 'ltc_usdt', 'dash_usdt',
+                            'xmr_usdt')
    context.nassets = len(context.assets)
-   # Set the time window that will be used to compute expected return
-   # and asset correlations
+   # Set the time window that will be used to compute expected return
+   # and asset correlations
    context.window = 180
-   # Set the number of days between each portfolio rebalancing
+   # Set the number of days between each portfolio rebalancing
    context.rebalance_period = 30
    context.i = 0
 
 
 def handle_data(context, data):
-   # Only rebalance at the beggining of the algorithm execution and
-   # every multiple of the rebalance period
+   # Only rebalance at the beggining of the algorithm execution and
+   # every multiple of the rebalance period
    if context.i == 0 or context.i%context.rebalance_period == 0:
        n = context.window
-       prices = data.history(context.assets, fields='price',
-                             bar_count=n+1, frequency='1d')
+       prices = data.history(context.assets, fields='price',
+                             bar_count=n+1, frequency='1d')
        pr = np.asmatrix(prices)
        t_prices = prices.iloc[1:n+1]
        t_val = t_prices.values
        tminus_prices = prices.iloc[0:n]
        tminus_val = tminus_prices.values
-       # Compute daily returns (r)
+       # Compute daily returns (r)
        r = np.asmatrix(t_val/tminus_val-1)
-       # Compute the expected returns of each asset with the average
-       # daily return for the selected time window
+       # Compute the expected returns of each asset with the average
+       # daily return for the selected time window
        m = np.asmatrix(np.mean(r, axis=0))
-       # ###
+       # ###
        stds = np.std(r, axis=0)
-       # Compute excess returns matrix (xr)
+       # Compute excess returns matrix (xr)
        xr = r - m
-       # Matrix algebra to get variance-covariance matrix
+       # Matrix algebra to get variance-covariance matrix
        cov_m = np.dot(np.transpose(xr),xr)/n
-       # Compute asset correlation matrix (informative only)
+       # Compute asset correlation matrix (informative only)
        corr_m = cov_m/np.dot(np.transpose(stds),stds)
 
-       # Define portfolio optimization parameters
+       # Define portfolio optimization parameters
        n_portfolios = 50000
        results_array = np.zeros((3+context.nassets,n_portfolios))
        for p in xrange(n_portfolios):
@@ -1116,38 +1244,38 @@ in writting the following article:
            p_r = np.sum(np.dot(w,np.transpose(m)))*365
            p_std = np.sqrt(np.dot(np.dot(w,cov_m),np.transpose(w)))*np.sqrt(365)
 
-           #store results in results array
+           #store results in results array
            results_array[0,p] = p_r
            results_array[1,p] = p_std
-           #store Sharpe Ratio (return / volatility) - risk free rate element
-           #excluded for simplicity
+           #store Sharpe Ratio (return / volatility) - risk free rate element
+           #excluded for simplicity
            results_array[2,p] = results_array[0,p] / results_array[1,p]
            i = 0
            for iw in weights:
                results_array[3+i,p] = weights[i]
                i += 1
 
-       #convert results array to Pandas DataFrame
+       #convert results array to Pandas DataFrame
        results_frame = pd.DataFrame(np.transpose(results_array),
-                          columns=['r','stdev','sharpe']+context.assets)
-       #locate position of portfolio with highest Sharpe Ratio
-       max_sharpe_port = results_frame.iloc[results_frame['sharpe'].idxmax()]
-       #locate positon of portfolio with minimum standard deviation
-       min_vol_port = results_frame.iloc[results_frame['stdev'].idxmin()]
+                          columns=['r','stdev','sharpe']+context.assets)
+       #locate position of portfolio with highest Sharpe Ratio
+       max_sharpe_port = results_frame.iloc[results_frame['sharpe'].idxmax()]
+       #locate positon of portfolio with minimum standard deviation
+       min_vol_port = results_frame.iloc[results_frame['stdev'].idxmin()]
 
-       #order optimal weights for each asset
+       #order optimal weights for each asset
        for asset in context.assets:
            if data.can_trade(asset):
                order_target_percent(asset, max_sharpe_port[asset])
 
-       #create scatter plot coloured by Sharpe Ratio
-       plt.scatter(results_frame.stdev,results_frame.r,c=results_frame.sharpe,cmap='RdYlGn')
-       plt.xlabel('Volatility')
-       plt.ylabel('Returns')
+       #create scatter plot coloured by Sharpe Ratio
+       plt.scatter(results_frame.stdev,results_frame.r,c=results_frame.sharpe,cmap='RdYlGn')
+       plt.xlabel('Volatility')
+       plt.ylabel('Returns')
        plt.colorbar()
-       #plot red star to highlight position of portfolio with highest Sharpe Ratio
-       plt.scatter(max_sharpe_port[1],max_sharpe_port[0],marker='o',color='b',s=200)
-       #plot green star to highlight position of minimum variance portfolio
+       #plot red star to highlight position of portfolio with highest Sharpe Ratio
+       plt.scatter(max_sharpe_port[1],max_sharpe_port[0],marker='o',color='b',s=200)
+       #plot green star to highlight position of minimum variance portfolio
        plt.show()
        print(max_sharpe_port)
        record(pr=pr,r=r, m=m, stds=stds ,max_sharpe_port=max_sharpe_port, corr_m=corr_m)
@@ -1155,15 +1283,15 @@ in writting the following article:
 
 
 def analyze(context=None, results=None):
-   # Form DataFrame with selected data
-   data = results[['pr','r','m','stds','max_sharpe_port','corr_m','portfolio_value']]
+   # Form DataFrame with selected data
+   data = results[['pr','r','m','stds','max_sharpe_port','corr_m','portfolio_value']]
 
-   # Save results in CSV file
-   filename = os.path.splitext(os.path.basename(__file__))[0]
-   data.to_csv(filename + '.csv')
+   # Save results in CSV file
+   filename = os.path.splitext(os.path.basename(__file__))[0]
+   data.to_csv(filename + '.csv')
 
 
-# Bitcoin data is available from 2015-3-2. Dates vary for other tokens.
+# Bitcoin data is available from 2015-3-2. Dates vary for other tokens.
 start = datetime(2017, 1, 1, 0, 0, 0, 0, pytz.utc)
 end = datetime(2017, 8, 16, 0, 0, 0, 0, pytz.utc)
 results = run_algorithm(initialize=initialize,
@@ -1171,7 +1299,7 @@ in writting the following article:
                         analyze=analyze,
                         start=start,
                         end=end,
-                        exchange_name='poloniex',
+                        exchange_name='poloniex',
                         capital_base=100000, )
 
@@ -1180,19 +1308,15 @@ in writting the following article:
-
-
- -
@@ -1226,8 +1349,7 @@ in writting the following article: VERSION:'0.4', COLLAPSE_INDEX:false, FILE_SUFFIX:'.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '' + HAS_SOURCE: true }; diff --git a/features.html b/features.html index 2b755b34..717f1ae0 100644 --- a/features.html +++ b/features.html @@ -13,8 +13,6 @@ - - @@ -43,28 +41,21 @@ -
- - - - - - - - - - - - - - - - -
- +
- -
-
-
+

Features

@@ -233,10 +365,10 @@ exchange. Catalyst will always expect in all its functions that you will refer t the asset pairs by using the Catalyst naming convention.

If at any point, you input the wrong name for an asset pair, you will get an error of that pair not found in the given exchange, and a list of pairs available on that exchange:

-
$ catalyst ingest-exchange -x poloniex -i btc_usd
+
$ catalyst ingest-exchange -x poloniex -i btc_usd
 
-
Ingesting exchange bundle poloniex...
+
Ingesting exchange bundle poloniex...
 Error traceback: /Volumes/Data/Users/victoris/Desktop/Enigma/user-install/catalyst-dev/catalyst/exchange/exchange.py (line 175)
 SymbolNotFoundOnExchange:  Symbol btc_usd not found on exchange Poloniex.
 Choose from: ['rep_usdt', 'gno_btc', 'xvc_btc', 'pink_btc', 'sys_btc',
@@ -263,10 +395,10 @@ USDT cryptocurrency asset that is issued on the Bitcoin blockchain via the Omni
 Layer Protocol. Each USDT unit is backed by a U.S Dollar held in the reserves of
 Tether Limited. USDT can be transferred, stored, and spent, just like bitcoins
 or any other cryptocurrency. Given its 1:1 mapping to the USD, is a viable alternative.

-
$ catalyst ingest-exchange -x poloniex -i btc_usdt
+
$ catalyst ingest-exchange -x poloniex -i btc_usdt
 
-
Ingesting exchange bundle poloniex...
+
Ingesting exchange bundle poloniex...
     [====================================]  Fetching poloniex daily candles: :  100%
 
@@ -274,19 +406,15 @@ or any other cryptocurrency. Given its 1:1 mapping to the USD, is a viable alter
-
-
- -
@@ -320,8 +447,7 @@ or any other cryptocurrency. Given its 1:1 mapping to the USD, is a viable alter VERSION:'0.4', COLLAPSE_INDEX:false, FILE_SUFFIX:'.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '' + HAS_SOURCE: true }; diff --git a/genindex.html b/genindex.html index 43c68730..ef21cc4a 100644 --- a/genindex.html +++ b/genindex.html @@ -14,8 +14,6 @@ - - @@ -42,28 +40,21 @@ -
- - - - - - - - - - - - - - - - -
- +
    - -
  • Docs »
  • - -
  • Index
  • - - +
  • Docs »
  • + +
  • - +
  • -
- -
-
-
+

Index

@@ -173,10 +310,6 @@ -
-
- -
@@ -210,8 +342,7 @@ VERSION:'0.4', COLLAPSE_INDEX:false, FILE_SUFFIX:'.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '' + HAS_SOURCE: true }; diff --git a/index.html b/index.html index 95984faf..932bed80 100644 --- a/index.html +++ b/index.html @@ -13,8 +13,6 @@ - - @@ -42,28 +40,21 @@ -
- - - - - - - - - - - - - - - - -
- +
- -
-
-
+
Enigma | Catalyst

version tag @@ -229,16 +366,12 @@ performance across trading algorithms.

-
-
- -
@@ -273,8 +405,7 @@ performance across trading algorithms. VERSION:'0.4', COLLAPSE_INDEX:false, FILE_SUFFIX:'.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '' + HAS_SOURCE: true }; diff --git a/install.html b/install.html index 2cec08af..ded4e9ae 100644 --- a/install.html +++ b/install.html @@ -13,8 +13,6 @@ - - @@ -43,28 +41,21 @@ -
- - - - - - - - - - - - - - - - -
- +
- -
-
-
+

Install

@@ -243,23 +358,23 @@ to a folder you can remember. Make sure that the file gets saved with the saved the above python2.7-environment.yml file.

  • Install using this file. This step can take about 5-10 minutes to install.

    -
    conda env create -f python2.7-environment.yml
    +
    conda env create -f python2.7-environment.yml
     
  • Activate the environment (which you need to do every time you start a new session to run Catalyst):

    Linux or MacOS:

    -
    source activate catalyst
    +
    source activate catalyst
     

    Windows:

    -
    activate catalyst
    +
    activate catalyst
     
  • Verify that Catalyst is install correctly:

    -
    catalyst --version
    +
    catalyst --version
     

    which should display the current version.

    @@ -275,32 +390,32 @@ with the following steps:

  • If the above installation failed, and you have a partially set up catalyst environment, remove it first. If you are starting from scratch, proceed to step #2:

    -
    conda env remove --name catalyst
    +
    conda env remove --name catalyst
     
  • Create the environment:

    -
    conda create --name catalyst python=2.7 scipy zlib
    +
    conda create --name catalyst python=2.7 scipy zlib
     
  • Activate the environment:

    Linux or MacOS:

    -
    source activate catalyst
    +
    source activate catalyst
     

    Windows:

    -
    activate catalyst
    +
    activate catalyst
     
  • Install the Catalyst inside the environment:

    -
    pip install enigma-catalyst matplotlib
    +
    pip install enigma-catalyst matplotlib
     
  • Verify that Catalyst is installed correctly:

    -
    catalyst --version
    +
    catalyst --version
     

    which should display the current version.

    @@ -330,14 +445,14 @@ distribution, refer to the Ins that you install in a virtualenv. The Hitchhiker’s Guide to Python provides an excellent tutorial on virtualenv. Here’s a summarized version:

    -
    $ pip install virtualenv
    -$ virtualenv catalyst-venv
    -$ source ./catalyst-venv/bin/activate
    +
    $ pip install virtualenv
    +$ virtualenv catalyst-venv
    +$ source ./catalyst-venv/bin/activate
     

    Once you’ve installed the necessary additional dependencies for your system (GNU/Linux Requirements, MacOS Requirements or Windows Requirements) and have activated your virtualenv, you should be able to simply run

    -
    $ pip install enigma-catalyst matplotlib
    +
    $ pip install enigma-catalyst matplotlib
     

    Note that in the command above we install two different packages. The second @@ -352,11 +467,11 @@ recommend you install it, as well.

    Package enigma-catalyst cannot be found
    Solution:

    Make sure you have the most up-to-date version of pip installed, by running:

    -
    $ pip install --upgrade pip
    +
    $ pip install --upgrade pip
     

    On Windows, the recommended command is:

    -
    $ python -m pip install --upgrade pip
    +
    $ python -m pip install --upgrade pip
     
    @@ -366,10 +481,10 @@ recommend you install it, as well.

    Issue:

    Package enigma-catalyst cannot still be found, even after upgrading pip (see above), with an error similar to:

    -
    Downloading/unpacking enigma-catalyst
    +
    Downloading/unpacking enigma-catalyst
     Could not find a version that satisfies the requirement enigma-catalyst
    -(from versions: 0.1.dev9, 0.2.dev2, 0.1.dev4, 0.1.dev5, 0.1.dev3,
    -0.2.dev1, 0.1.dev8, 0.1.dev6)
    +(from versions: 0.1.dev9, 0.2.dev2, 0.1.dev4, 0.1.dev5, 0.1.dev3,
    +0.2.dev1, 0.1.dev8, 0.1.dev6)
     Cleaning up...
     No distributions matching the version for enigma-catalyst
     
    @@ -381,7 +496,7 @@ to only find stable versions by default. Since Catalyst is in alpha version, pip cannot find a matching version that satisfies the installation requirements. The solution is to include the –pre flag to include pre-release and development versions:

    -
    $ pip install --pre enigma-catalyst
    +
    $ pip install --pre enigma-catalyst
     
    @@ -392,7 +507,7 @@ pre-release and development versions:

    Package enigma-catalyst fails to install because of outdated setuptools
    Solution:

    Upgrade to the most up-to-date setuptools package by running:

    -
    $ pip install --upgrade pip setuptools
    +
    $ pip install --upgrade pip setuptools
     
    @@ -405,7 +520,7 @@ pre-release and development versions:

    Download requirements.txt (click on the Raw button and Right click -> Save As...) and use it to install all the required dependencies by running:

    -
    $ pip install -r requirements.txt
    +
    $ pip install -r requirements.txt
     
    @@ -420,7 +535,7 @@ install all the required dependencies by running:

    for the proper build and installation of package dependencies. The solution is to install python-dev, which is independent of the virtual environment. In Ubuntu, you would need to run:

    -
    $ sudo apt-get install python-dev
    +
    $ sudo apt-get install python-dev
     
    @@ -431,21 +546,21 @@ In Ubuntu, you would need to run:

    Installing with pipenv

    Installing Catalyst via pipenv is perhaps easier that installing it via pip itself but you need to install pipenv first via pip.

    -
    $ pip install pipenv
    +
    $ pip install pipenv
     

    Once pipenv is installed you can proceed by creating a project folder and installing Catalyst on that project automagically as follows:

    -
    $ mkdir project
    -$ cd project
    -$ pipenv --two
    -$ pipenv install enigma-catalyst matplotlib
    +
    $ mkdir project
    +$ cd project
    +$ pipenv --two
    +$ pipenv install enigma-catalyst matplotlib
     

    Until now the workflow compared to pip is almost identical, the difference is that you don’t need to load manually any virtualenv however you need to use the pipenv run prefix to run the catalyst command as follows:

    -
    $ pipenv run catalyst --version
    +
    $ pipenv run catalyst --version
     

    If you want to know more about pipenv go to the pipenv github repo

    @@ -454,29 +569,29 @@ the pipenv run prefix to run the catalyst command as f

    GNU/Linux Requirements

    On Debian-derived Linux distributions, you can acquire all the necessary binary dependencies from apt by running:

    -
    $ sudo apt-get install libatlas-base-dev python-dev gfortran pkg-config libfreetype6-dev
    +
    $ sudo apt-get install libatlas-base-dev python-dev gfortran pkg-config libfreetype6-dev
     

    On recent RHEL-derived derived Linux distributions (e.g. Fedora), the following should be sufficient to acquire the necessary additional dependencies:

    -
    $ sudo dnf install atlas-devel gcc-c++ gcc-gfortran libgfortran python-devel redhat-rep-config
    +
    $ sudo dnf install atlas-devel gcc-c++ gcc-gfortran libgfortran python-devel redhat-rep-config
     

    On Arch Linux, you can acquire the additional dependencies via pacman:

    -
    $ pacman -S lapack gcc gcc-fortran pkg-config
    +
    $ pacman -S lapack gcc gcc-fortran pkg-config
     

    Amazon Linux AMI Notes

    The packages pip and setuptools that come shipped by default are very outdated. Thus, you first need to run:

    -
    $ pip install --upgrade pip setuptools
    +
    $ pip install --upgrade pip setuptools
     

    The default installation is also missing the C and C++ compilers, which you install by:

    -
    $ sudo yum install gcc gcc-c++
    +
    $ sudo yum install gcc gcc-c++
     

    Then you should follow the regular installation instructions outlined at the @@ -493,14 +608,14 @@ to which explains how to install Python with the Homebrew manager.

    Assuming you’ve installed Python with Homebrew, you’ll also likely need the following brew packages:

    -
    $ brew install freetype pkg-config gcc openssl
    +
    $ brew install freetype pkg-config gcc openssl
     

    MacOS + virtualenv/conda + matplotlib

    The first time that you try to run an algorithm that loads the matplotlib library, you may get the following error:

    -
    RuntimeError: Python is not installed as a framework. The Mac OS X backend
    +
    RuntimeError: Python is not installed as a framework. The Mac OS X backend
     will not be able to function correctly if Python is not installed as a
     framework. See the Python documentation for more information on installing
     Python as a framework on Mac OS X. Please either reinstall Python as a
    @@ -512,7 +627,7 @@ information.
     

    This is a matplotlib-specific error, that will go away once you run the following command:

    -
    $ echo "backend: TkAgg" > ~/.matplotlib/matplotlibrc
    +
    $ echo "backend: TkAgg" > ~/.matplotlib/matplotlibrc
     

    in order to override the default MacOS backend for your system, which @@ -582,12 +697,12 @@ update Catalyst frequently. Once installed, Catalyst can easily be updated as a pip package regardless of the environemnt used for installation. Make sure you activate your environment first as you did in your first install, and then execute:

    -
    $ pip uninstall enigma-catalyst
    -$ pip install enigma-catalyst
    +
    $ pip uninstall enigma-catalyst
    +$ pip install enigma-catalyst
     

    Alternatively, you could update Catalyst issuing the following command:

    -
    $ pip install -U enigma-catalyst
    +
    $ pip install -U enigma-catalyst
     

    but this command will also upgrade all the Catalyst dependencies to the latest @@ -617,19 +732,15 @@ and you get a hint on how to solve it.

  • -
    -
    - -
  • @@ -663,8 +773,7 @@ and you get a hint on how to solve it. VERSION:'0.4', COLLAPSE_INDEX:false, FILE_SUFFIX:'.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '' + HAS_SOURCE: true }; diff --git a/live-trading.html b/live-trading.html index 781ab3d4..22020d8b 100644 --- a/live-trading.html +++ b/live-trading.html @@ -13,8 +13,6 @@ - - @@ -43,28 +41,21 @@ -
    - - - - - - - - - - - - - - - - -
    - +
    - -
    -
    -
    +

    Live Trading

    @@ -245,7 +375,7 @@ Here is how to generate key and secret values for the Bitfinex exchange: https://docs.bitfinex.com/v1/docs/api-access. Most exchanges follow a similar process.

    The auth.json file:

    -
    {
    +
    {
       "name": "bitfinex",
       "key": "my-key",
       "secret": "my-secret"
    @@ -275,7 +405,7 @@ seperator.

    [Market Currency]_[Base Currency] all lowercase.

    Currency symbols (e.g. btc, eth, ltc) follow the Bittrex convention.

    Here are some examples:

    -
    # With Bitfinex
    +
    # With Bitfinex
     bitcoin_usd_asset = symbol('btc_usd')
     ethereum_bitcoin_asset = symbol('eth_btc')
     
    @@ -298,17 +428,17 @@ algorithm for live trading. The same algorithm should work in
     backtest and live execution mode without modification.

    What differs are the arguments provided to the catalyst client or run_algorithm() interface. Here is the same example in both interfaces:

    -
    catalyst live -f my_algo_code -x bitfinex -c btc -n my_algo_name
    +
    catalyst live -f my_algo_code -x bitfinex -c btc -n my_algo_name
     
    -
    run_algorithm(
    +
    run_algorithm(
         initialize=initialize,
         handle_data=handle_data,
         analyze=analyze,
    -    exchange_name='bitfinex',
    +    exchange_name='bitfinex',
         live=True,
    -    algo_namespace='my_algo_name',
    -    base_currency='btc'
    +    algo_namespace='my_algo_name',
    +    base_currency='btc'
     )
     
    @@ -337,19 +467,15 @@ simulated in Catalyst instead of processed on the exchange. It defaults to
    -
    -
    - -
    @@ -383,8 +508,7 @@ simulated in Catalyst instead of processed on the exchange. It defaults to VERSION:'0.4', COLLAPSE_INDEX:false, FILE_SUFFIX:'.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '' + HAS_SOURCE: true }; diff --git a/release-process.html b/release-process.html index a949a726..01ccf25f 100644 --- a/release-process.html +++ b/release-process.html @@ -13,8 +13,6 @@ - - @@ -41,28 +39,21 @@ -
    - - - - - - - - - - - - - - - - -
    - +
    - -
    -
    -
    +

    Release Process

    @@ -168,7 +305,7 @@ page. We will have been maintaining a whatsnew file while working on the release with the new version. First, find that file in: docs/source/whatsnew/<version>.txt. It will be the highest version number. Edit the release date field to be today’s date in the format:

    -
    <month> <day>, <year>
    +
    <month> <day>, <year>
     

    for example, November 6, 2015. @@ -179,9 +316,9 @@ update the underline of the title to match the title’s width.

    If you are renaming the release at this point, you’ll need to git mv the file and also update releases.rst to reference the renamed file.

    To build and view the docs locally, run:

    -
    $ cd docs
    -$ make html
    -$ {BROWSER} build/html/index.html
    +
    $ cd docs
    +$ make html
    +$ {BROWSER} build/html/index.html
     
    @@ -193,7 +330,7 @@ namespace is populated at import time by decorators on TradingAlgorithm methods. Those functions are therefore hidden from static analysis tools, but we can generate static files to make them available. Under Python 3, run the following to generate any stub files:

    -
    $ python etc/gen_type_stubs.py
    +
    $ python etc/gen_type_stubs.py
     
    @@ -215,8 +352,8 @@ manage the __version__

    To upgrade the version use the git tag command like:

    -
    $ git tag <major>.<minor>.<micro>
    -$ git push && git push --tags
    +
    $ git tag <major>.<minor>.<micro>
    +$ git push && git push --tags
     

    This will push the the code and the tag information.

    @@ -228,15 +365,15 @@ choose the tag you just pushed, and publish the release.

    sdist

    To build the sdist (source distribution) run:

    -
    $ python setup.py sdist
    +
    $ python setup.py sdist
     

    from the zipline root. This will create a gzipped tarball that includes all the python, cython, and miscellaneous files needed to install zipline. To test that the source dist worked correctly, cd into an empty directory, create a new virtualenv and then run:

    -
    $ pip install <zipline-root>/dist/zipline-<major>.<minor>.<micro>.tar.gz
    -$ python -c 'import zipline;print(zipline.__version__)'
    +
    $ pip install <zipline-root>/dist/zipline-<major>.<minor>.<micro>.tar.gz
    +$ python -c 'import zipline;print(zipline.__version__)'
     

    This should print the version we are expecting to release.

    @@ -250,7 +387,7 @@ all the required packages.

    Now that we have tested the package locally, it should be tested using the test PyPI server.

    Edit your ~/.pypirc file to look like:

    -
    [distutils]
    +
    [distutils]
     index-servers =
         pypi
         pypitest
    @@ -266,7 +403,7 @@ password:
     

    after that, run:

    -
    $ python setup.py sdist upload -r pypitest
    +
    $ python setup.py sdist upload -r pypitest
     
    @@ -283,14 +420,14 @@ debugging packaging problems on the test server.

    This will upload zipline to the pypi test server. To test installing from pypi, create a new virtualenv, cd into a clean directory and then run:

    -
    $ pip install --extra-index-url https://testpypi.python.org/pypi zipline
    -$ python -c 'import zipline;print(zipline.__version__)'
    +
    $ pip install --extra-index-url https://testpypi.python.org/pypi zipline
    +$ python -c 'import zipline;print(zipline.__version__)'
     

    This should pull the package you just uploaded and then print the version number.

    Now that we have tested locally and on PyPI test, it is time to upload to PyPI:

    -
    $ python setup.py sdist upload
    +
    $ python setup.py sdist upload
     
    @@ -305,7 +442,7 @@ they were compiled.

    Documentation

    To update zipline.io, checkout the latest master and run:

    -
    python <zipline_root>/docs/deploy.py
    +
    python <zipline_root>/docs/deploy.py
     

    This will build the documentation, checkout a fresh copy of the gh-pages @@ -320,9 +457,9 @@ correct arguments.

    Now, using our browser of choice, view the index.html page and verify that the docs look correct.

    Once we are happy, push the updated docs to the GitHub gh-pages branch.

    -
    $ git add .
    -$ git commit -m "DOC: update zipline.io"
    -$ git push origin gh-pages
    +
    $ git add .
    +$ git commit -m "DOC: update zipline.io"
    +$ git push origin gh-pages
     

    zipline.io will update in a few moments.

    @@ -337,14 +474,14 @@ is also a good time to remove all the old “ci” packages from anacond

    Travis and AppVeyor only build and upload linux-64 and win-64 packages. We’ll need to build and upload osx-64 packages manually on an OSX machine.

    To build the conda packages for zipline locally, run:

    -
    $ python etc/conda_build_matrix.py
    +
    $ python etc/conda_build_matrix.py
     

    If all of the builds succeed, then this will not print anything and exit with EXIT_SUCCESS. If there are build issues, we must address them and decide what to do.

    Once all of the builds in the matrix pass, we can upload them to anaconda with:

    -
    $ python etc/conda_build_matrix.py --upload
    +
    $ python etc/conda_build_matrix.py --upload
     

    If you would like to test this command by uploading to a different user, this @@ -359,17 +496,13 @@ renamed when that’s decided. You can use

    Include the whatsnew file in docs/source/releases.rst. New releases should appear at the top. The syntax for this is:

    -
    .. include:: whatsnew/<version>.txt
    +
    .. include:: whatsnew/<version>.txt
     
    -
    -
    - -
    @@ -403,8 +535,7 @@ appear at the top. The syntax for this is:

    VERSION:'0.4', COLLAPSE_INDEX:false, FILE_SUFFIX:'.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '' + HAS_SOURCE: true }; diff --git a/releases.html b/releases.html index 65f10249..ac621746 100644 --- a/releases.html +++ b/releases.html @@ -13,8 +13,6 @@ - - @@ -42,28 +40,21 @@ -
    - - - - - - - - - - - - - - - - -
    - +
    - -
    -
    -
    +

    Release Notes

    -
    -

    Version 0.4.7

    -

    Release Date: 2018-01-19

    +
    +

    Version 0.5.1

    +

    Release Date: 2018-02-07

    Bug Fixes

      -
    • Fixing issue #137 impacting the CLI
    • +
    • Fixed an issue with orders that stay open #211
    • +
    • Fixed Jupyter issues #179
    • +
    • Fetching multiple tickers in one call to minimize rate limit risks #174
    • +
    • Improved live state presentation #171

    Build

      +
    • Introducing the Enigma Marketplace
    • +
    +
    +
    +
    +

    Version 0.4.7

    +

    Release Date: 2018-01-19

    +
    +

    Bug Fixes

    +
      +
    • Fixing issue #137 impacting the CLI
    • +
    +
    +
    +

    Build

    +
    • Implemented authentication aliases (#60)
    @@ -265,8 +333,8 @@

    Version 0.4.6

    Release Date: 2018-01-18

    -
    -

    Bug Fixes

    +
    +

    Bug Fixes

    • Fixed some Python3 issues
    • Reading the trade log to get executed order prices on exchanges like Binance (#151)
    • @@ -276,8 +344,8 @@
    • Using Bitfinex instead of Poloniex to fetch btc_usdt benchmark (#161)
    -
    -

    Build

    +
    +

    Build

    • Added a context.state dict to keep arbitrary state values between runs
    • Added ability to stop live algo at specified end date
    • @@ -287,8 +355,8 @@

      Version 0.4.5

      Release Date: 2018-01-12

      -
      -

      Bug Fixes

      +
      +

      Bug Fixes

      • Improved order execution for exchanges supporting trade lists (#151)
      • Fixed an issue where requesting history of multiple assets repeats values
      • @@ -300,8 +368,8 @@

        Version 0.4.4

        Release Date: 2018-01-09

        -
        -

        Bug Fixes

        +
        +

        Bug Fixes

        • Removed redundant capital_base validation (#142)
        • Fixed portfolio update issue with restored state (#111)
        • @@ -312,8 +380,8 @@

          Version 0.4.3

          Release Date: 2018-01-05

          -
          -

          Bug Fixes

          +
          +

          Bug Fixes

          • Fixed CLI issue (#137)
          • Upgraded CCXT
          • @@ -323,8 +391,8 @@

            Version 0.4.2

            Release Date: 2018-01-03

            -
            -

            Bug Fixes

            +
            +

            Bug Fixes

            • Fixed cash synchronization issue (#133)
            • Fixed positions synchronization issue (#132)
            • @@ -334,8 +402,8 @@
            • Fixed a poloniex specific issue in live trading (#103)
            -
            -

            Build

            +
            +

            Build

            • Caching CCXT market info to limit round-trips (#99)
            • Tentative support for Pipeline (#96)
            • @@ -345,16 +413,16 @@

              Version 0.4.0

              Release Date: 2017-12-12

              -
              -

              Bug Fixes

              +
              +

              Bug Fixes

              • Changed Poloniex interface (should solve #95 and #94)
              • Solved issue with overriding commission and slippage (#87)
              • Fixed inefficiency with Bittrex current prices (#76)
              -
              -

              Build

              +
              +

              Build

              • Integrated with CCXT
              • Added paper trading capability (simulate_orders=True param in live mode)
              • @@ -366,8 +434,8 @@

                Version 0.3.10

                Release Date: 2017-11-28

              -
              -

              Bug Fixes

              +
              +

              Bug Fixes

              • Fixed issue with fetching assets with daily frequency
              @@ -376,15 +444,15 @@

              Version 0.3.9

              Release Date: 2017-11-28

              -
              -

              Bug Fixes

              +
              +

              Bug Fixes

              • Fixed sortino warning issues (#77)
              • Adjusted computation of last candle of data.history (#71)
              -
              -

              Build

              +
              +

              Build

              • Added capital_base parameter to live mode to limit cash (#79)
              • Added support for csv ingestion (#65)
              • @@ -395,8 +463,8 @@

                Version 0.3.8

                Release Date: 2017-11-14

                -
                -

                Bug Fixes

                +
                +

                Bug Fixes

                • Fixed a warning filter issue introduced with the latest release
                @@ -405,8 +473,8 @@

                Version 0.3.7

                Release Date: 2017-11-14

                -
                -

                Bug Fixes

                +
                +

                Bug Fixes

                • Fixed an SSL cert issue (#64)
                • Fixed cumulative stats warnings (#63)
                • @@ -414,8 +482,8 @@
                • Standardized live-trading stats (#61)
                -
                -

                Build

                +
                +

                Build

                • Added a mean-reversion sample algo
                • Added minutely stats in the analyze() function (#62)
                • @@ -426,8 +494,8 @@

                  Version 0.3.6

                  Release Date: 2017-11-4

                  -
                  -

                  Bug Fixes

                  +
                  +

                  Bug Fixes

                  • Fixed an issue with single bar data.history() (#55)
                  @@ -436,8 +504,8 @@

                  Version 0.3.5

                  Release Date: 2017-11-4

                  -
                  -

                  Bug Fixes

                  +
                  +

                  Bug Fixes

                  • Added workaround for: KeyError: Timestamp error (#53)
                  @@ -446,8 +514,8 @@

                  Version 0.3.4

                  Release Date: 2017-11-2

                  -
                  -

                  Bug Fixes

                  +
                  +

                  Bug Fixes

                  • Fixed issue with auto-ingestion of minute data (#47)
                  • Fixed issue with sell orders in backtesting
                  • @@ -457,8 +525,8 @@ transactions
                  -
                  -

                  Build

                  +
                  +

                  Build

                  • Added more unit tests
                  @@ -485,16 +553,16 @@ transactions

                  Version 0.3.3

                  Release Date: 2017-10-26

                  -
                  -

                  Bug Fixes

                  +
                  +

                  Bug Fixes

                  • Fix missing -x in ingest-exchange
                  • Fix issue with daily chunks end date (data bundles)
                  • Fix issue in the prepare_chunk logic (data bundles)
                  -
                  -

                  Build

                  +
                  +

                  Build

                  • Added data validation unit tests
                  @@ -503,8 +571,8 @@ transactions

                  Version 0.3.2

                  Release Date: 2017-10-25

                  -
                  -

                  Bug Fixes

                  +
                  +

                  Bug Fixes

                  • Fix to work with empty data bundles
                  • Fix Windows path of $HOME/.catalyst folder
                  • @@ -513,8 +581,8 @@ transactions
                  • Fix an issue with asset date in chunks
                  -
                  -

                  Build

                  +
                  +

                  Build

                  • Python3 adjustments
                  • Added method to clean bundle folders, and remove symbols.json
                  • @@ -525,8 +593,8 @@ transactions

                    Version 0.3.1

                    Release Date: 2017-10-22

                    -
                    -

                    Bug Fixes

                    +
                    +

                    Bug Fixes

                    • Fixed OS-dependent path issue in data bundle
                    • Changed handling of empty auth.json, instead of throwing an error for @@ -646,17 +714,13 @@ exchange directly
                    -
                    -
                    - -
                    @@ -690,8 +753,7 @@ exchange directly VERSION:'0.4', COLLAPSE_INDEX:false, FILE_SUFFIX:'.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '' + HAS_SOURCE: true }; diff --git a/resources.html b/resources.html index 90a4b025..37604681 100644 --- a/resources.html +++ b/resources.html @@ -13,8 +13,6 @@ - - @@ -43,28 +41,21 @@ -
                    - - - - - - - - - - - - - - - - -
                    - +
                    - -
                    -
                    -
                    +

                    Resources

                    @@ -190,19 +324,15 @@ trading algorithms
                    -
                    -
                    - -
                    @@ -236,8 +365,7 @@ trading algorithms VERSION:'0.4', COLLAPSE_INDEX:false, FILE_SUFFIX:'.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '' + HAS_SOURCE: true }; diff --git a/search.html b/search.html index 8680749a..14135600 100644 --- a/search.html +++ b/search.html @@ -13,8 +13,6 @@ - - @@ -41,28 +39,21 @@ -
                    - - - - - - - - - - - - - - - - -
                    - +
                      - -
                    • Docs »
                    • - -
                    • Search
                    • - - +
                    • Docs »
                    • + +
                    • -
                    - -
                    -
                    -
                    +
                    -
                    - -
                    @@ -202,8 +334,7 @@ VERSION:'0.4', COLLAPSE_INDEX:false, FILE_SUFFIX:'.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '' + HAS_SOURCE: true }; diff --git a/searchindex.js b/searchindex.js index 406c3096..21470183 100644 --- a/searchindex.js +++ b/searchindex.js @@ -1 +1 @@ -Search.setIndex({envversion:47,filenames:["appendix","beginner-tutorial","bundles","development-guidelines","example-algos","features","index","install","live-trading","release-process","releases","resources","unit-tests","utilities","videos"],objects:{"zipline.data.bundles":{bundles:[0,0,1,""]}},objnames:{"0":["py","data","Python data"]},objtypes:{"0":"py:data"},terms:{"000000e":1,"1000th":1,"15t":4,"1st":1,"30t":4,"328842e":1,"340mb":10,"380954e":1,"40mb":10,"460mb":10,"505275d6646a41f3856b22b16678d":1,"536708e":1,"5min":[1,4],"650729e":1,"7869f7828fa140328eb40477bb7d":1,"998236e":1,"998677e":1,"999120e":1,"999558e":1,"99mb":10,"__file__":[4,13],"__future__":4,"__main__":[1,4],"__name__":[1,4],"__wrapped__":9,"_html_base":3,"_tkinter":1,"boolean":[2,8],"break":7,"case":[1,2,3,7,13],"class":[3,9],"default":1,"export":9,"final":[1,2,3],"float":[1,10],"import":[1,2,4,9,13],"int":2,"long":[1,2,4],"new":1,"null":12,"public":10,"return":[1,4,8,9,10,11],"short":[1,3,4],"static":9,"switch":8,"throw":10,"true":[1,4,8,10],"try":[3,4,7],"var":1,"while":[5,7,9,10],aapl:2,abil:[2,10],abl:[1,2,7],abner:4,about:[1,2,6,7],abov:[1,3,4,5,7,8,9],accept:[2,7,9],accord:9,accordingli:[1,4],account:[1,2,4,6,10],acevedo:4,acquir:[2,7],across:[5,6,10],activ:[7,8,9],actual:1,add:[1,2,3,7,9,13],addit:[1,3,5,6,7,10],addition:8,address:9,adjust:[2,4,10],administr:7,advantag:7,afford:[1,4],aforement:1,after:[1,2,4,7,9],again:[1,3],against:[1,6,8,10,14],agre:4,ahead:1,aim:[4,11],algebra:[4,7],algo:[1,2,4,10],algo_namespac:[1,4,8],algo_volatil:1,algofil:[1,2],algorithm_period_return:[1,4],algotext:1,alia:4,alias:[4,10],all:[0,1,2,3,4,5,6,7,8,9,10,12],allow:[1,2,5,6,7],almost:7,along:2,alongsid:1,alpha:[1,4,7,8],alreadi:[1,2,3,7],also:[1,2,3,4,6,7,8,9],altern:[1,5,7],although:1,alwai:[2,5,8,9],amount:[1,4,8,10],amp_btc:5,ana:7,anaconda:[1,7,9],analog:1,analysi:[1,4,6,9,10,11],analyst:11,analyt:[6,7],analyz:[1,4,8,10,13],ani:[1,2,4,5,7,8,9,13],anonym:2,anoth:[1,2,4,5],anymor:1,anyth:[1,7,9],apach:4,app:7,appar:1,appear:[2,9],append:9,appli:[1,4],applic:[1,4],appropri:[1,3,4],approxim:[1,4],appveyor:9,apt:[1,7],arang:[1,4],arbitrag:5,arbitrari:[8,10],arbitrarili:1,arch:7,architectur:1,ardr_btc:5,arg:[1,9],argument:[0,1,2,8,9],argv:13,around:[6,9],arrai:[4,7],art:6,articl:[3,4],ask:[1,3],asmatrix:4,assert:[3,12],assertionerror:3,assess:1,asset_nam:[1,4],assetdbwrit:2,assign:[1,8],assimil:1,assist:7,assum:[1,3,4,7],astyp:4,atla:7,attempt:[2,8],attribut:[4,9],auth:[8,10],auto:10,automag:7,avail:[0,1],avoid:[1,2,4],awai:7,awar:9,ax1:[1,4],ax2:[1,4],ax3:[1,4],ax4:[1,4],ax5:[1,4],ax6:[1,4],axhlin:4,axi:4,ayala:4,back:[3,5,7],backbon:4,backend:7,bah:4,bar:[1,4,10],bar_count:[1,4],base:[1,2,4,5,6,7,8,14],base_curr:[1,4,5,8,13],base_pric:[1,4],basenam:[4,13],basi:[4,10],batch:7,batteri:1,battl:7,bch_btc:5,bch_eth:5,bch_usdt:5,bcn_btc:5,bcn_xmr:5,bcolz:2,bcolzdailybarread:2,bcolzdailybarwrit:2,bcolzminutebarread:2,bcolzminutebarwrit:2,bcy_btc:5,be62ff77760c4599abaac43be9cc9:1,bear:[1,4],beautifi:1,becaus:[1,7,9,10],been:[0,1,2,7,9],befor:[1,2,4,7,8,10],before_trading_start:[0,4],beggin:4,begin:[1,4,7],behavior:0,bela_btc:5,believ:1,below:[1,3,4,13],benchmark:[1,4,5,6,10],benchmark_period_return:[1,4],benchmark_volatil:1,benefit:1,best:[3,6,7],beta:[1,4],better:1,between:[1,3,4,5,6,10,12],beyond:5,bfill:4,bia:1,big:7,bin:[4,7],binanc:[8,10],binari:[7,9],bit:[3,7],bitcoin:[1,4,5,6,8,13],bitcoin_usd_asset:8,bitfinex:[1,4,5,6,8,10],bitmex:8,bittrex:[1,4,5,6,8,10,14],blank:12,bld:3,blk_btc:5,blk_xmr:5,blockchain:5,blotter:13,blue:1,bodi:3,book:1,both:[1,3,5,8,9,12],bought:[1,8],bound:1,breakdown:8,brew:7,brother:7,brows:7,browser:[1,3,9],btc:1,btc_usd:[1,4,5,8],btc_usdt:[4,5,6,10,13],btcd_btc:5,btcd_xmr:5,btm_btc:5,bts_btc:5,bug:[0,2,3],bui:1,build:[1,3,6,7,9],build_ext:3,burst_btc:5,button:[7,9],buy_and_hodl:[4,10],buy_btc_simpl:[1,4],buy_btc_simple_out:[1,4],buy_df:[1,4],buy_low_sell_high:10,calcul:[1,3,4,8,12],call:[1,2,3,4],can:[1,2,3,4,5,6,7,8,9,10,13],can_trad:[1,4,10],cancel_ord:[1,4],candl:[1,5,10,12],candle_s:4,candlestick:4,cannot:[1,4,7],canon:3,capabl:10,capit:[1,4],capital_bas:[1,4,8,10,13],capital_us:1,captur:1,cash:[1,2,3,4,10],catalyst_dev:[1,6,7],caus:[0,1,2,3],ccxt:[8,10],cell:1,cert:10,certian:0,chanc:1,chang:[1,3,4,6,7,9,10],channel:[1,6,7],charact:3,charg:1,chart:[1,4,7],check:[1,2,3,4,5,7,8],checker:9,checkout:[3,9],choic:9,choos:[1,4,5,7,9,13],chosen:[1,13],chunk:[1,10],circumv:7,clam_btc:5,classic:[1,4],classifi:1,clean:[2,7,9,10,12],clear:2,cli:[1,4,10,13],click:[7,9],client:8,clone:3,close:[1,4,5,13],cmap:4,cmd:[1,7],code:[1,4,7,9,10,13],codebas:3,coin:[1,4,10],collect:[1,2,4],color:[1,4],colorbar:4,colour:4,column:[1,2,4],com:[1,2,3,8],combin:[7,8],come:[2,7],comment:1,common:1,commonli:1,commun:[5,7,11],comp:4,compar:[1,4,5,6,7,12],comparison:10,compat:[6,10],compil:[7,9,10],complement:4,complet:8,complex:[1,7],complianc:4,complimentari:13,comprehens:10,compress:[1,10],comput:[1,4,7,10,11],concept:1,conda:1,conda_build_matrix:9,condit:4,confid:8,config:7,configur:[1,7,10],congratul:7,consid:[1,4],consist:[1,5,12],constant:1,constraint:2,consum:9,contain:[1,2,3,4,7,12],content:1,context:[1,3,4,10,13],continu:1,continuum:7,conveni:1,convent:4,convers:2,convert:[2,4],copi:[1,2,3,4,9],copyright:4,core:7,corr_m:4,correct:[2,7,8,9],correctli:[1,7,9],correctwai:7,correl:4,correspond:[1,7,8,13],cost:[1,4],could:[0,1,2,4,7,13],count:2,counter:4,coupl:1,cov_m:4,covari:4,cover:[1,4,8,13],coverag:[5,6,8],cpython:7,crash:2,creat:[1,2],creation:10,credit:4,critic:5,crossov:1,crowd:11,crypto:[1,6,10],cryptoasset:[1,4,13,14],cryptocurr:[4,5,8],csv:[1,4,10],csvfile:13,csvwriter:13,cumul:10,cumulative_capital_us:3,curat:[1,6],currenc:[1,4],current:[0,1,2,4],current_d:4,current_dai:4,current_dt:[4,13],custom:[1,2,5,13],cvc_btc:5,cvc_eth:5,cython:9,d6dca79513214346a646079213526:1,dai:[1,2,4,7,9],daili:[1,2,4,5,6,10,13],darkgoldenrod:4,dash:8,dash_btc:5,dash_usdt:[4,5],dash_xmr:5,data_frequ:[1,4,13],databas:2,datafram:[1,2,4,5,6,11,12,13],dataframe_cach:2,dataset:[1,2,5],date:[1,2,4,7,9,10,12,13],datetim:[4,13],dcr_btc:5,debian:[1,7],debug:9,decentr:5,decid:9,decim:10,decor:9,decreas:4,def:[1,4,13],defin:[1,4,8],delai:1,delet:2,demonstr:1,denomin:1,dep:3,depart_docu:3,depend:[1,3,7,9,10,13],deploi:9,deprec:3,deriv:7,describ:5,descript:[3,7],desir:[1,4,12,13],desktop:5,detail:[4,5,6],determin:4,dev1:7,dev2:7,dev3:7,dev4:7,dev5:7,dev6:7,dev8:7,dev9:7,dev:[3,5,7],devel:7,develop:1,deviat:4,devis:1,dgb_btc:5,dict:10,dictionari:10,did:[6,7],didn:7,differ:[1,2,4,5,7,8,9,13],dir:7,directli:[1,2,7,10,13],directori:[1,2,3,4,7,8,9],disabl:10,disablemsi:7,discard:4,discord:[1,3,6,7],discuss:1,disk:10,dismiss:1,displai:[1,4,7,9,10],dist:9,distribut:[4,7,9],distutil:9,divid:3,dividend:2,divis:4,dma:1,dname:1,dnf:7,doc:2,docker:3,dockerfil:3,document:[3,4,5,6,7,8],docutil:3,doe:[1,2,4,5,7],doesn:2,doge_btc:5,dollar:5,don:[1,3,7,14],done:[1,4,9],door:5,dot:4,down:[1,4,14],downgrad:3,download:[1,2,7,10],draft:9,drawback:2,drive:1,driven:[1,6,8],dropbox:10,dual_moving_averag:[1,4],dword:7,dynam:4,each:[1,2,3,4,5,6,7,8,10,12,13],earlier:[1,2,3,4],earliest:4,eas:6,easi:[1,2,4,11],easier:[1,2,4,5,7],easiest:7,easili:[1,6,7],echo:7,eco:6,ecosystem:5,edit:[3,4,7,9],editor:7,educ:1,educt:1,effect:7,either:[1,4,7],elaps:4,element:4,elif:[1,4],els:[4,7],emc2_btc:5,empow:[1,6],empti:[1,2,3,4,8,9,10],empyr:10,enabl:8,encount:7,encourag:8,end:[1,4,10,12,13],end_daili:4,end_dat:[1,4],ending_cash:1,ending_exposur:1,enh:3,enhanc:3,enigma:[1,4,5,6,7],enigmampc:[1,3],enough:[1,5,7],ensur:[0,4,7,8,9],ensure_directori:4,enter:[1,7],entir:3,entri:[1,7],env:[3,4,7],enviorn:2,environ:1,environemnt:[1,7],equal:[1,2,4,8,13],equiti:2,equival:[4,12],error:[1,3,4,5,7,8,10,12],especi:1,establish:6,estim:1,etc:[3,9,10],etc_btc:5,etc_eth:5,etc_usdt:5,eth:[1,8],eth_btc:[5,8],eth_usdt:[4,5],ethereum_bitcoin_asset:8,evalu:1,even:[2,7],event:1,eventu:1,everi:[1,4,7],everydai:4,everyth:[1,2],exact:[4,13],examin:1,excel:7,except:[1,3,4],excess:4,exchang:[1,2,4,5,6],exchange_algorithm:1,exchange_nam:[1,4,8,13],exchange_util:4,exclud:4,execut:[0,1,4,7,8,10],exist:[2,3,4,5,6,7],exit:[1,4,9],exit_success:9,exp_btc:5,expect:[0,1,2,4,5,7,9],experi:7,experienc:7,explain:[7,8],explicitli:9,explictili:7,express:[1,4,6],extend:1,extens:[2,3,7,8],extern:[1,4,7],extra:9,extract_transact:[1,4],facto:1,fail:[1,2,7],failur:2,fairli:[1,3],fals:[1,4,8],familiar:3,fantast:1,faq:7,far:2,fast:2,fatal:7,fct_btc:5,featur:[1,4],fedora:7,fee:5,feedback:2,feel:1,fetch:[2,5,8,10,12],few:[1,2,7,9],fewer:7,ffill:4,field:[2,4,9],file:[1,2,3,4,7,8],filenam:[1,4,13],fill:[1,4],filter:[4,10],financ:1,financi:[1,10],find:[1,2,7,9],fine:9,finish:1,fix:3,flag:[1,4,7,8,9],flake8:3,fldc_btc:5,flo_btc:5,floor:4,focu:[1,4,6],folder:[4,7,10],follow:[0,1,2,3,4,5,7,8,9,13],footprint:7,fork:11,form:[1,4,5],format:[1,2],fortran:7,forward:[2,12],foster:11,found:[1,3,5,7],fourth:[1,4],fraction:10,frame:[1,4],framework:7,free:[1,4],freelanc:11,freetyp:7,freq:[1,4],frequenc:[1,4,10,12],frequent:7,fresh:9,from:[0,1,2,3,4,5,7,8,9,10,12,13],from_dict:4,full:[1,8,13],fulli:8,fund:11,fundament:11,further:[1,4,6],futur:[1,2,5],game_btc:5,gas_btc:5,gas_eth:5,gave:1,gcc:7,gcf:[1,4],gdax:8,gen_type_stub:9,gener:[2,3,6,7,8,9,10,13],get:[1,2,3,4,5,6],get_exchange_symbol:4,get_open_ord:[1,4],get_ylim:[1,4],gettempdir:4,gfortran:7,github:[1,3,7,9],give:4,given:[1,2,4,5,13],global:1,gno_btc:5,gno_eth:5,gnt_btc:5,gnt_eth:5,goe:[4,8,14],good:[1,9],goog:2,got:1,govern:4,gracefulli:10,grain:9,granular:[5,10],graph:1,grc_btc:5,greatli:8,green:[1,4],group:[1,3],grow:2,guid:[3,7,10],gzip:9,hand:3,handi:[1,4,7],handl:[3,4,10],handle_data:[0,1,4,8,13],hang:7,happen:[1,2,8],happi:9,hard:1,hash:10,have:[0,1,2,3,6,7,8,9,14],haven:1,head:[1,7],header:[7,9],heavi:[1,4],heavili:11,hedg:11,held:5,help:[0,1,2],henc:1,here:[1,2,4,7,8],hidden:9,high:[1,4,8,11,13],highest:[4,9],highlight:4,hint:[7,9],histor:[1,4,5,6,8,10],hit:[1,10],hitchhik:7,hkey_local_machin:7,hold:[4,8],home:10,homebrew:7,hope:1,hopefulli:[4,14],how:[1,2,4,7,8],howev:[7,8,9],html:[3,4,9],http:[1,4,8,9],huc_btc:5,idea:[1,2,3],ident:7,idxmax:4,idxmin:4,illustr:8,iloc:4,immedi:[1,4],immut:0,impact:10,imper:3,implement:[1,2,4,10,14],impli:4,implicitli:0,importerror:1,improv:[3,10],inadvert:7,inc:4,includ:[1,2,3,4,7,9,13],incomplet:2,inconsist:8,increas:[2,4,10],increment:[1,9],independ:[5,7],index:[1,3,4,9],indic:[2,4,7],individu:[1,8],ineffici:10,inf:4,infer:2,infinit:4,influenc:1,info:[1,4,10],inform:[0,1,2,4,7,9],initi:[0,1,4,8,10,13],inlin:1,inplac:3,input:[1,5,6],insert:4,insid:[1,4,7],insight:[1,6],inspect:[1,4],installt:7,instanc:[0,2,4,12],instead:[1,2,3,4,5,8,10],instruct:[1,3,7],integ:[2,10],integr:[5,6,8,10],intend:[1,3,9],interact:[1,8],intern:[2,7],interpret:[1,4,13],interv:[4,12],introduc:[1,4,5,8,10],invest:[1,6],invok:[1,2],involv:[2,7],ipython:1,is_bui:[1,4],isinst:4,issu:[1,3,5,7,9,10],iter:[1,2,4,13],itself:[1,7],jan:1,join:[4,6,7],json:[8,10],json_symbol:4,juli:13,jump:7,just:[1,2,4,5,9],keep:[1,2,4,7,10],kei:[2,6,7,8],kept:[1,8],keyerror:10,kind:4,know:[1,7],knowledg:6,kpi:12,kwarg:9,label:[1,4,8,9],lack:5,lambda:4,languag:4,lapack:7,larg:2,larger:10,last:[1,2,4,7,10,12],later:[1,2,3,4],latest:[7,9,10],launch:[1,7],law:4,layer:5,lazi:2,lbc_btc:5,leak:2,learn:[1,4,6,7],least:[1,3,12],legend:[1,4],legend_:[1,4],len:[1,3,4],less:2,let:[1,4],level:[1,2,4],leverag:[1,4,11],lib:[3,4],libatla:7,libfreetype6:7,libgfortran:7,librari:[1,3,4,6,7,8,10,11],licens:4,lifetim:2,like:[1,2,3,5,6,7,9,10,12],limit:[1,4,5,10,12],limit_pric:[1,4],linear:7,linter:9,linux:[1,5],list:[0,1,2,4,5,7,8,9,10,13],littl:[1,3],live:[1,4,5,6,7],live_algo:4,live_graph:4,load:[1,2,7],load_ext:1,loc:[1,4],local:[1,2,3,7,9],locat:[1,2,4,13],log1p:10,log:[1,4,7,10],logbook:[1,4],logger:[1,4],logic:[1,4,10],long_mavg:[1,4],long_window:[1,4],longer:[1,3,9],look:[1,2,4,9,12,13],lookback:4,lookback_d:4,lookback_dai:4,lookup:1,loop:2,loss:10,lot:[2,10],low:[1,4,8],lower:[4,8,10],lowercas:[5,8],lsk_btc:5,lsk_eth:5,ltc:8,ltc_btc:5,ltc_usd:[1,4],ltc_usdt:[4,5],ltc_xmr:5,mac:7,machin:[2,6,9],maco:[1,5],made:[2,3],magic:1,mai:[1,2,4,7,8,9],maid_btc:5,maid_xmr:5,main:[1,7,9],maint:3,maintain:[5,9],mainten:3,major:9,make:[1,2,3,4,5,7,9],manag:[1,4,7,9],mani:[1,2,4,7,9,11],manifest:9,manner:8,manual:[7,9],map:[0,2,5,10],marker:[1,4],markers:1,market:[1,4,5,6,8,10],market_curr:[4,5],marketplac:1,markowitz:4,master:9,match:[1,7,8,9,12],matplotlib:[1,4,6],matplotlibrc:7,matrix:[4,9],matter:3,mavg:1,max_capital_us:3,max_leverag:3,max_sharpe_port:4,maxim:6,maximum:4,maybe_show_progress:2,mcoin:[1,4],mean:[1,2],mean_reversion_simpl:4,memori:2,mention:[1,7,9],menu:7,merg:1,merger:2,messag:1,method:[0,1,2,4,7,9,10,12,13],metric:[1,10],micro:9,microsoft:7,midnight:4,might:1,migrat:1,min:4,min_vol_port:4,mind:[1,4],miniconda:7,minim:[4,6],minimum:[4,10],minor:[7,9],minut:[1,2,4,5,6,7,10,13],miss:[1,7,8,10],mix:7,mkdir:7,mkvirtualenv:3,mode:[1,4,5,6],modif:[3,8],modifi:13,modul:1,moment:[7,9],momentum:[1,4,14],monei:0,month:[9,13],more:[0,1,2,4,6,7,8,10,13],most:[1,2,4,7,8,10],mostli:1,movement:1,mpc:[1,4],msft:2,msi:7,msiexec:7,much:[1,2],multipl:[2,4,5,9,10],must:[1,2,8,9],my_algo_cod:8,my_algo_nam:8,n_portfolio:4,name:[0,1,2,3,4],namespac:[1,4,9],nan:[1,4],nano:9,nasset:4,nativ:7,naut_btc:5,nav_btc:5,navig:[3,7],nchang:4,ndarrai:[1,4],nearest:4,necessari:7,nee:7,need:[1,2,3,4,5,7,9,11,13],neg:1,neo:4,neo_eth:[4,8],neo_ethereum_asset:8,neo_usd:4,neos_btc:5,never:[2,8],newer:[2,7],nice:[5,6],nmc_btc:5,noebook:1,non:7,none:[1,4,13],nor:4,normal:10,note:[1,4,5,6],note_btc:5,noth:7,notic:4,notion:4,novemb:9,now:[1,2,4,7,9,10,14],number:[1,2,4,7,9,10],numer:7,numpi:[1,3,4,7,9,11],nvalu:4,nxc_btc:5,nxt_btc:5,nxt_usdt:5,nxt_xmr:5,observ:7,obtain:[1,4,8],occur:[1,3,8],off:11,offer:1,offset:4,ohlc:1,ohlcv:[4,10,12],older:2,omg_btc:5,omg_eth:5,omni:5,omni_btc:5,onc:[1,2,4,7,8,9],one_day_in_minut:4,onli:[0,1,2,3,4,6,7,9,13],open:[1,3,4,5,7,10,12,13],openssl:7,oper:7,operatbl:7,opportun:5,opt:4,optim:1,option:[1,2,7,13],order_id:1,order_target_perc:[1,4,8],order_target_valu:[1,4],ordered_pip:3,org:[4,9],organ:1,origin:[1,4,9],osx:[7,9],other:[1,2,4,5,7,9,13],otherwis:7,our:[1,3,4,6,7,9,14],out:[1,2,3,4,6,7,9,12],outdat:7,outlin:7,output:[1,2,4,5,6],outstand:[1,4],overcom:5,overfit:1,overrid:[7,9,10],overview:1,overwhelm:1,own:[2,4,7,8],p_r:4,p_std:4,packag:[1,3,7],pacman:7,page:[3,5,7,9,10],pair:[1,4,5,8,10],pairon:4,panda:[1,2,4,5,6,11],paper:[3,5],param:10,parent:7,pars:2,part:[1,2,4,7,8,14],partial:[7,12],particular:[6,7],pasc_btc:5,pass:[1,2,4,9],password:9,past:[1,4],patch:10,path:[2,4,7,10,13],pattern:12,pend:9,peopl:3,pep8:3,per:[1,2,4,5,10],percent:[1,4],percentag:[1,4],perf:[1,3,4],perform:[0,1,3,4,5,6,7,10,11],perhap:7,period:[3,4],permiss:[4,7],persist:[1,4,10],pickl:[1,4],piec:[2,7],pink_btc:5,pip:[1,3],pkg:7,place:[1,4,8,10],plan:5,platform:[7,10,11],pleas:[1,6,7,13],plot:[1,4,11],plt:[1,4],plu:13,point:[1,5,9],poloniex:[1,4,5,6,8,10,13],popul:9,portfolio:1,portfolio_optim:4,portfolio_valu:[1,4],pos_amount:[1,4],posit:[1,4,10],positon:4,possibl:[2,3,7],post:9,pot_btc:5,power:[1,4,11],ppc_btc:5,practic:[1,3],pre:[2,7],precis:10,predict:[1,8],prefer:7,prefix:[3,7],preload:2,prepare_chunk:10,preprocess:9,prerequisit:[1,7],present:1,preserv:10,prevent:[2,7,9],previous:1,price_chang:[1,4],primari:7,print:[1,4,7,9],print_result:1,prior:[1,4],privileg:7,probabl:1,problem:[1,2,7,9],proce:7,proceed:7,process:[1,2,4,8],produc:[2,4,7],profit:[1,6],program:7,progress:2,project:[6,7,11],prompt:[1,7],proper:[7,8],properli:[1,4,7,13],protect:0,protocol:[1,5],provid:[0,1,2,4,5,6,7,8,10,11,13],publish:9,pull:[3,9],pun:1,purchas:[1,4],purpos:[1,5,8],push:9,put:[7,8],pycharm:9,pydata:[4,5,6],pyfolio:10,pypirc:9,pypitest:9,pyplot:[1,4],python2:[3,5,7,10],python3:[5,10],python:[1,3,4,6,7],pythonw:7,pytz:[4,13],quandl_api_kei:2,quandl_download_attempt:2,quantit:[1,11],queri:2,question:[1,3,6],quick:1,quickli:[4,14],quirk:7,quit:2,rads_btc:5,rais:[3,10],ran:2,random:[4,12],randomli:12,rang:[1,2,4,8,12],rate:4,rather:[1,7],ratio:4,raw:[2,7],rdylgn:4,reach:8,read:[1,2,7,10],read_pickl:1,readi:9,real:[0,4,8],realist:[1,4],reason:[1,2,7],rebal:4,rebalanc:[1,4],rebalance_period:4,recal:1,receiv:[1,2],recent:[1,2,4,5,7],recogn:7,recommend:[2,7],reconstruct:1,record:[1,4,13],red:[1,4],redhat:7,redon:10,redownload:[1,2],reduc:10,redund:10,refactor:3,referenc:[1,8],refus:1,regard:6,regardless:[1,7,8],regedit:7,regist:[0,1,2],registri:7,regular:7,reinstal:7,rel:3,relat:3,relationship:2,releas:[3,5,6,7],reli:[7,11],remain:10,rememb:[1,7],remot:2,remov:[1,3,4,7,9,10],renam:9,rep:7,rep_btc:5,rep_eth:5,rep_usdt:5,repeat:10,replac:[4,7],repo:7,report:[1,3,7],repositori:[7,9,10],repres:[2,8],reproduc:2,req:10,request:[1,2,3,4,10],requir:[1,3,4],requirements_blaz:3,requirements_dev:3,requirements_doc:3,research:1,reserv:[1,4,5],reserve_ratio:[1,4],reserve_valu:[1,4],resolut:[1,4,5,6,10,13],resolv:10,resourc:[2,6,10],respect:[3,9,13],respons:[2,7],rest:2,restart:10,restor:10,restrict:7,restructuredtext:3,result:[1,2,4,7,8,12,13],results_arrai:4,results_fram:4,resum:4,retri:2,retriev:[1,4,10,12],rev:3,revert:3,review:[1,7],revis:1,rhel:7,ric_btc:5,ride:[4,14],right:7,risk:[1,4,10],roll:1,rollup:2,root:[3,9],round:10,routin:7,row:[1,4],rsi:4,rsi_overbought:4,rsi_oversold:4,rst:[3,9],run_algo:[1,4,13],run_algorithm:[1,4,8,13],runtim:1,runtimeerror:7,safe:1,said:1,same:[1,2,4,5,7,8,9,10,13],sampl:[4,10,12],satisfi:7,save:[1,2,3,4,7,13],sbd_btc:5,sc_btc:5,scale:[1,10],scatter:[1,4],scientif:11,scikit:1,scipi:[4,6,7],scratch:7,script:[1,4,9,13],scriptnam:13,seamless:[5,6],search:7,second:[1,4,7,14],secret:8,section:[1,3,4,7,8,9,13],secur:[4,6,11],see:[0,1,2,4,5,6,7,8,13],seek:7,seen:4,select:[4,7,12],self:[0,3],sell:[1,4,8,10,11,12,14],sell_df:[1,4],separ:[1,3,5,7,8],seper:8,seri:[1,4,14],seriou:1,server:[1,2,9],servic:2,session:7,set:[1,2,4,5,7,10],set_benchmark:5,set_printopt:4,set_size_inch:[1,4],set_tick:[1,4],set_ylabel:[1,4],setup:[1,3,9],setuptool:7,seven:4,sever:[1,6,7],share:[1,5,6],sharex:[1,4],sharp:[1,4],ship:[2,7,9],short_exposur:1,short_mavg:[1,4],short_valu:1,short_window:[1,4],shorter:1,shorts_count:1,should:[0,1,2,3,7,8,9,10],shourc:2,show:[1,2,4],shown:2,sid:[1,2,10],side:7,signal:[2,4],signatur:2,signific:4,similar:[1,7,8],simpl:1,simple_univers:4,simpler:13,simplest:4,simpli:[1,3,4,7,13],simplic:4,simplifi:1,simulate_ord:[8,10],simultan:10,sinc:[1,4,7,8,9,13],singl:[2,4,7,10],site:3,size:[4,7,10],sjcx_btc:5,skeleton:9,skim:1,skip:[1,4,10],sklearn:6,slighlti:4,slightli:7,smaller:[7,10],smoothli:14,snip:1,snippet:13,softwar:[4,7],sold:8,solut:7,solv:[1,2,7,10],some:[1,2,3,4,7,8,10,11],someon:7,someth:3,somewhat:1,sortino:[1,10],sourc:[1,2,3,4,7,9,11],space:1,special:8,specif:[1,4,7,10],specifi:[1,2,4,5,8,9,10],spend:1,spent:5,sphinx:[3,9],split:[1,2,4],splitext:[4,13],spring:11,sqliteadjustmentwrit:2,sqrt:4,ssl:10,stabl:[4,7],stai:9,standard:[2,3,4,5,10],star:4,start:[1,2,3,4,6,7,8,12,13],start_dat:[1,4],start_tim:4,starting_cash:[1,4],starting_exposur:1,starting_valu:1,stat:[4,10],state:[1,2,4,6,10],statist:[1,5,6,8,10],stats_util:[1,4],statsmodel:6,statu:4,std:4,stdev:4,stdout:1,steem_btc:5,steem_eth:5,still:[1,2,4,5,7],stock:[1,2],stop:[1,4,10],storag:[1,8,10],store:[1,2,4,5,13],str:4,str_btc:5,str_usdt:5,straightforward:4,strat_btc:5,strategi:[1,4,6,8],stream:1,strftime:4,strictli:[2,7],string:[1,2,4,9],strongli:7,sty:3,style:[3,4],subdirectori:2,subject:3,submit:[3,4],subplot:[1,4],subset:4,substanti:1,succe:9,succeed:1,success:[2,3],successfulli:8,sudo:[1,7],suffici:7,suggest:3,sum:4,summar:7,summari:10,suppli:1,support:[1,4,5,6,7],suppos:1,suppress:4,sure:[4,7],surpris:1,suspect:3,symbol:[1,2,4,5],symbolnotfoundonexchang:5,sync:9,synchron:10,syntax:[9,10],sys_btc:5,system:[1,3,6,7],t_price:4,t_val:4,tag:9,take:[1,2,7,10,14],taken:9,talib:4,tar:9,tarbal:9,target:[1,8,12],target_hodl_ratio:[1,4],target_hodl_valu:[1,4],technic:[4,6],tempfil:4,templat:9,temporari:9,ten:1,tend:8,tens:3,tent:10,term:1,termin:[1,4,7],test:[1,3,7,8,9,10,11],testpypi:9,tether:5,text:1,than:[1,2,3,7,8,10],thank:4,thei:[1,2,9,10,11],them:[1,3,7,9],therefor:9,therein:7,thi:[0,1,2,3,4,5,7,8,9,13,14],thing:14,think:8,third:[1,4],thorough:7,those:[1,3,4,8,9],though:2,three:[1,2,4,5,6,8],threshold:[1,4],through:[0,1,2,5,7],throughli:8,throughout:1,thu:[1,4,7],tick:4,tick_siz:1,ticker:[2,10],time:[1,2,4,6,7,8,9,13],timedelta:4,timefram:10,timeperiod:4,timeseri:4,timestamp:[1,2,10],timestr:4,titl:9,tkagg:7,tminus_pric:4,tminus_v:4,to_csv:[4,13],to_datetim:[1,4],to_pydatetim:[1,4],todai:[4,9],togeth:1,token:[4,8,13],tolist:4,tool:[2,3,7,9,11],top:[1,6,9],total:2,toward:1,traceback:5,track:[1,3,4,10],tracker:[1,5],traded_todai:4,trader:[1,11],trading_dai:1,tradingalgorithm:[0,9],tradingcalendar:2,tradingpair:12,tradit:1,train:1,tran:[1,4],transact:[1,4,8,10],transaction:2,transaction_df:[1,4],transfer:5,transform:1,transit:[5,6],transpos:4,travi:9,treasuri:[1,4],treasury_period_return:[1,4],trend:1,tri:[1,6],trigger:4,trip:10,tst:3,tupl:2,turn:9,tweak:1,twice:9,two:[1,4,5,6,7,8,12,13,14],twoargument:1,txt:[3,7,9],type:[4,7,9],typo:3,ubuntu:[1,7],uncompress:10,under:[1,2,4,7,8,9],underli:1,underlin:9,underscor:5,understand:[1,7],undesir:0,unexpect:7,uninstal:7,unit:[1,5,10],univers:1,unknown:1,unless:4,unlik:2,unpack:7,unregist:0,unresolv:10,unsupport:10,untar:2,until:[1,4,7],unus:3,updat:[0,1,4],upgrad:[7,9,10],upper:[1,4],upward:1,url:9,usag:1,usd:[1,4,5],usdt:[4,5,13],usdt_btc:1,usdt_btc_benchmark:1,user:[1,2,4,5,6,7,9],usernam:9,usr:4,usual:1,utc:[1,4,13],utilit:13,valid:10,valu:[1,4,7,8,10],vari:[4,7,8,13],variabl:[1,2,4,8,13],varianc:4,varieti:13,variou:[1,2,4],varnam:1,vcforpython27:7,venv:7,veri:[1,2,4,7,9],verifi:[7,9],versatil:13,version:[1,3,4,5,7,8,9],via:[1,5,7],via_btc:5,viabl:5,victori:5,video:[4,6,10],view:[3,9],virtual:7,virtualenvwrapp:3,visit:[4,6],visual:[1,4,6,7],volatil:4,volum:[1,4,5,6,10,12,13],volumeshareslippag:1,vrc_btc:5,vtc_btc:5,wai:[1,2,4,6,7],wait:[1,4],want:[1,2,3,4,5,7],warn:[1,9,10],warranti:4,wave:[4,14],web:[5,9],websit:6,weight:4,welcom:3,well:[1,2,6,7],were:[3,4,9],what:[1,3,4,5,7,8,9],whatev:2,whatsnew:9,wheel:[7,9],when:[0,1,2,3,4,7,8,9,14],where:[1,2,3,4,5,6,7,8,10,13,14],which:[1,2,3,4,5,7,8,9,10,13],whitepap:[6,11],whitespac:3,who:3,whole:1,why:3,width:9,win:9,window:[1,4,5],within:[1,7,8],without:[1,2,4,7,8,10],workaround:10,workflow:7,world:1,wors:1,worth:1,would:[1,2,4,7,9],wouldlik:1,wrap:9,writ:4,write:1,writerow:13,written:[1,2,5,6],wrong:5,www:4,xbc_btc:5,xbt:8,xcp_btc:5,xem_btc:5,xlabel:4,xmr_btc:5,xmr_usdt:[4,5],xpm_btc:5,xrang:4,xrp_btc:5,xrp_usdt:5,xvc_btc:5,yahoo_equ:2,yaxi:[1,4],year:9,yet:1,ylabel:4,yml:[7,10],you:[1,2,3,4,5,6,7,8,9,13],your:[1,2,3,4,5,6,7,8,9,11,13],yourself:3,yum:7,zec_btc:5,zec_eth:5,zec_usdt:5,zec_xmr:5,zero:[3,4],ziplin:[0,2,3,6,9,11],zipline_root:[2,9],zlib:7,zrx_btc:5,zrx_eth:5},titles:["API Reference","Catalyst Beginner Tutorial","Data Bundles","Development Guidelines","Example Algorithms","Features","Overview","Install","Live Trading","Release Process","Release Notes","Resources","Unit Tests","Utilities","Videos"],titleterms:{"3rd":11,"__version__":9,"default":2,"function":[0,5],"new":2,access:1,adjustment_writ:2,algo:12,algorithm:[0,1,4,8],amazon:7,ami:7,api:[0,11],asset:0,asset_db_writ:2,authent:[8,12],avail:2,averag:[1,4],backtest:[0,2,14],basic:1,bdist:9,beginn:1,branch:3,btc:4,bug:10,bui:4,build:10,built:0,bundl:[0,2,12],cach:[0,2],calendar:[0,2],cancel:0,catalyst:[1,7],command:[0,1],commiss:0,commit:[3,9],conda:[7,9],content:6,contribut:3,control:0,convent:5,creat:3,cross:1,crossov:4,csv:[12,13],currenc:8,current:[5,12],daily_bar_writ:2,data:[0,1,2,12,13],dev1:10,dev2:10,dev3:10,dev4:10,dev5:10,dev6:10,dev7:10,dev8:10,dev9:10,develop:3,discov:2,doc:3,docstr:3,document:[9,10],dual:[1,4],end_sess:2,engin:0,environ:[2,3],exampl:[1,4],exchang:[8,12],extract:13,factor:0,factori:2,featur:5,file:[9,13],first:1,fix:10,format:3,get:7,git:3,gnu:7,guidelin:3,help:7,histor:12,histori:1,hodl:4,ingest:[1,2,12],instal:[1,7,14],interfac:1,jupyt:1,line:[0,1],linux:7,live:[8,14],loader:0,maco:[7,14],market:[12,13],matplotlib:7,mean:4,messag:3,metadata:0,minute_bar_writ:2,mirror:2,miscellan:0,mode:8,model:0,move:[1,4],name:5,next:[1,9],note:[7,9,10],notebook:1,object:0,old:2,optim:4,order:[0,12],output:13,output_dir:2,over:1,overview:[4,6],packag:9,paper:8,paramet:0,parti:11,pip:7,pipelin:0,pipenv:7,polici:0,portfolio:4,previou:1,price:[1,12],process:9,pypi:9,python:9,quandl:2,quantopian:2,reader:0,refer:0,relat:11,releas:[9,10],requir:7,resourc:11,revers:4,run:[0,1,2],schedul:0,sdist:9,show_progress:2,simpl:4,simul:0,slippag:0,start_sess:2,stat:12,step:1,strategi:14,structur:3,stub:9,support:8,symbol:8,tabl:6,test:12,ticker:12,trade:[0,8,14],troubleshoot:7,tutori:1,unit:12,univers:4,upcom:5,updat:[7,9],upload:9,util:[0,13],valid:12,version:10,video:14,virtualenv:7,wiki:2,window:[7,14],work:1,write:2,writer:0,yahoo:2}}) \ No newline at end of file +Search.setIndex({envversion:47,filenames:["appendix","beginner-tutorial","bundles","development-guidelines","example-algos","features","index","install","live-trading","release-process","releases","resources","unit-tests","utilities","videos"],objects:{"zipline.data.bundles":{bundles:[0,0,1,""]}},objnames:{"0":["py","data","Python data"]},objtypes:{"0":"py:data"},terms:{"000000e":1,"1000th":1,"15t":4,"1st":1,"30t":4,"328842e":1,"340mb":10,"380954e":1,"40mb":10,"460mb":10,"505275d6646a41f3856b22b16678d":1,"536708e":1,"5min":[1,4],"650729e":1,"7869f7828fa140328eb40477bb7d":1,"998236e":1,"998677e":1,"999120e":1,"999558e":1,"99mb":10,"__file__":[4,13],"__future__":4,"__main__":[1,4],"__name__":[1,4],"__wrapped__":9,"_html_base":3,"_tkinter":1,"boolean":[2,8],"break":7,"case":[1,2,3,7,13],"class":[3,9],"default":1,"export":9,"final":[1,2,3],"float":[1,10],"import":[1,2,4,9,13],"int":2,"long":[1,2,4],"new":1,"null":12,"public":10,"return":[1,4,8,9,10,11],"short":[1,3,4],"static":9,"switch":8,"throw":10,"true":[1,4,8,10],"try":[3,4,7],"var":1,"while":[5,7,9,10],aapl:2,abil:[2,10],abl:[1,2,7],abner:4,about:[1,2,6,7],abov:[1,3,4,5,7,8,9],accept:[2,7,9],accord:9,accordingli:[1,4],account:[1,2,4,6,10],acevedo:4,acquir:[2,7],across:[5,6,10],activ:[7,8,9],actual:1,add:[1,2,3,7,9,13],addit:[1,3,5,6,7,10],addition:8,address:9,adjust:[2,4,10],administr:7,advantag:7,afford:[1,4],aforement:1,after:[1,2,4,7,9],again:[1,3],against:[1,6,8,10,14],agre:4,ahead:1,aim:[4,11],algebra:[4,7],algo:[1,2,4,10],algo_namespac:[1,4,8],algo_volatil:1,algofil:[1,2],algorithm_period_return:[1,4],algotext:1,alia:4,alias:[4,10],all:[0,1,2,3,4,5,6,7,8,9,10,12],allow:[1,2,5,6,7],almost:7,along:2,alongsid:1,alpha:[1,4,7,8],alreadi:[1,2,3,7],also:[1,2,3,4,6,7,8,9],altern:[1,5,7],although:1,alwai:[2,5,8,9],amount:[1,4,8,10],amp_btc:5,ana:7,anaconda:[1,7,9],analog:1,analysi:[1,4,6,9,10,11],analyst:11,analyt:[6,7],analyz:[1,4,8,10,13],ani:[1,2,4,5,7,8,9,13],anonym:2,anoth:[1,2,4,5],anymor:1,anyth:[1,7,9],apach:4,app:7,appar:1,appear:[2,9],append:9,appli:[1,4],applic:[1,4],appropri:[1,3,4],approxim:[1,4],appveyor:9,apt:[1,7],arang:[1,4],arbitrag:5,arbitrari:[8,10],arbitrarili:1,arch:7,architectur:1,ardr_btc:5,arg:[1,9],argument:[0,1,2,8,9],argv:13,around:[6,9],arrai:[4,7],art:6,articl:[3,4],ask:[1,3],asmatrix:4,assert:[3,12],assertionerror:3,assess:1,asset_nam:[1,4],assetdbwrit:2,assign:[1,8],assimil:1,assist:7,assum:[1,3,4,7],astyp:4,atla:7,attempt:[2,8],attribut:[4,9],auth:[8,10],auto:10,automag:7,avail:1,avoid:[1,2,4],awai:7,awar:9,ax1:[1,4],ax2:[1,4],ax3:[1,4],ax4:[1,4],ax5:[1,4],ax6:[1,4],axhlin:4,axi:4,ayala:4,back:[3,5,7],backbon:4,backend:7,bah:4,bar:[1,4,10],bar_count:[1,4],base:[1,2,4,5,6,7,8,14],base_curr:[1,4,5,8,13],base_pric:[1,4],basenam:[4,13],basi:[4,10],batch:7,batteri:1,battl:7,bch_btc:5,bch_eth:5,bch_usdt:5,bcn_btc:5,bcn_xmr:5,bcolz:2,bcolzdailybarread:2,bcolzdailybarwrit:2,bcolzminutebarread:2,bcolzminutebarwrit:2,bcy_btc:5,be62ff77760c4599abaac43be9cc9:1,bear:[1,4],beautifi:1,becaus:[1,7,9,10],been:[0,1,2,7,9],befor:[1,2,4,7,8,10],before_trading_start:[0,4],beggin:4,begin:[1,4,7],behavior:0,bela_btc:5,believ:1,below:[1,3,4,13],benchmark:[1,4,5,6,10],benchmark_period_return:[1,4],benchmark_volatil:1,benefit:1,best:[3,6,7],beta:[1,4],better:1,between:[1,3,4,5,6,10,12],beyond:5,bfill:4,bia:1,big:7,bin:[4,7],binanc:[8,10],binari:[7,9],bit:[3,7],bitcoin:[1,4,5,6,8,13],bitcoin_usd_asset:8,bitfinex:[1,4,5,6,8,10],bitmex:8,bittrex:[1,4,5,6,8,10,14],blank:12,bld:3,blk_btc:5,blk_xmr:5,blockchain:5,blotter:13,blue:1,bodi:3,book:1,both:[1,3,5,8,9,12],bought:[1,8],bound:1,breakdown:8,brew:7,brother:7,brows:7,browser:[1,3,9],btc:1,btc_usd:[1,4,5,8],btc_usdt:[4,5,6,10,13],btcd_btc:5,btcd_xmr:5,btm_btc:5,bts_btc:5,bug:[2,3],bui:1,build:[1,3,7,9],build_ext:3,burst_btc:5,button:[7,9],buy_and_hodl:[4,10],buy_btc_simpl:[1,4],buy_btc_simple_out:[1,4],buy_df:[1,4],buy_low_sell_high:10,calcul:[1,3,4,8,12],call:[1,2,3,4,10],can:[1,2,3,4,5,6,7,8,9,10,13],can_trad:[1,4,10],cancel_ord:[1,4],candl:[1,5,10,12],candle_s:4,candlestick:4,cannot:[1,4,7],canon:3,capabl:10,capit:[1,4],capital_bas:[1,4,8,10,13],capital_us:1,captur:1,cash:[1,2,3,4,10],catalyst_dev:[1,6,7],caus:[0,1,2,3],ccxt:[8,10],cell:1,cert:10,certian:0,chanc:1,chang:[1,3,4,6,7,9,10],channel:[1,6,7],charact:3,charg:1,chart:[1,4,7],check:[1,2,3,4,5,7,8],checker:9,checkout:[3,9],choic:9,choos:[1,4,5,7,9,13],chosen:[1,13],chunk:[1,10],circumv:7,clam_btc:5,classic:[1,4],classifi:1,clean:[2,7,9,10,12],clear:2,cli:[1,4,10,13],click:[7,9],client:8,clone:3,close:[1,4,5,13],cmap:4,cmd:[1,7],code:[1,4,7,9,10,13],codebas:3,coin:[1,4,10],collect:[1,2,4],color:[1,4],colorbar:4,colour:4,column:[1,2,4],com:[1,2,3,8],combin:[7,8],come:[2,7],comment:1,common:1,commonli:1,commun:[5,7,11],comp:4,compar:[1,4,5,6,7,12],comparison:10,compat:[6,10],compil:[7,9,10],complement:4,complet:8,complex:[1,7],complianc:4,complimentari:13,comprehens:10,compress:[1,10],comput:[1,4,7,10,11],concept:1,conda:1,conda_build_matrix:9,condit:4,confid:8,config:7,configur:[1,7,10],congratul:7,consid:[1,4],consist:[1,5,12],constant:1,constraint:2,consum:9,contain:[1,2,3,4,7,12],content:1,context:[1,3,4,10,13],continu:1,continuum:7,conveni:1,convent:4,convers:2,convert:[2,4],copi:[1,2,3,4,9],copyright:4,core:7,corr_m:4,correct:[2,7,8,9],correctli:[1,7,9],correctwai:7,correl:4,correspond:[1,7,8,13],cost:[1,4],could:[0,1,2,4,7,13],count:2,counter:4,coupl:1,cov_m:4,covari:4,cover:[1,4,8,13],coverag:[5,6,8],cpython:7,crash:2,creat:[1,2],creation:10,credit:4,critic:5,crossov:1,crowd:11,crypto:[1,6,10],cryptoasset:[1,4,13,14],cryptocurr:[4,5,8],csv:[1,4,10],csvfile:13,csvwriter:13,cumul:10,cumulative_capital_us:3,curat:[1,6],currenc:[1,4],current:[1,2,4],current_d:4,current_dai:4,current_dt:[4,13],custom:[1,2,5,13],cvc_btc:5,cvc_eth:5,cython:9,d6dca79513214346a646079213526:1,dai:[1,2,4,7,9],daili:[1,2,4,5,6,10,13],darkgoldenrod:4,dash:8,dash_btc:5,dash_usdt:[4,5],dash_xmr:5,data_frequ:[1,4,13],databas:2,datafram:[1,2,4,5,6,11,12,13],dataframe_cach:2,dataset:[1,2,5],date:[1,2,4,7,9,10,12,13],datetim:[4,13],dcr_btc:5,debian:[1,7],debug:9,decentr:5,decid:9,decim:10,decor:9,decreas:4,def:[1,4,13],defin:[1,4,8],delai:1,delet:2,demonstr:1,denomin:1,dep:3,depart_docu:3,depend:[1,3,7,9,10,13],deploi:9,deprec:3,deriv:7,describ:5,descript:[3,7],desir:[1,4,12,13],desktop:5,detail:[4,5,6],determin:4,dev1:7,dev2:7,dev3:7,dev4:7,dev5:7,dev6:7,dev8:7,dev9:7,dev:[3,5,7],devel:7,develop:1,deviat:4,devis:1,dgb_btc:5,dict:10,dictionari:10,did:[6,7],didn:7,differ:[1,2,4,5,7,8,9,13],dir:7,directli:[1,2,7,10,13],directori:[1,2,3,4,7,8,9],disabl:10,disablemsi:7,discard:4,discord:[1,3,6,7],discuss:1,disk:10,dismiss:1,displai:[1,4,7,9,10],dist:9,distribut:[4,7,9],distutil:9,divid:3,dividend:2,divis:4,dma:1,dname:1,dnf:7,doc:2,docker:3,dockerfil:3,document:[3,4,5,7,8],docutil:3,doe:[1,2,4,5,7],doesn:2,doge_btc:5,dollar:5,don:[1,3,7,14],done:[1,4,9],door:5,dot:4,down:[1,4,14],downgrad:3,download:[1,2,7,10],draft:9,drawback:2,drive:1,driven:[1,6,8],dropbox:10,dual_moving_averag:[1,4],dword:7,dynam:4,each:[1,2,3,4,5,6,7,8,10,12,13],earlier:[1,2,3,4],earliest:4,eas:6,easi:[1,2,4,11],easier:[1,2,4,5,7],easiest:7,easili:[1,6,7],echo:7,eco:6,ecosystem:5,edit:[3,4,7,9],editor:7,educ:1,educt:1,effect:7,either:[1,4,7],elaps:4,element:4,elif:[1,4],els:[4,7],emc2_btc:5,empow:[1,6],empti:[1,2,3,4,8,9,10],empyr:10,enabl:8,encount:7,encourag:8,end:[1,4,10,12,13],end_daili:4,end_dat:[1,4],ending_cash:1,ending_exposur:1,enh:3,enhanc:3,enigma:[1,4,5,6,7,10],enigmampc:[1,3],enough:[1,5,7],ensur:[0,4,7,8,9],ensure_directori:4,enter:[1,7],entir:3,entri:[1,7],env:[3,4,7],enviorn:2,environ:1,environemnt:[1,7],equal:[1,2,4,8,13],equiti:2,equival:[4,12],error:[1,3,4,5,7,8,10,12],especi:1,establish:6,estim:1,etc:[3,9,10],etc_btc:5,etc_eth:5,etc_usdt:5,eth:[1,8],eth_btc:[5,8],eth_usdt:[4,5],ethereum_bitcoin_asset:8,evalu:1,even:[2,7],event:1,eventu:1,everi:[1,4,7],everydai:4,everyth:[1,2],exact:[4,13],examin:1,excel:7,except:[1,3,4],excess:4,exchang:[1,2,4,5],exchange_algorithm:1,exchange_nam:[1,4,8,13],exchange_util:4,exclud:4,execut:[0,1,4,7,8,10],exist:[2,3,4,5,6,7],exit:[1,4,9],exit_success:9,exp_btc:5,expect:[0,1,2,4,5,7,9],experi:7,experienc:7,explain:[7,8],explicitli:9,explictili:7,express:[1,4,6],extend:1,extens:[2,3,7,8],extern:[1,4,7],extra:9,extract_transact:[1,4],facto:1,fail:[1,2,7],failur:2,fairli:[1,3],fals:[1,4,8],familiar:3,fantast:1,faq:7,far:2,fast:2,fatal:7,fct_btc:5,featur:[1,4],fedora:7,fee:5,feedback:2,feel:1,fetch:[2,5,8,10,12],few:[1,2,7,9],fewer:7,ffill:4,field:[2,4,9],file:[1,2,3,4,7,8],filenam:[1,4,13],fill:[1,4],filter:[4,10],financ:1,financi:[1,10],find:[1,2,7,9],fine:9,finish:1,fix:3,flag:[1,4,7,8,9],flake8:3,fldc_btc:5,flo_btc:5,floor:4,focu:[1,4,6],folder:[4,7,10],follow:[0,1,2,3,4,5,7,8,9,13],footprint:7,fork:11,form:[1,4,5],format:[1,2],fortran:7,forward:[2,12],foster:11,found:[1,3,5,7],fourth:[1,4],fraction:10,frame:[1,4],framework:7,free:[1,4],freelanc:11,freetyp:7,freq:[1,4],frequenc:[1,4,10,12],frequent:7,fresh:9,from:[0,1,2,3,4,5,7,8,9,10,12,13],from_dict:4,full:[1,8,13],fulli:8,fund:11,fundament:11,further:[1,4,6],futur:[1,2,5],game_btc:5,gas_btc:5,gas_eth:5,gave:1,gcc:7,gcf:[1,4],gdax:8,gen_type_stub:9,gener:[2,3,6,7,8,9,10,13],get:[1,2,3,4,5],get_exchange_symbol:4,get_open_ord:[1,4],get_ylim:[1,4],gettempdir:4,gfortran:7,github:[1,3,7,9],give:4,given:[1,2,4,5,13],global:1,gno_btc:5,gno_eth:5,gnt_btc:5,gnt_eth:5,goe:[4,8,14],good:[1,9],goog:2,got:1,govern:4,gracefulli:10,grain:9,granular:[5,10],graph:1,grc_btc:5,greatli:8,green:[1,4],group:[1,3],grow:2,guid:[3,7,10],gzip:9,hand:3,handi:[1,4,7],handl:[3,4,10],handle_data:[0,1,4,8,13],hang:7,happen:[1,2,8],happi:9,hard:1,hash:10,have:[0,1,2,3,6,7,8,9,14],haven:1,head:[1,7],header:[7,9],heavi:[1,4],heavili:11,hedg:11,held:5,help:[1,2],henc:1,here:[1,2,4,7,8],hidden:9,high:[1,4,8,11,13],highest:[4,9],highlight:4,hint:[7,9],histor:[1,4,5,8,10],hit:[1,10],hitchhik:7,hkey_local_machin:7,hold:[4,8],home:10,homebrew:7,hope:1,hopefulli:[4,14],how:[1,2,4,7,8],howev:[7,8,9],html:[3,4,9],http:[1,4,8,9],huc_btc:5,idea:[1,2,3],ident:7,idxmax:4,idxmin:4,illustr:8,iloc:4,immedi:[1,4],immut:0,impact:10,imper:3,implement:[1,2,4,10,14],impli:4,implicitli:0,importerror:1,improv:[3,10],inadvert:7,inc:4,includ:[1,2,3,4,7,9,13],incomplet:2,inconsist:8,increas:[2,4,10],increment:[1,9],independ:[5,7],index:[1,3,4,9],indic:[2,4,7],individu:[1,8],ineffici:10,inf:4,infer:2,infinit:4,influenc:1,info:[1,4,10],inform:[0,1,2,4,7,9],initi:[0,1,4,8,10,13],inlin:1,inplac:3,input:[1,5,6],insert:4,insid:[1,4,7],insight:[1,6],inspect:[1,4],installt:7,instanc:[0,2,4,12],instead:[1,2,3,4,5,8,10],instruct:[1,3,7],integ:[2,10],integr:[5,6,8,10],intend:[1,3,9],interact:[1,8],intern:[2,7],interpret:[1,4,13],interv:[4,12],introduc:[1,4,5,8,10],invest:[1,6],invok:[1,2],involv:[2,7],ipython:1,is_bui:[1,4],isinst:4,issu:[1,3,5,7,9,10],iter:[1,2,4,13],itself:[1,7],jan:1,join:[4,6,7],json:[8,10],json_symbol:4,juli:13,jump:7,just:[1,2,4,5,9],keep:[1,2,4,7,10],kei:[2,6,7,8],kept:[1,8],keyerror:10,kind:4,know:[1,7],knowledg:6,kpi:12,kwarg:9,label:[1,4,8,9],lack:5,lambda:4,languag:4,lapack:7,larg:2,larger:10,last:[1,2,4,7,10,12],later:[1,2,3,4],latest:[7,9,10],launch:[1,7],law:4,layer:5,lazi:2,lbc_btc:5,leak:2,learn:[1,4,6,7],least:[1,3,12],legend:[1,4],legend_:[1,4],len:[1,3,4],less:2,let:[1,4],level:[1,2,4],leverag:[1,4,11],lib:[3,4],libatla:7,libfreetype6:7,libgfortran:7,librari:[1,3,4,6,7,8,10,11],licens:4,lifetim:2,like:[1,2,3,5,6,7,9,10,12],limit:[1,4,5,10,12],limit_pric:[1,4],linear:7,linter:9,linux:[1,5],list:[0,1,2,4,5,7,8,9,10,13],littl:[1,3],live:[1,4,5,7],live_algo:4,live_graph:4,load:[1,2,7],load_ext:1,loc:[1,4],local:[1,2,3,7,9],locat:[1,2,4,13],log1p:10,log:[1,4,7,10],logbook:[1,4],logger:[1,4],logic:[1,4,10],long_mavg:[1,4],long_window:[1,4],longer:[1,3,9],look:[1,2,4,9,12,13],lookback:4,lookback_d:4,lookback_dai:4,lookup:1,loop:2,loss:10,lot:[2,10],low:[1,4,8],lower:[4,8,10],lowercas:[5,8],lsk_btc:5,lsk_eth:5,ltc:8,ltc_btc:5,ltc_usd:[1,4],ltc_usdt:[4,5],ltc_xmr:5,mac:7,machin:[2,6,9],maco:[1,5],made:[2,3],magic:1,mai:[1,2,4,7,8,9],maid_btc:5,maid_xmr:5,main:[1,7,9],maint:3,maintain:[5,9],mainten:3,major:9,make:[1,2,3,4,5,7,9],manag:[1,4,7,9],mani:[1,2,4,7,9,11],manifest:9,manner:8,manual:[7,9],map:[0,2,5,10],marker:[1,4],markers:1,market:[1,4,5,8,10],market_curr:[4,5],marketplac:[1,10],markowitz:4,master:9,match:[1,7,8,9,12],matplotlib:[1,4],matplotlibrc:7,matrix:[4,9],matter:3,mavg:1,max_capital_us:3,max_leverag:3,max_sharpe_port:4,maxim:6,maximum:4,maybe_show_progress:2,mcoin:[1,4],mean:[1,2],mean_reversion_simpl:4,memori:2,mention:[1,7,9],menu:7,merg:1,merger:2,messag:1,method:[0,1,2,4,7,9,10,12,13],metric:[1,10],micro:9,microsoft:7,midnight:4,might:1,migrat:1,min:4,min_vol_port:4,mind:[1,4],miniconda:7,minim:[4,6,10],minimum:[4,10],minor:[7,9],minut:[1,2,4,5,6,7,10,13],miss:[1,7,8,10],mix:7,mkdir:7,mkvirtualenv:3,mode:[1,4,5],modif:[3,8],modifi:13,modul:1,moment:[7,9],momentum:[1,4,14],monei:0,month:[9,13],more:[0,1,2,4,6,7,8,10,13],most:[1,2,4,7,8,10],mostli:1,movement:1,mpc:[1,4],msft:2,msi:7,msiexec:7,much:[1,2],multipl:[2,4,5,9,10],must:[1,2,8,9],my_algo_cod:8,my_algo_nam:8,n_portfolio:4,name:[1,2,3,4],namespac:[1,4,9],nan:[1,4],nano:9,nasset:4,nativ:7,naut_btc:5,nav_btc:5,navig:[3,7],nchang:4,ndarrai:[1,4],nearest:4,necessari:7,nee:7,need:[1,2,3,4,5,7,9,11,13],neg:1,neo:4,neo_eth:[4,8],neo_ethereum_asset:8,neo_usd:4,neos_btc:5,never:[2,8],newer:[2,7],nice:[5,6],nmc_btc:5,noebook:1,non:7,none:[1,4,13],nor:4,normal:10,note:[1,4,5],note_btc:5,noth:7,notic:4,notion:4,novemb:9,now:[1,2,4,7,9,10,14],number:[1,2,4,7,9,10],numer:7,numpi:[1,3,4,7,9,11],nvalu:4,nxc_btc:5,nxt_btc:5,nxt_usdt:5,nxt_xmr:5,observ:7,obtain:[1,4,8],occur:[1,3,8],off:11,offer:1,offset:4,ohlc:1,ohlcv:[4,10,12],older:2,omg_btc:5,omg_eth:5,omni:5,omni_btc:5,onc:[1,2,4,7,8,9],one_day_in_minut:4,onli:[0,1,2,3,4,6,7,9,13],open:[1,3,4,5,7,10,12,13],openssl:7,oper:7,operatbl:7,opportun:5,opt:4,optim:1,option:[1,2,7,13],order_id:1,order_target_perc:[1,4,8],order_target_valu:[1,4],ordered_pip:3,org:[4,9],organ:1,origin:[1,4,9],osx:[7,9],other:[1,2,4,5,7,9,13],otherwis:7,our:[1,3,4,6,7,9,14],out:[1,2,3,4,6,7,9,12],outdat:7,outlin:7,output:[1,2,4,5],outstand:[1,4],overcom:5,overfit:1,overrid:[7,9,10],overview:1,overwhelm:1,own:[2,4,7,8],p_r:4,p_std:4,packag:[1,3,7],pacman:7,page:[3,5,7,9,10],pair:[1,4,5,8,10],pairon:4,panda:[1,2,4,5,6,11],paper:[3,5],param:10,parent:7,pars:2,part:[1,2,4,7,8,14],partial:[7,12],particular:[6,7],pasc_btc:5,pass:[1,2,4,9],password:9,past:[1,4],patch:10,path:[2,4,7,10,13],pattern:12,pend:9,peopl:3,pep8:3,per:[1,2,4,5,10],percent:[1,4],percentag:[1,4],perf:[1,3,4],perform:[0,1,3,4,5,6,7,10,11],perhap:7,period:[3,4],permiss:[4,7],persist:[1,4,10],pickl:[1,4],piec:[2,7],pink_btc:5,pip:[1,3],pkg:7,place:[1,4,8,10],plan:5,platform:[7,10,11],pleas:[1,6,7,13],plot:[1,4,11],plt:[1,4],plu:13,point:[1,5,9],poloniex:[1,4,5,6,8,10,13],popul:9,portfolio:1,portfolio_optim:4,portfolio_valu:[1,4],pos_amount:[1,4],posit:[1,4,10],positon:4,possibl:[2,3,7],post:9,pot_btc:5,power:[1,4,11],ppc_btc:5,practic:[1,3],pre:[2,7],precis:10,predict:[1,8],prefer:7,prefix:[3,7],preload:2,prepare_chunk:10,preprocess:9,prerequisit:[1,7],present:[1,10],preserv:10,prevent:[2,7,9],previous:1,price_chang:[1,4],primari:7,print:[1,4,7,9],print_result:1,prior:[1,4],privileg:7,probabl:1,problem:[1,2,7,9],proce:7,proceed:7,process:[1,2,4,8],produc:[2,4,7],profit:[1,6],program:7,progress:2,project:[6,7,11],prompt:[1,7],proper:[7,8],properli:[1,4,7,13],protect:0,protocol:[1,5],provid:[0,1,2,4,5,6,7,8,10,11,13],publish:9,pull:[3,9],pun:1,purchas:[1,4],purpos:[1,5,8],push:9,put:[7,8],pycharm:9,pydata:[4,5,6],pyfolio:10,pypirc:9,pypitest:9,pyplot:[1,4],python2:[3,5,7,10],python3:[5,10],python:[1,3,4,7],pythonw:7,pytz:[4,13],quandl_api_kei:2,quandl_download_attempt:2,quantit:[1,11],queri:2,question:[1,3,6],quick:1,quickli:[4,14],quirk:7,quit:2,rads_btc:5,rais:[3,10],ran:2,random:[4,12],randomli:12,rang:[1,2,4,8,12],rate:[4,10],rather:[1,7],ratio:4,raw:[2,7],rdylgn:4,reach:8,read:[1,2,7,10],read_pickl:1,readi:9,real:[0,4,8],realist:[1,4],reason:[1,2,7],rebal:4,rebalanc:[1,4],rebalance_period:4,recal:1,receiv:[1,2],recent:[1,2,4,5,7],recogn:7,recommend:[2,7],reconstruct:1,record:[1,4,13],red:[1,4],redhat:7,redon:10,redownload:[1,2],reduc:10,redund:10,refactor:3,referenc:[1,8],refus:1,regard:6,regardless:[1,7,8],regedit:7,regist:[0,1,2],registri:7,regular:7,reinstal:7,rel:3,relat:3,relationship:2,releas:[3,5,7],reli:[7,11],remain:10,rememb:[1,7],remot:2,remov:[1,3,4,7,9,10],renam:9,rep:7,rep_btc:5,rep_eth:5,rep_usdt:5,repeat:10,replac:[4,7],repo:7,report:[1,3,7],repositori:[7,9,10],repres:[2,8],reproduc:2,req:10,request:[1,2,3,4,10],requir:[1,3,4],requirements_blaz:3,requirements_dev:3,requirements_doc:3,research:1,reserv:[1,4,5],reserve_ratio:[1,4],reserve_valu:[1,4],resolut:[1,4,5,6,10,13],resolv:10,resourc:[2,10],respect:[3,9,13],respons:[2,7],rest:2,restart:10,restor:10,restrict:7,restructuredtext:3,result:[1,2,4,7,8,12,13],results_arrai:4,results_fram:4,resum:4,retri:2,retriev:[1,4,10,12],rev:3,revert:3,review:[1,7],revis:1,rhel:7,ric_btc:5,ride:[4,14],right:7,risk:[1,4,10],roll:1,rollup:2,root:[3,9],round:10,routin:7,row:[1,4],rsi:4,rsi_overbought:4,rsi_oversold:4,rst:[3,9],run_algo:[1,4,13],run_algorithm:[1,4,8,13],runtim:1,runtimeerror:7,safe:1,said:1,same:[1,2,4,5,7,8,9,10,13],sampl:[4,10,12],satisfi:7,save:[1,2,3,4,7,13],sbd_btc:5,sc_btc:5,scale:[1,10],scatter:[1,4],scientif:11,scikit:1,scipi:[4,6,7],scratch:7,script:[1,4,9,13],scriptnam:13,seamless:[5,6],search:7,second:[1,4,7,14],secret:8,section:[1,3,4,7,8,9,13],secur:[4,6,11],see:[0,1,2,4,5,6,7,8,13],seek:7,seen:4,select:[4,7,12],self:[0,3],sell:[1,4,8,10,11,12,14],sell_df:[1,4],separ:[1,3,5,7,8],seper:8,seri:[1,4,14],seriou:1,server:[1,2,9],servic:2,session:7,set:[1,2,4,5,7,10],set_benchmark:5,set_printopt:4,set_size_inch:[1,4],set_tick:[1,4],set_ylabel:[1,4],setup:[1,3,9],setuptool:7,seven:4,sever:[1,6,7],share:[1,5,6],sharex:[1,4],sharp:[1,4],ship:[2,7,9],short_exposur:1,short_mavg:[1,4],short_valu:1,short_window:[1,4],shorter:1,shorts_count:1,should:[0,1,2,3,7,8,9,10],shourc:2,show:[1,2,4],shown:2,sid:[1,2,10],side:7,signal:[2,4],signatur:2,signific:4,similar:[1,7,8],simpl:1,simple_univers:4,simpler:13,simplest:4,simpli:[1,3,4,7,13],simplic:4,simplifi:1,simulate_ord:[8,10],simultan:10,sinc:[1,4,7,8,9,13],singl:[2,4,7,10],site:3,size:[4,7,10],sjcx_btc:5,skeleton:9,skim:1,skip:[1,4,10],sklearn:6,slighlti:4,slightli:7,smaller:[7,10],smoothli:14,snip:1,snippet:13,softwar:[4,7],sold:8,solut:7,solv:[1,2,7,10],some:[1,2,3,4,7,8,10,11],someon:7,someth:3,somewhat:1,sortino:[1,10],sourc:[1,2,3,4,7,9,11],space:1,special:8,specif:[1,4,7,10],specifi:[1,2,4,5,8,9,10],spend:1,spent:5,sphinx:[3,9],split:[1,2,4],splitext:[4,13],spring:11,sqliteadjustmentwrit:2,sqrt:4,ssl:10,stabl:[4,7],stai:[9,10],standard:[2,3,4,5,10],star:4,start:[1,2,3,4,6,7,8,12,13],start_dat:[1,4],start_tim:4,starting_cash:[1,4],starting_exposur:1,starting_valu:1,stat:[4,10],state:[1,2,4,6,10],statist:[1,5,6,8,10],stats_util:[1,4],statsmodel:6,statu:4,std:4,stdev:4,stdout:1,steem_btc:5,steem_eth:5,still:[1,2,4,5,7],stock:[1,2],stop:[1,4,10],storag:[1,8,10],store:[1,2,4,5,13],str:4,str_btc:5,str_usdt:5,straightforward:4,strat_btc:5,strategi:[1,4,8],stream:1,strftime:4,strictli:[2,7],string:[1,2,4,9],strongli:7,sty:3,style:[3,4],subdirectori:2,subject:3,submit:[3,4],subplot:[1,4],subset:4,substanti:1,succe:9,succeed:1,success:[2,3],successfulli:8,sudo:[1,7],suffici:7,suggest:3,sum:4,summar:7,summari:10,suppli:1,support:[1,4,5,7],suppos:1,suppress:4,sure:[4,7],surpris:1,suspect:3,symbol:[1,2,4,5],symbolnotfoundonexchang:5,sync:9,synchron:10,syntax:[9,10],sys_btc:5,system:[1,3,6,7],t_price:4,t_val:4,tag:9,take:[1,2,7,10,14],taken:9,talib:4,tar:9,tarbal:9,target:[1,8,12],target_hodl_ratio:[1,4],target_hodl_valu:[1,4],technic:[4,6],tempfil:4,templat:9,temporari:9,ten:1,tend:8,tens:3,tent:10,term:1,termin:[1,4,7],test:[1,3,7,8,9,10,11],testpypi:9,tether:5,text:1,than:[1,2,3,7,8,10],thank:4,thei:[1,2,9,10,11],them:[1,3,7,9],therefor:9,therein:7,thi:[0,1,2,3,4,5,7,8,9,13,14],thing:14,think:8,third:[1,4],thorough:7,those:[1,3,4,8,9],though:2,three:[1,2,4,5,6,8],threshold:[1,4],through:[0,1,2,5,7],throughli:8,throughout:1,thu:[1,4,7],tick:4,tick_siz:1,ticker:[2,10],time:[1,2,4,6,7,8,9,13],timedelta:4,timefram:10,timeperiod:4,timeseri:4,timestamp:[1,2,10],timestr:4,titl:9,tkagg:7,tminus_pric:4,tminus_v:4,to_csv:[4,13],to_datetim:[1,4],to_pydatetim:[1,4],todai:[4,9],togeth:1,token:[4,8,13],tolist:4,tool:[2,3,7,9,11],top:[1,6,9],total:2,toward:1,traceback:5,track:[1,3,4,10],tracker:[1,5],traded_todai:4,trader:[1,11],trading_dai:1,tradingalgorithm:[0,9],tradingcalendar:2,tradingpair:12,tradit:1,train:1,tran:[1,4],transact:[1,4,8,10],transaction:2,transaction_df:[1,4],transfer:5,transform:1,transit:[5,6],transpos:4,travi:9,treasuri:[1,4],treasury_period_return:[1,4],trend:1,tri:[1,6],trigger:4,trip:10,tst:3,tupl:2,turn:9,tweak:1,twice:9,two:[1,4,5,6,7,8,12,13,14],twoargument:1,txt:[3,7,9],type:[4,7,9],typo:3,ubuntu:[1,7],uncompress:10,under:[1,2,4,7,8,9],underli:1,underlin:9,underscor:5,understand:[1,7],undesir:0,unexpect:7,uninstal:7,unit:[1,5,10],univers:1,unknown:1,unless:4,unlik:2,unpack:7,unregist:0,unresolv:10,unsupport:10,untar:2,until:[1,4,7],unus:3,updat:[1,4],upgrad:[7,9,10],upper:[1,4],upward:1,url:9,usag:1,usd:[1,4,5],usdt:[4,5,13],usdt_btc:1,usdt_btc_benchmark:1,user:[1,2,4,5,6,7,9],usernam:9,usr:4,usual:1,utc:[1,4,13],utilit:13,valid:10,valu:[1,4,7,8,10],vari:[4,7,8,13],variabl:[1,2,4,8,13],varianc:4,varieti:13,variou:[1,2,4],varnam:1,vcforpython27:7,venv:7,veri:[1,2,4,7,9],verifi:[7,9],versatil:13,version:[1,3,4,5,7,8,9],via:[1,5,7],via_btc:5,viabl:5,victori:5,video:[4,10],view:[3,9],virtual:7,virtualenvwrapp:3,visit:[4,6],visual:[1,4,6,7],volatil:4,volum:[1,4,5,6,10,12,13],volumeshareslippag:1,vrc_btc:5,vtc_btc:5,wai:[1,2,4,6,7],wait:[1,4],want:[1,2,3,4,5,7],warn:[1,9,10],warranti:4,wave:[4,14],web:[5,9],websit:6,weight:4,welcom:3,well:[1,2,6,7],were:[3,4,9],what:[1,3,4,5,7,8,9],whatev:2,whatsnew:9,wheel:[7,9],when:[0,1,2,3,4,7,8,9,14],where:[1,2,3,4,5,6,7,8,10,13,14],which:[1,2,3,4,5,7,8,9,10,13],whitepap:[6,11],whitespac:3,who:3,whole:1,why:3,width:9,win:9,window:[1,4,5],within:[1,7,8],without:[1,2,4,7,8,10],workaround:10,workflow:7,world:1,wors:1,worth:1,would:[1,2,4,7,9],wouldlik:1,wrap:9,writ:4,write:1,writerow:13,written:[1,2,5,6],wrong:5,www:4,xbc_btc:5,xbt:8,xcp_btc:5,xem_btc:5,xlabel:4,xmr_btc:5,xmr_usdt:[4,5],xpm_btc:5,xrang:4,xrp_btc:5,xrp_usdt:5,xvc_btc:5,yahoo_equ:2,yaxi:[1,4],year:9,yet:1,ylabel:4,yml:[7,10],you:[1,2,3,4,5,6,7,8,9,13],your:[1,2,3,4,5,6,7,8,9,11,13],yourself:3,yum:7,zec_btc:5,zec_eth:5,zec_usdt:5,zec_xmr:5,zero:[3,4],ziplin:[0,2,3,6,9,11],zipline_root:[2,9],zlib:7,zrx_btc:5,zrx_eth:5},titles:["API Reference","Catalyst Beginner Tutorial","Data Bundles","Development Guidelines","Example Algorithms","Features","Overview","Install","Live Trading","Release Process","Release Notes","Resources","Unit Tests","Utilities","Videos"],titleterms:{"3rd":11,"__version__":9,"default":2,"function":[0,5],"new":2,access:1,adjustment_writ:2,algo:12,algorithm:[0,1,4,8],amazon:7,ami:7,api:[0,11],asset:0,asset_db_writ:2,authent:[8,12],avail:2,averag:[1,4],backtest:[0,2,14],basic:1,bdist:9,beginn:1,branch:3,btc:4,bug:10,bui:4,build:10,built:0,bundl:[0,2,12],cach:[0,2],calendar:[0,2],cancel:0,catalyst:[1,7],command:[0,1],commiss:0,commit:[3,9],conda:[7,9],content:6,contribut:3,control:0,convent:5,creat:3,cross:1,crossov:4,csv:[12,13],currenc:8,current:[5,12],daily_bar_writ:2,data:[0,1,2,12,13],dev1:10,dev2:10,dev3:10,dev4:10,dev5:10,dev6:10,dev7:10,dev8:10,dev9:10,develop:3,discov:2,doc:3,docstr:3,document:[9,10],dual:[1,4],end_sess:2,engin:0,environ:[2,3],exampl:[1,4],exchang:[8,12],extract:13,factor:0,factori:2,featur:5,file:[9,13],first:1,fix:10,format:3,get:7,git:3,gnu:7,guidelin:3,help:7,histor:12,histori:1,hodl:4,ingest:[1,2,12],instal:[1,7,14],interfac:1,jupyt:1,line:[0,1],linux:7,live:[8,14],loader:0,maco:[7,14],market:[12,13],matplotlib:7,mean:4,messag:3,metadata:0,minute_bar_writ:2,mirror:2,miscellan:0,mode:8,model:0,move:[1,4],name:5,next:[1,9],note:[7,9,10],notebook:1,object:0,old:2,optim:4,order:[0,12],output:13,output_dir:2,over:1,overview:[4,6],packag:9,paper:8,paramet:0,parti:11,pip:7,pipelin:0,pipenv:7,polici:0,portfolio:4,previou:1,price:[1,12],process:9,pypi:9,python:9,quandl:2,quantopian:2,reader:0,refer:0,relat:11,releas:[9,10],requir:7,resourc:11,revers:4,run:[0,1,2],schedul:0,sdist:9,show_progress:2,simpl:4,simul:0,slippag:0,start_sess:2,stat:12,step:1,strategi:14,structur:3,stub:9,support:8,symbol:8,tabl:6,test:12,ticker:12,trade:[0,8,14],troubleshoot:7,tutori:1,unit:12,univers:4,upcom:5,updat:[7,9],upload:9,util:[0,13],valid:12,version:10,video:14,virtualenv:7,wiki:2,window:[7,14],work:1,write:2,writer:0,yahoo:2}}) \ No newline at end of file diff --git a/utilities.html b/utilities.html index 9d15794e..add2de7a 100644 --- a/utilities.html +++ b/utilities.html @@ -13,8 +13,6 @@ - - @@ -43,28 +41,21 @@ -
                    - - - - - - - - - - - - - - - - -
                    - +
                    - -
                    -
                    -
                    +

                    Utilities

                    @@ -177,25 +310,25 @@ script that you need to use depends on the interface that you are using to run your trading algorithm, which could be the CLI or a Python Interpreter.

                    1. Script to use with CLI:

                      -
                      def analyze(context=None, results=None):
                      +
                      def analyze(context=None, results=None):
                           import sys
                           import os
                           from os.path import basename
                       
                      -    # Save results in CSV file
                      +    # Save results in CSV file
                           filename = os.path.splitext(basename(sys.argv[3]))[0]
                      -    results.to_csv(filename + '.csv')
                      +    results.to_csv(filename + '.csv')
                       
                    2. Script to use with Python Interpreter:

                      -
                      def analyze(context=None, results=None):
                      +
                      def analyze(context=None, results=None):
                           import os
                           from os.path import basename
                       
                      -    # Save results in CSV file
                      -    filename = os.path.splitext(os.path.basename(__file__))[0]
                      -    results.to_csv(filename + '.csv')
                      +    # Save results in CSV file
                      +    filename = os.path.splitext(os.path.basename(__file__))[0]
                      +    results.to_csv(filename + '.csv')
                       
                    3. @@ -210,7 +343,7 @@ Run this script directly from your development environment: python scriptname.py where the contents of ‘scriptname.py’ are as follows. Two different version are provided as an example for daily- and minute-resolution data respectively:

                      Simpler case for daily data

                      -
                      import os
                      +
                      import os
                       import pytz
                       from datetime import datetime
                       
                      @@ -218,23 +351,23 @@ provided as an example for daily- and minute-resolution data respectively:

                      from catalyst.utils.run_algo import run_algorithm def initialize(context): - # Portfolio assets list - context.asset = symbol('btc_usdt') # Bitcoin on Poloniex + # Portfolio assets list + context.asset = symbol('btc_usdt') # Bitcoin on Poloniex def handle_data(context, data): - # Variables to record for a given asset: price and volume - price = data.current(context.asset, 'price') - volume = data.current(context.asset, 'volume') + # Variables to record for a given asset: price and volume + price = data.current(context.asset, 'price') + volume = data.current(context.asset, 'volume') record(price=price, volume=volume) def analyze(context=None, results=None): - # Generate DataFrame with Price and Volume only - data = results[['price','volume']] + # Generate DataFrame with Price and Volume only + data = results[['price','volume']] - # Save results in CSV file - filename = os.path.splitext(os.path.basename(__file__))[0] - data.to_csv(filename + '.csv') + # Save results in CSV file + filename = os.path.splitext(os.path.basename(__file__))[0] + data.to_csv(filename + '.csv') ''' Bitcoin data is available on Poloniex since 2015-3-1. Dates vary for other tokens. In the example below, we choose the @@ -247,13 +380,13 @@ provided as an example for daily- and minute-resolution data respectively:

                      analyze=analyze, start=start, end=end, - exchange_name='poloniex', + exchange_name='poloniex', capital_base=10000, - base_currency = 'usdt') + base_currency = 'usdt')

                      More versatile case for minute data

                      -
                      import os
                      +
                      import os
                       import csv
                       import pytz
                       from datetime import datetime
                      @@ -263,31 +396,31 @@ provided as an example for daily- and minute-resolution data respectively:

                      def initialize(context): -# Portfolio assets list -context.asset = symbol('btc_usdt') # Bitcoin on Poloniex +# Portfolio assets list +context.asset = symbol('btc_usdt') # Bitcoin on Poloniex -# Creates a .CSV file with the same name as this script to store results +# Creates a .CSV file with the same name as this script to store results context.csvfile = open(os.path.splitext( - os.path.basename(__file__))[0]+'.csv', 'w+') + os.path.basename(__file__))[0]+'.csv', 'w+') context.csvwriter = csv.writer(context.csvfile) def handle_data(context, data): -# Variables to record for a given asset: price and volume -# Other options include 'open', 'high', 'open', 'close' -# Please note that 'price' equals 'close' -date = context.blotter.current_dt # current time in each iteration -price = data.current(context.asset, 'price') -volume = data.current(context.asset, 'volume') +# Variables to record for a given asset: price and volume +# Other options include 'open', 'high', 'open', 'close' +# Please note that 'price' equals 'close' +date = context.blotter.current_dt # current time in each iteration +price = data.current(context.asset, 'price') +volume = data.current(context.asset, 'volume') -# Writes one line to CSV on each iteration with the chosen variables +# Writes one line to CSV on each iteration with the chosen variables context.csvwriter.writerow([date,price,volume]) def analyze(context=None, results=None): -# Close open file properly at the end +# Close open file properly at the end context.csvfile.close() -# Bitcoin data is available from 2015-3-2. Dates vary for other tokens. +# Bitcoin data is available from 2015-3-2. Dates vary for other tokens. start = datetime(2017, 7, 30, 0, 0, 0, 0, pytz.utc) end = datetime(2017, 7, 31, 0, 0, 0, 0, pytz.utc) results = run_algorithm(initialize=initialize, @@ -295,9 +428,9 @@ provided as an example for daily- and minute-resolution data respectively:

                      analyze=analyze, start=start, end=end, - exchange_name='poloniex', - data_frequency='minute', - base_currency ='usdt', + exchange_name='poloniex', + data_frequency='minute', + base_currency ='usdt', capital_base=10000 )
                      @@ -305,19 +438,15 @@ provided as an example for daily- and minute-resolution data respectively:

                      -
                      -
                      - -
                      @@ -351,8 +479,7 @@ provided as an example for daily- and minute-resolution data respectively:

                      VERSION:'0.4', COLLAPSE_INDEX:false, FILE_SUFFIX:'.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '' + HAS_SOURCE: true }; diff --git a/videos.html b/videos.html index e7a9825e..bb81bf29 100644 --- a/videos.html +++ b/videos.html @@ -13,8 +13,6 @@ - - @@ -43,28 +41,21 @@ -
                      - - - - - - - - - - - - - - - - -
                      - +
                      - -
                      -
                      -
                      +

                      Videos

                      @@ -209,19 +340,15 @@ in the previous video, we now take it to trade live against the Bittrex exchange
                      -
                      -
                      - -
                      @@ -255,8 +381,7 @@ in the previous video, we now take it to trade live against the Bittrex exchange VERSION:'0.4', COLLAPSE_INDEX:false, FILE_SUFFIX:'.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '' + HAS_SOURCE: true };