prvni verze dynamicky ind
This commit is contained in:
19
testy/previewindicator.py
Normal file
19
testy/previewindicator.py
Normal file
@ -0,0 +1,19 @@
|
||||
|
||||
|
||||
import v2realbot.controller.services as cs
|
||||
|
||||
#[stratvars.indicators.vwma]
|
||||
runner_id = "b44d6d8f-b44d-45b1-ad7a-7ee8b0facead"
|
||||
toml = """
|
||||
type = "custom"
|
||||
subtype = "vwma"
|
||||
on_confirmed_only = true
|
||||
cp.source = "vwap"
|
||||
cp.ref_source = "volume"
|
||||
cp.lookback = 50
|
||||
"""
|
||||
|
||||
res, vals = cs.preview_indicator_byTOML(id=runner_id, toml=toml)
|
||||
|
||||
print(res)
|
||||
print(vals)
|
||||
@ -267,6 +267,8 @@ class RunArchiveDetail(BaseModel):
|
||||
trades: List[TradeUpdate]
|
||||
ext_data: Optional[dict]
|
||||
|
||||
class TomlInput(BaseModel):
|
||||
toml: str
|
||||
# class Trade(BaseModel):
|
||||
# order: Order
|
||||
# value: float
|
||||
|
||||
@ -5,9 +5,10 @@ from alpaca.data.historical import StockHistoricalDataClient
|
||||
from alpaca.data.requests import StockTradesRequest, StockBarsRequest
|
||||
from alpaca.data.enums import DataFeed
|
||||
from alpaca.data.timeframe import TimeFrame
|
||||
from v2realbot.strategy.base import StrategyState
|
||||
from v2realbot.enums.enums import RecordType, StartBarAlign, Mode, Account, OrderSide
|
||||
from v2realbot.common.model import RunDay, StrategyInstance, Runner, RunRequest, RunArchive, RunArchiveView, RunArchiveDetail, RunArchiveChange, Bar, TradeEvent, TestList, Intervals, ConfigItem
|
||||
from v2realbot.utils.utils import AttributeDict, zoneNY, zonePRG, dict_replace_value, Store, parse_toml_string, json_serial, is_open_hours, send_to_telegram
|
||||
from v2realbot.utils.utils import AttributeDict, zoneNY, zonePRG, safe_get, dict_replace_value, Store, parse_toml_string, json_serial, is_open_hours, send_to_telegram
|
||||
from v2realbot.utils.ilog import delete_logs
|
||||
from v2realbot.common.PrescribedTradeModel import Trade, TradeDirection, TradeStatus, TradeStoplossType
|
||||
from datetime import datetime
|
||||
@ -30,6 +31,9 @@ from datetime import timedelta, time
|
||||
from threading import Lock
|
||||
from v2realbot.common.db import pool, execute_with_retry, row_to_runarchive, row_to_runarchiveview
|
||||
from sqlite3 import OperationalError, Row
|
||||
import v2realbot.strategyblocks.indicators.custom as ci
|
||||
from v2realbot.interfaces.backtest_interface import BacktestInterface
|
||||
|
||||
#from pyinstrument import Profiler
|
||||
#adding lock to ensure thread safety of TinyDB (in future will be migrated to proper db)
|
||||
lock = Lock()
|
||||
@ -1107,6 +1111,103 @@ def get_testlists():
|
||||
|
||||
# endregion
|
||||
|
||||
#WIP - possibility to add TOML indicator
|
||||
# open issues: hodnoty dalsich indikatoru
|
||||
def preview_indicator_byTOML(id: UUID, toml: str):
|
||||
try:
|
||||
res, toml_parsed = parse_toml_string(toml)
|
||||
if res < 0:
|
||||
return (-2, "toml invalid")
|
||||
|
||||
print("parsed toml", toml_parsed)
|
||||
|
||||
subtype = safe_get(toml_parsed, 'subtype', False)
|
||||
if subtype is None:
|
||||
return (-2, "subtype invalid")
|
||||
|
||||
custom_params = safe_get(toml_parsed, "cp", None)
|
||||
print("custom params",custom_params)
|
||||
|
||||
#dotahne runner details
|
||||
res, val = get_archived_runner_details_byID(id)
|
||||
if res < 0:
|
||||
return (-2, "no archived runner {id}")
|
||||
|
||||
# class RunArchiveDetail(BaseModel):
|
||||
# id: UUID
|
||||
# name: str
|
||||
# bars: dict
|
||||
# #trades: Optional[dict]
|
||||
# indicators: List[dict]
|
||||
# statinds: dict
|
||||
# trades: List[TradeUpdate]
|
||||
# ext_data: Optional[dict]
|
||||
|
||||
#TODO - conditional udelat podminku
|
||||
# if value == "conditional":
|
||||
# conditions = state.vars.indicators[indname]["cp"]["conditions"]
|
||||
# for condname,condsettings in conditions.items():
|
||||
# state.vars.indicators[indname]["cp"]["conditions"][condname]["cond_dict"] = get_conditions_from_configuration(action=KW.change_val+"_if", section=condsettings)
|
||||
# printanyway(f'creating workdict for {condname} value {state.vars.indicators[indname]["cp"]["conditions"][condname]["cond_dict"]}')
|
||||
|
||||
#TODO - podporit i jine nez custom?
|
||||
|
||||
|
||||
detail = RunArchiveDetail(**val)
|
||||
#print("toto jsme si dotahnuli", detail.bars)
|
||||
|
||||
#new dicts
|
||||
new_bars = {key: [] for key in detail.bars.keys()}
|
||||
new_bars = AttributeDict(**new_bars)
|
||||
new_inds = {key: [] for key in detail.indicators[0].keys()}
|
||||
new_inds = AttributeDict(**new_inds)
|
||||
interface = BacktestInterface(symbol="X", bt=None)
|
||||
|
||||
state = StrategyState(name="XX", symbol = "X", stratvars = toml, interface=interface)
|
||||
|
||||
state.bars = new_bars
|
||||
state.indicators = new_inds
|
||||
|
||||
new_inds["new"] = []
|
||||
print("delka",len(detail.bars["close"]))
|
||||
|
||||
#intitialize indicator mapping - in order to use eval in expression
|
||||
local_dict_inds = {key: state.indicators[key] for key in state.indicators.keys() if key != "time"}
|
||||
local_dict_bars = {key: state.bars[key] for key in state.bars.keys() if key != "time"}
|
||||
|
||||
state.ind_mapping = {**local_dict_inds, **local_dict_bars}
|
||||
print("IND MAPPING DONE:", state.ind_mapping)
|
||||
|
||||
|
||||
print("subtype")
|
||||
function = "ci."+subtype+"."+subtype
|
||||
print("funkce", function)
|
||||
custom_function = eval(function)
|
||||
#iterujeme nad bary a on the fly pridavame novou hodnotu do vsech indikatoru a nakonec nad tim spustime indikator
|
||||
#tak muzeme v toml pouzit i hodnoty ostatnich indikatoru
|
||||
for i in range(len(detail.bars["close"])):
|
||||
for key in detail.bars:
|
||||
state.bars[key].append(detail.bars[key][i])
|
||||
for key in detail.indicators[0]:
|
||||
state.indicators[key].append(detail.indicators[0][key][i])
|
||||
|
||||
new_inds["new"].append(0)
|
||||
try:
|
||||
res_code, new_val = custom_function(state, custom_params)
|
||||
if res_code == 0:
|
||||
new_inds["new"][-1]=new_val
|
||||
except Exception as e:
|
||||
print(str(e) + format_exc())
|
||||
|
||||
print("Done", f"delka {len(new_inds['new'])}", new_inds["new"])
|
||||
|
||||
return 0, new_inds["new"]
|
||||
|
||||
except Exception as e:
|
||||
print(str(e) + format_exc())
|
||||
return -2, str(e)
|
||||
|
||||
|
||||
# region CONFIG db services
|
||||
#TODO vytvorit modul pro dotahovani z pythonu (get_from_config(var_name, def_value) {)- stejne jako v js
|
||||
#TODO zvazit presunuti do TOML z JSONu
|
||||
|
||||
@ -11,7 +11,7 @@ import uvicorn
|
||||
from uuid import UUID
|
||||
import v2realbot.controller.services as cs
|
||||
from v2realbot.utils.ilog import get_log_window
|
||||
from v2realbot.common.model import StrategyInstance, RunnerView, RunRequest, Trade, RunArchive, RunArchiveView, RunArchiveDetail, Bar, RunArchiveChange, TestList, ConfigItem
|
||||
from v2realbot.common.model import StrategyInstance, RunnerView, RunRequest, Trade, RunArchive, RunArchiveView, RunArchiveDetail, Bar, RunArchiveChange, TestList, ConfigItem, TomlInput
|
||||
from fastapi import FastAPI, WebSocket, WebSocketDisconnect, Depends, HTTPException, status, WebSocketException, Cookie, Query
|
||||
from fastapi.responses import FileResponse
|
||||
from fastapi.staticfiles import StaticFiles
|
||||
@ -429,6 +429,19 @@ def _delete_archived_runners_byIDs(runner_ids: list[UUID]):
|
||||
elif res < 0:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Error: {res}:{id}")
|
||||
|
||||
#WIP - TOM indicator preview from frontend
|
||||
#return indicator value for archived runner
|
||||
@app.put("/archived_runners/{runner_id}/previewindicator", dependencies=[Depends(api_key_auth)], status_code=status.HTTP_200_OK)
|
||||
def _preview_indicator_byTOML(runner_id: UUID, toml: TomlInput) -> list[float]:
|
||||
#mozna pak pridat name
|
||||
res, vals = cs.preview_indicator_byTOML(id=runner_id, toml=toml.toml)
|
||||
if res == 0: return vals
|
||||
elif res == -1:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Error: {res}:{vals}")
|
||||
else:
|
||||
raise HTTPException(status_code=status.HTTP_406_NOT_ACCEPTABLE, detail=f"Error not changed: {res}:{runner_id}:{vals}")
|
||||
|
||||
|
||||
#edit archived runner ("note",..)
|
||||
@app.patch("/archived_runners/{runner_id}", dependencies=[Depends(api_key_auth)])
|
||||
def _edit_archived_runners(archChange: RunArchiveChange, runner_id: UUID):
|
||||
|
||||
@ -7,7 +7,7 @@ import v2realbot.ml.mlutils as mu
|
||||
from v2realbot.utils.utils import slice_dict_lists
|
||||
import numpy as np
|
||||
from copy import deepcopy
|
||||
from v2realbot.controller.services import get_archived_runnerslist_byBatchID
|
||||
import v2realbot.controller.services as cs
|
||||
#Basic classes for machine learning
|
||||
#drzi model a jeho zakladni nastaveni
|
||||
|
||||
@ -138,10 +138,10 @@ class ModelML:
|
||||
print("loading runners for ",str(runner_id_list))
|
||||
elif batch_id is not None:
|
||||
print("Loading runners for train_batch_id:", batch_id)
|
||||
res, runner_ids = get_archived_runnerslist_byBatchID(batch_id)
|
||||
res, runner_ids = cs.get_archived_runnerslist_byBatchID(batch_id)
|
||||
elif self.train_batch_id is not None:
|
||||
print("Loading runners for TRAINING BATCH self.train_batch_id:", self.train_batch_id)
|
||||
res, runner_ids = get_archived_runnerslist_byBatchID(self.train_batch_id)
|
||||
res, runner_ids = cs.get_archived_runnerslist_byBatchID(self.train_batch_id)
|
||||
#pripadne bereme z listu runneru
|
||||
else:
|
||||
runner_ids = self.train_runner_ids
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import numpy as np
|
||||
from v2realbot.controller.services import get_archived_runner_details_byID
|
||||
import v2realbot.controller.services as cs
|
||||
from joblib import load
|
||||
from v2realbot.config import DATA_DIR
|
||||
|
||||
@ -43,7 +43,7 @@ def merge_dicts(dict_list):
|
||||
# return merged_dict
|
||||
|
||||
def load_runner(runner_id):
|
||||
res, sada = get_archived_runner_details_byID(runner_id)
|
||||
res, sada = cs.get_archived_runner_details_byID(runner_id)
|
||||
if res == 0:
|
||||
print("ok")
|
||||
else:
|
||||
|
||||
@ -59,7 +59,16 @@
|
||||
<script src="/static/js/libs/mousetrap.min.js"></script>
|
||||
|
||||
<!-- <script src="https://cdn.datatables.net/select/1.6.2/js/dataTables.select.min.js"></script> -->
|
||||
<script src="/static/js/fast-toml.js" type="text/javascript"></script>
|
||||
<!-- <script src="/static/js/fast-toml.js" type="text/javascript"></script> -->
|
||||
<!-- <script src="/static/js/libs/j-toml/j-toml.min.js" type="module">
|
||||
import TOML from 'j-toml';
|
||||
|
||||
|
||||
</script> -->
|
||||
<script src="/static/js/libs/j-toml/j-toml.js">
|
||||
|
||||
// console.log(TOML.parse("ddd"))
|
||||
</script>
|
||||
|
||||
<!-- <script>
|
||||
// require is provided by loader.min.js.
|
||||
@ -132,6 +141,7 @@
|
||||
</form>
|
||||
</div>
|
||||
<div id="statusHeader" data-bs-toggle="collapse" data-bs-target="#statusDetail">
|
||||
<div id="statusArchId" class="headerItem"></div>
|
||||
<div id="statusRegime" class="headerItem"></div>
|
||||
<div id="statusName" class="headerItem"></div>
|
||||
<div id="statusMode" class="headerItem"></div>
|
||||
@ -156,6 +166,44 @@
|
||||
</div>
|
||||
<div class="lowercontainer" id="lowercontainer"></div>
|
||||
</div>
|
||||
<div id="indicatorModal" class="modal fade" style="--bs-modal-width: 591px;">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h4 class="modal-title"><i class="fa fa-plus"></i>Add/Edit Indicator - <div id="indicatorNameTitle"></div></h4>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="form-group">
|
||||
<label for="indicatorId" class="form-label">Id</label>
|
||||
<input type="text" class="form-control" id="indicatorId" name="indicatorId" placeholder="id">
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="form-group">
|
||||
<label for="indicatorName" class="form-label">Name</label>
|
||||
<input type="text" class="form-control" id="indicatorName" name="indicatorName">
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="form-group">
|
||||
<label for="indicatorTOML_editor" class="form-label">TOML</label>
|
||||
<div id="indicatorTOML_editor" style="height:266px;border:1px solid black;"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer d-flex justify-content-between">
|
||||
<div>
|
||||
<button type="button" name="delete" id="deleteIndicatorButton" class="btn btn-primary">Delete</button>
|
||||
</div>
|
||||
<div>
|
||||
<!-- <button type="button" name="new" id="newIndicatorButton" class="btn btn-primary">New</button> -->
|
||||
<button type="button" name="update" id="saveIndicatorButton" class="btn btn-primary">Save</button>
|
||||
<button type="button" class="btn btn-secondary" id="closeIndicatorButton" data-bs-dismiss="modal">Close</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="hist-trades" class="flex-items">
|
||||
<div id="form-trades">
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
277
v2realbot/static/js/libs/j-toml/j-toml.d.ts
vendored
Normal file
277
v2realbot/static/js/libs/j-toml/j-toml.d.ts
vendored
Normal file
@ -0,0 +1,277 @@
|
||||
export as namespace TOML;
|
||||
export = exports;
|
||||
|
||||
declare namespace exports {
|
||||
|
||||
export const version :'1.38.0';
|
||||
|
||||
export const parse :
|
||||
& {
|
||||
(this :void, source :Source, specificationVersion :1.0 | 0.5 | 0.4 | 0.3 | 0.2 | 0.1, multilineStringJoiner? :string, useBigInt? :boolean | number, xOptions? :XOptions ) :Table;
|
||||
(this :void, source :Source, multilineStringJoiner? :string, useBigInt? :boolean | number, xOptions? :XOptions ) :Table;
|
||||
(this :void, source :Source, options? :{ readonly joiner? :string, readonly bigint? :boolean | number, readonly x ? :XOptions }) :Table;
|
||||
}
|
||||
& {
|
||||
readonly [SpecificationVersion in 1.0 | 0.5 | 0.4 | 0.3 | 0.2 | 0.1] :{
|
||||
(this :void, source :Source, multilineStringJoiner? :string, useBigInt? :boolean | number, xOptions? :XOptions ) :Table;
|
||||
(this :void, source :Source, options? :{ readonly joiner? :string, readonly bigint? :boolean | number, readonly x ? :XOptions }) :Table;
|
||||
}
|
||||
};
|
||||
|
||||
export function stringify (this :void, rootTable :ReadonlyTable, options? :{
|
||||
readonly integer? :number
|
||||
readonly newline? :'\n' | '\r\n'
|
||||
readonly newlineAround? :'document' | 'section' | 'header' | 'pairs' | 'pair'
|
||||
readonly indent? :string | number
|
||||
readonly T? :'T' | 't' | ' '
|
||||
readonly Z? :'Z' | 'z'
|
||||
readonly xNull? :boolean
|
||||
readonly xBeforeNewlineInMultilineTable? :',' | ''
|
||||
readonly forceInlineArraySpacing? :0 | 1 | 2 | 3
|
||||
}) :string;
|
||||
|
||||
export function isSection (this :void, table :ReadonlyTable) :boolean;
|
||||
export function isInline (this :void, value :ReadonlyTable | ReadonlyArray) :boolean;
|
||||
|
||||
export function Section<T extends ReadonlyTable> (this :void, table :T) :T;
|
||||
export function inline<T extends ReadonlyArray> (this :void, value :T, inlineMode? :0 | 1 | 2 | 3) :T;
|
||||
export function inline<T extends ReadonlyTable> (this :void, value :T) :T;
|
||||
export const multiline :{
|
||||
readonly array :{
|
||||
<T extends ReadonlyArray>
|
||||
(this :void, array :T ) :T
|
||||
}
|
||||
<T extends ReadonlyTable>
|
||||
(this :void, table :T ) :T
|
||||
(this :void, value :string ) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] | [ `'''`, ...string[], `${string}'''` ] } & object & String
|
||||
(this :void, lines :readonly string[] ) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] | [ `'''`, ...string[], `${string}'''` ] } & object
|
||||
(this :void, lines :readonly string[], value :string) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] | [ `'''`, ...string[], `${string}'''` ] } & object & String
|
||||
readonly basic :{
|
||||
(this :void, value :string ) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] } & object & String
|
||||
(this :void, lines :readonly string[] ) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] } & object
|
||||
(this :void, lines :readonly string[], value :string) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] } & object & String
|
||||
}
|
||||
};
|
||||
export function basic (this :void, value :string ) :{ [_literal] :`"${string}"` } & object & String;
|
||||
export function literal (this :void, literal :string ) :{ [_literal] :string | [ string, ...string[] ] } & object ;
|
||||
export function literal (this :void, literal :string, value :string ) :{ [_literal] :string | [ string, ...string[] ] } & object & String;
|
||||
export function literal (this :void, literal :string, value :number ) :{ [_literal] :string | [ string, ...string[] ] } & object & Number;
|
||||
export function literal (this :void, literal :string, value :bigint ) :{ [_literal] :string | [ string, ...string[] ] } & object & BigInt;
|
||||
export function literal (this :void, literal :TemplateStringsArray, ...chars :string[]) :{ [_literal] :string | [ string, ...string[] ] } & object ;
|
||||
|
||||
export function commentFor (this :void, key :string) :symbol;
|
||||
export const commentForThis :unique symbol;
|
||||
|
||||
export { OffsetDateTime, LocalDateTime, LocalDate, LocalTime, Keys };
|
||||
|
||||
export { exports as default };
|
||||
|
||||
}
|
||||
|
||||
declare class OffsetDateTime {
|
||||
|
||||
readonly toJSON :Date['toJSON'];
|
||||
|
||||
readonly [Symbol.toStringTag] :'OffsetDateTime';
|
||||
|
||||
readonly toISOString :(this :Readonly<OffsetDateTime>) => `${number}-${number}-${number}T${number}:${number}:${number}${'' | `.${number}`}${'Z' | `${'+' | '-'}${number}:${number}`}`;
|
||||
readonly valueOf :(this :Readonly<OffsetDateTime>) => `${number}${'' | `.${number}`}`;
|
||||
|
||||
private [OffsetDateTime_ISOString] :string;
|
||||
private [OffsetDateTime_value] :string;
|
||||
|
||||
constructor (literal :`${number}-${number}-${number}${'T' | 't' | ' '}${number}:${number}:${number}${'' | `.${number}`}${'Z' | 'z' | `${'+' | '-'}${number}:${number}`}`);
|
||||
|
||||
readonly getUTCFullYear :(this :Readonly<OffsetDateTime>) => _1_10000;
|
||||
readonly getUTCMonth :(this :Readonly<OffsetDateTime>) => _0_11;
|
||||
readonly getUTCDate :(this :Readonly<OffsetDateTime>) => _1_31;
|
||||
|
||||
readonly getUTCHours :(this :Readonly<OffsetDateTime>) => _0_23;
|
||||
readonly getUTCMinutes :(this :Readonly<OffsetDateTime>) => _0_59;
|
||||
readonly getUTCSeconds :(this :Readonly<OffsetDateTime>) => _0_59;
|
||||
readonly getUTCMilliseconds :(this :Readonly<OffsetDateTime>) => _0_999;
|
||||
|
||||
readonly getUTCDay :(this :Readonly<OffsetDateTime>) => _0_6;
|
||||
readonly getTimezoneOffset :(this :Readonly<OffsetDateTime>) => _1439_1439;
|
||||
readonly getTime :(this :Readonly<OffsetDateTime>) => number;
|
||||
|
||||
}
|
||||
declare class LocalDateTime {
|
||||
|
||||
readonly toJSON :Date['toJSON'];
|
||||
|
||||
readonly [Symbol.toStringTag] :'LocalDateTime';
|
||||
|
||||
readonly toISOString :(this :Readonly<LocalDateTime>) => `${number}-${number}-${number}T${number}:${number}:${number}${'' | `.${number}`}`;
|
||||
readonly valueOf :(this :Readonly<LocalDateTime>) => `${number}`;
|
||||
|
||||
private [LocalDateTime_ISOString] :string;
|
||||
private [LocalDateTime_value] :string;
|
||||
|
||||
constructor (literal :`${number}-${number}-${number}${'T' | 't' | ' '}${number}:${number}:${number}${'' | `.${number}`}`);
|
||||
|
||||
readonly getFullYear :(this :Readonly<LocalDateTime>) => _0_9999;
|
||||
readonly setFullYear :(this :LocalDateTime, year :_0_9999) => void;
|
||||
readonly getMonth :(this :Readonly<LocalDateTime>) => _0_11;
|
||||
readonly setMonth :(this :LocalDateTime, month :_0_11) => void;
|
||||
readonly getDate :(this :Readonly<LocalDateTime>) => _1_31;
|
||||
readonly setDate :(this :LocalDateTime, date :_1_31) => void;
|
||||
|
||||
readonly getHours :(this :Readonly<LocalDateTime>) => _0_23;
|
||||
readonly setHours :(this :LocalDateTime, hours :_0_23) => void;
|
||||
readonly getMinutes :(this :Readonly<LocalDateTime>) => _0_59;
|
||||
readonly setMinutes :(this :LocalDateTime, min :_0_59) => void;
|
||||
readonly getSeconds :(this :Readonly<LocalDateTime>) => _0_59;
|
||||
readonly setSeconds :(this :LocalDateTime, sec :_0_59) => void;
|
||||
readonly getMilliseconds :(this :Readonly<LocalDateTime>) => _0_999;
|
||||
readonly setMilliseconds :(this :LocalDateTime, ms :_0_999) => void;
|
||||
|
||||
}
|
||||
declare class LocalDate {
|
||||
|
||||
readonly toJSON :Date['toJSON'];
|
||||
|
||||
readonly [Symbol.toStringTag] :'LocalDate';
|
||||
|
||||
readonly toISOString :(this :Readonly<LocalDate>) => `${number}-${number}-${number}`;
|
||||
readonly valueOf :(this :Readonly<LocalDate>) => `${number}`;
|
||||
|
||||
private [LocalDate_ISOString] :string;
|
||||
private [LocalDate_value] :string;
|
||||
|
||||
constructor (literal :`${number}-${number}-${number}`);
|
||||
|
||||
readonly getFullYear :(this :Readonly<LocalDate>) => _0_9999;
|
||||
readonly setFullYear :(this :LocalDate, year :_0_9999) => void;
|
||||
readonly getMonth :(this :Readonly<LocalDate>) => _0_11;
|
||||
readonly setMonth :(this :LocalDate, month :_0_11) => void;
|
||||
readonly getDate :(this :Readonly<LocalDate>) => _1_31;
|
||||
readonly setDate :(this :LocalDate, date :_1_31) => void;
|
||||
|
||||
}
|
||||
declare class LocalTime {
|
||||
|
||||
readonly toJSON :Date['toJSON'];
|
||||
|
||||
readonly [Symbol.toStringTag] :'LocalTime';
|
||||
|
||||
readonly toISOString :(this :Readonly<LocalTime>) => `${number}:${number}:${number}${'' | `.${number}`}`;
|
||||
readonly valueOf :(this :Readonly<LocalTime>) => `${number}`;
|
||||
|
||||
private [LocalTime_ISOString] :string;
|
||||
private [LocalTime_value] :string;
|
||||
|
||||
constructor (literal :`${number}:${number}:${number}${'' | `.${number}`}`);
|
||||
|
||||
readonly getHours :(this :Readonly<LocalTime>) => _0_23;
|
||||
readonly setHours :(this :LocalTime, hours :_0_23) => void;
|
||||
readonly getMinutes :(this :Readonly<LocalTime>) => _0_59;
|
||||
readonly setMinutes :(this :LocalTime, min :_0_59) => void;
|
||||
readonly getSeconds :(this :Readonly<LocalTime>) => _0_59;
|
||||
readonly setSeconds :(this :LocalTime, sec :_0_59) => void;
|
||||
readonly getMilliseconds :(this :Readonly<LocalTime>) => _0_999;
|
||||
readonly setMilliseconds :(this :LocalTime, ms :_0_999) => void;
|
||||
|
||||
}
|
||||
|
||||
declare class Keys extends RegExp {
|
||||
readonly lastIndex :number;
|
||||
constructor (keys :ArrayLike<string>);
|
||||
readonly test :(this :Keys, key :string) => boolean;
|
||||
}
|
||||
|
||||
declare const _literal :unique symbol;
|
||||
|
||||
type Source = string | ArrayBufferLike
|
||||
| {
|
||||
readonly path :string,
|
||||
readonly data? :undefined,
|
||||
readonly require :
|
||||
| {
|
||||
readonly resolve? :{ readonly paths? :undefined }
|
||||
(this :void, id :'fs') :{
|
||||
readonly readFileSync :(this :void, path :string) => ArrayBufferLike
|
||||
}
|
||||
}
|
||||
| {
|
||||
readonly resolve :{ readonly paths :(this :void, request :string) => null | string[] }
|
||||
(this :void, id :'path') :{
|
||||
readonly resolve :(this :void, dirname :string, filename :string) => string
|
||||
}
|
||||
(this :void, id :'fs') :{
|
||||
readonly readFileSync :(this :void, path :string) => ArrayBufferLike
|
||||
}
|
||||
},
|
||||
}
|
||||
| {
|
||||
readonly path :string,
|
||||
readonly data :string | ArrayBufferLike,
|
||||
readonly require? :
|
||||
| {
|
||||
readonly resolve? :{ readonly paths? :undefined }
|
||||
}
|
||||
| {
|
||||
readonly resolve :{ readonly paths :(this :void, request :string) => null | string[] }
|
||||
(this :void, id :'path') :{
|
||||
readonly resolve :(this :void, dirname :string, filename :string) => string
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
type XOptions = null | {
|
||||
readonly keys? :null | Keys,
|
||||
readonly order? :boolean,
|
||||
readonly exact? :boolean,
|
||||
readonly multi? :boolean,
|
||||
readonly longer? :boolean,
|
||||
readonly string? :boolean,
|
||||
readonly comment? :boolean,
|
||||
readonly literal? :boolean,
|
||||
readonly null? :boolean,
|
||||
readonly tag? :null | (
|
||||
<Table extends object & { [key :string | symbol] :any }, Key extends string | symbol, Array extends any[], Index extends number, Tag extends string>
|
||||
(this :void, each :
|
||||
| { table :Table, key :Key, tag :Tag }
|
||||
| { array :Array, index :Index, tag :Tag }
|
||||
| { table :Table, key :Key, array :Array, index :Index, tag :Tag }
|
||||
) => void
|
||||
),
|
||||
};
|
||||
|
||||
type ReadonlyTable = object & { readonly [key :string] :ReadonlyValue };
|
||||
type ReadonlyArray = readonly ReadonlyValue[];
|
||||
type ReadonlyValue =
|
||||
| { readonly [_literal] :string | readonly [ string, ...string[] ] } & object
|
||||
| null | boolean | bigint | number | string
|
||||
| ReadonlyDatetime | ReadonlyArray | ReadonlyTable
|
||||
;
|
||||
interface ReadonlyDatetime { readonly toISOString :(this :this) => string }
|
||||
|
||||
type Table = object & { [key :string] :Value };
|
||||
type Array = Value[];
|
||||
type Value =
|
||||
| object & BigInt & { [_literal] :string }
|
||||
| object & Number & { [_literal] :string }
|
||||
| object & String & { [_literal] :string | [ string, ...string[] ] }
|
||||
| null | boolean | bigint | number | string
|
||||
| Datetime | Array | Table
|
||||
;
|
||||
type Datetime = OffsetDateTime | LocalDateTime | LocalDate | LocalTime;
|
||||
declare const OffsetDateTime_ISOString :unique symbol;
|
||||
declare const OffsetDateTime_value :unique symbol;
|
||||
declare const LocalDateTime_ISOString :unique symbol;
|
||||
declare const LocalDateTime_value :unique symbol;
|
||||
declare const LocalDate_ISOString :unique symbol;
|
||||
declare const LocalDate_value :unique symbol;
|
||||
declare const LocalTime_ISOString :unique symbol;
|
||||
declare const LocalTime_value :unique symbol;
|
||||
|
||||
type _1439_1439 = -1439 | {} & number | 1439;
|
||||
type _1_10000 = -1 | {} & number | 10000;
|
||||
type _0_9999 = 0 | {} & number | 9999;
|
||||
type _0_999 = 0 | {} & number | 999;
|
||||
type _0_6 = 0 | 1 | 2 | 3 | 4 | 5 | 6;
|
||||
type _0_11 = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11;
|
||||
type _0_23 = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23;
|
||||
type _1_31 = | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31;
|
||||
type _0_59 = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59;
|
||||
3008
v2realbot/static/js/libs/j-toml/j-toml.js
Normal file
3008
v2realbot/static/js/libs/j-toml/j-toml.js
Normal file
File diff suppressed because one or more lines are too long
277
v2realbot/static/js/libs/j-toml/j-toml.min.d.ts
vendored
Normal file
277
v2realbot/static/js/libs/j-toml/j-toml.min.d.ts
vendored
Normal file
@ -0,0 +1,277 @@
|
||||
export as namespace TOML;
|
||||
export = exports;
|
||||
|
||||
declare namespace exports {
|
||||
|
||||
export const version :'1.38.0';
|
||||
|
||||
export const parse :
|
||||
& {
|
||||
(this :void, source :Source, specificationVersion :1.0 | 0.5 | 0.4 | 0.3 | 0.2 | 0.1, multilineStringJoiner? :string, useBigInt? :boolean | number, xOptions? :XOptions ) :Table;
|
||||
(this :void, source :Source, multilineStringJoiner? :string, useBigInt? :boolean | number, xOptions? :XOptions ) :Table;
|
||||
(this :void, source :Source, options? :{ readonly joiner? :string, readonly bigint? :boolean | number, readonly x ? :XOptions }) :Table;
|
||||
}
|
||||
& {
|
||||
readonly [SpecificationVersion in 1.0 | 0.5 | 0.4 | 0.3 | 0.2 | 0.1] :{
|
||||
(this :void, source :Source, multilineStringJoiner? :string, useBigInt? :boolean | number, xOptions? :XOptions ) :Table;
|
||||
(this :void, source :Source, options? :{ readonly joiner? :string, readonly bigint? :boolean | number, readonly x ? :XOptions }) :Table;
|
||||
}
|
||||
};
|
||||
|
||||
export function stringify (this :void, rootTable :ReadonlyTable, options? :{
|
||||
readonly integer? :number
|
||||
readonly newline? :'\n' | '\r\n'
|
||||
readonly newlineAround? :'document' | 'section' | 'header' | 'pairs' | 'pair'
|
||||
readonly indent? :string | number
|
||||
readonly T? :'T' | 't' | ' '
|
||||
readonly Z? :'Z' | 'z'
|
||||
readonly xNull? :boolean
|
||||
readonly xBeforeNewlineInMultilineTable? :',' | ''
|
||||
readonly forceInlineArraySpacing? :0 | 1 | 2 | 3
|
||||
}) :string;
|
||||
|
||||
export function isSection (this :void, table :ReadonlyTable) :boolean;
|
||||
export function isInline (this :void, value :ReadonlyTable | ReadonlyArray) :boolean;
|
||||
|
||||
export function Section<T extends ReadonlyTable> (this :void, table :T) :T;
|
||||
export function inline<T extends ReadonlyArray> (this :void, value :T, inlineMode? :0 | 1 | 2 | 3) :T;
|
||||
export function inline<T extends ReadonlyTable> (this :void, value :T) :T;
|
||||
export const multiline :{
|
||||
readonly array :{
|
||||
<T extends ReadonlyArray>
|
||||
(this :void, array :T ) :T
|
||||
}
|
||||
<T extends ReadonlyTable>
|
||||
(this :void, table :T ) :T
|
||||
(this :void, value :string ) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] | [ `'''`, ...string[], `${string}'''` ] } & object & String
|
||||
(this :void, lines :readonly string[] ) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] | [ `'''`, ...string[], `${string}'''` ] } & object
|
||||
(this :void, lines :readonly string[], value :string) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] | [ `'''`, ...string[], `${string}'''` ] } & object & String
|
||||
readonly basic :{
|
||||
(this :void, value :string ) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] } & object & String
|
||||
(this :void, lines :readonly string[] ) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] } & object
|
||||
(this :void, lines :readonly string[], value :string) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] } & object & String
|
||||
}
|
||||
};
|
||||
export function basic (this :void, value :string ) :{ [_literal] :`"${string}"` } & object & String;
|
||||
export function literal (this :void, literal :string ) :{ [_literal] :string | [ string, ...string[] ] } & object ;
|
||||
export function literal (this :void, literal :string, value :string ) :{ [_literal] :string | [ string, ...string[] ] } & object & String;
|
||||
export function literal (this :void, literal :string, value :number ) :{ [_literal] :string | [ string, ...string[] ] } & object & Number;
|
||||
export function literal (this :void, literal :string, value :bigint ) :{ [_literal] :string | [ string, ...string[] ] } & object & BigInt;
|
||||
export function literal (this :void, literal :TemplateStringsArray, ...chars :string[]) :{ [_literal] :string | [ string, ...string[] ] } & object ;
|
||||
|
||||
export function commentFor (this :void, key :string) :symbol;
|
||||
export const commentForThis :unique symbol;
|
||||
|
||||
export { OffsetDateTime, LocalDateTime, LocalDate, LocalTime, Keys };
|
||||
|
||||
export { exports as default };
|
||||
|
||||
}
|
||||
|
||||
declare class OffsetDateTime {
|
||||
|
||||
readonly toJSON :Date['toJSON'];
|
||||
|
||||
readonly [Symbol.toStringTag] :'OffsetDateTime';
|
||||
|
||||
readonly toISOString :(this :Readonly<OffsetDateTime>) => `${number}-${number}-${number}T${number}:${number}:${number}${'' | `.${number}`}${'Z' | `${'+' | '-'}${number}:${number}`}`;
|
||||
readonly valueOf :(this :Readonly<OffsetDateTime>) => `${number}${'' | `.${number}`}`;
|
||||
|
||||
private [OffsetDateTime_ISOString] :string;
|
||||
private [OffsetDateTime_value] :string;
|
||||
|
||||
constructor (literal :`${number}-${number}-${number}${'T' | 't' | ' '}${number}:${number}:${number}${'' | `.${number}`}${'Z' | 'z' | `${'+' | '-'}${number}:${number}`}`);
|
||||
|
||||
readonly getUTCFullYear :(this :Readonly<OffsetDateTime>) => _1_10000;
|
||||
readonly getUTCMonth :(this :Readonly<OffsetDateTime>) => _0_11;
|
||||
readonly getUTCDate :(this :Readonly<OffsetDateTime>) => _1_31;
|
||||
|
||||
readonly getUTCHours :(this :Readonly<OffsetDateTime>) => _0_23;
|
||||
readonly getUTCMinutes :(this :Readonly<OffsetDateTime>) => _0_59;
|
||||
readonly getUTCSeconds :(this :Readonly<OffsetDateTime>) => _0_59;
|
||||
readonly getUTCMilliseconds :(this :Readonly<OffsetDateTime>) => _0_999;
|
||||
|
||||
readonly getUTCDay :(this :Readonly<OffsetDateTime>) => _0_6;
|
||||
readonly getTimezoneOffset :(this :Readonly<OffsetDateTime>) => _1439_1439;
|
||||
readonly getTime :(this :Readonly<OffsetDateTime>) => number;
|
||||
|
||||
}
|
||||
declare class LocalDateTime {
|
||||
|
||||
readonly toJSON :Date['toJSON'];
|
||||
|
||||
readonly [Symbol.toStringTag] :'LocalDateTime';
|
||||
|
||||
readonly toISOString :(this :Readonly<LocalDateTime>) => `${number}-${number}-${number}T${number}:${number}:${number}${'' | `.${number}`}`;
|
||||
readonly valueOf :(this :Readonly<LocalDateTime>) => `${number}`;
|
||||
|
||||
private [LocalDateTime_ISOString] :string;
|
||||
private [LocalDateTime_value] :string;
|
||||
|
||||
constructor (literal :`${number}-${number}-${number}${'T' | 't' | ' '}${number}:${number}:${number}${'' | `.${number}`}`);
|
||||
|
||||
readonly getFullYear :(this :Readonly<LocalDateTime>) => _0_9999;
|
||||
readonly setFullYear :(this :LocalDateTime, year :_0_9999) => void;
|
||||
readonly getMonth :(this :Readonly<LocalDateTime>) => _0_11;
|
||||
readonly setMonth :(this :LocalDateTime, month :_0_11) => void;
|
||||
readonly getDate :(this :Readonly<LocalDateTime>) => _1_31;
|
||||
readonly setDate :(this :LocalDateTime, date :_1_31) => void;
|
||||
|
||||
readonly getHours :(this :Readonly<LocalDateTime>) => _0_23;
|
||||
readonly setHours :(this :LocalDateTime, hours :_0_23) => void;
|
||||
readonly getMinutes :(this :Readonly<LocalDateTime>) => _0_59;
|
||||
readonly setMinutes :(this :LocalDateTime, min :_0_59) => void;
|
||||
readonly getSeconds :(this :Readonly<LocalDateTime>) => _0_59;
|
||||
readonly setSeconds :(this :LocalDateTime, sec :_0_59) => void;
|
||||
readonly getMilliseconds :(this :Readonly<LocalDateTime>) => _0_999;
|
||||
readonly setMilliseconds :(this :LocalDateTime, ms :_0_999) => void;
|
||||
|
||||
}
|
||||
declare class LocalDate {
|
||||
|
||||
readonly toJSON :Date['toJSON'];
|
||||
|
||||
readonly [Symbol.toStringTag] :'LocalDate';
|
||||
|
||||
readonly toISOString :(this :Readonly<LocalDate>) => `${number}-${number}-${number}`;
|
||||
readonly valueOf :(this :Readonly<LocalDate>) => `${number}`;
|
||||
|
||||
private [LocalDate_ISOString] :string;
|
||||
private [LocalDate_value] :string;
|
||||
|
||||
constructor (literal :`${number}-${number}-${number}`);
|
||||
|
||||
readonly getFullYear :(this :Readonly<LocalDate>) => _0_9999;
|
||||
readonly setFullYear :(this :LocalDate, year :_0_9999) => void;
|
||||
readonly getMonth :(this :Readonly<LocalDate>) => _0_11;
|
||||
readonly setMonth :(this :LocalDate, month :_0_11) => void;
|
||||
readonly getDate :(this :Readonly<LocalDate>) => _1_31;
|
||||
readonly setDate :(this :LocalDate, date :_1_31) => void;
|
||||
|
||||
}
|
||||
declare class LocalTime {
|
||||
|
||||
readonly toJSON :Date['toJSON'];
|
||||
|
||||
readonly [Symbol.toStringTag] :'LocalTime';
|
||||
|
||||
readonly toISOString :(this :Readonly<LocalTime>) => `${number}:${number}:${number}${'' | `.${number}`}`;
|
||||
readonly valueOf :(this :Readonly<LocalTime>) => `${number}`;
|
||||
|
||||
private [LocalTime_ISOString] :string;
|
||||
private [LocalTime_value] :string;
|
||||
|
||||
constructor (literal :`${number}:${number}:${number}${'' | `.${number}`}`);
|
||||
|
||||
readonly getHours :(this :Readonly<LocalTime>) => _0_23;
|
||||
readonly setHours :(this :LocalTime, hours :_0_23) => void;
|
||||
readonly getMinutes :(this :Readonly<LocalTime>) => _0_59;
|
||||
readonly setMinutes :(this :LocalTime, min :_0_59) => void;
|
||||
readonly getSeconds :(this :Readonly<LocalTime>) => _0_59;
|
||||
readonly setSeconds :(this :LocalTime, sec :_0_59) => void;
|
||||
readonly getMilliseconds :(this :Readonly<LocalTime>) => _0_999;
|
||||
readonly setMilliseconds :(this :LocalTime, ms :_0_999) => void;
|
||||
|
||||
}
|
||||
|
||||
declare class Keys extends RegExp {
|
||||
readonly lastIndex :number;
|
||||
constructor (keys :ArrayLike<string>);
|
||||
readonly test :(this :Keys, key :string) => boolean;
|
||||
}
|
||||
|
||||
declare const _literal :unique symbol;
|
||||
|
||||
type Source = string | ArrayBufferLike
|
||||
| {
|
||||
readonly path :string,
|
||||
readonly data? :undefined,
|
||||
readonly require :
|
||||
| {
|
||||
readonly resolve? :{ readonly paths? :undefined }
|
||||
(this :void, id :'fs') :{
|
||||
readonly readFileSync :(this :void, path :string) => ArrayBufferLike
|
||||
}
|
||||
}
|
||||
| {
|
||||
readonly resolve :{ readonly paths :(this :void, request :string) => null | string[] }
|
||||
(this :void, id :'path') :{
|
||||
readonly resolve :(this :void, dirname :string, filename :string) => string
|
||||
}
|
||||
(this :void, id :'fs') :{
|
||||
readonly readFileSync :(this :void, path :string) => ArrayBufferLike
|
||||
}
|
||||
},
|
||||
}
|
||||
| {
|
||||
readonly path :string,
|
||||
readonly data :string | ArrayBufferLike,
|
||||
readonly require? :
|
||||
| {
|
||||
readonly resolve? :{ readonly paths? :undefined }
|
||||
}
|
||||
| {
|
||||
readonly resolve :{ readonly paths :(this :void, request :string) => null | string[] }
|
||||
(this :void, id :'path') :{
|
||||
readonly resolve :(this :void, dirname :string, filename :string) => string
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
type XOptions = null | {
|
||||
readonly keys? :null | Keys,
|
||||
readonly order? :boolean,
|
||||
readonly exact? :boolean,
|
||||
readonly multi? :boolean,
|
||||
readonly longer? :boolean,
|
||||
readonly string? :boolean,
|
||||
readonly comment? :boolean,
|
||||
readonly literal? :boolean,
|
||||
readonly null? :boolean,
|
||||
readonly tag? :null | (
|
||||
<Table extends object & { [key :string | symbol] :any }, Key extends string | symbol, Array extends any[], Index extends number, Tag extends string>
|
||||
(this :void, each :
|
||||
| { table :Table, key :Key, tag :Tag }
|
||||
| { array :Array, index :Index, tag :Tag }
|
||||
| { table :Table, key :Key, array :Array, index :Index, tag :Tag }
|
||||
) => void
|
||||
),
|
||||
};
|
||||
|
||||
type ReadonlyTable = object & { readonly [key :string] :ReadonlyValue };
|
||||
type ReadonlyArray = readonly ReadonlyValue[];
|
||||
type ReadonlyValue =
|
||||
| { readonly [_literal] :string | readonly [ string, ...string[] ] } & object
|
||||
| null | boolean | bigint | number | string
|
||||
| ReadonlyDatetime | ReadonlyArray | ReadonlyTable
|
||||
;
|
||||
interface ReadonlyDatetime { readonly toISOString :(this :this) => string }
|
||||
|
||||
type Table = object & { [key :string] :Value };
|
||||
type Array = Value[];
|
||||
type Value =
|
||||
| object & BigInt & { [_literal] :string }
|
||||
| object & Number & { [_literal] :string }
|
||||
| object & String & { [_literal] :string | [ string, ...string[] ] }
|
||||
| null | boolean | bigint | number | string
|
||||
| Datetime | Array | Table
|
||||
;
|
||||
type Datetime = OffsetDateTime | LocalDateTime | LocalDate | LocalTime;
|
||||
declare const OffsetDateTime_ISOString :unique symbol;
|
||||
declare const OffsetDateTime_value :unique symbol;
|
||||
declare const LocalDateTime_ISOString :unique symbol;
|
||||
declare const LocalDateTime_value :unique symbol;
|
||||
declare const LocalDate_ISOString :unique symbol;
|
||||
declare const LocalDate_value :unique symbol;
|
||||
declare const LocalTime_ISOString :unique symbol;
|
||||
declare const LocalTime_value :unique symbol;
|
||||
|
||||
type _1439_1439 = -1439 | {} & number | 1439;
|
||||
type _1_10000 = -1 | {} & number | 10000;
|
||||
type _0_9999 = 0 | {} & number | 9999;
|
||||
type _0_999 = 0 | {} & number | 999;
|
||||
type _0_6 = 0 | 1 | 2 | 3 | 4 | 5 | 6;
|
||||
type _0_11 = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11;
|
||||
type _0_23 = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23;
|
||||
type _1_31 = | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31;
|
||||
type _0_59 = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59;
|
||||
144
v2realbot/static/js/libs/j-toml/j-toml.min.js
vendored
Normal file
144
v2realbot/static/js/libs/j-toml/j-toml.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
v2realbot/static/js/libs/j-toml/j-toml.min.js.gz
Normal file
BIN
v2realbot/static/js/libs/j-toml/j-toml.min.js.gz
Normal file
Binary file not shown.
45
v2realbot/static/js/libs/j-toml/j-toml.min.js.map
Normal file
45
v2realbot/static/js/libs/j-toml/j-toml.min.js.map
Normal file
File diff suppressed because one or more lines are too long
BIN
v2realbot/static/js/libs/j-toml/j-toml.min.js.map.gz
Normal file
BIN
v2realbot/static/js/libs/j-toml/j-toml.min.js.map.gz
Normal file
Binary file not shown.
@ -23,6 +23,7 @@ function populate_rt_status_header(runnerId) {
|
||||
success:function(data){
|
||||
//console.log(JSON.stringify(data))
|
||||
//add status on chart
|
||||
$("#statusArchId").text(data.id)
|
||||
$("#statusRegime").text("REALTIME: "+data.id)
|
||||
$("#statusName").text(data.run_name)
|
||||
$("#statusMode").text(data.run_mode)
|
||||
|
||||
@ -50,8 +50,8 @@ function refresh_stratin_and_callback(row, callback) {
|
||||
contentType: "application/json",
|
||||
dataType: "json",
|
||||
success:function(data){
|
||||
console.log("fetched data ok")
|
||||
console.log(JSON.stringify(data,null,2));
|
||||
//console.log("fetched data ok")
|
||||
//console.log(JSON.stringify(data,null,2));
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
var err = eval("(" + xhr.responseText + ")");
|
||||
@ -65,7 +65,7 @@ function refresh_stratin_and_callback(row, callback) {
|
||||
// Both requests have completed successfully
|
||||
|
||||
//console.log("Result from request:", result);
|
||||
console.log("calling calbback")
|
||||
//console.log("calling calbback")
|
||||
//call callback function
|
||||
callback(response)
|
||||
|
||||
@ -236,19 +236,19 @@ $(document).ready(function () {
|
||||
filterList[i] = filterList[i].trim();
|
||||
}
|
||||
|
||||
console.log("filter list")
|
||||
console.log(filterList)
|
||||
console.log(minsize)
|
||||
//console.log("filter list")
|
||||
//console.log(filterList)
|
||||
//console.log(minsize)
|
||||
var row = ""
|
||||
//zakrouhleno na milisekundy
|
||||
var puvodni = parseFloat(parseInt(parseFloat($('#trade-timestamp').val())*1000))/1000
|
||||
console.log(puvodni)
|
||||
//console.log(puvodni)
|
||||
$('#trades-data-table').html(row);
|
||||
data.forEach((tradeLine) => {
|
||||
//console.log(JSON.stringify(tradeLine))
|
||||
date = new Date(tradeLine.timestamp)
|
||||
timestamp = date.getTime()/1000
|
||||
console.log(timestamp)
|
||||
//console.log(timestamp)
|
||||
|
||||
//trade contains filtered condition or size<minsize
|
||||
bg = (findCommonElements3(filterList, tradeLine.conditions) || (parseInt(tradeLine.size) < minsize) ? 'style="background-color: #411e1e;"' : '')
|
||||
@ -398,8 +398,8 @@ $(document).ready(function () {
|
||||
contentType: "application/json",
|
||||
dataType: "json",
|
||||
success:function(data){
|
||||
console.log("first request ok")
|
||||
console.log(JSON.stringify(data,null,2));
|
||||
//("first request ok")
|
||||
//console.log(JSON.stringify(data,null,2));
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
var err = eval("(" + xhr.responseText + ")");
|
||||
@ -417,8 +417,8 @@ $(document).ready(function () {
|
||||
contentType: "application/json",
|
||||
dataType: "json",
|
||||
success:function(data){
|
||||
console.log("first request ok")
|
||||
console.log(JSON.stringify(data,null,2));
|
||||
//console.log("first request ok")
|
||||
//console.log(JSON.stringify(data,null,2));
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
var err = eval("(" + xhr.responseText + ")");
|
||||
@ -433,9 +433,9 @@ $(document).ready(function () {
|
||||
// Both requests have completed successfully
|
||||
var result1 = response1[0];
|
||||
var result2 = response2[0];
|
||||
console.log("Result from first request:", result1);
|
||||
console.log("Result from second request:", result2);
|
||||
console.log("calling compare")
|
||||
// console.log("Result from first request:", result1);
|
||||
// console.log("Result from second request:", result2);
|
||||
// console.log("calling compare")
|
||||
perform_compare(result1, result2)
|
||||
// Perform your action with the results from both requests
|
||||
// Example:
|
||||
|
||||
@ -13,14 +13,16 @@ var candlestickSeries = null
|
||||
var volumeSeries = null
|
||||
var vwapSeries = null
|
||||
var statusBarConfig = JSON.parse(localStorage.getItem("statusBarConfig"));
|
||||
|
||||
var activatedButtons = []
|
||||
if (statusBarConfig == null) {
|
||||
statusBarConfig = {}
|
||||
}
|
||||
|
||||
var index_ind = 0
|
||||
|
||||
|
||||
const sorter = (a, b) => a.time > b.time ? 1 : -1;
|
||||
|
||||
var ind_editor = null
|
||||
var indConfig = null
|
||||
settings = {}
|
||||
settings
|
||||
@ -56,6 +58,13 @@ var indConfig_default = [ {name: "ema", titlevisible: false, embed: true, displa
|
||||
{name: "sec_price", titlevisible: true, embed: true, display: true, priceScaleId: "right", lastValueVisible: false},]
|
||||
//console.log(JSON.stringify(indConfig_default, null,null, 2))
|
||||
|
||||
function store_activated_buttons_state() {
|
||||
activatedButtons = []
|
||||
//ulozime si stav aktivovaných buttonků před změnou - mozna do sluzby
|
||||
$('#indicatorsButtons .switcher-active-item').each(function() {
|
||||
activatedButtons.push($(this).text());
|
||||
});
|
||||
}
|
||||
|
||||
function initialize_statusheader() {
|
||||
|
||||
@ -132,9 +141,11 @@ function initialize_statusheader() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
//pokud neni v configuraci vracime default
|
||||
function get_ind_config(indName) {
|
||||
|
||||
def = {name: "ema", titlevisible: false, embed: true, display: true, priceScaleId: "middle", lastValueVisible: false}
|
||||
|
||||
if (indConfig == null) {
|
||||
indConfig = get_from_config("indConfig", indConfig_default)
|
||||
}
|
||||
@ -144,7 +155,7 @@ function get_ind_config(indName) {
|
||||
{
|
||||
return indConfig[i]
|
||||
}
|
||||
return null
|
||||
return def
|
||||
}
|
||||
|
||||
function toggle_vertical_line(time) {
|
||||
@ -328,25 +339,183 @@ function remove_indicator_buttons() {
|
||||
elem1.remove()
|
||||
}
|
||||
|
||||
//pomocna funkce pro vytvoreni buttonu indiaktoru
|
||||
function create_indicator_button(item, index, def) {
|
||||
// //div pro kazdy button
|
||||
// var buttonContainer = document.createElement('div');
|
||||
// buttonContainer.classList.add('button-container');
|
||||
|
||||
var itemEl = document.createElement('button');
|
||||
itemEl.innerText = item.name;
|
||||
itemEl.id = "IND"+index;
|
||||
itemEl.title = item.cnf
|
||||
itemEl.style.color = item.series.options().color;
|
||||
//pokud jde o pridanou on the fly - vybarvime jinak
|
||||
if (item.added) {
|
||||
itemEl.style.outline = "solid 1px"
|
||||
}
|
||||
itemEl.classList.add('switcher-item');
|
||||
if (def) {
|
||||
itemEl.classList.add('switcher-active-item');
|
||||
}
|
||||
|
||||
// //jeste vytvorime pod tim overlay a nad to az dame linky
|
||||
// // Create the overlay element.
|
||||
// const overlay = document.createElement("div");
|
||||
// overlay.id = "OVR"+index;
|
||||
// overlay.classList.add("overlayLayer");
|
||||
// overlay.classList.add("hidden");
|
||||
|
||||
// // Create the action buttons.
|
||||
// const actionShow = document.createElement("div");
|
||||
// actionShow.id = "actionShow";
|
||||
// actionShow.textContent = "Show";
|
||||
|
||||
itemEl.addEventListener('click', function() {
|
||||
onItemClickedToggle(index);
|
||||
});
|
||||
|
||||
// const actionEdit = document.createElement("div");
|
||||
// actionEdit.id = "actionEdit";
|
||||
// actionEdit.textContent = "Edit";
|
||||
|
||||
itemEl.addEventListener('contextmenu', function(e) {
|
||||
//edit modal zatim nemame
|
||||
onItemClickedEdit(e, index);
|
||||
});
|
||||
|
||||
// // Append the action buttons to the overlay.
|
||||
// overlay.appendChild(actionShow);
|
||||
// overlay.appendChild(actionEdit);
|
||||
|
||||
// // Add a hover listener to the button.
|
||||
// itemEl.addEventListener("mouseover", toggleOverlay(index));
|
||||
// itemEl.addEventListener("mouseout", toggleOverlay(index));
|
||||
|
||||
// buttonContainer.appendChild(itemEl)
|
||||
// buttonContainer.appendChild(overlay)
|
||||
return itemEl
|
||||
}
|
||||
|
||||
//pomocne funkce
|
||||
function onResetClicked() {
|
||||
indList.forEach(function (item, index) {
|
||||
vis = true;
|
||||
const elem = document.getElementById("IND"+index);
|
||||
if (elem.classList.contains("switcher-active-item")) {
|
||||
vis = false;
|
||||
}
|
||||
elem.classList.toggle("switcher-active-item");
|
||||
if (indList[index].series) {
|
||||
indList[index].series.applyOptions({
|
||||
visible: vis });
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
function generateIndicators(e) {
|
||||
alert("stratvars generated to clipboard from selected indicators")
|
||||
}
|
||||
|
||||
//editace indikatoru, vcetne vytvoreni noveho
|
||||
function onItemClickedEdit(e, index) {
|
||||
if (ind_editor) {
|
||||
ind_editor.dispose()
|
||||
}
|
||||
title = `#[stratvars.indicators.name]
|
||||
`
|
||||
const elem = document.getElementById("IND"+index);
|
||||
//console.log("element",elem)
|
||||
//jde o update
|
||||
if (elem) {
|
||||
elem.classList.replace('switcher-item', 'switcher-item-highlighted');
|
||||
$('#indicatorName').val(elem.textContent)
|
||||
$('#indicatorNameTitle').text(elem.textContent)
|
||||
title = elem.title
|
||||
}
|
||||
//jde o novy zaznam - davame pryc delete
|
||||
else {
|
||||
$('#deleteIndicatorButton').hide();
|
||||
}
|
||||
e.preventDefault()
|
||||
//$('#stratvar_id').val(row.id);
|
||||
$('#indicatorId').val(index)
|
||||
|
||||
require(["vs/editor/editor.main"], () => {
|
||||
ind_editor = monaco.editor.create(document.getElementById('indicatorTOML_editor'), {
|
||||
value: title,
|
||||
language: 'toml',
|
||||
theme: 'tomlTheme-dark',
|
||||
automaticLayout: true
|
||||
});
|
||||
});
|
||||
window.$('#indicatorModal').modal('show');
|
||||
}
|
||||
|
||||
//togle profit line
|
||||
function profitLineToggle() {
|
||||
vis = true;
|
||||
const elem = document.getElementById("profitLine");
|
||||
if (elem.classList.contains("switcher-active-item")) {
|
||||
vis = false;
|
||||
}
|
||||
elem.classList.toggle("switcher-active-item");
|
||||
//v ifu kvuli workaroundu
|
||||
if (profitLine) {
|
||||
profitLine.applyOptions({
|
||||
visible: vis });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//toggle indiktoru
|
||||
function onItemClickedToggle(index) {
|
||||
vis = true;
|
||||
const elem = document.getElementById("IND"+index);
|
||||
if (elem.classList.contains("switcher-active-item")) {
|
||||
vis = false;
|
||||
}
|
||||
elem.classList.toggle("switcher-active-item");
|
||||
//v ifu kvuli workaroundu
|
||||
if (indList[index].series) {
|
||||
indList[index].series.applyOptions({
|
||||
visible: vis });
|
||||
}
|
||||
//zatim takto workaround, pak vymyslet systemove pro vsechny tickbased indikatory
|
||||
if (indList[index].name == "tick_price") {
|
||||
if (!vis && indList[index].series) {
|
||||
chart.removeSeries(indList[index].series)
|
||||
chart.timeScale().fitContent();
|
||||
indList[index].series = null
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//funkce pro vytvoreni buttonku indikatoru
|
||||
function populate_indicator_buttons(def) {
|
||||
|
||||
//vytvoreni outer button divu
|
||||
var buttonElement = document.createElement('div');
|
||||
buttonElement.id = "indicatorsButtons"
|
||||
buttonElement.classList.add('switcher');
|
||||
|
||||
//iterace nad indikatory a vytvareni buttonků
|
||||
indList.forEach(function (item, index) {
|
||||
var itemEl = document.createElement('button');
|
||||
itemEl.innerText = item.name;
|
||||
itemEl.id = "IND"+index;
|
||||
itemEl.title = item.cnf
|
||||
itemEl.style.color = item.series.options().color;
|
||||
itemEl.classList.add('switcher-item');
|
||||
if (def) {
|
||||
itemEl.classList.add('switcher-active-item');
|
||||
index_ind = index
|
||||
active = false
|
||||
|
||||
//console.log("activatedButtons", activatedButtons)
|
||||
//console.log("obsahuje item.name", activatedButtons.includes(item.name), item.name)
|
||||
//pokud existuje v aktivnich pak
|
||||
if ((activatedButtons) && (activatedButtons.includes(item.name))) {
|
||||
active = true
|
||||
}
|
||||
itemEl.addEventListener('click', function() {
|
||||
onItemClicked1(index);
|
||||
});
|
||||
buttonElement.appendChild(itemEl);
|
||||
//vytvoreni buttonku
|
||||
itemEl = create_indicator_button(item, index, def||active);
|
||||
//prirazeni do divu
|
||||
buttonElement.appendChild(itemEl); ;
|
||||
});
|
||||
|
||||
//create toggle all button
|
||||
@ -361,51 +530,47 @@ function populate_indicator_buttons(def) {
|
||||
});
|
||||
buttonElement.appendChild(itemEl);
|
||||
|
||||
function onResetClicked() {
|
||||
indList.forEach(function (item, index) {
|
||||
vis = true;
|
||||
const elem = document.getElementById("IND"+index);
|
||||
if (elem.classList.contains("switcher-active-item")) {
|
||||
vis = false;
|
||||
}
|
||||
elem.classList.toggle("switcher-active-item");
|
||||
if (indList[index].series) {
|
||||
indList[index].series.applyOptions({
|
||||
visible: vis });
|
||||
}
|
||||
})
|
||||
}
|
||||
//button pro toggle profitu
|
||||
var itemEl = document.createElement('button');
|
||||
itemEl.innerText = "prof"
|
||||
itemEl.classList.add('switcher-item');
|
||||
itemEl.style.color = "#99912b"
|
||||
itemEl.id = "profitLine"
|
||||
itemEl.addEventListener('click', function(e) {
|
||||
profitLineToggle();
|
||||
});
|
||||
buttonElement.appendChild(itemEl);
|
||||
|
||||
function onItemClicked1(index) {
|
||||
vis = true;
|
||||
const elem = document.getElementById("IND"+index);
|
||||
if (elem.classList.contains("switcher-active-item")) {
|
||||
vis = false;
|
||||
}
|
||||
elem.classList.toggle("switcher-active-item");
|
||||
//v ifu kvuli workaroundu
|
||||
if (indList[index].series) {
|
||||
indList[index].series.applyOptions({
|
||||
visible: vis });
|
||||
}
|
||||
//zatim takto workaround, pak vymyslet systemove pro vsechny tickbased indikatory
|
||||
if (indList[index].name == "tick_price") {
|
||||
if (!vis && indList[index].series) {
|
||||
chart.removeSeries(indList[index].series)
|
||||
chart.timeScale().fitContent();
|
||||
indList[index].series = null
|
||||
}
|
||||
}
|
||||
//create plus button to create new button
|
||||
var itemEl = document.createElement('button');
|
||||
itemEl.innerText = "+"
|
||||
itemEl.classList.add('switcher-item');
|
||||
//na tomto je navesena jquery pro otevreni modalu
|
||||
itemEl.id = "button_addindicator"
|
||||
itemEl.addEventListener('click', function(e) {
|
||||
index_ind++
|
||||
onItemClickedEdit(e, index_ind);
|
||||
});
|
||||
buttonElement.appendChild(itemEl);
|
||||
|
||||
//save indicator buttons - will generate indicators to stratvars
|
||||
var itemEl = document.createElement('button');
|
||||
itemEl.innerText = "generate"
|
||||
itemEl.classList.add('switcher-item');
|
||||
//na tomto je navesena jquery pro otevreni modalu
|
||||
itemEl.id = "save_indicators"
|
||||
itemEl.addEventListener('click', function(e) {
|
||||
index_ind++
|
||||
generateIndicators(e);
|
||||
});
|
||||
buttonElement.appendChild(itemEl);
|
||||
|
||||
|
||||
}
|
||||
return buttonElement;
|
||||
return buttonElement;
|
||||
}
|
||||
|
||||
|
||||
//range switch pro chart https://jsfiddle.net/TradingView/qrb9a850/
|
||||
function createSimpleSwitcher(items, activeItem, activeItemChangedCallback) {
|
||||
function createSimpleSwitcher(items, activeItem, activeItemChangedCallback, data) {
|
||||
var switcherElement = document.createElement('div');
|
||||
switcherElement.classList.add('switcher');
|
||||
|
||||
@ -432,7 +597,7 @@ function createSimpleSwitcher(items, activeItem, activeItemChangedCallback) {
|
||||
|
||||
activeItem = item;
|
||||
|
||||
activeItemChangedCallback(item);
|
||||
activeItemChangedCallback(item, data);
|
||||
}
|
||||
|
||||
return switcherElement;
|
||||
@ -485,6 +650,7 @@ function format_date(datum, markettime = false, timeonly = false) {
|
||||
}
|
||||
|
||||
function clear_status_header() {
|
||||
$("#statusArchId").text("")
|
||||
$("#statusRegime").text("")
|
||||
$("#statusName").text("")
|
||||
$("#statusMode").text("")
|
||||
|
||||
@ -372,12 +372,64 @@ pre {
|
||||
/* color: var(--bs-dark-text-emphasis); */
|
||||
/* } */
|
||||
|
||||
|
||||
.overlayLayer {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: inline-table;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s;
|
||||
/* z-index: 2; */
|
||||
}
|
||||
|
||||
|
||||
.actionText {
|
||||
color: white;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* #indicatorModal {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
left: 10px;
|
||||
z-index: 1000;
|
||||
} */
|
||||
|
||||
.highlighted {
|
||||
color: #989393;
|
||||
background-color: #242a31;
|
||||
/* color: var(--bs-dark-text-emphasis); */
|
||||
}
|
||||
|
||||
.switcher-item-highlighted {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
/* cursor: pointer; */
|
||||
text-decoration: double;
|
||||
display: inline-block;
|
||||
padding: 1px 6px;
|
||||
font-size: 14px;
|
||||
/* color: #262b3e; */
|
||||
/* background-color: #818581; */
|
||||
background-color: #0202022e;
|
||||
margin-right: 8px;
|
||||
margin-bottom: 6px;
|
||||
/* border: 1px; */
|
||||
border-radius: 4px;
|
||||
outline: solid 1px;
|
||||
outline-color: #73df4d;
|
||||
/* outline-width: 1px; */
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
/* .switcher {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@ -426,7 +478,15 @@ pre {
|
||||
outline: none;
|
||||
} */
|
||||
|
||||
.button-container {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.switcher-item {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
/* cursor: pointer; */
|
||||
text-decoration: double;
|
||||
display: inline-block;
|
||||
@ -445,6 +505,10 @@ pre {
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
.switcher-item:hover + .overlayLayer {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.switcher-item:hover {
|
||||
background-color: #f2f3f521;
|
||||
}
|
||||
|
||||
@ -104,13 +104,13 @@ class StrategyClassicSL(Strategy):
|
||||
rel_profit = 0
|
||||
#spoctene celkovy relativni profit za trade v procentech ((trade_profit/vstup_naklady)*100)
|
||||
if vstup_cena != 0 and int(data.order.qty) != 0:
|
||||
rel_profit = (trade_profit / (vstup_cena * float(data.order.qty))) * 100
|
||||
rel_profit = round((trade_profit / (vstup_cena * float(data.order.qty))) * 100,5)
|
||||
|
||||
#pokud jde o finalni FILL - pridame do pole tento celkovy relativnich profit (ze ktereho se pocita kumulativni relativni profit)
|
||||
rel_profit_cum_calculated = 0
|
||||
if data.event == TradeEvent.FILL:
|
||||
self.state.rel_profit_cum.append(rel_profit)
|
||||
rel_profit_cum_calculated = np.mean(self.state.rel_profit_cum)
|
||||
rel_profit_cum_calculated = round(np.mean(self.state.rel_profit_cum),5)
|
||||
|
||||
self.state.ilog(e=f"BUY notif - SHORT PROFIT:{round(float(trade_profit),3)} celkem:{round(float(self.state.profit),3)} rel:{float(rel_profit)} rel_cum:{round(rel_profit_cum_calculated,7)}", msg=str(data.event), rel_profit_cum=str(self.state.rel_profit_cum), bought_amount=bought_amount, avg_costs=avg_costs, trade_qty=data.qty, trade_price=data.price, orderid=str(data.order.id))
|
||||
|
||||
@ -216,13 +216,13 @@ class StrategyClassicSL(Strategy):
|
||||
rel_profit = 0
|
||||
#spoctene celkovy relativni profit za trade v procentech ((trade_profit/vstup_naklady)*100)
|
||||
if vstup_cena != 0 and data.order.qty != 0:
|
||||
rel_profit = (trade_profit / (vstup_cena * float(data.order.qty))) * 100
|
||||
rel_profit = round((trade_profit / (vstup_cena * float(data.order.qty))) * 100,5)
|
||||
|
||||
rel_profit_cum_calculated = 0
|
||||
#pokud jde o finalni FILL - pridame do pole relativnich profit (ze ktereho se pocita kumulativni relativni profit)
|
||||
if data.event == TradeEvent.FILL:
|
||||
self.state.rel_profit_cum.append(rel_profit)
|
||||
rel_profit_cum_calculated = np.mean(self.state.rel_profit_cum)
|
||||
rel_profit_cum_calculated = round(np.mean(self.state.rel_profit_cum),5)
|
||||
|
||||
self.state.ilog(e=f"SELL notif - PROFIT:{round(float(trade_profit),3)} celkem:{round(float(self.state.profit),3)} rel:{float(rel_profit)} rel_cum:{round(rel_profit_cum_calculated,7)}", msg=str(data.event), rel_profit_cum = str(self.state.rel_profit_cum), sold_amount=sold_amount, avg_costs=avg_costs, trade_qty=data.qty, trade_price=data.price, orderid=str(data.order.id))
|
||||
|
||||
|
||||
@ -692,7 +692,7 @@ class StrategyState:
|
||||
self.bars = AttributeDict(bars)
|
||||
self.trades = AttributeDict(trades)
|
||||
self.indicators = AttributeDict(time=[])
|
||||
#pro mapping indikatoru pro pouziti v operation statementu
|
||||
#pro mapping indikatoru pro pouziti v operation expressionu
|
||||
self.ind_mapping = {}
|
||||
self.cbar_indicators = AttributeDict(time=[])
|
||||
#secondary timeframe indicators
|
||||
|
||||
@ -3,6 +3,8 @@ from v2realbot.strategy.base import StrategyState
|
||||
from v2realbot.indicators.indicators import ema, natr, roc
|
||||
from v2realbot.indicators.oscillators import rsi
|
||||
from traceback import format_exc
|
||||
from v2realbot.strategyblocks.indicators.helpers import get_source_series
|
||||
|
||||
#RSI INDICATOR
|
||||
# type = RSI, source = [close, vwap, hlcc4], rsi_length = [14], MA_length = int (optional), on_confirmed_only = [true, false]
|
||||
# pokud existuje MA, vytvarime i stejnojnojmenny MAcko
|
||||
@ -20,15 +22,13 @@ def populate_dynamic_RSI_indicator(data, state: StrategyState, name):
|
||||
#poustet kazdy tick nebo jenom na confirmed baru (on_confirmed_only = true)
|
||||
on_confirmed_only = safe_get(options, 'on_confirmed_only', False)
|
||||
req_source = safe_get(options, 'source', 'vwap')
|
||||
if req_source not in ["close", "vwap","hlcc4"]:
|
||||
state.ilog(lvl=1,e=f"Unknown source error {req_source} for {name}")
|
||||
return
|
||||
rsi_length = int(safe_get(options, "RSI_length",14))
|
||||
rsi_length = int(safe_get(options, "length",14))
|
||||
rsi_MA_length = safe_get(options, "MA_length", None)
|
||||
|
||||
if on_confirmed_only is False or (on_confirmed_only is True and data['confirmed']==1):
|
||||
try:
|
||||
source = state.bars[req_source]
|
||||
#source = state.bars[req_source]
|
||||
source = get_source_series(state, req_source)
|
||||
#cekame na dostatek dat
|
||||
if len(source) > rsi_length:
|
||||
rsi_res = rsi(source, rsi_length)
|
||||
|
||||
@ -25,6 +25,8 @@ def upscaledrsi(state, params):
|
||||
|
||||
#pokud potrebuju jen close nebo open muzu pouzit toto
|
||||
# vezme to N-th element z pole
|
||||
|
||||
#TODO resample any series
|
||||
def resample_close_prices(bars, new_resolution):
|
||||
# Check that the new resolution is a multiple of the old resolution.
|
||||
if new_resolution % bars['resolution'][-1] != 0:
|
||||
|
||||
@ -7,6 +7,7 @@ from traceback import format_exc
|
||||
from v2realbot.ml.ml import ModelML
|
||||
import numpy as np
|
||||
from collections import defaultdict
|
||||
from scipy.stats import linregress
|
||||
|
||||
#vstupem je bud indicator nebo bar parametr
|
||||
#na tomto vstupu dokaze provest zakladni statisticke funkce pro subpole X hodnot zpatky
|
||||
@ -61,6 +62,26 @@ def basestats(state, params):
|
||||
#val = 2 * (angle_deg / 180) - 1
|
||||
elif func =="stdev":
|
||||
val = np.std(source_array)
|
||||
#linregres slope
|
||||
elif func == "slope":
|
||||
if len(source_array) < 4:
|
||||
return -2, "less than 4 elmnts"
|
||||
try:
|
||||
np.seterr(all="raise")
|
||||
val, _, _, _, _ = linregress(np.arange(len(source_array)), source_array)
|
||||
val = round(val, 4)
|
||||
except FloatingPointError:
|
||||
return -2, "FloatingPointError"
|
||||
#zatim takto, dokud nebudou podporovany indikatory s vice vystupnimi
|
||||
elif func == "intercept":
|
||||
if len(source_array) < 4:
|
||||
return -2, "less than 4 elmnts"
|
||||
try:
|
||||
np.seterr(all="raise")
|
||||
_, val, _, _, _ = linregress(np.arange(len(source_array)), source_array)
|
||||
val = round(val, 4)
|
||||
except FloatingPointError:
|
||||
return -2, "FloatingPointError"
|
||||
else:
|
||||
return -2, "wrong function"
|
||||
|
||||
|
||||
@ -2,17 +2,17 @@ from v2realbot.utils.utils import isrising, isfalling,zoneNY, price2dec, print,
|
||||
from v2realbot.strategy.base import StrategyState
|
||||
import numpy as np
|
||||
|
||||
#allows executing a statement - pozor neni sanitized a zatim se spousti i v globalni scopu
|
||||
#allows executing a expression - pozor neni sanitized a zatim se spousti i v globalni scopu
|
||||
#v pripade jineho nez soukromeho uziti zabezpecit
|
||||
|
||||
#do budoucna prozkoumat NUMEXPR - ten omezuje jen na operatory a univerzalni funkce
|
||||
#eval nyni umi i user-defined function, string operation and control statements
|
||||
|
||||
#teroeticky se dá pouzit i SYMPY - kde se daji vytvorit jednotlive symboly s urcitou funkcni
|
||||
def statement(state: StrategyState, params):
|
||||
funcName = "statement"
|
||||
def expression(state: StrategyState, params):
|
||||
funcName = "expression"
|
||||
#indicator name
|
||||
operation = safe_get(params, "statement", None)
|
||||
operation = safe_get(params, "expression", None)
|
||||
|
||||
if operation is None :
|
||||
return -2, "required param missing"
|
||||
@ -20,7 +20,7 @@ def statement(state: StrategyState, params):
|
||||
state.ilog(lvl=1,e=f"BEFORE {funcName} {operation=}", **params)
|
||||
|
||||
#pro zacatek eval
|
||||
val = eval(operation, None, state.ind_mapping)
|
||||
val = eval(operation, {'state': state}, state.ind_mapping)
|
||||
|
||||
|
||||
if not np.isfinite(val):
|
||||
@ -10,7 +10,7 @@ from collections import defaultdict
|
||||
from v2realbot.strategyblocks.indicators.helpers import value_or_indicator
|
||||
|
||||
|
||||
#IMPLEMENTS different types of moving averages
|
||||
#IMPLEMENTS different types of moving averages in package v2realbot.indicators.moving_averages
|
||||
def ma(state, params):
|
||||
funcName = "ma"
|
||||
type = safe_get(params, "type", "ema")
|
||||
|
||||
Reference in New Issue
Block a user