@qtsurfer/api-client 0.22.0 → 0.23.1
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.
- package/dist/index.d.ts +44 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/generated/schemas.gen.ts +41 -2
- package/src/generated/sdk.gen.ts +16 -1
- package/src/generated/types.gen.ts +28 -5
package/dist/index.d.ts
CHANGED
|
@@ -649,6 +649,9 @@ type SweepProgress = {
|
|
|
649
649
|
*/
|
|
650
650
|
aborted: number;
|
|
651
651
|
shardCount: number;
|
|
652
|
+
/**
|
|
653
|
+
* Shards (or folds) that have not finished yet. On a cancelled sweep, `0` is what says every run that was in flight has finished and the leaderboard is complete: `CANCELLED` is reported before that.
|
|
654
|
+
*/
|
|
652
655
|
pendingShards: number;
|
|
653
656
|
/**
|
|
654
657
|
* Shards (or folds) that failed and will not be retried. Distinct from `aborted`: this counts whole units that never reported, not runs that ran badly.
|
|
@@ -1735,12 +1738,31 @@ type LiveSource = {
|
|
|
1735
1738
|
*/
|
|
1736
1739
|
type: "ticker" | "kline";
|
|
1737
1740
|
/**
|
|
1738
|
-
*
|
|
1741
|
+
* The instruments the run reads. For a run started with a list, that list as sent; for one started without `instruments`, or with `["*"]`, what the start resolved: the list of pairs the compilation of the strategy records as the instruments it accepts, when it records one, or `["*"]` for every instrument the exchange/segment offers (tier-gated). An entry is written `BASE/QUOTE` and either side can be `*` to mean any, such as any base paired with USDT. Symbols are not case-sensitive and spaces around them are ignored, so `btc/usdt` and `BTC/USDT` are the same instrument.
|
|
1739
1742
|
*/
|
|
1740
1743
|
instruments: Array<string>;
|
|
1741
1744
|
};
|
|
1745
|
+
/**
|
|
1746
|
+
* One market feed to start a live run on. Exactly one entry per run today. It is `LiveSource` as you ask for it: the only difference is that `instruments` can be left out.
|
|
1747
|
+
*/
|
|
1748
|
+
type LiveSourceRequest = {
|
|
1749
|
+
/**
|
|
1750
|
+
* Venue category. `cx` (centralized exchange) is the only one live runs support today.
|
|
1751
|
+
*/
|
|
1752
|
+
venueType: string;
|
|
1753
|
+
exchange: string;
|
|
1754
|
+
segment: string;
|
|
1755
|
+
/**
|
|
1756
|
+
* Both `ticker` and `kline` connect to the lightest (fastest) cadence available for the exchange — today, 1 tick/second on every supported exchange. Choosing a specific cadence is not offered yet.
|
|
1757
|
+
*/
|
|
1758
|
+
type: "ticker" | "kline";
|
|
1759
|
+
/**
|
|
1760
|
+
* Which instruments the run reads. A QTScript strategy can declare which instruments it accepts with an `instruments` line in its source. When the compilation of the strategy records that selection as a list of pairs, leaving `instruments` out, or sending `["*"]`, takes that list; otherwise the run reads every instrument the exchange/segment offers. A list of instruments is taken as sent, and `[]` and `null` are refused with `400`. An entry is written `BASE/QUOTE`; either side can be `*` to mean any: any base can be paired with USDT, and BTC can be paired with any quote. Entries are not case-sensitive and spaces around them are ignored, so `btc/usdt` and `BTC/USDT` are the same instrument. An entry that is not of that form (no `/`, an empty side, a `.` or a space inside a side, or a `*` mixed with other characters of a side) makes the run fail when it starts. Plan limits: a list with an entry that has a `*` on a side counts like `["*"]` and only plans that include the wildcard accept it; the other entries are counted one by one. The instruments the run actually reads come back in the run's `sources`.
|
|
1761
|
+
*/
|
|
1762
|
+
instruments?: Array<string>;
|
|
1763
|
+
};
|
|
1742
1764
|
type StartLiveRequest = {
|
|
1743
|
-
sources: [
|
|
1765
|
+
sources: [LiveSourceRequest];
|
|
1744
1766
|
/**
|
|
1745
1767
|
* Strategy parameters to start with. Opaque key/value pairs — see this strategy's own `declaredProperties` (from `POST /strategy`) for the keys it accepts.
|
|
1746
1768
|
*/
|
|
@@ -3532,7 +3554,7 @@ type StartLiveData = {
|
|
|
3532
3554
|
};
|
|
3533
3555
|
type StartLiveErrors = {
|
|
3534
3556
|
/**
|
|
3535
|
-
* Malformed `sources` (not exactly one entry, missing field, unsupported `type`), a `type` the strategy cannot consume (a ticker strategy with a `kline` source, or the reverse; the message names both), an invalid `visibility`, an invalid `paper` block (an unknown field, a wrong type or an out-of-range value), or no `paper` block for a strategy that listens to its own execution events. A `relay` or `stream` that is not `true` or `false`, or a `stream` where streams are not available yet. A `warmFrom` that is not an integer from 0 to 3600.
|
|
3557
|
+
* Malformed `sources` (not exactly one entry, missing field, unsupported `type`), a `type` the strategy cannot consume (a ticker strategy with a `kline` source, or the reverse; the message names both), an invalid `visibility`, an invalid `paper` block (an unknown field, a wrong type or an out-of-range value), or no `paper` block for a strategy that listens to its own execution events. A `relay` or `stream` that is not `true` or `false`, or a `stream` where streams are not available yet. A `warmFrom` that is not an integer from 0 to 3600. An `instruments` that is empty or `null`.
|
|
3536
3558
|
*/
|
|
3537
3559
|
400: ResponseError;
|
|
3538
3560
|
/**
|
|
@@ -3817,8 +3839,8 @@ type GetLiveRunSignalsData = {
|
|
|
3817
3839
|
sinceMs?: number;
|
|
3818
3840
|
/**
|
|
3819
3841
|
* Narrow to one or more instruments. Omitted, or `*`, returns every instrument the run
|
|
3820
|
-
* covers. Accepts a single pair (`BTC/USDT`), either half as a wildcard (
|
|
3821
|
-
*
|
|
3842
|
+
* covers. Accepts a single pair (`BTC/USDT`), either half as a wildcard (any base paired
|
|
3843
|
+
* with that quote, or BTC paired with any quote), or a comma-separated
|
|
3822
3844
|
* list of pairs (`BTC/USDT,ETH/EUR`). Symbols are matched exactly, case included — pass
|
|
3823
3845
|
* them as this API reports them.
|
|
3824
3846
|
*
|
|
@@ -4075,7 +4097,7 @@ declare const listStrategies: <ThrowOnError extends boolean = false>(options?: O
|
|
|
4075
4097
|
*
|
|
4076
4098
|
* The source is either **Java** — a class extending a strategy base class — or **QTScript**
|
|
4077
4099
|
* (beta), a compact strategy language whose braced bodies are plain Java. QTScript source
|
|
4078
|
-
* begins with the `strategy` keyword — whitespace and
|
|
4100
|
+
* begins with the `strategy` keyword — whitespace and line or block comments before it
|
|
4079
4101
|
* are ignored — and that is how the two are told apart: there is no separate endpoint and
|
|
4080
4102
|
* no header to set. Once registered, a strategy is used the same way
|
|
4081
4103
|
* whichever language it was written in.
|
|
@@ -4233,6 +4255,15 @@ declare const executeSweep: <ThrowOnError extends boolean = false>(options: Opti
|
|
|
4233
4255
|
/**
|
|
4234
4256
|
* Cancel a running parameter sweep
|
|
4235
4257
|
* Requests cancellation between parameter vectors. Completed rows remain readable.
|
|
4258
|
+
*
|
|
4259
|
+
* Cancelling is a request, not a stop: the sweep reports `status: CANCELLED` (and
|
|
4260
|
+
* `state.status: Aborted`) as soon as the request is accepted, while runs that were already
|
|
4261
|
+
* in flight are still finishing. Until they have, `progress.pendingShards` is above `0`, and
|
|
4262
|
+
* `progress.done` and the leaderboard can still grow after `CANCELLED` is first seen. A client
|
|
4263
|
+
* that needs the final set of rows, to store them or to mark the rest as not run, keeps
|
|
4264
|
+
* reading until `progress.pendingShards` is `0`; the wait is bounded by how long one run
|
|
4265
|
+
* takes.
|
|
4266
|
+
*
|
|
4236
4267
|
*/
|
|
4237
4268
|
declare const cancelSweep: <ThrowOnError extends boolean = false>(options: Options<CancelSweepData, ThrowOnError>) => _hey_api_client_fetch.RequestResult<{
|
|
4238
4269
|
status: "cancelling";
|
|
@@ -4557,6 +4588,12 @@ declare const getLive: <ThrowOnError extends boolean = false>(options: Options<G
|
|
|
4557
4588
|
* (fastest) cadence available for the exchange — today that is 1 tick/second on every
|
|
4558
4589
|
* supported exchange; choosing among several cadences is not offered yet.
|
|
4559
4590
|
*
|
|
4591
|
+
* `instruments` can be left out. A QTScript strategy can declare which instruments it accepts with an `instruments`
|
|
4592
|
+
* line in its source; when the compilation of the strategy records that selection as a list of pairs, a
|
|
4593
|
+
* start that leaves `instruments` out, or sends `["*"]`, takes that list, and otherwise the run reads every
|
|
4594
|
+
* instrument the exchange/segment offers. A list you send is taken as sent. Either side of an entry can be `*`
|
|
4595
|
+
* (any base paired with USDT). The instruments the run reads come back in `sources`. See the "Live execution" guide, "Sources".
|
|
4596
|
+
*
|
|
4560
4597
|
* `params` is passed straight through to the strategy at start — the same free-form object
|
|
4561
4598
|
* `POST /strategy/{strategyId}/validate` and the backtest endpoints already accept. To change
|
|
4562
4599
|
* a parameter **while the run is live**, use `PUT /live/{runId}/params` instead; this endpoint
|
|
@@ -4764,4 +4801,4 @@ declare const mintLiveConnectionToken: <ThrowOnError extends boolean = false>(op
|
|
|
4764
4801
|
|
|
4765
4802
|
declare const client: _hey_api_client_fetch.Client;
|
|
4766
4803
|
|
|
4767
|
-
export { type AcceptedJob, type Account, type AccountLinks, type AccountUsage, type AccountUsageLinks, type AuthTokenError, type AuthTokenResponse, type AuthenticateData, type AuthenticateError, type AuthenticateErrors, type AuthenticateResponse, type AuthenticateResponses, type BacktestJobResult, type CancelBacktestData, type CancelBacktestError, type CancelBacktestErrors, type CancelBacktestResponse, type CancelBacktestResponses, type CancelSweepData, type CancelSweepError, type CancelSweepErrors, type CancelSweepResponse, type CancelSweepResponses, type ClientOptions, type CompileStrategyData, type CompileStrategyError, type CompileStrategyErrors, type CompileStrategyResponse, type CompileStrategyResponses, type CoverageWindow, type CreateDatasetData, type CreateDatasetError, type CreateDatasetErrors, type CreateDatasetResponse, type CreateDatasetResponses, type DataSourceType, type Dataset, type DatasetCreated, type DatasetImportCreated, type DatasetImportDexRequest, type DatasetImportRequest, type DatasetImportState, type DatasetUploadSession, type DatasetUploadState, type DatasetUploadTarget, type DatasetVersion, type DatasetWithLinks, type DeclaredProperty, type DeleteDatasetData, type DeleteDatasetError, type DeleteDatasetErrors, type DeleteDatasetResponse, type DeleteDatasetResponses, type DeleteStrategyData, type DeleteStrategyError, type DeleteStrategyErrors, type DeleteStrategyResponse, type DeleteStrategyResponses, type DownloadKlinesData, type DownloadKlinesError, type DownloadKlinesErrors, type DownloadKlinesResponse, type DownloadKlinesResponses, type DownloadTickersData, type DownloadTickersError, type DownloadTickersErrors, type DownloadTickersResponse, type DownloadTickersResponses, type EquityCurveMeta, type EquityCurveOptions, type EquityCurveOutMode, type EquityCurveRequest, type EquityCurveResult, type EquityPoint, type Exchange, type ExecuteBacktestData, type ExecuteBacktestError, type ExecuteBacktestErrors, type ExecuteBacktestResponse, type ExecuteBacktestResponses, type ExecuteSweepAccepted, type ExecuteSweepData, type ExecuteSweepError, type ExecuteSweepErrors, type ExecuteSweepRequest, type ExecuteSweepResponse, type ExecuteSweepResponses, type ExecuteSweepResult, type FinalizeDatasetUploadData, type FinalizeDatasetUploadError, type FinalizeDatasetUploadErrors, type FinalizeDatasetUploadResponse, type FinalizeDatasetUploadResponses, type GetAccountData, type GetAccountResponse, type GetAccountResponses, type GetAccountUsageData, type GetAccountUsageResponse, type GetAccountUsageResponses, type GetBacktestResultData, type GetBacktestResultError, type GetBacktestResultErrors, type GetBacktestResultResponse, type GetBacktestResultResponses, type GetDatasetData, type GetDatasetError, type GetDatasetErrors, type GetDatasetImportData, type GetDatasetImportError, type GetDatasetImportErrors, type GetDatasetImportResponse, type GetDatasetImportResponses, type GetDatasetResponse, type GetDatasetResponses, type GetDatasetUploadData, type GetDatasetUploadError, type GetDatasetUploadErrors, type GetDatasetUploadResponse, type GetDatasetUploadResponses, type GetLiveData, type GetLiveError, type GetLiveErrors, type GetLiveResponse, type GetLiveResponses, type GetLiveRunData, type GetLiveRunError, type GetLiveRunErrors, type GetLiveRunPaperData, type GetLiveRunPaperEquityData, type GetLiveRunPaperEquityError, type GetLiveRunPaperEquityErrors, type GetLiveRunPaperEquityResponse, type GetLiveRunPaperEquityResponses, type GetLiveRunPaperError, type GetLiveRunPaperErrors, type GetLiveRunPaperResponse, type GetLiveRunPaperResponses, type GetLiveRunResponse, type GetLiveRunResponses, type GetLiveRunSignalsData, type GetLiveRunSignalsError, type GetLiveRunSignalsErrors, type GetLiveRunSignalsResponse, type GetLiveRunSignalsResponses, type GetPrepareStatusData, type GetPrepareStatusError, type GetPrepareStatusErrors, type GetPrepareStatusResponse, type GetPrepareStatusResponses, type GetStrategyCodeData, type GetStrategyCodeError, type GetStrategyCodeErrors, type GetStrategyCodeResponse, type GetStrategyCodeResponses, type GetStrategyData, type GetStrategyError, type GetStrategyErrors, type GetStrategyResponse, type GetStrategyResponses, type GetSweepResultData, type GetSweepResultError, type GetSweepResultErrors, type GetSweepResultResponse, type GetSweepResultResponses, type GetSweepRunEquityCurveData, type GetSweepRunEquityCurveError, type GetSweepRunEquityCurveErrors, type GetSweepRunEquityCurveResponse, type GetSweepRunEquityCurveResponses, type GetSweepSensitivityData, type GetSweepSensitivityError, type GetSweepSensitivityErrors, type GetSweepSensitivityResponse, type GetSweepSensitivityResponses, type HalLink, type ImportDatasetData, type ImportDatasetError, type ImportDatasetErrors, type ImportDatasetResponse, type ImportDatasetResponses, type Instrument, type InstrumentCoverage, type InstrumentDetail, type InstrumentLinks, type InstrumentListMeta, type InstrumentListResponse, type JobState, type ListDatasetsData, type ListDatasetsResponse, type ListDatasetsResponses, type ListExchangesData, type ListExchangesResponse, type ListExchangesResponses, type ListInstrumentsData, type ListInstrumentsError, type ListInstrumentsErrors, type ListInstrumentsResponse, type ListInstrumentsResponses, type ListLiveData, type ListLiveError, type ListLiveErrors, type ListLiveResponse, type ListLiveResponses, type ListPublicLiveData, type ListPublicLiveError, type ListPublicLiveErrors, type ListPublicLiveResponse, type ListPublicLiveResponses, type ListSegmentInstrumentsData, type ListSegmentInstrumentsError, type ListSegmentInstrumentsErrors, type ListSegmentInstrumentsResponse, type ListSegmentInstrumentsResponses, type ListStrategiesData, type ListStrategiesResponse, type ListStrategiesResponses, type LiveCommandResult, type LiveConnectionToken, type LiveListResponse, type LivePaper, type LivePaperAccount, type LivePaperConfig, type LivePaperEquityPage, type LivePaperEquityPoint, type LivePaperKpi, type LivePaperPosition, type LiveParamsUpdateResult, type LiveRun, type LiveRunCompact, type LiveRunDetail, type LiveRunStats, type LiveRunSummary, type LiveRunWithStream, type LiveSignal, type LiveSignalInstrument, type LiveSignalOrder, type LiveSignalPage, type LiveSource, type LiveStreamRevoked, type LiveStreamUrl, type MintLiveConnectionTokenData, type MintLiveConnectionTokenResponse, type MintLiveConnectionTokenResponses, type Notice, type OpenDatasetUploadData, type OpenDatasetUploadError, type OpenDatasetUploadErrors, type OpenDatasetUploadResponse, type OpenDatasetUploadResponses, type Options, type PrepareBacktestData, type PrepareBacktestError, type PrepareBacktestErrors, type PrepareBacktestResponse, type PrepareBacktestResponses, type PrepareJobState, type PrepareRequest, type PublicLiveListLinks, type PublicLiveListResponse, type PublicLiveNextLink, type PublicLiveRun, type ResponseError, type ResultMap, type RevokeLiveStreamData, type RevokeLiveStreamError, type RevokeLiveStreamErrors, type RevokeLiveStreamResponse, type RevokeLiveStreamResponses, type RotateLiveStreamData, type RotateLiveStreamError, type RotateLiveStreamErrors, type RotateLiveStreamResponse, type RotateLiveStreamResponses, type ScalarStrategyParamValue, type SendLiveCommandData, type SendLiveCommandError, type SendLiveCommandErrors, type SendLiveCommandRequest, type SendLiveCommandResponse, type SendLiveCommandResponses, type StartLiveData, type StartLiveError, type StartLiveErrors, type StartLiveRequest, type StartLiveResponse, type StartLiveResponses, type StopLiveData, type StopLiveError, type StopLiveErrors, type StopLiveResponse, type StopLiveResponses, type StrategyId, type StrategyLinks, type StrategyState, type StrategySummary, type SweepAxis, type SweepBaseConfig, type SweepHeatmap, type SweepHeatmapCell, type SweepMarginal, type SweepMarginalPoint, type SweepProgress, type SweepRunRow, type SweepSensitivity, type SweepSpecRequest, type UpdateLiveData, type UpdateLiveError, type UpdateLiveErrors, type UpdateLiveParamsData, type UpdateLiveParamsError, type UpdateLiveParamsErrors, type UpdateLiveParamsRequest, type UpdateLiveParamsResponse, type UpdateLiveParamsResponses, type UpdateLiveRequest, type UpdateLiveResponse, type UpdateLiveResponses, type ValidateStrategyData, type ValidateStrategyError, type ValidateStrategyErrors, type ValidateStrategyResponse, type ValidateStrategyResponses, type WalkForwardAccepted, type WalkForwardFold, type WalkForwardRequest, type WalkForwardResult, type WarmFrom, authenticate, cancelBacktest, cancelSweep, client, compileStrategy, createDataset, deleteDataset, deleteStrategy, downloadKlines, downloadTickers, executeBacktest, executeSweep, finalizeDatasetUpload, getAccount, getAccountUsage, getBacktestResult, getDataset, getDatasetImport, getDatasetUpload, getLive, getLiveRun, getLiveRunPaper, getLiveRunPaperEquity, getLiveRunSignals, getPrepareStatus, getStrategy, getStrategyCode, getSweepResult, getSweepRunEquityCurve, getSweepSensitivity, importDataset, listDatasets, listExchanges, listInstruments, listLive, listPublicLive, listSegmentInstruments, listStrategies, mintLiveConnectionToken, openDatasetUpload, prepareBacktest, revokeLiveStream, rotateLiveStream, sendLiveCommand, startLive, stopLive, updateLive, updateLiveParams, validateStrategy };
|
|
4804
|
+
export { type AcceptedJob, type Account, type AccountLinks, type AccountUsage, type AccountUsageLinks, type AuthTokenError, type AuthTokenResponse, type AuthenticateData, type AuthenticateError, type AuthenticateErrors, type AuthenticateResponse, type AuthenticateResponses, type BacktestJobResult, type CancelBacktestData, type CancelBacktestError, type CancelBacktestErrors, type CancelBacktestResponse, type CancelBacktestResponses, type CancelSweepData, type CancelSweepError, type CancelSweepErrors, type CancelSweepResponse, type CancelSweepResponses, type ClientOptions, type CompileStrategyData, type CompileStrategyError, type CompileStrategyErrors, type CompileStrategyResponse, type CompileStrategyResponses, type CoverageWindow, type CreateDatasetData, type CreateDatasetError, type CreateDatasetErrors, type CreateDatasetResponse, type CreateDatasetResponses, type DataSourceType, type Dataset, type DatasetCreated, type DatasetImportCreated, type DatasetImportDexRequest, type DatasetImportRequest, type DatasetImportState, type DatasetUploadSession, type DatasetUploadState, type DatasetUploadTarget, type DatasetVersion, type DatasetWithLinks, type DeclaredProperty, type DeleteDatasetData, type DeleteDatasetError, type DeleteDatasetErrors, type DeleteDatasetResponse, type DeleteDatasetResponses, type DeleteStrategyData, type DeleteStrategyError, type DeleteStrategyErrors, type DeleteStrategyResponse, type DeleteStrategyResponses, type DownloadKlinesData, type DownloadKlinesError, type DownloadKlinesErrors, type DownloadKlinesResponse, type DownloadKlinesResponses, type DownloadTickersData, type DownloadTickersError, type DownloadTickersErrors, type DownloadTickersResponse, type DownloadTickersResponses, type EquityCurveMeta, type EquityCurveOptions, type EquityCurveOutMode, type EquityCurveRequest, type EquityCurveResult, type EquityPoint, type Exchange, type ExecuteBacktestData, type ExecuteBacktestError, type ExecuteBacktestErrors, type ExecuteBacktestResponse, type ExecuteBacktestResponses, type ExecuteSweepAccepted, type ExecuteSweepData, type ExecuteSweepError, type ExecuteSweepErrors, type ExecuteSweepRequest, type ExecuteSweepResponse, type ExecuteSweepResponses, type ExecuteSweepResult, type FinalizeDatasetUploadData, type FinalizeDatasetUploadError, type FinalizeDatasetUploadErrors, type FinalizeDatasetUploadResponse, type FinalizeDatasetUploadResponses, type GetAccountData, type GetAccountResponse, type GetAccountResponses, type GetAccountUsageData, type GetAccountUsageResponse, type GetAccountUsageResponses, type GetBacktestResultData, type GetBacktestResultError, type GetBacktestResultErrors, type GetBacktestResultResponse, type GetBacktestResultResponses, type GetDatasetData, type GetDatasetError, type GetDatasetErrors, type GetDatasetImportData, type GetDatasetImportError, type GetDatasetImportErrors, type GetDatasetImportResponse, type GetDatasetImportResponses, type GetDatasetResponse, type GetDatasetResponses, type GetDatasetUploadData, type GetDatasetUploadError, type GetDatasetUploadErrors, type GetDatasetUploadResponse, type GetDatasetUploadResponses, type GetLiveData, type GetLiveError, type GetLiveErrors, type GetLiveResponse, type GetLiveResponses, type GetLiveRunData, type GetLiveRunError, type GetLiveRunErrors, type GetLiveRunPaperData, type GetLiveRunPaperEquityData, type GetLiveRunPaperEquityError, type GetLiveRunPaperEquityErrors, type GetLiveRunPaperEquityResponse, type GetLiveRunPaperEquityResponses, type GetLiveRunPaperError, type GetLiveRunPaperErrors, type GetLiveRunPaperResponse, type GetLiveRunPaperResponses, type GetLiveRunResponse, type GetLiveRunResponses, type GetLiveRunSignalsData, type GetLiveRunSignalsError, type GetLiveRunSignalsErrors, type GetLiveRunSignalsResponse, type GetLiveRunSignalsResponses, type GetPrepareStatusData, type GetPrepareStatusError, type GetPrepareStatusErrors, type GetPrepareStatusResponse, type GetPrepareStatusResponses, type GetStrategyCodeData, type GetStrategyCodeError, type GetStrategyCodeErrors, type GetStrategyCodeResponse, type GetStrategyCodeResponses, type GetStrategyData, type GetStrategyError, type GetStrategyErrors, type GetStrategyResponse, type GetStrategyResponses, type GetSweepResultData, type GetSweepResultError, type GetSweepResultErrors, type GetSweepResultResponse, type GetSweepResultResponses, type GetSweepRunEquityCurveData, type GetSweepRunEquityCurveError, type GetSweepRunEquityCurveErrors, type GetSweepRunEquityCurveResponse, type GetSweepRunEquityCurveResponses, type GetSweepSensitivityData, type GetSweepSensitivityError, type GetSweepSensitivityErrors, type GetSweepSensitivityResponse, type GetSweepSensitivityResponses, type HalLink, type ImportDatasetData, type ImportDatasetError, type ImportDatasetErrors, type ImportDatasetResponse, type ImportDatasetResponses, type Instrument, type InstrumentCoverage, type InstrumentDetail, type InstrumentLinks, type InstrumentListMeta, type InstrumentListResponse, type JobState, type ListDatasetsData, type ListDatasetsResponse, type ListDatasetsResponses, type ListExchangesData, type ListExchangesResponse, type ListExchangesResponses, type ListInstrumentsData, type ListInstrumentsError, type ListInstrumentsErrors, type ListInstrumentsResponse, type ListInstrumentsResponses, type ListLiveData, type ListLiveError, type ListLiveErrors, type ListLiveResponse, type ListLiveResponses, type ListPublicLiveData, type ListPublicLiveError, type ListPublicLiveErrors, type ListPublicLiveResponse, type ListPublicLiveResponses, type ListSegmentInstrumentsData, type ListSegmentInstrumentsError, type ListSegmentInstrumentsErrors, type ListSegmentInstrumentsResponse, type ListSegmentInstrumentsResponses, type ListStrategiesData, type ListStrategiesResponse, type ListStrategiesResponses, type LiveCommandResult, type LiveConnectionToken, type LiveListResponse, type LivePaper, type LivePaperAccount, type LivePaperConfig, type LivePaperEquityPage, type LivePaperEquityPoint, type LivePaperKpi, type LivePaperPosition, type LiveParamsUpdateResult, type LiveRun, type LiveRunCompact, type LiveRunDetail, type LiveRunStats, type LiveRunSummary, type LiveRunWithStream, type LiveSignal, type LiveSignalInstrument, type LiveSignalOrder, type LiveSignalPage, type LiveSource, type LiveSourceRequest, type LiveStreamRevoked, type LiveStreamUrl, type MintLiveConnectionTokenData, type MintLiveConnectionTokenResponse, type MintLiveConnectionTokenResponses, type Notice, type OpenDatasetUploadData, type OpenDatasetUploadError, type OpenDatasetUploadErrors, type OpenDatasetUploadResponse, type OpenDatasetUploadResponses, type Options, type PrepareBacktestData, type PrepareBacktestError, type PrepareBacktestErrors, type PrepareBacktestResponse, type PrepareBacktestResponses, type PrepareJobState, type PrepareRequest, type PublicLiveListLinks, type PublicLiveListResponse, type PublicLiveNextLink, type PublicLiveRun, type ResponseError, type ResultMap, type RevokeLiveStreamData, type RevokeLiveStreamError, type RevokeLiveStreamErrors, type RevokeLiveStreamResponse, type RevokeLiveStreamResponses, type RotateLiveStreamData, type RotateLiveStreamError, type RotateLiveStreamErrors, type RotateLiveStreamResponse, type RotateLiveStreamResponses, type ScalarStrategyParamValue, type SendLiveCommandData, type SendLiveCommandError, type SendLiveCommandErrors, type SendLiveCommandRequest, type SendLiveCommandResponse, type SendLiveCommandResponses, type StartLiveData, type StartLiveError, type StartLiveErrors, type StartLiveRequest, type StartLiveResponse, type StartLiveResponses, type StopLiveData, type StopLiveError, type StopLiveErrors, type StopLiveResponse, type StopLiveResponses, type StrategyId, type StrategyLinks, type StrategyState, type StrategySummary, type SweepAxis, type SweepBaseConfig, type SweepHeatmap, type SweepHeatmapCell, type SweepMarginal, type SweepMarginalPoint, type SweepProgress, type SweepRunRow, type SweepSensitivity, type SweepSpecRequest, type UpdateLiveData, type UpdateLiveError, type UpdateLiveErrors, type UpdateLiveParamsData, type UpdateLiveParamsError, type UpdateLiveParamsErrors, type UpdateLiveParamsRequest, type UpdateLiveParamsResponse, type UpdateLiveParamsResponses, type UpdateLiveRequest, type UpdateLiveResponse, type UpdateLiveResponses, type ValidateStrategyData, type ValidateStrategyError, type ValidateStrategyErrors, type ValidateStrategyResponse, type ValidateStrategyResponses, type WalkForwardAccepted, type WalkForwardFold, type WalkForwardRequest, type WalkForwardResult, type WarmFrom, authenticate, cancelBacktest, cancelSweep, client, compileStrategy, createDataset, deleteDataset, deleteStrategy, downloadKlines, downloadTickers, executeBacktest, executeSweep, finalizeDatasetUpload, getAccount, getAccountUsage, getBacktestResult, getDataset, getDatasetImport, getDatasetUpload, getLive, getLiveRun, getLiveRunPaper, getLiveRunPaperEquity, getLiveRunSignals, getPrepareStatus, getStrategy, getStrategyCode, getSweepResult, getSweepRunEquityCurve, getSweepSensitivity, importDataset, listDatasets, listExchanges, listInstruments, listLive, listPublicLive, listSegmentInstruments, listStrategies, mintLiveConnectionToken, openDatasetUpload, prepareBacktest, revokeLiveStream, rotateLiveStream, sendLiveCommand, startLive, stopLive, updateLive, updateLiveParams, validateStrategy };
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/generated/client.gen.ts","../src/generated/sdk.gen.ts"],"sourcesContent":["// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { ClientOptions } from \"./types.gen\";\nimport {\n type Config,\n type ClientOptions as DefaultClientOptions,\n createClient,\n createConfig,\n} from \"@hey-api/client-fetch\";\n\n/**\n * The `createClientConfig()` function will be called on client initialization\n * and the returned object will become the client's initial configuration.\n *\n * You may want to initialize your client this way instead of calling\n * `setConfig()`. This is useful for example if you're using Next.js\n * to ensure your client always has the correct values.\n */\nexport type CreateClientConfig<T extends DefaultClientOptions = ClientOptions> =\n (\n override?: Config<DefaultClientOptions & T>\n ) => Config<Required<DefaultClientOptions> & T>;\n\nexport const client = createClient(\n createConfig<ClientOptions>({\n baseUrl: \"https://api.qtsurfer.net/v1\",\n })\n);\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type {\n Options as ClientOptions,\n TDataShape,\n Client,\n} from \"@hey-api/client-fetch\";\nimport type {\n AuthenticateData,\n AuthenticateResponse,\n AuthenticateError,\n GetAccountData,\n GetAccountResponse,\n GetAccountUsageData,\n GetAccountUsageResponse,\n ListExchangesData,\n ListExchangesResponse,\n ListInstrumentsData,\n ListInstrumentsResponse,\n ListInstrumentsError,\n ListSegmentInstrumentsData,\n ListSegmentInstrumentsResponse,\n ListSegmentInstrumentsError,\n DownloadTickersData,\n DownloadTickersResponse,\n DownloadTickersError,\n DownloadKlinesData,\n DownloadKlinesResponse,\n DownloadKlinesError,\n ListStrategiesData,\n ListStrategiesResponse,\n CompileStrategyData,\n CompileStrategyResponse,\n CompileStrategyError,\n ValidateStrategyData,\n ValidateStrategyResponse,\n ValidateStrategyError,\n DeleteStrategyData,\n DeleteStrategyResponse,\n DeleteStrategyError,\n GetStrategyData,\n GetStrategyResponse,\n GetStrategyError,\n GetStrategyCodeData,\n GetStrategyCodeResponse,\n GetStrategyCodeError,\n PrepareBacktestData,\n PrepareBacktestResponse,\n PrepareBacktestError,\n GetPrepareStatusData,\n GetPrepareStatusResponse,\n GetPrepareStatusError,\n ExecuteSweepData,\n ExecuteSweepResponse,\n ExecuteSweepError,\n CancelSweepData,\n CancelSweepResponse,\n CancelSweepError,\n GetSweepResultData,\n GetSweepResultResponse,\n GetSweepResultError,\n GetSweepSensitivityData,\n GetSweepSensitivityResponse,\n GetSweepSensitivityError,\n GetSweepRunEquityCurveData,\n GetSweepRunEquityCurveResponse,\n GetSweepRunEquityCurveError,\n ExecuteBacktestData,\n ExecuteBacktestResponse,\n ExecuteBacktestError,\n CancelBacktestData,\n CancelBacktestResponse,\n CancelBacktestError,\n GetBacktestResultData,\n GetBacktestResultResponse,\n GetBacktestResultError,\n ListDatasetsData,\n ListDatasetsResponse,\n CreateDatasetData,\n CreateDatasetResponse,\n CreateDatasetError,\n DeleteDatasetData,\n DeleteDatasetResponse,\n DeleteDatasetError,\n GetDatasetData,\n GetDatasetResponse,\n GetDatasetError,\n OpenDatasetUploadData,\n OpenDatasetUploadResponse,\n OpenDatasetUploadError,\n FinalizeDatasetUploadData,\n FinalizeDatasetUploadResponse,\n FinalizeDatasetUploadError,\n GetDatasetUploadData,\n GetDatasetUploadResponse,\n GetDatasetUploadError,\n ImportDatasetData,\n ImportDatasetResponse,\n ImportDatasetError,\n GetDatasetImportData,\n GetDatasetImportResponse,\n GetDatasetImportError,\n StopLiveData,\n StopLiveResponse,\n StopLiveError,\n GetLiveData,\n GetLiveResponse,\n GetLiveError,\n StartLiveData,\n StartLiveResponse,\n StartLiveError,\n ListLiveData,\n ListLiveResponse,\n ListLiveError,\n ListPublicLiveData,\n ListPublicLiveResponse,\n ListPublicLiveError,\n GetLiveRunData,\n GetLiveRunResponse,\n GetLiveRunError,\n UpdateLiveData,\n UpdateLiveResponse,\n UpdateLiveError,\n UpdateLiveParamsData,\n UpdateLiveParamsResponse,\n UpdateLiveParamsError,\n SendLiveCommandData,\n SendLiveCommandResponse,\n SendLiveCommandError,\n RevokeLiveStreamData,\n RevokeLiveStreamResponse,\n RevokeLiveStreamError,\n RotateLiveStreamData,\n RotateLiveStreamResponse,\n RotateLiveStreamError,\n GetLiveRunSignalsData,\n GetLiveRunSignalsResponse,\n GetLiveRunSignalsError,\n GetLiveRunPaperData,\n GetLiveRunPaperResponse,\n GetLiveRunPaperError,\n GetLiveRunPaperEquityData,\n GetLiveRunPaperEquityResponse,\n GetLiveRunPaperEquityError,\n MintLiveConnectionTokenData,\n MintLiveConnectionTokenResponse,\n} from \"./types.gen\";\nimport { client as _heyApiClient } from \"./client.gen\";\n\nexport type Options<\n TData extends TDataShape = TDataShape,\n ThrowOnError extends boolean = boolean\n> = ClientOptions<TData, ThrowOnError> & {\n /**\n * You can provide a client instance returned by `createClient()` instead of\n * individual options. This might be also useful if you want to implement a\n * custom client.\n */\n client?: Client;\n /**\n * You can pass arbitrary values through the `meta` object. This can be\n * used to access values that aren't defined as part of the SDK function.\n */\n meta?: Record<string, unknown>;\n};\n\n/**\n * Exchange API key for a short-lived JWT\n * Exchanges a long-lived API key for a short-lived JWT used by every other\n * endpoint. This is the only endpoint that accepts an API key directly —\n * callers should obtain a JWT here, then send it as `Authorization: Bearer\n * <token>` to all other operations.\n *\n * The returned JWT carries the caller's subscription `tier` as a claim and\n * expires after `expires_in` seconds. Callers should refresh the token\n * before expiry (or on a `401` response) by calling this endpoint again.\n *\n */\nexport const authenticate = <ThrowOnError extends boolean = false>(\n options?: Options<AuthenticateData, ThrowOnError>\n) => {\n return (options?.client ?? _heyApiClient).post<\n AuthenticateResponse,\n AuthenticateError,\n ThrowOnError\n >({\n security: [\n {\n name: \"X-API-Key\",\n type: \"apiKey\",\n },\n ],\n url: \"/auth/token\",\n ...options,\n });\n};\n\n/**\n * Get your account's identity and tier limits\n * Your userId, current tier, and that tier's limits — no database call, safe to fetch on\n * every page load. For live usage against these limits, see `_links.usage`\n * (`GET /account/usage`).\n *\n */\nexport const getAccount = <ThrowOnError extends boolean = false>(\n options?: Options<GetAccountData, ThrowOnError>\n) => {\n return (options?.client ?? _heyApiClient).get<\n GetAccountResponse,\n unknown,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/account\",\n ...options,\n });\n};\n\n/**\n * Get your live storage usage\n * How much of your account's shared storage pool (`GET /account`'s `maxTotalStorageBytes`)\n * you're currently using. Datasets, strategy-execution signals, and registered strategies\n * all count against the same total — they compete for the same underlying storage, so\n * there's one number to watch, not one per resource type. Not guaranteed real-time — a\n * just-completed upload or strategy execution may take a short moment to be reflected here.\n *\n */\nexport const getAccountUsage = <ThrowOnError extends boolean = false>(\n options?: Options<GetAccountUsageData, ThrowOnError>\n) => {\n return (options?.client ?? _heyApiClient).get<\n GetAccountUsageResponse,\n unknown,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/account/usage\",\n ...options,\n });\n};\n\n/**\n * List the available exchanges\n */\nexport const listExchanges = <ThrowOnError extends boolean = false>(\n options?: Options<ListExchangesData, ThrowOnError>\n) => {\n return (options?.client ?? _heyApiClient).get<\n ListExchangesResponse,\n unknown,\n ThrowOnError\n >({\n url: \"/exchanges\",\n ...options,\n });\n};\n\n/**\n * List an exchange's instruments (default spot segment)\n * \"Give me binance instruments\" — returns the exchange's DEFAULT segment (`spot`)\n * in `data`, each instrument with per-data-type coverage and market info. `meta`\n * confirms the served `segment` (`spot`); HAL `_links` carry `self` plus the\n * `spot` / `futures` segment-discovery links.\n *\n */\nexport const listInstruments = <ThrowOnError extends boolean = false>(\n options: Options<ListInstrumentsData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n ListInstrumentsResponse,\n ListInstrumentsError,\n ThrowOnError\n >({\n url: \"/exchange/{exchangeId}/instruments\",\n ...options,\n });\n};\n\n/**\n * List an exchange segment's instruments\n * Returns the instruments for one market segment of the exchange, each with\n * per-data-type coverage and market info. HAL `_links` carry `self` plus the\n * `spot` / `futures` segment-discovery links; the default-segment shortcut is\n * `GET /exchange/{exchangeId}/instruments` (spot).\n *\n */\nexport const listSegmentInstruments = <ThrowOnError extends boolean = false>(\n options: Options<ListSegmentInstrumentsData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n ListSegmentInstrumentsResponse,\n ListSegmentInstrumentsError,\n ThrowOnError\n >({\n url: \"/exchange/{exchangeId}/{segment}/instruments\",\n ...options,\n });\n};\n\n/**\n * Download one hour of tickers for an instrument as a Lastra segment\n * Serves exactly one hour of raw ticker data for the given instrument on the\n * requested exchange. The payload is a native [Lastra](https://github.com/QTSurfer/lastra-java)\n * file — QTSurfer's columnar format for tick-precision timeseries — with\n * no JSON envelope.\n *\n * One segment = one hour, aligned to UTC. The `hour` query parameter selects\n * the segment and must match `YYYY-MM-DDTHH` (no minutes/seconds, no timezone\n * suffix). Example: `hour=2026-01-15T10` returns `h10.lastra` for\n * 2026-01-15, covering `[10:00:00Z, 11:00:00Z)`. Hours not yet available\n * return `404`.\n *\n * A `format=parquet` query parameter switches the response to on-the-fly\n * Parquet conversion via [lastra-convert](https://github.com/QTSurfer/lastra-convert)\n * for clients that don't yet read Lastra. Lastra is the primary format\n * and cheaper when the client can consume it.\n *\n * Clients:\n * - [lastra-java](https://github.com/QTSurfer/lastra-java) — reference\n * Java reader/writer with per-column codecs (ALP, Gorilla, delta-varint,\n * ZSTD) and CRC32 integrity.\n * - [lastra-ts](https://github.com/QTSurfer/lastra-ts) — TypeScript reader\n * (~4 kB bundle, browser + Node.js).\n * - [duckdb-lastra](https://github.com/QTSurfer/duckdb-lastra) — DuckDB\n * extension for ad-hoc SQL over Lastra files.\n * - [lastra-convert](https://github.com/QTSurfer/lastra-convert) — CLI + Java\n * API for converting to/from Parquet, Reef, and CSV.\n * - `curl -OJ` for offline dumps (the `Content-Disposition` header sets a\n * descriptive filename).\n *\n */\nexport const downloadTickers = <ThrowOnError extends boolean = false>(\n options: Options<DownloadTickersData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n DownloadTickersResponse,\n DownloadTickersError,\n ThrowOnError\n >({\n url: \"/exchange/{exchangeId}/tickers/{base}/{quote}\",\n ...options,\n });\n};\n\n/**\n * Download one hour of klines for an instrument as a Lastra segment\n * Same shape and semantics as `/exchange/{exchangeId}/tickers/{base}/{quote}`,\n * but serves klines (aggregated bars) instead of raw ticks. One\n * [Lastra](https://github.com/QTSurfer/lastra-java) segment = one hour of\n * klines at the exchange's native kline cadence, aligned to UTC.\n *\n * Klines use the same columnar layout as tickers — readers that handle one\n * format read the other with the same code. Use this endpoint when a\n * per-tick payload would be too large for the window of interest.\n *\n */\nexport const downloadKlines = <ThrowOnError extends boolean = false>(\n options: Options<DownloadKlinesData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n DownloadKlinesResponse,\n DownloadKlinesError,\n ThrowOnError\n >({\n url: \"/exchange/{exchangeId}/klines/{base}/{quote}\",\n ...options,\n });\n};\n\n/**\n * List your registered strategies\n * Every strategy you have registered and not deleted, most recently compiled first.\n *\n * Each entry carries the same provenance `GET /strategy/{strategyId}` does — `compiledAt`,\n * `requiredSources` — but not its validation state, so listing stays cheap regardless of how\n * many strategies you have. Check a specific strategy's validation with `GET\n * /strategy/{strategyId}`.\n *\n * With `includeDeleted=true`, strategies you have deleted are listed too, each with the\n * `deletedAt` it was deleted at — useful to keep a copy of your list in sync, telling a\n * deleted strategy apart from one that never existed.\n *\n */\nexport const listStrategies = <ThrowOnError extends boolean = false>(\n options?: Options<ListStrategiesData, ThrowOnError>\n) => {\n return (options?.client ?? _heyApiClient).get<\n ListStrategiesResponse,\n unknown,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/strategies\",\n ...options,\n });\n};\n\n/**\n * Compile and register a strategy\n * Compiles raw strategy source and registers it, returning its `strategyId`.\n *\n * The source is either **Java** — a class extending a strategy base class — or **QTScript**\n * (beta), a compact strategy language whose braced bodies are plain Java. QTScript source\n * begins with the `strategy` keyword — whitespace and comments (`//` or `* *`) before it\n * are ignored — and that is how the two are told apart: there is no separate endpoint and\n * no header to set. Once registered, a strategy is used the same way\n * whichever language it was written in.\n *\n * **This answers one question: is the source valid.** It compiles, registers, and hands\n * back the id — nothing more. Whether the class can actually run is\n * `POST /strategy/{strategyId}/validate`, and everything known about a strategy, validation\n * included, is read from `GET /strategy/{strategyId}`. One place to ask, so there is no second\n * answer to keep in step.\n *\n * A `200` means the source parsed and compiled, not that it will run. What only shows once the\n * strategy sets up its indicators is found by `validate`: for QTScript, a window on an indicator\n * name that is not registered (`window nosuch m1 { ... }`) registers, and `validate` ends `failed`\n * on that line.\n *\n * For **Java**, the `strategyId` is derived from what the code *means*, not from how it is\n * written. Adding a comment, inserting a blank line, re-indenting, reordering imports, or\n * moving a method around all return the **same** id — you have not created a second strategy.\n * Renaming a variable, changing an identifier's case, reordering fields, or reordering\n * statements inside a method return a **different** one.\n *\n * For **QTScript**, the id is derived from the text, because indentation is part of its\n * grammar. Only differences that cannot change the strategy are ignored: a byte-order mark, the\n * style of line endings, whitespace at the end of a line, and blank lines before the first and\n * after the last line. Anything else — a comment, the indentation, a blank line in between —\n * returns a **different** id.\n *\n * Two rules follow, and they are worth designing around:\n *\n * - re-submitting a Java strategy you have only reformatted is free, and gives you back the id\n * you already had, along with any validation already recorded against it;\n * - the id says nothing about *behaviour*. Two sources that compute the same thing by\n * different means are two strategies, because deciding otherwise would mean deciding program\n * equivalence.\n *\n * The response also lists `declaredProperties` — the sweep/execute param keys this strategy\n * is known to accept, so a caller can catch a typo'd key before submitting a sweep instead of\n * only learning it from a rejected one. See `DeclaredProperty`: best-effort, not exhaustive.\n *\n */\nexport const compileStrategy = <ThrowOnError extends boolean = false>(\n options: Options<CompileStrategyData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n CompileStrategyResponse,\n CompileStrategyError,\n ThrowOnError\n >({\n bodySerializer: null,\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/strategy\",\n ...options,\n headers: {\n \"Content-Type\": \"text/plain\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * Check that a registered strategy can actually run\n * Instantiates the compiled class and drives it through a bounded synthetic series, so a wiring\n * fault surfaces here instead of at your first backtest. The verdict — pass or fail, plus any\n * engine notices — is recorded and served from `GET /strategy/{strategyId}`.\n *\n * **Idempotent.** If a verdict already exists for the current compilation it comes straight\n * back with `200` and nothing is queued. Otherwise the check is queued and this returns `202`;\n * poll `GET /strategy/{strategyId}` until `validation` is `passed` or `failed`.\n *\n * Recompiling supersedes a verdict, which makes this callable again — the old answer described\n * bytecode that is no longer what would run.\n *\n */\nexport const validateStrategy = <ThrowOnError extends boolean = false>(\n options: Options<ValidateStrategyData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n ValidateStrategyResponse,\n ValidateStrategyError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/strategy/{strategyId}/validate\",\n ...options,\n });\n};\n\n/**\n * Release a registered strategy\n * Removes a strategy from `GET /strategy/{strategyId}` and `GET /strategies`. This is not\n * undone by re-submitting the same source to `POST /strategy` — that registers a new\n * strategy, with a new id.\n *\n * **Backtests you already ran against this strategy are unaffected.** Deleting it stops it\n * from counting against your account and stops you from validating or re-running it under\n * this id — it does not erase what already happened.\n *\n * Only removes a strategy you registered yourself. If you copied someone else's strategy\n * (a shared/marketplace listing), deleting your copy never affects theirs, or anyone else's.\n *\n */\nexport const deleteStrategy = <ThrowOnError extends boolean = false>(\n options: Options<DeleteStrategyData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).delete<\n DeleteStrategyResponse,\n DeleteStrategyError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/strategy/{strategyId}\",\n ...options,\n });\n};\n\n/**\n * Get a strategy by id, including its validation state\n * Reports that the strategy is registered — implied by a `200` at all — and what validating it\n * found.\n *\n * A `404` means one thing: no such registered strategy for this user. It is never a stale or\n * expired answer; registration and verdict are stored durably, not cached.\n *\n */\nexport const getStrategy = <ThrowOnError extends boolean = false>(\n options: Options<GetStrategyData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetStrategyResponse,\n GetStrategyError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/strategy/{strategyId}\",\n ...options,\n });\n};\n\n/**\n * Get a registered strategy's source, if you still have one to read\n * The exact source you last submitted for this id — the same text `POST /strategy` derives\n * `strategyId` from, whitespace and comments included.\n *\n * **\"If available\", not \"always\".** A strategy you resolve only through a shared/marketplace\n * listing you copied by reference carries no source of its own, and reads as a `404` here the\n * same as a `strategyId` you never registered — that is the honest answer either way, since\n * from this endpoint's point of view nothing is there to return.\n *\n */\nexport const getStrategyCode = <ThrowOnError extends boolean = false>(\n options: Options<GetStrategyCodeData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetStrategyCodeResponse,\n GetStrategyCodeError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/strategy/{strategyId}/code\",\n ...options,\n });\n};\n\n/**\n * Prepare backtest data\n * Enqueues a prepare task over the requested date range. Returns immediately with a `jobId`;\n * poll `GET /backtest/{exchangeId}/{type}/prepare/{jobId}` for completion.\n *\n * The same params always return the same `jobId` (idempotent). Repeated calls with identical\n * params do not enqueue duplicate work — they reuse the existing job.\n *\n * Every source in `DataSourceType` can be prepared, but not every one can then be run: `funding`\n * data can be prepared and is rejected by `execute` and `executeSweep`. A `kline` prepare takes\n * the bar width from `cadence` — see `PrepareRequest`.\n *\n * **`exchangeId: user` is reserved for your own uploaded data.** Instead of a managed\n * exchange, it prepares from a dataset you created via `POST /datasets` (see the **Dataset**\n * endpoints) — send `datasetId` in place of `instrument`. See `PrepareRequest` below for the\n * two request shapes.\n *\n */\nexport const prepareBacktest = <ThrowOnError extends boolean = false>(\n options: Options<PrepareBacktestData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n PrepareBacktestResponse,\n PrepareBacktestError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/prepare\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * Get the status of a prepare job\n * Retrieves the current state of the prepare job identified by `jobId`.\n * Poll until `status` is `Completed`, `Failed`, or `Aborted`.\n *\n * For a dataset prepare (`exchangeId: user`), coverage is reported against the dataset's own\n * cadence grid instead of hours — see `cadence`/`gaps`/`largestGapSteps` on `PrepareJobState`.\n *\n */\nexport const getPrepareStatus = <ThrowOnError extends boolean = false>(\n options: Options<GetPrepareStatusData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetPrepareStatusResponse,\n GetPrepareStatusError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/prepare/{jobId}\",\n ...options,\n });\n};\n\n/**\n * Execute a parameter sweep over prepared data\n * Runs a parameter matrix over the single immutable dataset identified by `requestId`.\n * The backend expands and executes the matrix internally; clients poll the returned\n * `sweepId` for incremental results.\n *\n * `type` must be `ticker` or `kline`; a `kline` sweep, walk-forward included, runs over bars of\n * the cadence the request was prepared at. `funding` can be prepared but not swept yet: it is\n * rejected with `400` before anything is queued.\n *\n * Supplying `walkForward` runs the sweep in a different mode entirely. Instead of scoring\n * every parameter vector once over the whole range, the data is split into F sequential\n * folds; each fold optimizes the full grid on its own window and then scores only its winner\n * on the window immediately after — data that winner was not chosen on. It answers a harder\n * question than a leaderboard: not \"which parameters won\", but \"does re-optimizing this\n * periodically actually work\". Omit the block and nothing changes, including the response.\n *\n * The cost is the reason it is opt-in rather than always on: F folds × N vectors, so a\n * 4-fold run over a 500-point grid is 2004 backtests where the plain sweep is 500. The\n * request is rejected when `folds × totalRuns` exceeds the server's sweep budget.\n *\n */\nexport const executeSweep = <ThrowOnError extends boolean = false>(\n options: Options<ExecuteSweepData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n ExecuteSweepResponse,\n ExecuteSweepError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/executeSweep/{requestId}\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * Cancel a running parameter sweep\n * Requests cancellation between parameter vectors. Completed rows remain readable.\n */\nexport const cancelSweep = <ThrowOnError extends boolean = false>(\n options: Options<CancelSweepData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).delete<\n CancelSweepResponse,\n CancelSweepError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/executeSweep/{requestId}/{sweepId}\",\n ...options,\n });\n};\n\n/**\n * Get sweep progress and results\n * Returns incremental sweep progress. The default `ranked` view sorts and may truncate the\n * display leaderboard. `order=natural` returns every available row, untruncated, ordered by\n * deterministic `runIx`; use that view when materialising durable trial rows.\n *\n * The `ranked` view is ordered by **plateau score** by default, not by the raw objective. A\n * plateau score is the objective of the worst run in a parameter point's immediate\n * neighbourhood, so a point scores well only if the region around it also does — the highest\n * raw score is frequently a spike that does not survive the parameters moving slightly. Pass\n * `ranking=raw` for the unadjusted objective order.\n *\n * Rows in the `ranked` view carry `plateauScore` and `neighbourCount` when plateau ranking\n * applied. Read them together: `neighbourCount: 0` means the point had no neighbours to\n * compare against, so its plateau score is unevidenced rather than confirmed. Sweeps\n * submitted before plateau ranking existed have no stored parameter grid to rebuild a\n * neighbourhood from and are always ranked raw; the response's `ranking` field says which\n * ordering was actually used.\n *\n * A sweep submitted with `walkForward` answers in a different shape, and the `walkForward`\n * field on the response is what tells the two apart — it appears as soon as the sweep is\n * accepted, before any fold has finished, so it is safe to branch on while polling. There\n * the leaderboard is one row per completed fold: that fold's winner as it scored\n * **out-of-sample**, with `runIx` carrying the fold index rather than a grid position. The\n * in-sample runs behind those winners are not retained — they are an optimization's working\n * set, and only the winner survives its fold. `ranking` is always `raw` and no plateau, DSR\n * or PBO figure is reported: the out-of-sample scores are already the honest number, and\n * layering a certification computed over F observations on top of them would overstate what\n * was measured.\n *\n */\nexport const getSweepResult = <ThrowOnError extends boolean = false>(\n options: Options<GetSweepResultData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetSweepResultResponse,\n GetSweepResultError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/executeSweep/{requestId}/{sweepId}\",\n ...options,\n });\n};\n\n/**\n * Get sweep sensitivity surfaces\n * How the objective moves as each parameter moves — the question a leaderboard cannot answer.\n * A leaderboard says which point won; a sweep can spend its entire budget on an axis that\n * never moved the objective at all, and showing only the top rows hides that completely.\n *\n * A **marginal** takes one axis and collapses every other one: for each value of that axis,\n * it aggregates every run that used it, whatever the rest of the parameters were. A flat\n * marginal means the axis is irrelevant over the range swept. `best`, `mean` and `worst` are\n * all reported because them disagreeing is itself the signal — a value with a high `best` and\n * a poor `mean` works only in specific company, which is an interaction between parameters\n * and would be invisible behind a single number.\n *\n * A **heatmap** does the same over a pair of axes, where that interaction becomes visible\n * directly.\n *\n * Served from the sweep's stored rows: no re-run, no engine call, and it works on a sweep\n * still in flight — the aggregates then describe the runs finished so far. Aborted runs are\n * excluded throughout, since a run that threw measured nothing and counting it as a bad\n * outcome would invent evidence against a parameter value that was never really tested.\n *\n * This is a separate endpoint rather than extra fields on the result view because the\n * two-dimensional half is quadratic in the axis count (N axes give N(N-1)/2 surfaces, each\n * the product of two axes' value counts) and is not wanted on the poll that drives progress.\n *\n */\nexport const getSweepSensitivity = <ThrowOnError extends boolean = false>(\n options: Options<GetSweepSensitivityData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetSweepSensitivityResponse,\n GetSweepSensitivityError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/executeSweep/{requestId}/{sweepId}/sensitivity\",\n ...options,\n });\n};\n\n/**\n * Get one sweep trial's equity curve\n * The resource a leaderboard row's `equityCurve.url` points at — only reachable when that\n * trial's curve was actually selected (`equityCurve.mode: topN` or `topPct` on the sweep\n * submission, and this trial ranked among the winners). Returns the exact same\n * `{points|timestamps+equities, meta}` shape a plain backtest's inline `equityCurve` carries.\n *\n * Query params reshape the response the same way a plain backtest's `equityCurve` options do.\n * A param genuinely absent from the query string falls back to the `equityCurve` transform\n * preference the sweep was submitted with — a param\n * present but malformed does not fall back, it degrades the same way it always has. Above a\n * server-side size threshold, the shape is forced regardless of either — `meta.outMode` in\n * the response, not the query string or the submitted default, is the source of truth for\n * what shape actually came back.\n *\n */\nexport const getSweepRunEquityCurve = <ThrowOnError extends boolean = false>(\n options: Options<GetSweepRunEquityCurveData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetSweepRunEquityCurveResponse,\n GetSweepRunEquityCurveError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/executeSweep/{requestId}/{sweepId}/runs/{runIx}/equityCurve\",\n ...options,\n });\n};\n\n/**\n * Execute a compiled strategy against a prepared dataset\n * Enqueues an execute task that runs the strategy identified by `strategyId` over the data\n * prepared by the prepare job identified by `prepareJobId`. The instrument and date range are\n * recovered from the prepare job — they do not need to be sent again.\n *\n * Returns immediately with a `jobId`; poll `GET /backtest/{exchangeId}/{type}/execute/{jobId}`\n * for the result.\n *\n * `type` must be a source that can be executed: `ticker` or `kline`. A `kline` strategy is fed\n * bars of the cadence its `prepareJobId` was prepared at — chosen by you when preparing, not by\n * the strategy. `funding` can be prepared but not executed yet: it is rejected with `400`\n * before anything is queued.\n *\n * Optionally takes `params`: strategy properties for this one run, applied without\n * recompiling. This is how a sweep leaderboard winner gets re-run for its `equityCurve` —\n * a sweep row carries the ten ranking metrics but never a curve, whatever its size. Compile\n * once, call this endpoint N times with different `params`, and each response is an ordinary\n * backtest result with the curve included.\n *\n * The same request (same `prepareJobId`, `strategyId`, `storeSignals`, `equityCurve`,\n * `baseConfig`, `params`) always returns the same `jobId` (idempotent) — a request that omits\n * `equityCurve`, `baseConfig` or `params` dedupes exactly as it did before those fields\n * existed. Two different `params` vectors over one prepare are two different jobs, and `9`\n * and `9.0` are the same one.\n *\n * The re-run is an independent execution rather than a replay of the sweep trial — the two\n * paths do not share a simulator — but they are pinned to agree: one vector run both ways\n * matches on every leaderboard metric, asserted as a regression test. Treat a difference as a\n * bug worth reporting, not as expected behaviour.\n *\n * Optionally takes `baseConfig`, the same `SweepBaseConfig` shape `executeSweep` accepts —\n * `initialFunding`, `feeRate`, `percentAmountToLock`, etc. — so the same object can be reused\n * against either endpoint. This endpoint has one effective fee rate rather than a sweep's\n * independent buy/sell legs: a `baseConfig` that resolves to different buy/sell rates, or sets\n * a non-default `feeLeg`, is rejected with `400` rather than silently collapsed to one side.\n *\n * Works unchanged for a dataset-backed prepare (`exchangeId: user`) — the request body is\n * identical either way, since the instrument and range are recovered from `prepareJobId`.\n *\n */\nexport const executeBacktest = <ThrowOnError extends boolean = false>(\n options: Options<ExecuteBacktestData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n ExecuteBacktestResponse,\n ExecuteBacktestError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/execute\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * Cancel a running backtest execution\n * Requests cancellation of the specified execution. The execution\n * status will transition to `Aborted` once the cancellation is\n * processed. Cancellation is asynchronous — poll the GET endpoint\n * to confirm the final status.\n *\n */\nexport const cancelBacktest = <ThrowOnError extends boolean = false>(\n options: Options<CancelBacktestData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).delete<\n CancelBacktestResponse,\n CancelBacktestError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/execute/{jobId}\",\n ...options,\n });\n};\n\n/**\n * Get the result of a backtest execution job\n * Retrieves the current state and results of the execute job identified by `jobId`.\n * Poll until `state.status` is `Completed`, `Failed`, or `Aborted`.\n *\n * A `202` means the result is not readable yet — keep polling. It is never a terminal\n * outcome, and it carries no `state`, so a poll loop that stops on a terminal status will\n * not stop on it.\n *\n */\nexport const getBacktestResult = <ThrowOnError extends boolean = false>(\n options: Options<GetBacktestResultData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetBacktestResultResponse,\n GetBacktestResultError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/execute/{jobId}\",\n ...options,\n });\n};\n\n/**\n * List your datasets\n * Every dataset you have created and not deleted, most recently created first. Never a `404`\n * — an empty array if you have none, same convention as `GET /strategies`.\n *\n * With `includeDeleted=true`, datasets you have deleted are listed too, each with the\n * `deletedAt` it was deleted at — useful to keep a copy of your list in sync, telling a\n * deleted dataset apart from one that never existed.\n *\n */\nexport const listDatasets = <ThrowOnError extends boolean = false>(\n options?: Options<ListDatasetsData, ThrowOnError>\n) => {\n return (options?.client ?? _heyApiClient).get<\n ListDatasetsResponse,\n unknown,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/datasets\",\n ...options,\n });\n};\n\n/**\n * Create a dataset and get a URL to upload it to\n * Creates a dataset AND its first upload session in one call — a presigned URL your client\n * PUTs the file to directly, no API credentials involved in that PUT. Call\n * `POST /datasets/{datasetId}/uploads/{uploadId}/finalize` once the upload completes to kick\n * off ingest.\n *\n * Losing this response loses nothing: calling this dataset's\n * `POST /datasets/{datasetId}/uploads` returns the very same upload session again rather than\n * opening a new one, as long as nothing has been finalized against it yet.\n *\n * v1 is ticker data only — `type` is not a request field, it is always `\"ticker\"` in the\n * response. `instrument` must be a plain spot pair (`BASE/QUOTE`, exactly one `/`); derivative\n * forms (e.g. `BTC/USDT:USDT`) are rejected.\n *\n * **Upload format.** A CSV with a header row, a parquet file with the same columns by\n * name, or a lastra file — our own native columnar format, the same one a dataset's\n * `dataUrl` hands back by default, so a downloaded dataset can be handed to another user to\n * upload with no conversion in between. For CSV/parquet, required: `timestamp` (ISO-8601, or\n * numeric epoch seconds/millis/micros — detected from the first row, then enforced for every\n * later row), `close`. Optional: `open`, `high`, `low`, `volume`, `quoteVolume`, `bid`,\n * `bidSize`, `ask`, `askSize`. A lastra upload carries its own fixed column set instead and\n * only needs a timestamp series and a close series present. Cadence and timestamp unit are\n * discovered from the data, not declared, for all three.\n *\n * A CSV upload is converted to our native columnar format (`lastra`) for storage. A parquet\n * or lastra upload is stored as-is today. Either way, always check `dataFormat` on\n * `GET /datasets/{datasetId}` and `GET /datasets/{datasetId}/uploads/{uploadId}` for which\n * one `dataUrl` actually is, rather than assuming from how you uploaded it (a converted CSV\n * and an uploaded lastra file both report `dataFormat: \"lastra\"`).\n *\n * The bytes PUT to `upload.url` may be that file directly, gzipped (`.gz`), or zipped\n * (`.zip`, exactly one file inside — a dataset is one file regardless of how it travels).\n * Format is detected from the decompressed content itself: there is no filename or\n * `Content-Type` anywhere in this flow for a client to declare it with, so nothing needs to\n * be sent besides the bytes.\n *\n */\nexport const createDataset = <ThrowOnError extends boolean = false>(\n options: Options<CreateDatasetData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n CreateDatasetResponse,\n CreateDatasetError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/datasets\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * Delete a dataset\n * Soft-delete — the dataset stops appearing in `GET /datasets`/`GET /datasets/{datasetId}` and\n * can no longer be prepared from, but its object data is reclaimed later rather than purged\n * inline, so a backtest already running against one of its versions is not disrupted.\n *\n */\nexport const deleteDataset = <ThrowOnError extends boolean = false>(\n options: Options<DeleteDatasetData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).delete<\n DeleteDatasetResponse,\n DeleteDatasetError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/datasets/{datasetId}\",\n ...options,\n });\n};\n\n/**\n * Get a dataset by id\n * Detail for one dataset, plus a self link.\n */\nexport const getDataset = <ThrowOnError extends boolean = false>(\n options: Options<GetDatasetData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetDatasetResponse,\n GetDatasetError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/datasets/{datasetId}\",\n ...options,\n });\n};\n\n/**\n * Open a new upload session for an existing dataset\n * Get a fresh presigned URL to upload a new version into a dataset you already have — a\n * corrected file, or the next chunk of history. Behaves the same way `POST /datasets` does\n * for a brand-new dataset's own upload: at most one upload session is open per dataset at a\n * time, so calling this again before finalizing just hands back that same session rather\n * than opening a second one — safe to call repeatedly if a response gets lost.\n *\n * Once a session has been finalized (successfully or not), the next call here opens a\n * genuinely new one for that dataset's next version.\n *\n */\nexport const openDatasetUpload = <ThrowOnError extends boolean = false>(\n options: Options<OpenDatasetUploadData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n OpenDatasetUploadResponse,\n OpenDatasetUploadError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/datasets/{datasetId}/uploads\",\n ...options,\n });\n};\n\n/**\n * Finalize an uploaded file and start ingest\n * Call once the file has been PUT to the `upload.url` from `POST /datasets` (or from\n * `POST /datasets/{datasetId}/uploads`). Enqueues ingest and returns immediately; poll\n * `GET /datasets/{datasetId}/uploads/{uploadId}` for the result.\n *\n * Idempotent while the upload is still open — a repeat finalize before it has produced a\n * version returns the same `jobId` rather than enqueueing a second ingest. Once it HAS\n * produced a version, `uploadId` is spent: finalizing it again is a `409`, even with\n * different bytes freshly PUT to the same URL — open a new upload session instead\n * (`POST /datasets/{datasetId}/uploads`) rather than reusing a spent one.\n *\n */\nexport const finalizeDatasetUpload = <ThrowOnError extends boolean = false>(\n options: Options<FinalizeDatasetUploadData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n FinalizeDatasetUploadResponse,\n FinalizeDatasetUploadError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/datasets/{datasetId}/uploads/{uploadId}/finalize\",\n ...options,\n });\n};\n\n/**\n * Get the state of an upload/ingest\n * Poll after `POST .../finalize` until `status` is `ready` or `failed`. Also reports\n * `uploading` (finalize not called yet, but the file was PUT) before you finalize at all.\n *\n */\nexport const getDatasetUpload = <ThrowOnError extends boolean = false>(\n options: Options<GetDatasetUploadData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetDatasetUploadResponse,\n GetDatasetUploadError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/datasets/{datasetId}/uploads/{uploadId}\",\n ...options,\n });\n};\n\n/**\n * Create a dataset by importing history instead of uploading it\n * A second way to get data into a dataset, alongside `POST /datasets`: instead of `PUT`ting a\n * file yourself, ask the API to go fetch history on your behalf. Creates the dataset and\n * starts the fetch in the same call — there is no separate upload step, and the result lands\n * as a dataset version indistinguishable from an uploaded one once it's ready. Poll\n * `GET /datasets/{datasetId}/imports/{importId}` for progress.\n *\n * `type` selects the source. `dex` — history over a pool/pair's own on-chain market — is the\n * only value today; other source types join this same endpoint later.\n *\n * A `dex` import has two data shapes, chosen by the top-level `cadence`:\n *\n * * Omitted/blank (default) — on-chain swap history, replayed directly from the pool/pair's\n * own chain. Cadence is native, not resampled: each swap keeps the timestamp it happened\n * at rather than being bucketed into candles, so the resulting version's `cadence` is `rt`\n * unless the swaps happen to sit on a fixed grid (see `DatasetVersion.cadence`).\n * * One of `1s` / `1m` / `5m` — pre-aggregated candles at that width instead of raw trades.\n * The resulting dataset's `type` is `klines`, not `ticker`. Not every network supports every\n * cadence yet — an unsupported combination fails asynchronously, same as an unresolvable\n * pool (see the `failed` status on the poll endpoint below).\n *\n */\nexport const importDataset = <ThrowOnError extends boolean = false>(\n options: Options<ImportDatasetData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n ImportDatasetResponse,\n ImportDatasetError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/datasets/imports\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * Get the state of an import/ingest\n * Poll after `POST /datasets/imports` until `status` is `ready` or `failed`. An import spends\n * real time fetching from its source before anything is even staged — `fetching` is the one\n * status only an import ever reports; `ingesting`/`ready`/`failed` mean exactly what they do\n * on `GET /datasets/{datasetId}/uploads/{uploadId}`, since an import re-enters that same\n * ingest chain once it has fetched and staged its data.\n *\n */\nexport const getDatasetImport = <ThrowOnError extends boolean = false>(\n options: Options<GetDatasetImportData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetDatasetImportResponse,\n GetDatasetImportError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/datasets/{datasetId}/imports/{importId}\",\n ...options,\n });\n};\n\n/**\n * Stop this strategy's live run\n * Requests a stop. The run winds down at its own next check-in rather than instantly —\n * poll `GET`/`PATCH` `.../live` and expect `state` to remain `RUNNING` for a short window\n * after `desired` flips to `STOPPED`. Calling this again on an already-stopped run is not an\n * error; it returns the same (unchanged) state. A stopped run has no stream: its `streamUrl`, if it had one,\n * stops working and is not in this response.\n *\n */\nexport const stopLive = <ThrowOnError extends boolean = false>(\n options: Options<StopLiveData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).delete<\n StopLiveResponse,\n StopLiveError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/strategy/{strategyId}/live\",\n ...options,\n });\n};\n\n/**\n * Get this strategy's current (or most recent) live run\n * The run you last started for this strategy — its most complete state, including `params`\n * and the promotion `gate` once the sandbox trial has one to report. Returns the run's last\n * known state even after it has stopped; this endpoint never disappears history. When the run was started\n * with a `stream`, `streamUrl` is here too while the run is running and your plan allows it.\n *\n * While the run is being executed it also carries `stats`, the run's latest counters (updates\n * processed, rate, instruments seen), refreshed about once a minute. Starting or stopping a run\n * does not return them; read them here.\n *\n */\nexport const getLive = <ThrowOnError extends boolean = false>(\n options: Options<GetLiveData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetLiveResponse,\n GetLiveError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/strategy/{strategyId}/live\",\n ...options,\n });\n};\n\n/**\n * Start a strategy on a live market feed\n * Starts your strategy against a live market feed. A new run always begins in the **sandbox**\n * stage — a short trial that compares an independent second execution against the first for\n * agreement — before it is eligible for promotion to the live stage where it actually\n * publishes signals other systems can act on. Poll `GET /strategy/{strategyId}/live` (or\n * `PATCH`/`DELETE` `/live/{runId}` once you have the `runId`) to watch `stage` move from\n * `SANDBOX` to `LIVE`.\n *\n * Only one run per strategy at a time — starting again while one is already running is `409`;\n * stop the current one first.\n *\n * `sources` takes exactly one entry today (multi-source strategies are not supported yet).\n * `type` is `ticker` or `kline`; anything else is rejected. Both connect to the lightest\n * (fastest) cadence available for the exchange — today that is 1 tick/second on every\n * supported exchange; choosing among several cadences is not offered yet.\n *\n * `params` is passed straight through to the strategy at start — the same free-form object\n * `POST /strategy/{strategyId}/validate` and the backtest endpoints already accept. To change\n * a parameter **while the run is live**, use `PUT /live/{runId}/params` instead; this endpoint\n * only sets the values a run starts with.\n *\n * Consuming a run's own output — its signals, and updating its parameters over a live\n * connection instead of polling — is a WebSocket protocol on top of these REST endpoints; see\n * the \"Live execution\" guide linked from this tag's description for the full flow (minting a\n * connection token, the channel and RPC method).\n *\n * **Paper trading.** Pass a `paper` block to have the run's hints executed in simulation from\n * its first tick, as a backtest would execute them: fills, closed trades, equity and KPIs,\n * with one simulated account per quote currency. Omitted, the run has no paper trading. It\n * takes the same economics as a backtest's `baseConfig` plus where its output goes; read it\n * back with `GET /live/{runId}/paper`. A strategy that listens to its own execution events\n * (it overrides `getExecutionCallback()`) has no other execution venue, so it cannot start\n * without a `paper` block.\n *\n * **Warming up.** Pass `warmFrom` to choose how many seconds before its start the run replays the market\n * feed from, so that its indicators and windows have history when the first live tick arrives. `0` replays\n * nothing: the run delivers its first signal as soon as it is running, but its indicators start empty and the\n * first bar of a window can be partial. Omitted, the platform replays from the start of the current 15-minute\n * block, which is between 0 and 900 seconds before the run's start, so the first bar of a 15-minute window is\n * complete. The value in effect, yours or the platform's, comes back as `warmFrom`. It can be set only here,\n * when the run is started. See the \"Live execution\" guide, \"Warming up\".\n *\n * **A plain WebSocket stream.** Pass `stream: true` to get a secret URL for this run's signals that a simple\n * client, or a service that passes them on to others, can open as an ordinary WebSocket, from the sandbox stage\n * on. The URL is in the response (`streamUrl`) and in `GET /strategy/{strategyId}/live`; treat it like a\n * password. See the \"Live execution\" guide.\n *\n */\nexport const startLive = <ThrowOnError extends boolean = false>(\n options: Options<StartLiveData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n StartLiveResponse,\n StartLiveError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/strategy/{strategyId}/live\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * List your own live runs\n * Every run you have started, in any `stage`, `desired` state, or `visibility` — newest\n * first. Unlike `GET /live/public`, this is not filtered to `RUNNING` public runs: it is\n * the complete list of runs you own, including `sandbox` trials and stopped ones.\n *\n */\nexport const listLive = <ThrowOnError extends boolean = false>(\n options?: Options<ListLiveData, ThrowOnError>\n) => {\n return (options?.client ?? _heyApiClient).get<\n ListLiveResponse,\n ListLiveError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live\",\n ...options,\n });\n};\n\n/**\n * Browse public live runs\n * Every run whose owner marked it `public`, that has been promoted to `live` and is running —\n * anyone's, yours included, and listed without revealing who owns it. A `public` run still in\n * its `sandbox` trial is not listed. Most recently started first.\n *\n * This is the only `Live Execution` endpoint that needs no `Authorization` header.\n *\n */\nexport const listPublicLive = <ThrowOnError extends boolean = false>(\n options?: Options<ListPublicLiveData, ThrowOnError>\n) => {\n return (options?.client ?? _heyApiClient).get<\n ListPublicLiveResponse,\n ListPublicLiveError,\n ThrowOnError\n >({\n url: \"/live/public\",\n ...options,\n });\n};\n\n/**\n * Read one of your runs by its id\n * Owner only, addressed by `runId` directly rather than through its strategy: the run's own\n * canonical identity, which is what `POST`/`GET`/`DELETE` `.../live`, `GET /live` and\n * `GET /live/public` all hand out. Use it to re-read one specific run — including one you\n * stopped long ago or that is no longer your strategy's most recent — without paging through\n * `GET /live`.\n *\n * Returns the same state as `GET /strategy/{strategyId}/live` (`strategyId` is the strategy's\n * id, and `stats` is there too), plus `updatedAtMs`: when the run last changed, from any cause — a\n * state change, a promotion, a parameter update, a stop. A refresh of `stats` is not a change of\n * the run and does not move `updatedAtMs`. A run that is public is reachable by others through\n * `GET /live/public`, never through this route.\n *\n */\nexport const getLiveRun = <ThrowOnError extends boolean = false>(\n options: Options<GetLiveRunData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetLiveRunResponse,\n GetLiveRunError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/{runId}\",\n ...options,\n });\n};\n\n/**\n * Change a run's visibility, name, or description\n * Owner only, addressed by `runId` directly rather than through its strategy — this is a\n * run's own canonical identity, independent of which strategy started it.\n *\n * Setting `visibility` from `public` back to `private` also evicts anyone currently connected\n * to the run's live signal channel who is not its owner — best-effort; the change to this\n * record is not rolled back if that eviction fails.\n *\n */\nexport const updateLive = <ThrowOnError extends boolean = false>(\n options: Options<UpdateLiveData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).patch<\n UpdateLiveResponse,\n UpdateLiveError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/{runId}\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * Change a running strategy's parameters\n * Updates one or more parameters of a run **while it stays live** — unlike `params` on\n * `POST /strategy/{strategyId}/live`, which only sets the starting values. Owner only.\n *\n * Every key in `params` must be one your strategy declares (see `declaredProperties` on\n * `POST /strategy`) as of the compilation this run is executing — recompiling the strategy\n * later never changes what an already-running instance accepts; start a new run for that.\n *\n * The change does not take effect the instant this call returns: `effectiveAtMs` is the\n * earliest moment it is guaranteed to apply, a few seconds out, so both the REST and\n * WebSocket paths to this same update (see the \"Live execution\" guide) land on the exact same\n * value at the exact same moment.\n *\n */\nexport const updateLiveParams = <ThrowOnError extends boolean = false>(\n options: Options<UpdateLiveParamsData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).put<\n UpdateLiveParamsResponse,\n UpdateLiveParamsError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/{runId}/params\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * Tell a running strategy a command\n * Tells a running strategy something **while it stays live**, without restarting it — for a strategy that\n * implements the engine's `CommandRequestHandler`. Owner only.\n *\n * A command is an event, not a stored setting: it is delivered once to every execution behind the run, at\n * the same market position, and nothing about it is written to the run's state. **It is transient** — a\n * replica that restarts replays only its recent market history, so a command from before that only reaches\n * one that was already running when it arrived. Anything the strategy needs to remember across a restart\n * belongs in a parameter (`PUT /live/{runId}/params`), which does have a stored value; a command does not.\n *\n * The command's text is a plain string; an optional `properties` object of your own choosing travels\n * alongside it. Each entry lands as a top-level entry on the `CommandRequest` the handler receives —\n * `request.get(\"<key>\")` in Java, `$command.<key>` sugar in QTScript — no key is off limits, since the\n * command's own text is kept separately.\n *\n */\nexport const sendLiveCommand = <ThrowOnError extends boolean = false>(\n options: Options<SendLiveCommandData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n SendLiveCommandResponse,\n SendLiveCommandError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/{runId}/commands\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * Revoke a run's stream URL\n * Revokes a run's stream URL **for good**: connections open on it are closed within about 15 seconds and it\n * answers `404` from then on. The run itself is not touched, and a stream cannot be added to it again; start\n * the run again with `stream: true` for a new URL. Owner only, and always allowed, whatever your plan or the\n * run's state. Repeating it is not an error.\n *\n */\nexport const revokeLiveStream = <ThrowOnError extends boolean = false>(\n options: Options<RevokeLiveStreamData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).delete<\n RevokeLiveStreamResponse,\n RevokeLiveStreamError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/{runId}/stream\",\n ...options,\n });\n};\n\n/**\n * Rotate a run's stream URL\n * Gives a run a **new** stream URL and retires the old one: connections open on the old URL are closed\n * within about 15 seconds and the old URL answers `404` from then on. Use it when the URL may have leaked.\n * Owner only, and only for a run that is running and was started with `stream: true` (the URL cannot be added\n * to a run later, and a revoked one cannot be brought back). The plan is checked again: a plan that may not\n * broadcast gets `429`.\n *\n * See the \"Live execution\" guide, \"A plain WebSocket stream of a run\".\n *\n */\nexport const rotateLiveStream = <ThrowOnError extends boolean = false>(\n options: Options<RotateLiveStreamData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n RotateLiveStreamResponse,\n RotateLiveStreamError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/{runId}/stream\",\n ...options,\n });\n};\n\n/**\n * Read a run's signals\n * Returns one page of the signals a run has already produced, newest-last, optionally from a\n * given time and narrowed to one or more instruments.\n *\n * This is the counterpart to the real-time WebSocket channel: that channel only carries what\n * happens while you are connected, and only for a run that asked for `relay`. A run's signals\n * are recorded either way, so this endpoint serves them whether or not `relay` was ever on,\n * in both the `sandbox` and `live` stages — use it to catch up after a disconnect, to read a\n * run you never relayed, or to page back over what has already happened.\n *\n * **The available window moves.** Signals are kept for a limited span, and the oldest are\n * continuously discarded as new ones arrive, so how far back you can read is not a fixed\n * number of hours: on a busy run it can be a good deal shorter. Every response carries\n * `availableSinceMs`, the oldest moment that can still be answered for. Asking for a\n * `sinceMs` older than that is not an error — you get everything from `availableSinceMs`\n * onwards, and that field tells you it happened.\n *\n * **A cursor can expire, and on a busy run it expires quickly.** If the position a cursor\n * points at has since been discarded, the next page answers `410` rather than silently\n * serving a shortened page that looks complete. Treat that as a normal outcome: read\n * `availableSinceMs` from the error and start again from there.\n *\n * Readable by the run's owner, and by anyone if the run is `public` and has reached the `live`\n * stage — the same rule the signal channel applies to a subscription. A `sandbox` run is read\n * by its owner only, whatever visibility it asked for.\n *\n */\nexport const getLiveRunSignals = <ThrowOnError extends boolean = false>(\n options: Options<GetLiveRunSignalsData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetLiveRunSignalsResponse,\n GetLiveRunSignalsError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/{runId}/signals\",\n ...options,\n });\n};\n\n/**\n * Read a run's paper trading\n * The run's paper trading as last recorded: one entry per simulated account (one per quote\n * currency the run trades — never added together), with its starting capital, current\n * equity, realised PnL, open positions and KPIs. The KPIs are the same a backtest reports,\n * computed over the trades closed so far.\n *\n * `equity` is the account's latest recorded value: at the last closed trade (`equityKind:\n * equity`), or the last periodic mark-to-market while positions are open (`equityKind:\n * mark`, taken every minute of market time). Until either exists the account holds its\n * starting capital.\n *\n * Readable by the run's owner, and by anyone if the run is `public` and has reached the `live`\n * stage. A run started without a `paper` block answers `404`.\n *\n */\nexport const getLiveRunPaper = <ThrowOnError extends boolean = false>(\n options: Options<GetLiveRunPaperData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetLiveRunPaperResponse,\n GetLiveRunPaperError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/{runId}/paper\",\n ...options,\n });\n};\n\n/**\n * Read a run's paper equity curve\n * The run's paper equity curve, oldest first, page by page. It is kept for the life of the\n * run, so unlike signals it has no moving window. Points are `equity` at every closed trade,\n * `mark` every minute of market time while positions are open, and `gap` where the run was\n * restarted with positions open: those positions are not carried over, so the curve has no\n * value there.\n *\n * `currency` narrows to one account; without it, every account's points come interleaved by\n * time, each carrying its currency.\n *\n * Readable by the run's owner, and by anyone if the run is `public` and has reached the `live`\n * stage.\n *\n */\nexport const getLiveRunPaperEquity = <ThrowOnError extends boolean = false>(\n options: Options<GetLiveRunPaperEquityData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetLiveRunPaperEquityResponse,\n GetLiveRunPaperEquityError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/{runId}/paper/equity\",\n ...options,\n });\n};\n\n/**\n * Mint a WebSocket connection token\n * Mints a short-lived token for the WebSocket connection used to receive a run's signals in\n * real time and to call `live.params` (the WebSocket form of `PUT /live/{runId}/params`) —\n * see the \"Live execution\" guide linked from this tag's description for the full protocol.\n * Carries no request body.\n *\n */\nexport const mintLiveConnectionToken = <ThrowOnError extends boolean = false>(\n options?: Options<MintLiveConnectionTokenData, ThrowOnError>\n) => {\n return (options?.client ?? _heyApiClient).post<\n MintLiveConnectionTokenResponse,\n unknown,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/token\",\n ...options,\n });\n};\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/generated/client.gen.ts","../src/generated/sdk.gen.ts"],"sourcesContent":["// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { ClientOptions } from \"./types.gen\";\nimport {\n type Config,\n type ClientOptions as DefaultClientOptions,\n createClient,\n createConfig,\n} from \"@hey-api/client-fetch\";\n\n/**\n * The `createClientConfig()` function will be called on client initialization\n * and the returned object will become the client's initial configuration.\n *\n * You may want to initialize your client this way instead of calling\n * `setConfig()`. This is useful for example if you're using Next.js\n * to ensure your client always has the correct values.\n */\nexport type CreateClientConfig<T extends DefaultClientOptions = ClientOptions> =\n (\n override?: Config<DefaultClientOptions & T>\n ) => Config<Required<DefaultClientOptions> & T>;\n\nexport const client = createClient(\n createConfig<ClientOptions>({\n baseUrl: \"https://api.qtsurfer.net/v1\",\n })\n);\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type {\n Options as ClientOptions,\n TDataShape,\n Client,\n} from \"@hey-api/client-fetch\";\nimport type {\n AuthenticateData,\n AuthenticateResponse,\n AuthenticateError,\n GetAccountData,\n GetAccountResponse,\n GetAccountUsageData,\n GetAccountUsageResponse,\n ListExchangesData,\n ListExchangesResponse,\n ListInstrumentsData,\n ListInstrumentsResponse,\n ListInstrumentsError,\n ListSegmentInstrumentsData,\n ListSegmentInstrumentsResponse,\n ListSegmentInstrumentsError,\n DownloadTickersData,\n DownloadTickersResponse,\n DownloadTickersError,\n DownloadKlinesData,\n DownloadKlinesResponse,\n DownloadKlinesError,\n ListStrategiesData,\n ListStrategiesResponse,\n CompileStrategyData,\n CompileStrategyResponse,\n CompileStrategyError,\n ValidateStrategyData,\n ValidateStrategyResponse,\n ValidateStrategyError,\n DeleteStrategyData,\n DeleteStrategyResponse,\n DeleteStrategyError,\n GetStrategyData,\n GetStrategyResponse,\n GetStrategyError,\n GetStrategyCodeData,\n GetStrategyCodeResponse,\n GetStrategyCodeError,\n PrepareBacktestData,\n PrepareBacktestResponse,\n PrepareBacktestError,\n GetPrepareStatusData,\n GetPrepareStatusResponse,\n GetPrepareStatusError,\n ExecuteSweepData,\n ExecuteSweepResponse,\n ExecuteSweepError,\n CancelSweepData,\n CancelSweepResponse,\n CancelSweepError,\n GetSweepResultData,\n GetSweepResultResponse,\n GetSweepResultError,\n GetSweepSensitivityData,\n GetSweepSensitivityResponse,\n GetSweepSensitivityError,\n GetSweepRunEquityCurveData,\n GetSweepRunEquityCurveResponse,\n GetSweepRunEquityCurveError,\n ExecuteBacktestData,\n ExecuteBacktestResponse,\n ExecuteBacktestError,\n CancelBacktestData,\n CancelBacktestResponse,\n CancelBacktestError,\n GetBacktestResultData,\n GetBacktestResultResponse,\n GetBacktestResultError,\n ListDatasetsData,\n ListDatasetsResponse,\n CreateDatasetData,\n CreateDatasetResponse,\n CreateDatasetError,\n DeleteDatasetData,\n DeleteDatasetResponse,\n DeleteDatasetError,\n GetDatasetData,\n GetDatasetResponse,\n GetDatasetError,\n OpenDatasetUploadData,\n OpenDatasetUploadResponse,\n OpenDatasetUploadError,\n FinalizeDatasetUploadData,\n FinalizeDatasetUploadResponse,\n FinalizeDatasetUploadError,\n GetDatasetUploadData,\n GetDatasetUploadResponse,\n GetDatasetUploadError,\n ImportDatasetData,\n ImportDatasetResponse,\n ImportDatasetError,\n GetDatasetImportData,\n GetDatasetImportResponse,\n GetDatasetImportError,\n StopLiveData,\n StopLiveResponse,\n StopLiveError,\n GetLiveData,\n GetLiveResponse,\n GetLiveError,\n StartLiveData,\n StartLiveResponse,\n StartLiveError,\n ListLiveData,\n ListLiveResponse,\n ListLiveError,\n ListPublicLiveData,\n ListPublicLiveResponse,\n ListPublicLiveError,\n GetLiveRunData,\n GetLiveRunResponse,\n GetLiveRunError,\n UpdateLiveData,\n UpdateLiveResponse,\n UpdateLiveError,\n UpdateLiveParamsData,\n UpdateLiveParamsResponse,\n UpdateLiveParamsError,\n SendLiveCommandData,\n SendLiveCommandResponse,\n SendLiveCommandError,\n RevokeLiveStreamData,\n RevokeLiveStreamResponse,\n RevokeLiveStreamError,\n RotateLiveStreamData,\n RotateLiveStreamResponse,\n RotateLiveStreamError,\n GetLiveRunSignalsData,\n GetLiveRunSignalsResponse,\n GetLiveRunSignalsError,\n GetLiveRunPaperData,\n GetLiveRunPaperResponse,\n GetLiveRunPaperError,\n GetLiveRunPaperEquityData,\n GetLiveRunPaperEquityResponse,\n GetLiveRunPaperEquityError,\n MintLiveConnectionTokenData,\n MintLiveConnectionTokenResponse,\n} from \"./types.gen\";\nimport { client as _heyApiClient } from \"./client.gen\";\n\nexport type Options<\n TData extends TDataShape = TDataShape,\n ThrowOnError extends boolean = boolean\n> = ClientOptions<TData, ThrowOnError> & {\n /**\n * You can provide a client instance returned by `createClient()` instead of\n * individual options. This might be also useful if you want to implement a\n * custom client.\n */\n client?: Client;\n /**\n * You can pass arbitrary values through the `meta` object. This can be\n * used to access values that aren't defined as part of the SDK function.\n */\n meta?: Record<string, unknown>;\n};\n\n/**\n * Exchange API key for a short-lived JWT\n * Exchanges a long-lived API key for a short-lived JWT used by every other\n * endpoint. This is the only endpoint that accepts an API key directly —\n * callers should obtain a JWT here, then send it as `Authorization: Bearer\n * <token>` to all other operations.\n *\n * The returned JWT carries the caller's subscription `tier` as a claim and\n * expires after `expires_in` seconds. Callers should refresh the token\n * before expiry (or on a `401` response) by calling this endpoint again.\n *\n */\nexport const authenticate = <ThrowOnError extends boolean = false>(\n options?: Options<AuthenticateData, ThrowOnError>\n) => {\n return (options?.client ?? _heyApiClient).post<\n AuthenticateResponse,\n AuthenticateError,\n ThrowOnError\n >({\n security: [\n {\n name: \"X-API-Key\",\n type: \"apiKey\",\n },\n ],\n url: \"/auth/token\",\n ...options,\n });\n};\n\n/**\n * Get your account's identity and tier limits\n * Your userId, current tier, and that tier's limits — no database call, safe to fetch on\n * every page load. For live usage against these limits, see `_links.usage`\n * (`GET /account/usage`).\n *\n */\nexport const getAccount = <ThrowOnError extends boolean = false>(\n options?: Options<GetAccountData, ThrowOnError>\n) => {\n return (options?.client ?? _heyApiClient).get<\n GetAccountResponse,\n unknown,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/account\",\n ...options,\n });\n};\n\n/**\n * Get your live storage usage\n * How much of your account's shared storage pool (`GET /account`'s `maxTotalStorageBytes`)\n * you're currently using. Datasets, strategy-execution signals, and registered strategies\n * all count against the same total — they compete for the same underlying storage, so\n * there's one number to watch, not one per resource type. Not guaranteed real-time — a\n * just-completed upload or strategy execution may take a short moment to be reflected here.\n *\n */\nexport const getAccountUsage = <ThrowOnError extends boolean = false>(\n options?: Options<GetAccountUsageData, ThrowOnError>\n) => {\n return (options?.client ?? _heyApiClient).get<\n GetAccountUsageResponse,\n unknown,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/account/usage\",\n ...options,\n });\n};\n\n/**\n * List the available exchanges\n */\nexport const listExchanges = <ThrowOnError extends boolean = false>(\n options?: Options<ListExchangesData, ThrowOnError>\n) => {\n return (options?.client ?? _heyApiClient).get<\n ListExchangesResponse,\n unknown,\n ThrowOnError\n >({\n url: \"/exchanges\",\n ...options,\n });\n};\n\n/**\n * List an exchange's instruments (default spot segment)\n * \"Give me binance instruments\" — returns the exchange's DEFAULT segment (`spot`)\n * in `data`, each instrument with per-data-type coverage and market info. `meta`\n * confirms the served `segment` (`spot`); HAL `_links` carry `self` plus the\n * `spot` / `futures` segment-discovery links.\n *\n */\nexport const listInstruments = <ThrowOnError extends boolean = false>(\n options: Options<ListInstrumentsData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n ListInstrumentsResponse,\n ListInstrumentsError,\n ThrowOnError\n >({\n url: \"/exchange/{exchangeId}/instruments\",\n ...options,\n });\n};\n\n/**\n * List an exchange segment's instruments\n * Returns the instruments for one market segment of the exchange, each with\n * per-data-type coverage and market info. HAL `_links` carry `self` plus the\n * `spot` / `futures` segment-discovery links; the default-segment shortcut is\n * `GET /exchange/{exchangeId}/instruments` (spot).\n *\n */\nexport const listSegmentInstruments = <ThrowOnError extends boolean = false>(\n options: Options<ListSegmentInstrumentsData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n ListSegmentInstrumentsResponse,\n ListSegmentInstrumentsError,\n ThrowOnError\n >({\n url: \"/exchange/{exchangeId}/{segment}/instruments\",\n ...options,\n });\n};\n\n/**\n * Download one hour of tickers for an instrument as a Lastra segment\n * Serves exactly one hour of raw ticker data for the given instrument on the\n * requested exchange. The payload is a native [Lastra](https://github.com/QTSurfer/lastra-java)\n * file — QTSurfer's columnar format for tick-precision timeseries — with\n * no JSON envelope.\n *\n * One segment = one hour, aligned to UTC. The `hour` query parameter selects\n * the segment and must match `YYYY-MM-DDTHH` (no minutes/seconds, no timezone\n * suffix). Example: `hour=2026-01-15T10` returns `h10.lastra` for\n * 2026-01-15, covering `[10:00:00Z, 11:00:00Z)`. Hours not yet available\n * return `404`.\n *\n * A `format=parquet` query parameter switches the response to on-the-fly\n * Parquet conversion via [lastra-convert](https://github.com/QTSurfer/lastra-convert)\n * for clients that don't yet read Lastra. Lastra is the primary format\n * and cheaper when the client can consume it.\n *\n * Clients:\n * - [lastra-java](https://github.com/QTSurfer/lastra-java) — reference\n * Java reader/writer with per-column codecs (ALP, Gorilla, delta-varint,\n * ZSTD) and CRC32 integrity.\n * - [lastra-ts](https://github.com/QTSurfer/lastra-ts) — TypeScript reader\n * (~4 kB bundle, browser + Node.js).\n * - [duckdb-lastra](https://github.com/QTSurfer/duckdb-lastra) — DuckDB\n * extension for ad-hoc SQL over Lastra files.\n * - [lastra-convert](https://github.com/QTSurfer/lastra-convert) — CLI + Java\n * API for converting to/from Parquet, Reef, and CSV.\n * - `curl -OJ` for offline dumps (the `Content-Disposition` header sets a\n * descriptive filename).\n *\n */\nexport const downloadTickers = <ThrowOnError extends boolean = false>(\n options: Options<DownloadTickersData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n DownloadTickersResponse,\n DownloadTickersError,\n ThrowOnError\n >({\n url: \"/exchange/{exchangeId}/tickers/{base}/{quote}\",\n ...options,\n });\n};\n\n/**\n * Download one hour of klines for an instrument as a Lastra segment\n * Same shape and semantics as `/exchange/{exchangeId}/tickers/{base}/{quote}`,\n * but serves klines (aggregated bars) instead of raw ticks. One\n * [Lastra](https://github.com/QTSurfer/lastra-java) segment = one hour of\n * klines at the exchange's native kline cadence, aligned to UTC.\n *\n * Klines use the same columnar layout as tickers — readers that handle one\n * format read the other with the same code. Use this endpoint when a\n * per-tick payload would be too large for the window of interest.\n *\n */\nexport const downloadKlines = <ThrowOnError extends boolean = false>(\n options: Options<DownloadKlinesData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n DownloadKlinesResponse,\n DownloadKlinesError,\n ThrowOnError\n >({\n url: \"/exchange/{exchangeId}/klines/{base}/{quote}\",\n ...options,\n });\n};\n\n/**\n * List your registered strategies\n * Every strategy you have registered and not deleted, most recently compiled first.\n *\n * Each entry carries the same provenance `GET /strategy/{strategyId}` does — `compiledAt`,\n * `requiredSources` — but not its validation state, so listing stays cheap regardless of how\n * many strategies you have. Check a specific strategy's validation with `GET\n * /strategy/{strategyId}`.\n *\n * With `includeDeleted=true`, strategies you have deleted are listed too, each with the\n * `deletedAt` it was deleted at — useful to keep a copy of your list in sync, telling a\n * deleted strategy apart from one that never existed.\n *\n */\nexport const listStrategies = <ThrowOnError extends boolean = false>(\n options?: Options<ListStrategiesData, ThrowOnError>\n) => {\n return (options?.client ?? _heyApiClient).get<\n ListStrategiesResponse,\n unknown,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/strategies\",\n ...options,\n });\n};\n\n/**\n * Compile and register a strategy\n * Compiles raw strategy source and registers it, returning its `strategyId`.\n *\n * The source is either **Java** — a class extending a strategy base class — or **QTScript**\n * (beta), a compact strategy language whose braced bodies are plain Java. QTScript source\n * begins with the `strategy` keyword — whitespace and line or block comments before it\n * are ignored — and that is how the two are told apart: there is no separate endpoint and\n * no header to set. Once registered, a strategy is used the same way\n * whichever language it was written in.\n *\n * **This answers one question: is the source valid.** It compiles, registers, and hands\n * back the id — nothing more. Whether the class can actually run is\n * `POST /strategy/{strategyId}/validate`, and everything known about a strategy, validation\n * included, is read from `GET /strategy/{strategyId}`. One place to ask, so there is no second\n * answer to keep in step.\n *\n * A `200` means the source parsed and compiled, not that it will run. What only shows once the\n * strategy sets up its indicators is found by `validate`: for QTScript, a window on an indicator\n * name that is not registered (`window nosuch m1 { ... }`) registers, and `validate` ends `failed`\n * on that line.\n *\n * For **Java**, the `strategyId` is derived from what the code *means*, not from how it is\n * written. Adding a comment, inserting a blank line, re-indenting, reordering imports, or\n * moving a method around all return the **same** id — you have not created a second strategy.\n * Renaming a variable, changing an identifier's case, reordering fields, or reordering\n * statements inside a method return a **different** one.\n *\n * For **QTScript**, the id is derived from the text, because indentation is part of its\n * grammar. Only differences that cannot change the strategy are ignored: a byte-order mark, the\n * style of line endings, whitespace at the end of a line, and blank lines before the first and\n * after the last line. Anything else — a comment, the indentation, a blank line in between —\n * returns a **different** id.\n *\n * Two rules follow, and they are worth designing around:\n *\n * - re-submitting a Java strategy you have only reformatted is free, and gives you back the id\n * you already had, along with any validation already recorded against it;\n * - the id says nothing about *behaviour*. Two sources that compute the same thing by\n * different means are two strategies, because deciding otherwise would mean deciding program\n * equivalence.\n *\n * The response also lists `declaredProperties` — the sweep/execute param keys this strategy\n * is known to accept, so a caller can catch a typo'd key before submitting a sweep instead of\n * only learning it from a rejected one. See `DeclaredProperty`: best-effort, not exhaustive.\n *\n */\nexport const compileStrategy = <ThrowOnError extends boolean = false>(\n options: Options<CompileStrategyData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n CompileStrategyResponse,\n CompileStrategyError,\n ThrowOnError\n >({\n bodySerializer: null,\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/strategy\",\n ...options,\n headers: {\n \"Content-Type\": \"text/plain\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * Check that a registered strategy can actually run\n * Instantiates the compiled class and drives it through a bounded synthetic series, so a wiring\n * fault surfaces here instead of at your first backtest. The verdict — pass or fail, plus any\n * engine notices — is recorded and served from `GET /strategy/{strategyId}`.\n *\n * **Idempotent.** If a verdict already exists for the current compilation it comes straight\n * back with `200` and nothing is queued. Otherwise the check is queued and this returns `202`;\n * poll `GET /strategy/{strategyId}` until `validation` is `passed` or `failed`.\n *\n * Recompiling supersedes a verdict, which makes this callable again — the old answer described\n * bytecode that is no longer what would run.\n *\n */\nexport const validateStrategy = <ThrowOnError extends boolean = false>(\n options: Options<ValidateStrategyData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n ValidateStrategyResponse,\n ValidateStrategyError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/strategy/{strategyId}/validate\",\n ...options,\n });\n};\n\n/**\n * Release a registered strategy\n * Removes a strategy from `GET /strategy/{strategyId}` and `GET /strategies`. This is not\n * undone by re-submitting the same source to `POST /strategy` — that registers a new\n * strategy, with a new id.\n *\n * **Backtests you already ran against this strategy are unaffected.** Deleting it stops it\n * from counting against your account and stops you from validating or re-running it under\n * this id — it does not erase what already happened.\n *\n * Only removes a strategy you registered yourself. If you copied someone else's strategy\n * (a shared/marketplace listing), deleting your copy never affects theirs, or anyone else's.\n *\n */\nexport const deleteStrategy = <ThrowOnError extends boolean = false>(\n options: Options<DeleteStrategyData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).delete<\n DeleteStrategyResponse,\n DeleteStrategyError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/strategy/{strategyId}\",\n ...options,\n });\n};\n\n/**\n * Get a strategy by id, including its validation state\n * Reports that the strategy is registered — implied by a `200` at all — and what validating it\n * found.\n *\n * A `404` means one thing: no such registered strategy for this user. It is never a stale or\n * expired answer; registration and verdict are stored durably, not cached.\n *\n */\nexport const getStrategy = <ThrowOnError extends boolean = false>(\n options: Options<GetStrategyData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetStrategyResponse,\n GetStrategyError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/strategy/{strategyId}\",\n ...options,\n });\n};\n\n/**\n * Get a registered strategy's source, if you still have one to read\n * The exact source you last submitted for this id — the same text `POST /strategy` derives\n * `strategyId` from, whitespace and comments included.\n *\n * **\"If available\", not \"always\".** A strategy you resolve only through a shared/marketplace\n * listing you copied by reference carries no source of its own, and reads as a `404` here the\n * same as a `strategyId` you never registered — that is the honest answer either way, since\n * from this endpoint's point of view nothing is there to return.\n *\n */\nexport const getStrategyCode = <ThrowOnError extends boolean = false>(\n options: Options<GetStrategyCodeData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetStrategyCodeResponse,\n GetStrategyCodeError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/strategy/{strategyId}/code\",\n ...options,\n });\n};\n\n/**\n * Prepare backtest data\n * Enqueues a prepare task over the requested date range. Returns immediately with a `jobId`;\n * poll `GET /backtest/{exchangeId}/{type}/prepare/{jobId}` for completion.\n *\n * The same params always return the same `jobId` (idempotent). Repeated calls with identical\n * params do not enqueue duplicate work — they reuse the existing job.\n *\n * Every source in `DataSourceType` can be prepared, but not every one can then be run: `funding`\n * data can be prepared and is rejected by `execute` and `executeSweep`. A `kline` prepare takes\n * the bar width from `cadence` — see `PrepareRequest`.\n *\n * **`exchangeId: user` is reserved for your own uploaded data.** Instead of a managed\n * exchange, it prepares from a dataset you created via `POST /datasets` (see the **Dataset**\n * endpoints) — send `datasetId` in place of `instrument`. See `PrepareRequest` below for the\n * two request shapes.\n *\n */\nexport const prepareBacktest = <ThrowOnError extends boolean = false>(\n options: Options<PrepareBacktestData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n PrepareBacktestResponse,\n PrepareBacktestError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/prepare\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * Get the status of a prepare job\n * Retrieves the current state of the prepare job identified by `jobId`.\n * Poll until `status` is `Completed`, `Failed`, or `Aborted`.\n *\n * For a dataset prepare (`exchangeId: user`), coverage is reported against the dataset's own\n * cadence grid instead of hours — see `cadence`/`gaps`/`largestGapSteps` on `PrepareJobState`.\n *\n */\nexport const getPrepareStatus = <ThrowOnError extends boolean = false>(\n options: Options<GetPrepareStatusData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetPrepareStatusResponse,\n GetPrepareStatusError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/prepare/{jobId}\",\n ...options,\n });\n};\n\n/**\n * Execute a parameter sweep over prepared data\n * Runs a parameter matrix over the single immutable dataset identified by `requestId`.\n * The backend expands and executes the matrix internally; clients poll the returned\n * `sweepId` for incremental results.\n *\n * `type` must be `ticker` or `kline`; a `kline` sweep, walk-forward included, runs over bars of\n * the cadence the request was prepared at. `funding` can be prepared but not swept yet: it is\n * rejected with `400` before anything is queued.\n *\n * Supplying `walkForward` runs the sweep in a different mode entirely. Instead of scoring\n * every parameter vector once over the whole range, the data is split into F sequential\n * folds; each fold optimizes the full grid on its own window and then scores only its winner\n * on the window immediately after — data that winner was not chosen on. It answers a harder\n * question than a leaderboard: not \"which parameters won\", but \"does re-optimizing this\n * periodically actually work\". Omit the block and nothing changes, including the response.\n *\n * The cost is the reason it is opt-in rather than always on: F folds × N vectors, so a\n * 4-fold run over a 500-point grid is 2004 backtests where the plain sweep is 500. The\n * request is rejected when `folds × totalRuns` exceeds the server's sweep budget.\n *\n */\nexport const executeSweep = <ThrowOnError extends boolean = false>(\n options: Options<ExecuteSweepData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n ExecuteSweepResponse,\n ExecuteSweepError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/executeSweep/{requestId}\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * Cancel a running parameter sweep\n * Requests cancellation between parameter vectors. Completed rows remain readable.\n *\n * Cancelling is a request, not a stop: the sweep reports `status: CANCELLED` (and\n * `state.status: Aborted`) as soon as the request is accepted, while runs that were already\n * in flight are still finishing. Until they have, `progress.pendingShards` is above `0`, and\n * `progress.done` and the leaderboard can still grow after `CANCELLED` is first seen. A client\n * that needs the final set of rows, to store them or to mark the rest as not run, keeps\n * reading until `progress.pendingShards` is `0`; the wait is bounded by how long one run\n * takes.\n *\n */\nexport const cancelSweep = <ThrowOnError extends boolean = false>(\n options: Options<CancelSweepData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).delete<\n CancelSweepResponse,\n CancelSweepError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/executeSweep/{requestId}/{sweepId}\",\n ...options,\n });\n};\n\n/**\n * Get sweep progress and results\n * Returns incremental sweep progress. The default `ranked` view sorts and may truncate the\n * display leaderboard. `order=natural` returns every available row, untruncated, ordered by\n * deterministic `runIx`; use that view when materialising durable trial rows.\n *\n * The `ranked` view is ordered by **plateau score** by default, not by the raw objective. A\n * plateau score is the objective of the worst run in a parameter point's immediate\n * neighbourhood, so a point scores well only if the region around it also does — the highest\n * raw score is frequently a spike that does not survive the parameters moving slightly. Pass\n * `ranking=raw` for the unadjusted objective order.\n *\n * Rows in the `ranked` view carry `plateauScore` and `neighbourCount` when plateau ranking\n * applied. Read them together: `neighbourCount: 0` means the point had no neighbours to\n * compare against, so its plateau score is unevidenced rather than confirmed. Sweeps\n * submitted before plateau ranking existed have no stored parameter grid to rebuild a\n * neighbourhood from and are always ranked raw; the response's `ranking` field says which\n * ordering was actually used.\n *\n * A sweep submitted with `walkForward` answers in a different shape, and the `walkForward`\n * field on the response is what tells the two apart — it appears as soon as the sweep is\n * accepted, before any fold has finished, so it is safe to branch on while polling. There\n * the leaderboard is one row per completed fold: that fold's winner as it scored\n * **out-of-sample**, with `runIx` carrying the fold index rather than a grid position. The\n * in-sample runs behind those winners are not retained — they are an optimization's working\n * set, and only the winner survives its fold. `ranking` is always `raw` and no plateau, DSR\n * or PBO figure is reported: the out-of-sample scores are already the honest number, and\n * layering a certification computed over F observations on top of them would overstate what\n * was measured.\n *\n */\nexport const getSweepResult = <ThrowOnError extends boolean = false>(\n options: Options<GetSweepResultData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetSweepResultResponse,\n GetSweepResultError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/executeSweep/{requestId}/{sweepId}\",\n ...options,\n });\n};\n\n/**\n * Get sweep sensitivity surfaces\n * How the objective moves as each parameter moves — the question a leaderboard cannot answer.\n * A leaderboard says which point won; a sweep can spend its entire budget on an axis that\n * never moved the objective at all, and showing only the top rows hides that completely.\n *\n * A **marginal** takes one axis and collapses every other one: for each value of that axis,\n * it aggregates every run that used it, whatever the rest of the parameters were. A flat\n * marginal means the axis is irrelevant over the range swept. `best`, `mean` and `worst` are\n * all reported because them disagreeing is itself the signal — a value with a high `best` and\n * a poor `mean` works only in specific company, which is an interaction between parameters\n * and would be invisible behind a single number.\n *\n * A **heatmap** does the same over a pair of axes, where that interaction becomes visible\n * directly.\n *\n * Served from the sweep's stored rows: no re-run, no engine call, and it works on a sweep\n * still in flight — the aggregates then describe the runs finished so far. Aborted runs are\n * excluded throughout, since a run that threw measured nothing and counting it as a bad\n * outcome would invent evidence against a parameter value that was never really tested.\n *\n * This is a separate endpoint rather than extra fields on the result view because the\n * two-dimensional half is quadratic in the axis count (N axes give N(N-1)/2 surfaces, each\n * the product of two axes' value counts) and is not wanted on the poll that drives progress.\n *\n */\nexport const getSweepSensitivity = <ThrowOnError extends boolean = false>(\n options: Options<GetSweepSensitivityData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetSweepSensitivityResponse,\n GetSweepSensitivityError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/executeSweep/{requestId}/{sweepId}/sensitivity\",\n ...options,\n });\n};\n\n/**\n * Get one sweep trial's equity curve\n * The resource a leaderboard row's `equityCurve.url` points at — only reachable when that\n * trial's curve was actually selected (`equityCurve.mode: topN` or `topPct` on the sweep\n * submission, and this trial ranked among the winners). Returns the exact same\n * `{points|timestamps+equities, meta}` shape a plain backtest's inline `equityCurve` carries.\n *\n * Query params reshape the response the same way a plain backtest's `equityCurve` options do.\n * A param genuinely absent from the query string falls back to the `equityCurve` transform\n * preference the sweep was submitted with — a param\n * present but malformed does not fall back, it degrades the same way it always has. Above a\n * server-side size threshold, the shape is forced regardless of either — `meta.outMode` in\n * the response, not the query string or the submitted default, is the source of truth for\n * what shape actually came back.\n *\n */\nexport const getSweepRunEquityCurve = <ThrowOnError extends boolean = false>(\n options: Options<GetSweepRunEquityCurveData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetSweepRunEquityCurveResponse,\n GetSweepRunEquityCurveError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/executeSweep/{requestId}/{sweepId}/runs/{runIx}/equityCurve\",\n ...options,\n });\n};\n\n/**\n * Execute a compiled strategy against a prepared dataset\n * Enqueues an execute task that runs the strategy identified by `strategyId` over the data\n * prepared by the prepare job identified by `prepareJobId`. The instrument and date range are\n * recovered from the prepare job — they do not need to be sent again.\n *\n * Returns immediately with a `jobId`; poll `GET /backtest/{exchangeId}/{type}/execute/{jobId}`\n * for the result.\n *\n * `type` must be a source that can be executed: `ticker` or `kline`. A `kline` strategy is fed\n * bars of the cadence its `prepareJobId` was prepared at — chosen by you when preparing, not by\n * the strategy. `funding` can be prepared but not executed yet: it is rejected with `400`\n * before anything is queued.\n *\n * Optionally takes `params`: strategy properties for this one run, applied without\n * recompiling. This is how a sweep leaderboard winner gets re-run for its `equityCurve` —\n * a sweep row carries the ten ranking metrics but never a curve, whatever its size. Compile\n * once, call this endpoint N times with different `params`, and each response is an ordinary\n * backtest result with the curve included.\n *\n * The same request (same `prepareJobId`, `strategyId`, `storeSignals`, `equityCurve`,\n * `baseConfig`, `params`) always returns the same `jobId` (idempotent) — a request that omits\n * `equityCurve`, `baseConfig` or `params` dedupes exactly as it did before those fields\n * existed. Two different `params` vectors over one prepare are two different jobs, and `9`\n * and `9.0` are the same one.\n *\n * The re-run is an independent execution rather than a replay of the sweep trial — the two\n * paths do not share a simulator — but they are pinned to agree: one vector run both ways\n * matches on every leaderboard metric, asserted as a regression test. Treat a difference as a\n * bug worth reporting, not as expected behaviour.\n *\n * Optionally takes `baseConfig`, the same `SweepBaseConfig` shape `executeSweep` accepts —\n * `initialFunding`, `feeRate`, `percentAmountToLock`, etc. — so the same object can be reused\n * against either endpoint. This endpoint has one effective fee rate rather than a sweep's\n * independent buy/sell legs: a `baseConfig` that resolves to different buy/sell rates, or sets\n * a non-default `feeLeg`, is rejected with `400` rather than silently collapsed to one side.\n *\n * Works unchanged for a dataset-backed prepare (`exchangeId: user`) — the request body is\n * identical either way, since the instrument and range are recovered from `prepareJobId`.\n *\n */\nexport const executeBacktest = <ThrowOnError extends boolean = false>(\n options: Options<ExecuteBacktestData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n ExecuteBacktestResponse,\n ExecuteBacktestError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/execute\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * Cancel a running backtest execution\n * Requests cancellation of the specified execution. The execution\n * status will transition to `Aborted` once the cancellation is\n * processed. Cancellation is asynchronous — poll the GET endpoint\n * to confirm the final status.\n *\n */\nexport const cancelBacktest = <ThrowOnError extends boolean = false>(\n options: Options<CancelBacktestData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).delete<\n CancelBacktestResponse,\n CancelBacktestError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/execute/{jobId}\",\n ...options,\n });\n};\n\n/**\n * Get the result of a backtest execution job\n * Retrieves the current state and results of the execute job identified by `jobId`.\n * Poll until `state.status` is `Completed`, `Failed`, or `Aborted`.\n *\n * A `202` means the result is not readable yet — keep polling. It is never a terminal\n * outcome, and it carries no `state`, so a poll loop that stops on a terminal status will\n * not stop on it.\n *\n */\nexport const getBacktestResult = <ThrowOnError extends boolean = false>(\n options: Options<GetBacktestResultData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetBacktestResultResponse,\n GetBacktestResultError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/backtest/{exchangeId}/{type}/execute/{jobId}\",\n ...options,\n });\n};\n\n/**\n * List your datasets\n * Every dataset you have created and not deleted, most recently created first. Never a `404`\n * — an empty array if you have none, same convention as `GET /strategies`.\n *\n * With `includeDeleted=true`, datasets you have deleted are listed too, each with the\n * `deletedAt` it was deleted at — useful to keep a copy of your list in sync, telling a\n * deleted dataset apart from one that never existed.\n *\n */\nexport const listDatasets = <ThrowOnError extends boolean = false>(\n options?: Options<ListDatasetsData, ThrowOnError>\n) => {\n return (options?.client ?? _heyApiClient).get<\n ListDatasetsResponse,\n unknown,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/datasets\",\n ...options,\n });\n};\n\n/**\n * Create a dataset and get a URL to upload it to\n * Creates a dataset AND its first upload session in one call — a presigned URL your client\n * PUTs the file to directly, no API credentials involved in that PUT. Call\n * `POST /datasets/{datasetId}/uploads/{uploadId}/finalize` once the upload completes to kick\n * off ingest.\n *\n * Losing this response loses nothing: calling this dataset's\n * `POST /datasets/{datasetId}/uploads` returns the very same upload session again rather than\n * opening a new one, as long as nothing has been finalized against it yet.\n *\n * v1 is ticker data only — `type` is not a request field, it is always `\"ticker\"` in the\n * response. `instrument` must be a plain spot pair (`BASE/QUOTE`, exactly one `/`); derivative\n * forms (e.g. `BTC/USDT:USDT`) are rejected.\n *\n * **Upload format.** A CSV with a header row, a parquet file with the same columns by\n * name, or a lastra file — our own native columnar format, the same one a dataset's\n * `dataUrl` hands back by default, so a downloaded dataset can be handed to another user to\n * upload with no conversion in between. For CSV/parquet, required: `timestamp` (ISO-8601, or\n * numeric epoch seconds/millis/micros — detected from the first row, then enforced for every\n * later row), `close`. Optional: `open`, `high`, `low`, `volume`, `quoteVolume`, `bid`,\n * `bidSize`, `ask`, `askSize`. A lastra upload carries its own fixed column set instead and\n * only needs a timestamp series and a close series present. Cadence and timestamp unit are\n * discovered from the data, not declared, for all three.\n *\n * A CSV upload is converted to our native columnar format (`lastra`) for storage. A parquet\n * or lastra upload is stored as-is today. Either way, always check `dataFormat` on\n * `GET /datasets/{datasetId}` and `GET /datasets/{datasetId}/uploads/{uploadId}` for which\n * one `dataUrl` actually is, rather than assuming from how you uploaded it (a converted CSV\n * and an uploaded lastra file both report `dataFormat: \"lastra\"`).\n *\n * The bytes PUT to `upload.url` may be that file directly, gzipped (`.gz`), or zipped\n * (`.zip`, exactly one file inside — a dataset is one file regardless of how it travels).\n * Format is detected from the decompressed content itself: there is no filename or\n * `Content-Type` anywhere in this flow for a client to declare it with, so nothing needs to\n * be sent besides the bytes.\n *\n */\nexport const createDataset = <ThrowOnError extends boolean = false>(\n options: Options<CreateDatasetData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n CreateDatasetResponse,\n CreateDatasetError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/datasets\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * Delete a dataset\n * Soft-delete — the dataset stops appearing in `GET /datasets`/`GET /datasets/{datasetId}` and\n * can no longer be prepared from, but its object data is reclaimed later rather than purged\n * inline, so a backtest already running against one of its versions is not disrupted.\n *\n */\nexport const deleteDataset = <ThrowOnError extends boolean = false>(\n options: Options<DeleteDatasetData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).delete<\n DeleteDatasetResponse,\n DeleteDatasetError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/datasets/{datasetId}\",\n ...options,\n });\n};\n\n/**\n * Get a dataset by id\n * Detail for one dataset, plus a self link.\n */\nexport const getDataset = <ThrowOnError extends boolean = false>(\n options: Options<GetDatasetData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetDatasetResponse,\n GetDatasetError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/datasets/{datasetId}\",\n ...options,\n });\n};\n\n/**\n * Open a new upload session for an existing dataset\n * Get a fresh presigned URL to upload a new version into a dataset you already have — a\n * corrected file, or the next chunk of history. Behaves the same way `POST /datasets` does\n * for a brand-new dataset's own upload: at most one upload session is open per dataset at a\n * time, so calling this again before finalizing just hands back that same session rather\n * than opening a second one — safe to call repeatedly if a response gets lost.\n *\n * Once a session has been finalized (successfully or not), the next call here opens a\n * genuinely new one for that dataset's next version.\n *\n */\nexport const openDatasetUpload = <ThrowOnError extends boolean = false>(\n options: Options<OpenDatasetUploadData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n OpenDatasetUploadResponse,\n OpenDatasetUploadError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/datasets/{datasetId}/uploads\",\n ...options,\n });\n};\n\n/**\n * Finalize an uploaded file and start ingest\n * Call once the file has been PUT to the `upload.url` from `POST /datasets` (or from\n * `POST /datasets/{datasetId}/uploads`). Enqueues ingest and returns immediately; poll\n * `GET /datasets/{datasetId}/uploads/{uploadId}` for the result.\n *\n * Idempotent while the upload is still open — a repeat finalize before it has produced a\n * version returns the same `jobId` rather than enqueueing a second ingest. Once it HAS\n * produced a version, `uploadId` is spent: finalizing it again is a `409`, even with\n * different bytes freshly PUT to the same URL — open a new upload session instead\n * (`POST /datasets/{datasetId}/uploads`) rather than reusing a spent one.\n *\n */\nexport const finalizeDatasetUpload = <ThrowOnError extends boolean = false>(\n options: Options<FinalizeDatasetUploadData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n FinalizeDatasetUploadResponse,\n FinalizeDatasetUploadError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/datasets/{datasetId}/uploads/{uploadId}/finalize\",\n ...options,\n });\n};\n\n/**\n * Get the state of an upload/ingest\n * Poll after `POST .../finalize` until `status` is `ready` or `failed`. Also reports\n * `uploading` (finalize not called yet, but the file was PUT) before you finalize at all.\n *\n */\nexport const getDatasetUpload = <ThrowOnError extends boolean = false>(\n options: Options<GetDatasetUploadData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetDatasetUploadResponse,\n GetDatasetUploadError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/datasets/{datasetId}/uploads/{uploadId}\",\n ...options,\n });\n};\n\n/**\n * Create a dataset by importing history instead of uploading it\n * A second way to get data into a dataset, alongside `POST /datasets`: instead of `PUT`ting a\n * file yourself, ask the API to go fetch history on your behalf. Creates the dataset and\n * starts the fetch in the same call — there is no separate upload step, and the result lands\n * as a dataset version indistinguishable from an uploaded one once it's ready. Poll\n * `GET /datasets/{datasetId}/imports/{importId}` for progress.\n *\n * `type` selects the source. `dex` — history over a pool/pair's own on-chain market — is the\n * only value today; other source types join this same endpoint later.\n *\n * A `dex` import has two data shapes, chosen by the top-level `cadence`:\n *\n * * Omitted/blank (default) — on-chain swap history, replayed directly from the pool/pair's\n * own chain. Cadence is native, not resampled: each swap keeps the timestamp it happened\n * at rather than being bucketed into candles, so the resulting version's `cadence` is `rt`\n * unless the swaps happen to sit on a fixed grid (see `DatasetVersion.cadence`).\n * * One of `1s` / `1m` / `5m` — pre-aggregated candles at that width instead of raw trades.\n * The resulting dataset's `type` is `klines`, not `ticker`. Not every network supports every\n * cadence yet — an unsupported combination fails asynchronously, same as an unresolvable\n * pool (see the `failed` status on the poll endpoint below).\n *\n */\nexport const importDataset = <ThrowOnError extends boolean = false>(\n options: Options<ImportDatasetData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n ImportDatasetResponse,\n ImportDatasetError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/datasets/imports\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * Get the state of an import/ingest\n * Poll after `POST /datasets/imports` until `status` is `ready` or `failed`. An import spends\n * real time fetching from its source before anything is even staged — `fetching` is the one\n * status only an import ever reports; `ingesting`/`ready`/`failed` mean exactly what they do\n * on `GET /datasets/{datasetId}/uploads/{uploadId}`, since an import re-enters that same\n * ingest chain once it has fetched and staged its data.\n *\n */\nexport const getDatasetImport = <ThrowOnError extends boolean = false>(\n options: Options<GetDatasetImportData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetDatasetImportResponse,\n GetDatasetImportError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/datasets/{datasetId}/imports/{importId}\",\n ...options,\n });\n};\n\n/**\n * Stop this strategy's live run\n * Requests a stop. The run winds down at its own next check-in rather than instantly —\n * poll `GET`/`PATCH` `.../live` and expect `state` to remain `RUNNING` for a short window\n * after `desired` flips to `STOPPED`. Calling this again on an already-stopped run is not an\n * error; it returns the same (unchanged) state. A stopped run has no stream: its `streamUrl`, if it had one,\n * stops working and is not in this response.\n *\n */\nexport const stopLive = <ThrowOnError extends boolean = false>(\n options: Options<StopLiveData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).delete<\n StopLiveResponse,\n StopLiveError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/strategy/{strategyId}/live\",\n ...options,\n });\n};\n\n/**\n * Get this strategy's current (or most recent) live run\n * The run you last started for this strategy — its most complete state, including `params`\n * and the promotion `gate` once the sandbox trial has one to report. Returns the run's last\n * known state even after it has stopped; this endpoint never disappears history. When the run was started\n * with a `stream`, `streamUrl` is here too while the run is running and your plan allows it.\n *\n * While the run is being executed it also carries `stats`, the run's latest counters (updates\n * processed, rate, instruments seen), refreshed about once a minute. Starting or stopping a run\n * does not return them; read them here.\n *\n */\nexport const getLive = <ThrowOnError extends boolean = false>(\n options: Options<GetLiveData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetLiveResponse,\n GetLiveError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/strategy/{strategyId}/live\",\n ...options,\n });\n};\n\n/**\n * Start a strategy on a live market feed\n * Starts your strategy against a live market feed. A new run always begins in the **sandbox**\n * stage — a short trial that compares an independent second execution against the first for\n * agreement — before it is eligible for promotion to the live stage where it actually\n * publishes signals other systems can act on. Poll `GET /strategy/{strategyId}/live` (or\n * `PATCH`/`DELETE` `/live/{runId}` once you have the `runId`) to watch `stage` move from\n * `SANDBOX` to `LIVE`.\n *\n * Only one run per strategy at a time — starting again while one is already running is `409`;\n * stop the current one first.\n *\n * `sources` takes exactly one entry today (multi-source strategies are not supported yet).\n * `type` is `ticker` or `kline`; anything else is rejected. Both connect to the lightest\n * (fastest) cadence available for the exchange — today that is 1 tick/second on every\n * supported exchange; choosing among several cadences is not offered yet.\n *\n * `instruments` can be left out. A QTScript strategy can declare which instruments it accepts with an `instruments`\n * line in its source; when the compilation of the strategy records that selection as a list of pairs, a\n * start that leaves `instruments` out, or sends `[\"*\"]`, takes that list, and otherwise the run reads every\n * instrument the exchange/segment offers. A list you send is taken as sent. Either side of an entry can be `*`\n * (any base paired with USDT). The instruments the run reads come back in `sources`. See the \"Live execution\" guide, \"Sources\".\n *\n * `params` is passed straight through to the strategy at start — the same free-form object\n * `POST /strategy/{strategyId}/validate` and the backtest endpoints already accept. To change\n * a parameter **while the run is live**, use `PUT /live/{runId}/params` instead; this endpoint\n * only sets the values a run starts with.\n *\n * Consuming a run's own output — its signals, and updating its parameters over a live\n * connection instead of polling — is a WebSocket protocol on top of these REST endpoints; see\n * the \"Live execution\" guide linked from this tag's description for the full flow (minting a\n * connection token, the channel and RPC method).\n *\n * **Paper trading.** Pass a `paper` block to have the run's hints executed in simulation from\n * its first tick, as a backtest would execute them: fills, closed trades, equity and KPIs,\n * with one simulated account per quote currency. Omitted, the run has no paper trading. It\n * takes the same economics as a backtest's `baseConfig` plus where its output goes; read it\n * back with `GET /live/{runId}/paper`. A strategy that listens to its own execution events\n * (it overrides `getExecutionCallback()`) has no other execution venue, so it cannot start\n * without a `paper` block.\n *\n * **Warming up.** Pass `warmFrom` to choose how many seconds before its start the run replays the market\n * feed from, so that its indicators and windows have history when the first live tick arrives. `0` replays\n * nothing: the run delivers its first signal as soon as it is running, but its indicators start empty and the\n * first bar of a window can be partial. Omitted, the platform replays from the start of the current 15-minute\n * block, which is between 0 and 900 seconds before the run's start, so the first bar of a 15-minute window is\n * complete. The value in effect, yours or the platform's, comes back as `warmFrom`. It can be set only here,\n * when the run is started. See the \"Live execution\" guide, \"Warming up\".\n *\n * **A plain WebSocket stream.** Pass `stream: true` to get a secret URL for this run's signals that a simple\n * client, or a service that passes them on to others, can open as an ordinary WebSocket, from the sandbox stage\n * on. The URL is in the response (`streamUrl`) and in `GET /strategy/{strategyId}/live`; treat it like a\n * password. See the \"Live execution\" guide.\n *\n */\nexport const startLive = <ThrowOnError extends boolean = false>(\n options: Options<StartLiveData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n StartLiveResponse,\n StartLiveError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/strategy/{strategyId}/live\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * List your own live runs\n * Every run you have started, in any `stage`, `desired` state, or `visibility` — newest\n * first. Unlike `GET /live/public`, this is not filtered to `RUNNING` public runs: it is\n * the complete list of runs you own, including `sandbox` trials and stopped ones.\n *\n */\nexport const listLive = <ThrowOnError extends boolean = false>(\n options?: Options<ListLiveData, ThrowOnError>\n) => {\n return (options?.client ?? _heyApiClient).get<\n ListLiveResponse,\n ListLiveError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live\",\n ...options,\n });\n};\n\n/**\n * Browse public live runs\n * Every run whose owner marked it `public`, that has been promoted to `live` and is running —\n * anyone's, yours included, and listed without revealing who owns it. A `public` run still in\n * its `sandbox` trial is not listed. Most recently started first.\n *\n * This is the only `Live Execution` endpoint that needs no `Authorization` header.\n *\n */\nexport const listPublicLive = <ThrowOnError extends boolean = false>(\n options?: Options<ListPublicLiveData, ThrowOnError>\n) => {\n return (options?.client ?? _heyApiClient).get<\n ListPublicLiveResponse,\n ListPublicLiveError,\n ThrowOnError\n >({\n url: \"/live/public\",\n ...options,\n });\n};\n\n/**\n * Read one of your runs by its id\n * Owner only, addressed by `runId` directly rather than through its strategy: the run's own\n * canonical identity, which is what `POST`/`GET`/`DELETE` `.../live`, `GET /live` and\n * `GET /live/public` all hand out. Use it to re-read one specific run — including one you\n * stopped long ago or that is no longer your strategy's most recent — without paging through\n * `GET /live`.\n *\n * Returns the same state as `GET /strategy/{strategyId}/live` (`strategyId` is the strategy's\n * id, and `stats` is there too), plus `updatedAtMs`: when the run last changed, from any cause — a\n * state change, a promotion, a parameter update, a stop. A refresh of `stats` is not a change of\n * the run and does not move `updatedAtMs`. A run that is public is reachable by others through\n * `GET /live/public`, never through this route.\n *\n */\nexport const getLiveRun = <ThrowOnError extends boolean = false>(\n options: Options<GetLiveRunData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetLiveRunResponse,\n GetLiveRunError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/{runId}\",\n ...options,\n });\n};\n\n/**\n * Change a run's visibility, name, or description\n * Owner only, addressed by `runId` directly rather than through its strategy — this is a\n * run's own canonical identity, independent of which strategy started it.\n *\n * Setting `visibility` from `public` back to `private` also evicts anyone currently connected\n * to the run's live signal channel who is not its owner — best-effort; the change to this\n * record is not rolled back if that eviction fails.\n *\n */\nexport const updateLive = <ThrowOnError extends boolean = false>(\n options: Options<UpdateLiveData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).patch<\n UpdateLiveResponse,\n UpdateLiveError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/{runId}\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * Change a running strategy's parameters\n * Updates one or more parameters of a run **while it stays live** — unlike `params` on\n * `POST /strategy/{strategyId}/live`, which only sets the starting values. Owner only.\n *\n * Every key in `params` must be one your strategy declares (see `declaredProperties` on\n * `POST /strategy`) as of the compilation this run is executing — recompiling the strategy\n * later never changes what an already-running instance accepts; start a new run for that.\n *\n * The change does not take effect the instant this call returns: `effectiveAtMs` is the\n * earliest moment it is guaranteed to apply, a few seconds out, so both the REST and\n * WebSocket paths to this same update (see the \"Live execution\" guide) land on the exact same\n * value at the exact same moment.\n *\n */\nexport const updateLiveParams = <ThrowOnError extends boolean = false>(\n options: Options<UpdateLiveParamsData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).put<\n UpdateLiveParamsResponse,\n UpdateLiveParamsError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/{runId}/params\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * Tell a running strategy a command\n * Tells a running strategy something **while it stays live**, without restarting it — for a strategy that\n * implements the engine's `CommandRequestHandler`. Owner only.\n *\n * A command is an event, not a stored setting: it is delivered once to every execution behind the run, at\n * the same market position, and nothing about it is written to the run's state. **It is transient** — a\n * replica that restarts replays only its recent market history, so a command from before that only reaches\n * one that was already running when it arrived. Anything the strategy needs to remember across a restart\n * belongs in a parameter (`PUT /live/{runId}/params`), which does have a stored value; a command does not.\n *\n * The command's text is a plain string; an optional `properties` object of your own choosing travels\n * alongside it. Each entry lands as a top-level entry on the `CommandRequest` the handler receives —\n * `request.get(\"<key>\")` in Java, `$command.<key>` sugar in QTScript — no key is off limits, since the\n * command's own text is kept separately.\n *\n */\nexport const sendLiveCommand = <ThrowOnError extends boolean = false>(\n options: Options<SendLiveCommandData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n SendLiveCommandResponse,\n SendLiveCommandError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/{runId}/commands\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n });\n};\n\n/**\n * Revoke a run's stream URL\n * Revokes a run's stream URL **for good**: connections open on it are closed within about 15 seconds and it\n * answers `404` from then on. The run itself is not touched, and a stream cannot be added to it again; start\n * the run again with `stream: true` for a new URL. Owner only, and always allowed, whatever your plan or the\n * run's state. Repeating it is not an error.\n *\n */\nexport const revokeLiveStream = <ThrowOnError extends boolean = false>(\n options: Options<RevokeLiveStreamData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).delete<\n RevokeLiveStreamResponse,\n RevokeLiveStreamError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/{runId}/stream\",\n ...options,\n });\n};\n\n/**\n * Rotate a run's stream URL\n * Gives a run a **new** stream URL and retires the old one: connections open on the old URL are closed\n * within about 15 seconds and the old URL answers `404` from then on. Use it when the URL may have leaked.\n * Owner only, and only for a run that is running and was started with `stream: true` (the URL cannot be added\n * to a run later, and a revoked one cannot be brought back). The plan is checked again: a plan that may not\n * broadcast gets `429`.\n *\n * See the \"Live execution\" guide, \"A plain WebSocket stream of a run\".\n *\n */\nexport const rotateLiveStream = <ThrowOnError extends boolean = false>(\n options: Options<RotateLiveStreamData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).post<\n RotateLiveStreamResponse,\n RotateLiveStreamError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/{runId}/stream\",\n ...options,\n });\n};\n\n/**\n * Read a run's signals\n * Returns one page of the signals a run has already produced, newest-last, optionally from a\n * given time and narrowed to one or more instruments.\n *\n * This is the counterpart to the real-time WebSocket channel: that channel only carries what\n * happens while you are connected, and only for a run that asked for `relay`. A run's signals\n * are recorded either way, so this endpoint serves them whether or not `relay` was ever on,\n * in both the `sandbox` and `live` stages — use it to catch up after a disconnect, to read a\n * run you never relayed, or to page back over what has already happened.\n *\n * **The available window moves.** Signals are kept for a limited span, and the oldest are\n * continuously discarded as new ones arrive, so how far back you can read is not a fixed\n * number of hours: on a busy run it can be a good deal shorter. Every response carries\n * `availableSinceMs`, the oldest moment that can still be answered for. Asking for a\n * `sinceMs` older than that is not an error — you get everything from `availableSinceMs`\n * onwards, and that field tells you it happened.\n *\n * **A cursor can expire, and on a busy run it expires quickly.** If the position a cursor\n * points at has since been discarded, the next page answers `410` rather than silently\n * serving a shortened page that looks complete. Treat that as a normal outcome: read\n * `availableSinceMs` from the error and start again from there.\n *\n * Readable by the run's owner, and by anyone if the run is `public` and has reached the `live`\n * stage — the same rule the signal channel applies to a subscription. A `sandbox` run is read\n * by its owner only, whatever visibility it asked for.\n *\n */\nexport const getLiveRunSignals = <ThrowOnError extends boolean = false>(\n options: Options<GetLiveRunSignalsData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetLiveRunSignalsResponse,\n GetLiveRunSignalsError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/{runId}/signals\",\n ...options,\n });\n};\n\n/**\n * Read a run's paper trading\n * The run's paper trading as last recorded: one entry per simulated account (one per quote\n * currency the run trades — never added together), with its starting capital, current\n * equity, realised PnL, open positions and KPIs. The KPIs are the same a backtest reports,\n * computed over the trades closed so far.\n *\n * `equity` is the account's latest recorded value: at the last closed trade (`equityKind:\n * equity`), or the last periodic mark-to-market while positions are open (`equityKind:\n * mark`, taken every minute of market time). Until either exists the account holds its\n * starting capital.\n *\n * Readable by the run's owner, and by anyone if the run is `public` and has reached the `live`\n * stage. A run started without a `paper` block answers `404`.\n *\n */\nexport const getLiveRunPaper = <ThrowOnError extends boolean = false>(\n options: Options<GetLiveRunPaperData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetLiveRunPaperResponse,\n GetLiveRunPaperError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/{runId}/paper\",\n ...options,\n });\n};\n\n/**\n * Read a run's paper equity curve\n * The run's paper equity curve, oldest first, page by page. It is kept for the life of the\n * run, so unlike signals it has no moving window. Points are `equity` at every closed trade,\n * `mark` every minute of market time while positions are open, and `gap` where the run was\n * restarted with positions open: those positions are not carried over, so the curve has no\n * value there.\n *\n * `currency` narrows to one account; without it, every account's points come interleaved by\n * time, each carrying its currency.\n *\n * Readable by the run's owner, and by anyone if the run is `public` and has reached the `live`\n * stage.\n *\n */\nexport const getLiveRunPaperEquity = <ThrowOnError extends boolean = false>(\n options: Options<GetLiveRunPaperEquityData, ThrowOnError>\n) => {\n return (options.client ?? _heyApiClient).get<\n GetLiveRunPaperEquityResponse,\n GetLiveRunPaperEquityError,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/{runId}/paper/equity\",\n ...options,\n });\n};\n\n/**\n * Mint a WebSocket connection token\n * Mints a short-lived token for the WebSocket connection used to receive a run's signals in\n * real time and to call `live.params` (the WebSocket form of `PUT /live/{runId}/params`) —\n * see the \"Live execution\" guide linked from this tag's description for the full protocol.\n * Carries no request body.\n *\n */\nexport const mintLiveConnectionToken = <ThrowOnError extends boolean = false>(\n options?: Options<MintLiveConnectionTokenData, ThrowOnError>\n) => {\n return (options?.client ?? _heyApiClient).post<\n MintLiveConnectionTokenResponse,\n unknown,\n ThrowOnError\n >({\n security: [\n {\n scheme: \"bearer\",\n type: \"http\",\n },\n ],\n url: \"/live/token\",\n ...options,\n });\n};\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1120,6 +1120,8 @@ export const SweepProgressSchema = {
|
|
|
1120
1120
|
},
|
|
1121
1121
|
pendingShards: {
|
|
1122
1122
|
type: "integer",
|
|
1123
|
+
description:
|
|
1124
|
+
"Shards (or folds) that have not finished yet. On a cancelled sweep, `0` is what says every run that was in flight has finished and the leaderboard is complete: `CANCELLED` is reported before that.",
|
|
1123
1125
|
},
|
|
1124
1126
|
failedShards: {
|
|
1125
1127
|
type: "integer",
|
|
@@ -2871,7 +2873,44 @@ export const LiveSourceSchema = {
|
|
|
2871
2873
|
},
|
|
2872
2874
|
example: ["BTC/USDT"],
|
|
2873
2875
|
description:
|
|
2874
|
-
'
|
|
2876
|
+
'The instruments the run reads. For a run started with a list, that list as sent; for one started without `instruments`, or with `["*"]`, what the start resolved: the list of pairs the compilation of the strategy records as the instruments it accepts, when it records one, or `["*"]` for every instrument the exchange/segment offers (tier-gated). An entry is written `BASE/QUOTE` and either side can be `*` to mean any, such as any base paired with USDT. Symbols are not case-sensitive and spaces around them are ignored, so `btc/usdt` and `BTC/USDT` are the same instrument.',
|
|
2877
|
+
},
|
|
2878
|
+
},
|
|
2879
|
+
} as const;
|
|
2880
|
+
|
|
2881
|
+
export const LiveSourceRequestSchema = {
|
|
2882
|
+
type: "object",
|
|
2883
|
+
required: ["venueType", "exchange", "segment", "type"],
|
|
2884
|
+
description:
|
|
2885
|
+
"One market feed to start a live run on. Exactly one entry per run today. It is `LiveSource` as you ask for it: the only difference is that `instruments` can be left out.",
|
|
2886
|
+
properties: {
|
|
2887
|
+
venueType: {
|
|
2888
|
+
type: "string",
|
|
2889
|
+
example: "cx",
|
|
2890
|
+
description:
|
|
2891
|
+
"Venue category. `cx` (centralized exchange) is the only one live runs support today.",
|
|
2892
|
+
},
|
|
2893
|
+
exchange: {
|
|
2894
|
+
type: "string",
|
|
2895
|
+
example: "binance",
|
|
2896
|
+
},
|
|
2897
|
+
segment: {
|
|
2898
|
+
type: "string",
|
|
2899
|
+
example: "spot",
|
|
2900
|
+
},
|
|
2901
|
+
type: {
|
|
2902
|
+
type: "string",
|
|
2903
|
+
enum: ["ticker", "kline"],
|
|
2904
|
+
description:
|
|
2905
|
+
"Both `ticker` and `kline` connect to the lightest (fastest) cadence available for the exchange — today, 1 tick/second on every supported exchange. Choosing a specific cadence is not offered yet.",
|
|
2906
|
+
},
|
|
2907
|
+
instruments: {
|
|
2908
|
+
type: "array",
|
|
2909
|
+
items: {
|
|
2910
|
+
type: "string",
|
|
2911
|
+
},
|
|
2912
|
+
example: ["BTC/USDT"],
|
|
2913
|
+
description: `Which instruments the run reads. A QTScript strategy can declare which instruments it accepts with an \`instruments\` line in its source. When the compilation of the strategy records that selection as a list of pairs, leaving \`instruments\` out, or sending \`["*"]\`, takes that list; otherwise the run reads every instrument the exchange/segment offers. A list of instruments is taken as sent, and \`[]\` and \`null\` are refused with \`400\`. An entry is written \`BASE/QUOTE\`; either side can be \`*\` to mean any: any base can be paired with USDT, and BTC can be paired with any quote. Entries are not case-sensitive and spaces around them are ignored, so \`btc/usdt\` and \`BTC/USDT\` are the same instrument. An entry that is not of that form (no \`/\`, an empty side, a \`.\` or a space inside a side, or a \`*\` mixed with other characters of a side) makes the run fail when it starts. Plan limits: a list with an entry that has a \`*\` on a side counts like \`["*"]\` and only plans that include the wildcard accept it; the other entries are counted one by one. The instruments the run actually reads come back in the run's \`sources\`.`,
|
|
2875
2914
|
},
|
|
2876
2915
|
},
|
|
2877
2916
|
} as const;
|
|
@@ -2885,7 +2924,7 @@ export const StartLiveRequestSchema = {
|
|
|
2885
2924
|
minItems: 1,
|
|
2886
2925
|
maxItems: 1,
|
|
2887
2926
|
items: {
|
|
2888
|
-
$ref: "#/components/schemas/
|
|
2927
|
+
$ref: "#/components/schemas/LiveSourceRequest",
|
|
2889
2928
|
},
|
|
2890
2929
|
},
|
|
2891
2930
|
params: {
|
package/src/generated/sdk.gen.ts
CHANGED
|
@@ -416,7 +416,7 @@ export const listStrategies = <ThrowOnError extends boolean = false>(
|
|
|
416
416
|
*
|
|
417
417
|
* The source is either **Java** — a class extending a strategy base class — or **QTScript**
|
|
418
418
|
* (beta), a compact strategy language whose braced bodies are plain Java. QTScript source
|
|
419
|
-
* begins with the `strategy` keyword — whitespace and
|
|
419
|
+
* begins with the `strategy` keyword — whitespace and line or block comments before it
|
|
420
420
|
* are ignored — and that is how the two are told apart: there is no separate endpoint and
|
|
421
421
|
* no header to set. Once registered, a strategy is used the same way
|
|
422
422
|
* whichever language it was written in.
|
|
@@ -722,6 +722,15 @@ export const executeSweep = <ThrowOnError extends boolean = false>(
|
|
|
722
722
|
/**
|
|
723
723
|
* Cancel a running parameter sweep
|
|
724
724
|
* Requests cancellation between parameter vectors. Completed rows remain readable.
|
|
725
|
+
*
|
|
726
|
+
* Cancelling is a request, not a stop: the sweep reports `status: CANCELLED` (and
|
|
727
|
+
* `state.status: Aborted`) as soon as the request is accepted, while runs that were already
|
|
728
|
+
* in flight are still finishing. Until they have, `progress.pendingShards` is above `0`, and
|
|
729
|
+
* `progress.done` and the leaderboard can still grow after `CANCELLED` is first seen. A client
|
|
730
|
+
* that needs the final set of rows, to store them or to mark the rest as not run, keeps
|
|
731
|
+
* reading until `progress.pendingShards` is `0`; the wait is bounded by how long one run
|
|
732
|
+
* takes.
|
|
733
|
+
*
|
|
725
734
|
*/
|
|
726
735
|
export const cancelSweep = <ThrowOnError extends boolean = false>(
|
|
727
736
|
options: Options<CancelSweepData, ThrowOnError>
|
|
@@ -1369,6 +1378,12 @@ export const getLive = <ThrowOnError extends boolean = false>(
|
|
|
1369
1378
|
* (fastest) cadence available for the exchange — today that is 1 tick/second on every
|
|
1370
1379
|
* supported exchange; choosing among several cadences is not offered yet.
|
|
1371
1380
|
*
|
|
1381
|
+
* `instruments` can be left out. A QTScript strategy can declare which instruments it accepts with an `instruments`
|
|
1382
|
+
* line in its source; when the compilation of the strategy records that selection as a list of pairs, a
|
|
1383
|
+
* start that leaves `instruments` out, or sends `["*"]`, takes that list, and otherwise the run reads every
|
|
1384
|
+
* instrument the exchange/segment offers. A list you send is taken as sent. Either side of an entry can be `*`
|
|
1385
|
+
* (any base paired with USDT). The instruments the run reads come back in `sources`. See the "Live execution" guide, "Sources".
|
|
1386
|
+
*
|
|
1372
1387
|
* `params` is passed straight through to the strategy at start — the same free-form object
|
|
1373
1388
|
* `POST /strategy/{strategyId}/validate` and the backtest endpoints already accept. To change
|
|
1374
1389
|
* a parameter **while the run is live**, use `PUT /live/{runId}/params` instead; this endpoint
|
|
@@ -679,6 +679,9 @@ export type SweepProgress = {
|
|
|
679
679
|
*/
|
|
680
680
|
aborted: number;
|
|
681
681
|
shardCount: number;
|
|
682
|
+
/**
|
|
683
|
+
* Shards (or folds) that have not finished yet. On a cancelled sweep, `0` is what says every run that was in flight has finished and the leaderboard is complete: `CANCELLED` is reported before that.
|
|
684
|
+
*/
|
|
682
685
|
pendingShards: number;
|
|
683
686
|
/**
|
|
684
687
|
* Shards (or folds) that failed and will not be retried. Distinct from `aborted`: this counts whole units that never reported, not runs that ran badly.
|
|
@@ -1800,13 +1803,33 @@ export type LiveSource = {
|
|
|
1800
1803
|
*/
|
|
1801
1804
|
type: "ticker" | "kline";
|
|
1802
1805
|
/**
|
|
1803
|
-
*
|
|
1806
|
+
* The instruments the run reads. For a run started with a list, that list as sent; for one started without `instruments`, or with `["*"]`, what the start resolved: the list of pairs the compilation of the strategy records as the instruments it accepts, when it records one, or `["*"]` for every instrument the exchange/segment offers (tier-gated). An entry is written `BASE/QUOTE` and either side can be `*` to mean any, such as any base paired with USDT. Symbols are not case-sensitive and spaces around them are ignored, so `btc/usdt` and `BTC/USDT` are the same instrument.
|
|
1804
1807
|
*/
|
|
1805
1808
|
instruments: Array<string>;
|
|
1806
1809
|
};
|
|
1807
1810
|
|
|
1811
|
+
/**
|
|
1812
|
+
* One market feed to start a live run on. Exactly one entry per run today. It is `LiveSource` as you ask for it: the only difference is that `instruments` can be left out.
|
|
1813
|
+
*/
|
|
1814
|
+
export type LiveSourceRequest = {
|
|
1815
|
+
/**
|
|
1816
|
+
* Venue category. `cx` (centralized exchange) is the only one live runs support today.
|
|
1817
|
+
*/
|
|
1818
|
+
venueType: string;
|
|
1819
|
+
exchange: string;
|
|
1820
|
+
segment: string;
|
|
1821
|
+
/**
|
|
1822
|
+
* Both `ticker` and `kline` connect to the lightest (fastest) cadence available for the exchange — today, 1 tick/second on every supported exchange. Choosing a specific cadence is not offered yet.
|
|
1823
|
+
*/
|
|
1824
|
+
type: "ticker" | "kline";
|
|
1825
|
+
/**
|
|
1826
|
+
* Which instruments the run reads. A QTScript strategy can declare which instruments it accepts with an `instruments` line in its source. When the compilation of the strategy records that selection as a list of pairs, leaving `instruments` out, or sending `["*"]`, takes that list; otherwise the run reads every instrument the exchange/segment offers. A list of instruments is taken as sent, and `[]` and `null` are refused with `400`. An entry is written `BASE/QUOTE`; either side can be `*` to mean any: any base can be paired with USDT, and BTC can be paired with any quote. Entries are not case-sensitive and spaces around them are ignored, so `btc/usdt` and `BTC/USDT` are the same instrument. An entry that is not of that form (no `/`, an empty side, a `.` or a space inside a side, or a `*` mixed with other characters of a side) makes the run fail when it starts. Plan limits: a list with an entry that has a `*` on a side counts like `["*"]` and only plans that include the wildcard accept it; the other entries are counted one by one. The instruments the run actually reads come back in the run's `sources`.
|
|
1827
|
+
*/
|
|
1828
|
+
instruments?: Array<string>;
|
|
1829
|
+
};
|
|
1830
|
+
|
|
1808
1831
|
export type StartLiveRequest = {
|
|
1809
|
-
sources: [
|
|
1832
|
+
sources: [LiveSourceRequest];
|
|
1810
1833
|
/**
|
|
1811
1834
|
* Strategy parameters to start with. Opaque key/value pairs — see this strategy's own `declaredProperties` (from `POST /strategy`) for the keys it accepts.
|
|
1812
1835
|
*/
|
|
@@ -3847,7 +3870,7 @@ export type StartLiveData = {
|
|
|
3847
3870
|
|
|
3848
3871
|
export type StartLiveErrors = {
|
|
3849
3872
|
/**
|
|
3850
|
-
* Malformed `sources` (not exactly one entry, missing field, unsupported `type`), a `type` the strategy cannot consume (a ticker strategy with a `kline` source, or the reverse; the message names both), an invalid `visibility`, an invalid `paper` block (an unknown field, a wrong type or an out-of-range value), or no `paper` block for a strategy that listens to its own execution events. A `relay` or `stream` that is not `true` or `false`, or a `stream` where streams are not available yet. A `warmFrom` that is not an integer from 0 to 3600.
|
|
3873
|
+
* Malformed `sources` (not exactly one entry, missing field, unsupported `type`), a `type` the strategy cannot consume (a ticker strategy with a `kline` source, or the reverse; the message names both), an invalid `visibility`, an invalid `paper` block (an unknown field, a wrong type or an out-of-range value), or no `paper` block for a strategy that listens to its own execution events. A `relay` or `stream` that is not `true` or `false`, or a `stream` where streams are not available yet. A `warmFrom` that is not an integer from 0 to 3600. An `instruments` that is empty or `null`.
|
|
3851
3874
|
*/
|
|
3852
3875
|
400: ResponseError;
|
|
3853
3876
|
/**
|
|
@@ -4186,8 +4209,8 @@ export type GetLiveRunSignalsData = {
|
|
|
4186
4209
|
sinceMs?: number;
|
|
4187
4210
|
/**
|
|
4188
4211
|
* Narrow to one or more instruments. Omitted, or `*`, returns every instrument the run
|
|
4189
|
-
* covers. Accepts a single pair (`BTC/USDT`), either half as a wildcard (
|
|
4190
|
-
*
|
|
4212
|
+
* covers. Accepts a single pair (`BTC/USDT`), either half as a wildcard (any base paired
|
|
4213
|
+
* with that quote, or BTC paired with any quote), or a comma-separated
|
|
4191
4214
|
* list of pairs (`BTC/USDT,ETH/EUR`). Symbols are matched exactly, case included — pass
|
|
4192
4215
|
* them as this API reports them.
|
|
4193
4216
|
*
|