opencode-pyneruntime 6.6.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- opencode_pyneruntime-6.6.4.dist-info/METADATA +281 -0
- opencode_pyneruntime-6.6.4.dist-info/RECORD +261 -0
- opencode_pyneruntime-6.6.4.dist-info/WHEEL +5 -0
- opencode_pyneruntime-6.6.4.dist-info/entry_points.txt +6 -0
- opencode_pyneruntime-6.6.4.dist-info/licenses/LICENSE +201 -0
- opencode_pyneruntime-6.6.4.dist-info/licenses/NOTICE +21 -0
- opencode_pyneruntime-6.6.4.dist-info/top_level.txt +1 -0
- pynecore/__init__.py +6 -0
- pynecore/cli/__init__.py +2 -0
- pynecore/cli/app.py +238 -0
- pynecore/cli/commands/__init__.py +343 -0
- pynecore/cli/commands/benchmark.py +186 -0
- pynecore/cli/commands/compile.py +198 -0
- pynecore/cli/commands/data.py +857 -0
- pynecore/cli/commands/debug.py +63 -0
- pynecore/cli/commands/optimize.py +956 -0
- pynecore/cli/commands/plugin.py +242 -0
- pynecore/cli/commands/run.py +2006 -0
- pynecore/cli/pluggable.py +132 -0
- pynecore/cli/utils/__init__.py +0 -0
- pynecore/cli/utils/api_error_handler.py +168 -0
- pynecore/cli/utils/broker_picker.py +330 -0
- pynecore/cli/utils/error_hook.py +28 -0
- pynecore/cli/utils/keyreader.py +178 -0
- pynecore/cli/utils/provider_picker.py +19 -0
- pynecore/cli/utils/symbol_browser.py +1149 -0
- pynecore/core/__init__.py +0 -0
- pynecore/core/aggregator.py +257 -0
- pynecore/core/bar_magnifier.py +168 -0
- pynecore/core/broker/__init__.py +64 -0
- pynecore/core/broker/defaults.py +113 -0
- pynecore/core/broker/disappearance.py +927 -0
- pynecore/core/broker/emulator.py +345 -0
- pynecore/core/broker/exceptions.py +346 -0
- pynecore/core/broker/idempotency.py +401 -0
- pynecore/core/broker/intent_builder.py +334 -0
- pynecore/core/broker/journal.py +1785 -0
- pynecore/core/broker/models.py +1600 -0
- pynecore/core/broker/native_failsafe_manager.py +1436 -0
- pynecore/core/broker/one_way_emulator.py +1128 -0
- pynecore/core/broker/position.py +787 -0
- pynecore/core/broker/run_identity.py +126 -0
- pynecore/core/broker/software_entry_stop_engine.py +351 -0
- pynecore/core/broker/software_partial_bracket_engine.py +1379 -0
- pynecore/core/broker/spot_inventory.py +1327 -0
- pynecore/core/broker/storage.py +2655 -0
- pynecore/core/broker/store_helpers.py +2161 -0
- pynecore/core/broker/sync_engine.py +16070 -0
- pynecore/core/broker/validation.py +382 -0
- pynecore/core/class_property.py +7 -0
- pynecore/core/config.py +392 -0
- pynecore/core/csv_file.py +547 -0
- pynecore/core/currency.py +262 -0
- pynecore/core/data_converter.py +1002 -0
- pynecore/core/datetime.py +296 -0
- pynecore/core/download_info.py +71 -0
- pynecore/core/download_runner.py +274 -0
- pynecore/core/htf_aggregator.py +181 -0
- pynecore/core/import_hook.py +358 -0
- pynecore/core/instance_state.py +494 -0
- pynecore/core/live_ltf_collector.py +442 -0
- pynecore/core/live_ltf_window.py +189 -0
- pynecore/core/live_runner.py +1347 -0
- pynecore/core/module_property.py +26 -0
- pynecore/core/ohlcv_file.py +1888 -0
- pynecore/core/overload.py +371 -0
- pynecore/core/pine_cast.py +113 -0
- pynecore/core/pine_export.py +95 -0
- pynecore/core/pine_method.py +244 -0
- pynecore/core/pine_range.py +86 -0
- pynecore/core/pine_udt.py +69 -0
- pynecore/core/plugin/__init__.py +394 -0
- pynecore/core/plugin/broker.py +781 -0
- pynecore/core/plugin/cli.py +96 -0
- pynecore/core/plugin/live_provider.py +208 -0
- pynecore/core/plugin/provider.py +331 -0
- pynecore/core/provider_string.py +148 -0
- pynecore/core/random.py +40 -0
- pynecore/core/resampler.py +686 -0
- pynecore/core/safe_convert.py +64 -0
- pynecore/core/script.py +1011 -0
- pynecore/core/script_runner.py +3202 -0
- pynecore/core/security.py +1749 -0
- pynecore/core/security_process.py +1253 -0
- pynecore/core/security_shm.py +456 -0
- pynecore/core/series.py +417 -0
- pynecore/core/strategy_stats.py +669 -0
- pynecore/core/symbol_map.py +134 -0
- pynecore/core/syminfo.py +505 -0
- pynecore/core/viz.py +591 -0
- pynecore/lib/__init__.py +1771 -0
- pynecore/lib/_fixnan.py +32 -0
- pynecore/lib/_math_stateful.py +202 -0
- pynecore/lib/_timeframe_change.py +101 -0
- pynecore/lib/adjustment.py +6 -0
- pynecore/lib/alert.py +39 -0
- pynecore/lib/alert.pyi +14 -0
- pynecore/lib/array.py +1051 -0
- pynecore/lib/barmerge.py +60 -0
- pynecore/lib/barstate.py +30 -0
- pynecore/lib/box.py +415 -0
- pynecore/lib/chart.py +128 -0
- pynecore/lib/color.py +152 -0
- pynecore/lib/color.pyi +50 -0
- pynecore/lib/currency.py +62 -0
- pynecore/lib/dayofweek.py +36 -0
- pynecore/lib/dayofweek.pyi +18 -0
- pynecore/lib/display.py +8 -0
- pynecore/lib/dividends.py +9 -0
- pynecore/lib/earnings.py +11 -0
- pynecore/lib/extend.py +6 -0
- pynecore/lib/font.py +5 -0
- pynecore/lib/footprint.py +79 -0
- pynecore/lib/format.py +11 -0
- pynecore/lib/hline.py +67 -0
- pynecore/lib/hline.pyi +24 -0
- pynecore/lib/label.py +409 -0
- pynecore/lib/line.py +433 -0
- pynecore/lib/linefill.py +93 -0
- pynecore/lib/location.py +11 -0
- pynecore/lib/log.py +362 -0
- pynecore/lib/map.py +150 -0
- pynecore/lib/math.py +385 -0
- pynecore/lib/matrix.py +708 -0
- pynecore/lib/order.py +8 -0
- pynecore/lib/pivotpointtype.py +8 -0
- pynecore/lib/plot.py +95 -0
- pynecore/lib/plot.pyi +33 -0
- pynecore/lib/polyline.py +91 -0
- pynecore/lib/position.py +15 -0
- pynecore/lib/request.py +281 -0
- pynecore/lib/runtime.py +5 -0
- pynecore/lib/scale.py +9 -0
- pynecore/lib/session.py +267 -0
- pynecore/lib/session.pyi +12 -0
- pynecore/lib/shape.py +18 -0
- pynecore/lib/size.py +12 -0
- pynecore/lib/splits.py +4 -0
- pynecore/lib/strategy/__init__.py +4778 -0
- pynecore/lib/strategy/closedtrades.py +347 -0
- pynecore/lib/strategy/closedtrades.pyi +53 -0
- pynecore/lib/strategy/commission.py +9 -0
- pynecore/lib/strategy/direction.py +9 -0
- pynecore/lib/strategy/oca.py +13 -0
- pynecore/lib/strategy/opentrades.py +281 -0
- pynecore/lib/strategy/opentrades.pyi +49 -0
- pynecore/lib/strategy/risk.py +109 -0
- pynecore/lib/string.py +649 -0
- pynecore/lib/syminfo.py +84 -0
- pynecore/lib/ta.py +2230 -0
- pynecore/lib/table.py +290 -0
- pynecore/lib/text.py +17 -0
- pynecore/lib/ticker.py +207 -0
- pynecore/lib/timeframe.py +293 -0
- pynecore/lib/volume_row.py +67 -0
- pynecore/lib/xloc.py +4 -0
- pynecore/lib/yloc.py +5 -0
- pynecore/providers/__init__.py +0 -0
- pynecore/providers/ccxt.py +664 -0
- pynecore/providers/replay.py +187 -0
- pynecore/pynesys/__init__.py +0 -0
- pynecore/pynesys/api.py +498 -0
- pynecore/pynesys/compiler.py +112 -0
- pynecore/standalone.py +99 -0
- pynecore/testing/__init__.py +1 -0
- pynecore/testing/broker_lab/__init__.py +41 -0
- pynecore/testing/broker_lab/__main__.py +5 -0
- pynecore/testing/broker_lab/cli.py +87 -0
- pynecore/testing/broker_lab/generate.py +47 -0
- pynecore/testing/broker_lab/model.py +84 -0
- pynecore/testing/broker_lab/reference.py +645 -0
- pynecore/testing/broker_lab/runner.py +372 -0
- pynecore/testing/broker_lab/scheduler.py +50 -0
- pynecore/testing/broker_lab/subprocess.py +73 -0
- pynecore/transformers/__init__.py +0 -0
- pynecore/transformers/builtin_shadow.py +136 -0
- pynecore/transformers/closure_arguments_transformer.py +428 -0
- pynecore/transformers/display_rewrite.py +140 -0
- pynecore/transformers/dynamic_default.py +147 -0
- pynecore/transformers/function_isolation.py +757 -0
- pynecore/transformers/import_lifter.py +61 -0
- pynecore/transformers/import_normalizer.py +328 -0
- pynecore/transformers/inline_series_hoist.py +178 -0
- pynecore/transformers/input_transformer.py +175 -0
- pynecore/transformers/lib_series.py +201 -0
- pynecore/transformers/locations.py +70 -0
- pynecore/transformers/module_properties.json +3387 -0
- pynecore/transformers/module_property.py +221 -0
- pynecore/transformers/ne_guard.py +70 -0
- pynecore/transformers/persistent.py +320 -0
- pynecore/transformers/persistent_series.py +76 -0
- pynecore/transformers/safe_convert_transformer.py +97 -0
- pynecore/transformers/safe_division_transformer.py +95 -0
- pynecore/transformers/script_requirements.py +308 -0
- pynecore/transformers/security.py +752 -0
- pynecore/transformers/security_instantiation.py +274 -0
- pynecore/transformers/series.py +275 -0
- pynecore/transformers/slot_layout.py +381 -0
- pynecore/transformers/type_checking_stripper.py +25 -0
- pynecore/transformers/unused_series_detector.py +267 -0
- pynecore/types/__init__.py +21 -0
- pynecore/types/alert.py +5 -0
- pynecore/types/barmerge.py +5 -0
- pynecore/types/base.py +39 -0
- pynecore/types/box.py +37 -0
- pynecore/types/chart.py +17 -0
- pynecore/types/color.py +107 -0
- pynecore/types/currency.py +5 -0
- pynecore/types/datetime.py +6 -0
- pynecore/types/display.py +5 -0
- pynecore/types/dividends.py +5 -0
- pynecore/types/earnings.py +5 -0
- pynecore/types/extend.py +5 -0
- pynecore/types/font.py +5 -0
- pynecore/types/footprint.py +41 -0
- pynecore/types/format.py +5 -0
- pynecore/types/hline.py +24 -0
- pynecore/types/ib_persistent.py +8 -0
- pynecore/types/ib_persistent.pyi +10 -0
- pynecore/types/label.py +35 -0
- pynecore/types/line.py +32 -0
- pynecore/types/linefill.py +13 -0
- pynecore/types/location.py +5 -0
- pynecore/types/matrix.py +999 -0
- pynecore/types/na.py +237 -0
- pynecore/types/na.pyi +83 -0
- pynecore/types/ohlcv.py +12 -0
- pynecore/types/order.py +5 -0
- pynecore/types/persistent.py +8 -0
- pynecore/types/persistent.pyi +13 -0
- pynecore/types/pine_types.py +11 -0
- pynecore/types/pine_types.pyi +15 -0
- pynecore/types/pivotpointtype.py +5 -0
- pynecore/types/plot.py +12 -0
- pynecore/types/plot_meta.py +60 -0
- pynecore/types/polyline.py +40 -0
- pynecore/types/position.py +5 -0
- pynecore/types/scale.py +5 -0
- pynecore/types/script_type.py +15 -0
- pynecore/types/series.py +23 -0
- pynecore/types/series.pyi +19 -0
- pynecore/types/session.py +35 -0
- pynecore/types/shape.py +5 -0
- pynecore/types/size.py +5 -0
- pynecore/types/source.py +33 -0
- pynecore/types/splits.py +5 -0
- pynecore/types/strategy.py +45 -0
- pynecore/types/table.py +87 -0
- pynecore/types/text.py +13 -0
- pynecore/types/type_checker.py +7 -0
- pynecore/types/type_checker.pyi +48 -0
- pynecore/types/volume_row.py +36 -0
- pynecore/types/weekdays.py +11 -0
- pynecore/types/xloc.py +5 -0
- pynecore/types/yloc.py +5 -0
- pynecore/utils/__init__.py +0 -0
- pynecore/utils/file_utils.py +50 -0
- pynecore/utils/rich/__init__.py +0 -0
- pynecore/utils/rich/date_column.py +25 -0
- pynecore/utils/sequence_view.py +92 -0
- pynecore/utils/stdlib_checker.py +17 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from .persistent import Persistent
|
|
2
|
+
from .ib_persistent import IBPersistent, IBPersistentSeries
|
|
3
|
+
from .series import Series, PersistentSeries
|
|
4
|
+
from .na import NA, na_float
|
|
5
|
+
from .pine_types import PyneFloat, PyneInt, PyneStr, PyneBool
|
|
6
|
+
|
|
7
|
+
from .box import Box
|
|
8
|
+
from .chart import ChartPoint
|
|
9
|
+
from .color import Color
|
|
10
|
+
from .footprint import Footprint
|
|
11
|
+
from .currency import Currency
|
|
12
|
+
from .datetime import DayOfWeek
|
|
13
|
+
from .hline import HLine
|
|
14
|
+
from .label import Label
|
|
15
|
+
from .line import Line
|
|
16
|
+
from .linefill import LineFill
|
|
17
|
+
from .polyline import Polyline
|
|
18
|
+
from .table import Table
|
|
19
|
+
from .volume_row import VolumeRow
|
|
20
|
+
from .extend import Extend
|
|
21
|
+
from .matrix import Matrix
|
pynecore/types/alert.py
ADDED
pynecore/types/base.py
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
class IntEnum(int):
|
|
2
|
+
"""
|
|
3
|
+
IntEnum class that auto-increments values.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
def __init_subclass__(cls, start: int = 0, **kwargs):
|
|
7
|
+
super().__init_subclass__(**kwargs)
|
|
8
|
+
cls._counter = start # Each subclass gets its own counter
|
|
9
|
+
|
|
10
|
+
def __new__(cls):
|
|
11
|
+
# Create new object with the current counter value
|
|
12
|
+
value = cls._counter
|
|
13
|
+
cls._counter += 1
|
|
14
|
+
# noinspection PyTypeChecker
|
|
15
|
+
return super().__new__(cls, value)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class StrLiteral(str):
|
|
19
|
+
"""
|
|
20
|
+
StrLiteral class to store string literals.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
# Monotonic id counter for drawing objects (line/label/box/table/polyline/linefill).
|
|
25
|
+
# Single-threaded runner, so a plain module-level integer needs no locking.
|
|
26
|
+
_vid_counter = 0
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def next_vid() -> int:
|
|
30
|
+
"""Return the next monotonically increasing drawing-object id."""
|
|
31
|
+
global _vid_counter
|
|
32
|
+
_vid_counter += 1
|
|
33
|
+
return _vid_counter
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def reset_vid_counter() -> None:
|
|
37
|
+
"""Reset the drawing-object id counter (new run / new script)."""
|
|
38
|
+
global _vid_counter
|
|
39
|
+
_vid_counter = 0
|
pynecore/types/box.py
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
|
|
4
|
+
from ..lib import (color as _color, extend as _extend, xloc as _xloc, size as _size, line as _line,
|
|
5
|
+
text as _text, font as _font)
|
|
6
|
+
from .na import NA
|
|
7
|
+
from .pine_types import PyneFloat, PyneInt
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass(slots=True, eq=False)
|
|
11
|
+
class Box:
|
|
12
|
+
# Required parameters - coordinates (``na`` when set from a chart.point that lacks the
|
|
13
|
+
# corresponding coordinate for the active xloc)
|
|
14
|
+
left: PyneInt # Bar index or UNIX time
|
|
15
|
+
top: PyneFloat # Price of the top border
|
|
16
|
+
right: PyneInt # Bar index or UNIX time
|
|
17
|
+
bottom: PyneFloat # Price of the bottom border
|
|
18
|
+
|
|
19
|
+
# Optional parameters with defaults
|
|
20
|
+
border_color: Optional[_color.Color] = None
|
|
21
|
+
border_width: int = 1
|
|
22
|
+
border_style: Optional[_line.LineEnum] = None
|
|
23
|
+
extend: Optional[_extend.Extend] = None
|
|
24
|
+
xloc: Optional[_xloc.XLoc] = None
|
|
25
|
+
bgcolor: Optional[_color.Color] = None
|
|
26
|
+
text: str = ""
|
|
27
|
+
text_size: Optional[_size.Size] = None
|
|
28
|
+
text_color: Optional[_color.Color] = None
|
|
29
|
+
text_halign: Optional[_text.AlignEnum] = None
|
|
30
|
+
text_valign: Optional[_text.AlignEnum] = None
|
|
31
|
+
text_wrap: Optional[_text.WrapEnum] = None
|
|
32
|
+
text_font_family: Optional[_font.FontFamilyEnum] = None
|
|
33
|
+
text_formatting: Optional[_text.FormatEnum] = None
|
|
34
|
+
|
|
35
|
+
force_overlay: bool = False
|
|
36
|
+
|
|
37
|
+
vid: int = -1
|
pynecore/types/chart.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
from .pine_types import PyneFloat, PyneInt
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@dataclass(slots=True)
|
|
7
|
+
class ChartPoint:
|
|
8
|
+
# The x-coordinate of the point, expressed as a bar index value (``na`` when the point
|
|
9
|
+
# was created from a time only, e.g. ``chart.point.from_time``)
|
|
10
|
+
index: PyneInt
|
|
11
|
+
|
|
12
|
+
# The x-coordinate of the point, expressed as a UNIX time value, in milliseconds (``na``
|
|
13
|
+
# when the point was created from an index only, e.g. ``chart.point.from_index``)
|
|
14
|
+
time: PyneInt
|
|
15
|
+
|
|
16
|
+
# The y-coordinate of the point
|
|
17
|
+
price: PyneFloat
|
pynecore/types/color.py
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
class Color:
|
|
2
|
+
"""
|
|
3
|
+
Color class that stores RGBA values in a single 32-bit integer.
|
|
4
|
+
The fmt is 0xRRGGBBAA where each component is 8 bits.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
__slots__ = ('value',)
|
|
8
|
+
|
|
9
|
+
def __init__(self, hexstr: str) -> None:
|
|
10
|
+
# Remove leading '#' if present
|
|
11
|
+
hexstr = hexstr.lstrip('#').upper()
|
|
12
|
+
|
|
13
|
+
# Add default alpha if not provided
|
|
14
|
+
if len(hexstr) == 6:
|
|
15
|
+
hexstr += 'FF'
|
|
16
|
+
|
|
17
|
+
# Convert hex string to int
|
|
18
|
+
self.value = int(hexstr, 16)
|
|
19
|
+
|
|
20
|
+
def __repr__(self) -> str:
|
|
21
|
+
return f'Color("#{self.value:08X}")'
|
|
22
|
+
|
|
23
|
+
def __lt__(self, other: 'Color') -> bool:
|
|
24
|
+
return self.value < other.value
|
|
25
|
+
|
|
26
|
+
def __eq__(self, other: 'Color') -> bool:
|
|
27
|
+
return self.value == other.value
|
|
28
|
+
|
|
29
|
+
def __hash__(self) -> int:
|
|
30
|
+
# Value-based, consistent with __eq__. Defining __eq__ otherwise sets
|
|
31
|
+
# __hash__ to None (unhashable), which makes a Color an illegal
|
|
32
|
+
# dataclass field default (``@udt`` uses dataclass) and forbids use as a
|
|
33
|
+
# dict key / set member -- both of which Pine colors legitimately need.
|
|
34
|
+
return hash(self.value)
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def r(self) -> int:
|
|
38
|
+
"""Red component (0-255)"""
|
|
39
|
+
return (self.value >> 24) & 0xFF
|
|
40
|
+
|
|
41
|
+
@property
|
|
42
|
+
def g(self) -> int:
|
|
43
|
+
"""Green component (0-255)"""
|
|
44
|
+
return (self.value >> 16) & 0xFF
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def b(self) -> int:
|
|
48
|
+
"""Blue component (0-255)"""
|
|
49
|
+
return (self.value >> 8) & 0xFF
|
|
50
|
+
|
|
51
|
+
@property
|
|
52
|
+
def a(self) -> int:
|
|
53
|
+
"""Alpha component (0-255)"""
|
|
54
|
+
return self.value & 0xFF
|
|
55
|
+
|
|
56
|
+
@a.setter
|
|
57
|
+
def a(self, alpha: int) -> None:
|
|
58
|
+
"""
|
|
59
|
+
Set alpha component (0-255)
|
|
60
|
+
0: fully transparent
|
|
61
|
+
255: fully opaque
|
|
62
|
+
|
|
63
|
+
:param alpha: Alpha value (0-255)
|
|
64
|
+
"""
|
|
65
|
+
if not (0 <= alpha <= 255):
|
|
66
|
+
raise ValueError("Alpha must be between 0 and 255")
|
|
67
|
+
self.value = (self.value & 0xFFFFFF00) | alpha
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def t(self) -> float:
|
|
71
|
+
"""
|
|
72
|
+
Transparency component (0-100)
|
|
73
|
+
0: not transparent (fully opaque)
|
|
74
|
+
100: invisible
|
|
75
|
+
"""
|
|
76
|
+
return 100 - (self.value & 0xFF) / 255.0 * 100
|
|
77
|
+
|
|
78
|
+
@t.setter
|
|
79
|
+
def t(self, transp: float) -> None:
|
|
80
|
+
"""
|
|
81
|
+
Set transparency component (0-100)
|
|
82
|
+
0: not transparent (fully opaque)
|
|
83
|
+
100: invisible
|
|
84
|
+
|
|
85
|
+
:param transp: Transparency percentage (0-100)
|
|
86
|
+
"""
|
|
87
|
+
if not (0 <= transp <= 100):
|
|
88
|
+
raise ValueError("Transparency must be between 0 and 100")
|
|
89
|
+
self.value = (self.value & 0xFFFFFF00) | int((1 - transp / 100.0) * 255)
|
|
90
|
+
|
|
91
|
+
@classmethod
|
|
92
|
+
def rgb(cls, r: int, g: int, b: int, transp: float = 0) -> 'Color':
|
|
93
|
+
"""
|
|
94
|
+
Create a Color object from RGB values and transparency.
|
|
95
|
+
|
|
96
|
+
:param r: Red component (0-255)
|
|
97
|
+
:param g: Green component (0-255)
|
|
98
|
+
:param b: Blue component (0-255)
|
|
99
|
+
:param transp: Transparency percentage (0-100, 0: not transparent, 100: invisible)
|
|
100
|
+
:return: Color object
|
|
101
|
+
"""
|
|
102
|
+
# Pine accepts float channels (e.g. from math.random) and rounds them to
|
|
103
|
+
# the nearest integer, so normalise before the range check / hex format.
|
|
104
|
+
r, g, b = int(round(r)), int(round(g)), int(round(b))
|
|
105
|
+
if not (0 <= r <= 255 and 0 <= g <= 255 and 0 <= b <= 255):
|
|
106
|
+
raise ValueError("RGB values must be between 0 and 255")
|
|
107
|
+
return cls(f'#{r:02X}{g:02X}{b:02X}{int((1 - transp / 100.0) * 255):02X}')
|
pynecore/types/extend.py
ADDED
pynecore/types/font.py
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
from .volume_row import VolumeRow
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@dataclass(slots=True)
|
|
7
|
+
class Footprint:
|
|
8
|
+
"""
|
|
9
|
+
Stores volume footprint data for a bar, including total buy/sell volume,
|
|
10
|
+
delta, and key price level rows (VAH, VAL, POC).
|
|
11
|
+
|
|
12
|
+
Obtained via ``request.footprint()``.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def buy_volume(self) -> float:
|
|
16
|
+
"""Total buy volume for the bar."""
|
|
17
|
+
raise NotImplementedError("Footprint.buy_volume() is not yet implemented in PyneCore")
|
|
18
|
+
|
|
19
|
+
def sell_volume(self) -> float:
|
|
20
|
+
"""Total sell volume for the bar."""
|
|
21
|
+
raise NotImplementedError("Footprint.sell_volume() is not yet implemented in PyneCore")
|
|
22
|
+
|
|
23
|
+
def delta(self) -> float:
|
|
24
|
+
"""Volume delta (buy - sell) for the bar."""
|
|
25
|
+
raise NotImplementedError("Footprint.delta() is not yet implemented in PyneCore")
|
|
26
|
+
|
|
27
|
+
def total_volume(self) -> float:
|
|
28
|
+
"""Total volume (buy + sell) for the bar."""
|
|
29
|
+
raise NotImplementedError("Footprint.total_volume() is not yet implemented in PyneCore")
|
|
30
|
+
|
|
31
|
+
def vah(self) -> VolumeRow:
|
|
32
|
+
"""Value Area High row."""
|
|
33
|
+
raise NotImplementedError("Footprint.vah() is not yet implemented in PyneCore")
|
|
34
|
+
|
|
35
|
+
def val(self) -> VolumeRow:
|
|
36
|
+
"""Value Area Low row."""
|
|
37
|
+
raise NotImplementedError("Footprint.val() is not yet implemented in PyneCore")
|
|
38
|
+
|
|
39
|
+
def poc(self) -> VolumeRow:
|
|
40
|
+
"""Point of Control row."""
|
|
41
|
+
raise NotImplementedError("Footprint.poc() is not yet implemented in PyneCore")
|
pynecore/types/format.py
ADDED
pynecore/types/hline.py
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Optional, Union
|
|
3
|
+
|
|
4
|
+
from .base import StrLiteral
|
|
5
|
+
from ..lib import color as _color, display as _display
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class HLineEnum(StrLiteral):
|
|
9
|
+
...
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass(slots=True)
|
|
13
|
+
class HLine:
|
|
14
|
+
# Required parameter
|
|
15
|
+
price: Union[int, float] # Price value at which the object will be rendered
|
|
16
|
+
|
|
17
|
+
# Optional parameters
|
|
18
|
+
title: Optional[str] = None # Title of the object
|
|
19
|
+
color: Optional[_color.Color] = None # Color of the rendered line
|
|
20
|
+
linestyle: Optional[HLineEnum] = None # Style of the rendered line
|
|
21
|
+
linewidth: int = 1 # Width of the rendered line
|
|
22
|
+
editable: bool = True # If true then hline style will be editable in Format dialog
|
|
23
|
+
display: Optional[_display.Display] = None # Controls where the hline is displayed
|
|
24
|
+
id: Optional[str] = None # Registration id assigned by ``hline()``
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Transparent aliases for type checkers, same rationale as persistent.pyi:
|
|
3
|
+
NA-free static view, runtime module unchanged.
|
|
4
|
+
"""
|
|
5
|
+
from typing import TypeVar, TypeAlias
|
|
6
|
+
|
|
7
|
+
T = TypeVar('T')
|
|
8
|
+
|
|
9
|
+
IBPersistent: TypeAlias = T
|
|
10
|
+
IBPersistentSeries: TypeAlias = T
|
pynecore/types/label.py
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from ..lib import color as _color, xloc as _xloc, yloc as _yloc, size as _size, text as _text, font as _font
|
|
5
|
+
from .base import StrLiteral
|
|
6
|
+
from .na import NA
|
|
7
|
+
from .pine_types import PyneFloat, PyneInt
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class LabelStyleEnum(StrLiteral):
|
|
11
|
+
...
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass(slots=True, eq=False)
|
|
15
|
+
class Label:
|
|
16
|
+
# Required parameters (``na`` when set from a chart.point that lacks the corresponding
|
|
17
|
+
# coordinate for the active xloc)
|
|
18
|
+
x: PyneInt # Bar index or UNIX time
|
|
19
|
+
y: PyneInt | PyneFloat # Price of the label position
|
|
20
|
+
text: str = "" # Label text
|
|
21
|
+
|
|
22
|
+
# Optional parameters with defaults
|
|
23
|
+
xloc: Optional[_xloc.XLoc] = None
|
|
24
|
+
yloc: Optional[_yloc.YLoc] = None
|
|
25
|
+
color: Optional[_color.Color] = None
|
|
26
|
+
style: Optional[LabelStyleEnum] = None
|
|
27
|
+
textcolor: Optional[_color.Color] = None
|
|
28
|
+
size: Optional[_size.Size] = None
|
|
29
|
+
textalign: Optional[_text.AlignEnum] = None
|
|
30
|
+
tooltip: str = ""
|
|
31
|
+
text_font_family: Optional[_font.FontFamilyEnum] = None
|
|
32
|
+
force_overlay: bool = False
|
|
33
|
+
text_formatting: Optional[_text.FormatEnum] = None
|
|
34
|
+
|
|
35
|
+
vid: int = -1
|
pynecore/types/line.py
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from ..lib import color as _color, extend as _extend, xloc as _xloc
|
|
5
|
+
from .base import StrLiteral
|
|
6
|
+
from .na import NA
|
|
7
|
+
from .pine_types import PyneFloat, PyneInt
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class LineEnum(StrLiteral):
|
|
11
|
+
...
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass(slots=True, eq=False)
|
|
15
|
+
class Line:
|
|
16
|
+
# Required parameters - coordinates (``na`` when set from a chart.point that lacks the
|
|
17
|
+
# corresponding coordinate for the active xloc)
|
|
18
|
+
x1: PyneInt # Bar index or UNIX time
|
|
19
|
+
y1: PyneFloat # Price of the first point
|
|
20
|
+
x2: PyneInt # Bar index or UNIX time
|
|
21
|
+
y2: PyneFloat # Price of the second point
|
|
22
|
+
|
|
23
|
+
# Optional parameters with defaults
|
|
24
|
+
xloc: Optional[_xloc.XLoc] = None
|
|
25
|
+
extend: Optional[_extend.Extend] = None
|
|
26
|
+
color: Optional[_color.Color] = None
|
|
27
|
+
style: Optional[LineEnum] = None
|
|
28
|
+
width: int = 1
|
|
29
|
+
|
|
30
|
+
force_overlay: bool = False
|
|
31
|
+
|
|
32
|
+
vid: int = -1
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
from ..lib import color as _color
|
|
4
|
+
from .line import Line
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@dataclass(slots=True, eq=False)
|
|
8
|
+
class LineFill:
|
|
9
|
+
line1: Line # First line object
|
|
10
|
+
line2: Line # Second line object
|
|
11
|
+
color: _color.Color # Fill color
|
|
12
|
+
|
|
13
|
+
vid: int = -1
|