@gbozee/ultimate 0.0.2-152 → 0.0.2-154
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/frontend-index.d.ts +134 -1
- package/dist/frontend-index.js +100 -7
- package/dist/index.cjs +180 -10
- package/dist/index.d.ts +75 -1
- package/dist/index.js +180 -10
- package/dist/mcp-server.cjs +178 -10
- package/dist/mcp-server.js +178 -10
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -140,6 +140,7 @@ export interface PositionsView {
|
|
|
140
140
|
expand?: {
|
|
141
141
|
p_account?: ExchangeAccount;
|
|
142
142
|
b_config?: ScheduledTrade;
|
|
143
|
+
proxy?: Proxy$1;
|
|
143
144
|
};
|
|
144
145
|
}
|
|
145
146
|
export interface BullishMarket extends RecordModel {
|
|
@@ -624,6 +625,7 @@ export declare class AppDatabase {
|
|
|
624
625
|
expand?: {
|
|
625
626
|
config: ScheduledTrade;
|
|
626
627
|
account: ExchangeAccount;
|
|
628
|
+
proxy: Proxy$1;
|
|
627
629
|
};
|
|
628
630
|
})[]>;
|
|
629
631
|
private _createOrUpdatePosition;
|
|
@@ -636,6 +638,7 @@ export declare class AppDatabase {
|
|
|
636
638
|
expand?: {
|
|
637
639
|
config: ScheduledTrade;
|
|
638
640
|
account: ExchangeAccount;
|
|
641
|
+
proxy: Proxy$1;
|
|
639
642
|
};
|
|
640
643
|
})[]>;
|
|
641
644
|
update_db_position(position: any, payload: any): Promise<import("pocketbase").RecordModel>;
|
|
@@ -1436,7 +1439,13 @@ export declare function generateOptimumAppConfig(config: GlobalConfig, payload:
|
|
|
1436
1439
|
quantity: number;
|
|
1437
1440
|
kind: "long" | "short";
|
|
1438
1441
|
}): AppConfig | null;
|
|
1439
|
-
export declare function determineOptimumReward(
|
|
1442
|
+
export declare function determineOptimumReward(payload: {
|
|
1443
|
+
app_config: AppConfig;
|
|
1444
|
+
increase?: boolean;
|
|
1445
|
+
low_range?: number;
|
|
1446
|
+
high_range?: number;
|
|
1447
|
+
target_loss?: number;
|
|
1448
|
+
}): number | {
|
|
1440
1449
|
result: any[];
|
|
1441
1450
|
value: number;
|
|
1442
1451
|
total: number;
|
|
@@ -1472,6 +1481,7 @@ export declare function computeRiskReward(payload: {
|
|
|
1472
1481
|
entry: number;
|
|
1473
1482
|
stop: number;
|
|
1474
1483
|
risk_per_trade: number;
|
|
1484
|
+
target_loss?: number;
|
|
1475
1485
|
}): number | {
|
|
1476
1486
|
result: any[];
|
|
1477
1487
|
value: number;
|
|
@@ -1656,6 +1666,38 @@ export declare function determineCompoundLongTrade(payload: {
|
|
|
1656
1666
|
result: any;
|
|
1657
1667
|
short_max_size: any;
|
|
1658
1668
|
};
|
|
1669
|
+
export declare function generateOppositeTradeConfig(payload: {
|
|
1670
|
+
kind: "long" | "short";
|
|
1671
|
+
entry: number;
|
|
1672
|
+
quantity: number;
|
|
1673
|
+
target_pnl: number;
|
|
1674
|
+
global_config: GlobalConfig;
|
|
1675
|
+
ratio?: number;
|
|
1676
|
+
}): {
|
|
1677
|
+
entry: number;
|
|
1678
|
+
stop: number;
|
|
1679
|
+
risk: number;
|
|
1680
|
+
risk_reward: number | {
|
|
1681
|
+
result: any[];
|
|
1682
|
+
value: number;
|
|
1683
|
+
total: number;
|
|
1684
|
+
risk_per_trade: number;
|
|
1685
|
+
max: number;
|
|
1686
|
+
min: number;
|
|
1687
|
+
neg_pnl: any;
|
|
1688
|
+
entry: any;
|
|
1689
|
+
};
|
|
1690
|
+
};
|
|
1691
|
+
export declare function constructAppConfig(payload: {
|
|
1692
|
+
account: PositionsView;
|
|
1693
|
+
global_config: GlobalConfig;
|
|
1694
|
+
kelly_config?: {
|
|
1695
|
+
use_kelly: boolean;
|
|
1696
|
+
kelly_confidence_factor: number;
|
|
1697
|
+
kelly_minimum_risk: number;
|
|
1698
|
+
kelly_prediction_model: string;
|
|
1699
|
+
};
|
|
1700
|
+
}): AppConfig;
|
|
1659
1701
|
declare class ExchangePosition {
|
|
1660
1702
|
exchange: BaseExchange;
|
|
1661
1703
|
symbol_config: SymbolConfig;
|
|
@@ -1670,10 +1712,12 @@ declare class ExchangePosition {
|
|
|
1670
1712
|
exchange_account: ExchangeAccount$1;
|
|
1671
1713
|
without_view?: PositionsView;
|
|
1672
1714
|
});
|
|
1715
|
+
initialize(): Promise<void>;
|
|
1673
1716
|
getInstance(): PositionsView;
|
|
1674
1717
|
get symbol(): any;
|
|
1675
1718
|
get kind(): any;
|
|
1676
1719
|
get account(): ExchangeAccount;
|
|
1720
|
+
getProxyForAccount(): Promise<HttpsProxyAgent<`http://${string}`> | SocksProxyAgent>;
|
|
1677
1721
|
cancelOrders(payload: {
|
|
1678
1722
|
limit?: boolean;
|
|
1679
1723
|
price?: number;
|
|
@@ -1943,6 +1987,33 @@ declare class ExchangePosition {
|
|
|
1943
1987
|
risk?: number;
|
|
1944
1988
|
risk_reward?: number;
|
|
1945
1989
|
}): Promise<import("pocketbase").RecordModel | ScheduledTrade>;
|
|
1990
|
+
getOppositeConfig(payload: {
|
|
1991
|
+
ratio?: number;
|
|
1992
|
+
}): {
|
|
1993
|
+
entry: number;
|
|
1994
|
+
stop: number;
|
|
1995
|
+
risk: number;
|
|
1996
|
+
risk_reward: number | {
|
|
1997
|
+
result: any[];
|
|
1998
|
+
value: number;
|
|
1999
|
+
total: number;
|
|
2000
|
+
risk_per_trade: number;
|
|
2001
|
+
max: number;
|
|
2002
|
+
min: number;
|
|
2003
|
+
neg_pnl: any;
|
|
2004
|
+
entry: any;
|
|
2005
|
+
};
|
|
2006
|
+
};
|
|
2007
|
+
getOptimumRiskReward(): Promise<number | {
|
|
2008
|
+
result: any[];
|
|
2009
|
+
value: number;
|
|
2010
|
+
total: number;
|
|
2011
|
+
risk_per_trade: number;
|
|
2012
|
+
max: number;
|
|
2013
|
+
min: number;
|
|
2014
|
+
neg_pnl: any;
|
|
2015
|
+
entry: any;
|
|
2016
|
+
}>;
|
|
1946
2017
|
}
|
|
1947
2018
|
declare class ExchangeAccount$1 {
|
|
1948
2019
|
instance: {
|
|
@@ -1996,6 +2067,7 @@ declare class ExchangeAccount$1 {
|
|
|
1996
2067
|
expand?: {
|
|
1997
2068
|
config: ScheduledTrade;
|
|
1998
2069
|
account: ExchangeAccount;
|
|
2070
|
+
proxy: Proxy$1;
|
|
1999
2071
|
};
|
|
2000
2072
|
})[]>;
|
|
2001
2073
|
syncAccount(options: {
|
|
@@ -2009,6 +2081,7 @@ declare class ExchangeAccount$1 {
|
|
|
2009
2081
|
expand?: {
|
|
2010
2082
|
config: ScheduledTrade;
|
|
2011
2083
|
account: ExchangeAccount;
|
|
2084
|
+
proxy: Proxy$1;
|
|
2012
2085
|
};
|
|
2013
2086
|
})[]>;
|
|
2014
2087
|
getRunningInstanceFromDB(symbol: string): Promise<TradeBlockTracking>;
|
|
@@ -2657,6 +2730,7 @@ declare class App {
|
|
|
2657
2730
|
expand?: {
|
|
2658
2731
|
config: ScheduledTrade;
|
|
2659
2732
|
account: ExchangeAccount;
|
|
2733
|
+
proxy: Proxy$1;
|
|
2660
2734
|
};
|
|
2661
2735
|
})[]>;
|
|
2662
2736
|
syncOrders(payload: {
|
package/dist/index.js
CHANGED
|
@@ -51692,7 +51692,6 @@ class AppDatabase {
|
|
|
51692
51692
|
const result = await this.get_exchange_db_instance(account);
|
|
51693
51693
|
if (result?.expand?.proxy) {
|
|
51694
51694
|
const { type, ip_address } = result.expand.proxy;
|
|
51695
|
-
console.log(type, ip_address);
|
|
51696
51695
|
if (type === "http") {
|
|
51697
51696
|
return new import_https_proxy_agent.HttpsProxyAgent(`http://${ip_address}`);
|
|
51698
51697
|
}
|
|
@@ -51740,13 +51739,13 @@ class AppDatabase {
|
|
|
51740
51739
|
table: "positions_view",
|
|
51741
51740
|
params: {
|
|
51742
51741
|
filter: `symbol:lower="${symbol.toLowerCase()}" && account:lower="${account.owner.toLowerCase()} ${account.exchange.toLowerCase()}"`,
|
|
51743
|
-
expand: "config, account_strategy, p_account"
|
|
51742
|
+
expand: "config, account_strategy, p_account, proxy"
|
|
51744
51743
|
}
|
|
51745
51744
|
} : {
|
|
51746
51745
|
table: "positions",
|
|
51747
51746
|
params: {
|
|
51748
51747
|
filter: `symbol:lower="${symbol.toLowerCase()}" && account.owner:lower="${account.owner.toLowerCase()}" && account.exchange:lower="${account.exchange.toLowerCase()}"`,
|
|
51749
|
-
expand: "account,config"
|
|
51748
|
+
expand: "account,config, proxy"
|
|
51750
51749
|
}
|
|
51751
51750
|
};
|
|
51752
51751
|
if (custom_filter) {
|
|
@@ -54276,7 +54275,14 @@ function generateOptimumAppConfig(config2, payload, position2) {
|
|
|
54276
54275
|
});
|
|
54277
54276
|
return best_app_config;
|
|
54278
54277
|
}
|
|
54279
|
-
function determineOptimumReward(
|
|
54278
|
+
function determineOptimumReward(payload) {
|
|
54279
|
+
const {
|
|
54280
|
+
app_config,
|
|
54281
|
+
increase = true,
|
|
54282
|
+
low_range = 1,
|
|
54283
|
+
high_range = 199,
|
|
54284
|
+
target_loss
|
|
54285
|
+
} = payload;
|
|
54280
54286
|
const criterion = app_config.strategy || "quantity";
|
|
54281
54287
|
const risk_rewards = createArray(low_range, high_range, 1);
|
|
54282
54288
|
let func = risk_rewards.map((trade_no) => {
|
|
@@ -54316,10 +54322,33 @@ function determineOptimumReward(app_config, increase = true, low_range = 30, hig
|
|
|
54316
54322
|
entry
|
|
54317
54323
|
};
|
|
54318
54324
|
});
|
|
54319
|
-
func = func.filter((r2) => Boolean(r2))
|
|
54320
|
-
|
|
54321
|
-
|
|
54322
|
-
|
|
54325
|
+
func = func.filter((r2) => Boolean(r2));
|
|
54326
|
+
if (target_loss === undefined) {
|
|
54327
|
+
func = func.filter((r2) => {
|
|
54328
|
+
let foundIndex = r2?.result.findIndex((e2) => e2.quantity === r2.max);
|
|
54329
|
+
return criterion === "quantity" ? foundIndex === 0 : true;
|
|
54330
|
+
});
|
|
54331
|
+
}
|
|
54332
|
+
if (target_loss !== undefined) {
|
|
54333
|
+
const validResults = func.filter((r2) => Math.abs(r2.neg_pnl) <= target_loss);
|
|
54334
|
+
if (validResults.length > 0) {
|
|
54335
|
+
validResults.sort((a, b) => {
|
|
54336
|
+
const diffA = target_loss - Math.abs(a.neg_pnl);
|
|
54337
|
+
const diffB = target_loss - Math.abs(b.neg_pnl);
|
|
54338
|
+
return diffA - diffB;
|
|
54339
|
+
});
|
|
54340
|
+
if (app_config.raw) {
|
|
54341
|
+
return validResults[0];
|
|
54342
|
+
}
|
|
54343
|
+
return validResults[0]?.value;
|
|
54344
|
+
} else {
|
|
54345
|
+
func.sort((a, b) => Math.abs(a.neg_pnl) - Math.abs(b.neg_pnl));
|
|
54346
|
+
if (app_config.raw) {
|
|
54347
|
+
return func[0];
|
|
54348
|
+
}
|
|
54349
|
+
return func[0]?.value;
|
|
54350
|
+
}
|
|
54351
|
+
}
|
|
54323
54352
|
const highest = criterion === "quantity" ? Math.max(...func.map((o) => o.max)) : Math.min(...func.map((o) => o.entry));
|
|
54324
54353
|
const key = criterion === "quantity" ? "max" : "entry";
|
|
54325
54354
|
const index = findIndexByCondition(func, app_config.kind, (x) => x[key] == highest, criterion);
|
|
@@ -54431,13 +54460,13 @@ function determineOptimumRisk(config2, payload, params) {
|
|
|
54431
54460
|
};
|
|
54432
54461
|
}
|
|
54433
54462
|
function computeRiskReward(payload) {
|
|
54434
|
-
const { app_config, entry, stop, risk_per_trade } = payload;
|
|
54463
|
+
const { app_config, entry, stop, risk_per_trade, target_loss } = payload;
|
|
54435
54464
|
const kind = entry > stop ? "long" : "short";
|
|
54436
54465
|
app_config.kind = kind;
|
|
54437
54466
|
app_config.entry = entry;
|
|
54438
54467
|
app_config.stop = stop;
|
|
54439
54468
|
app_config.risk_per_trade = risk_per_trade;
|
|
54440
|
-
const result = determineOptimumReward(app_config);
|
|
54469
|
+
const result = determineOptimumReward({ app_config, target_loss });
|
|
54441
54470
|
return result;
|
|
54442
54471
|
}
|
|
54443
54472
|
function getRiskReward(payload) {
|
|
@@ -54772,6 +54801,67 @@ function determineCompoundLongTrade(payload) {
|
|
|
54772
54801
|
short_max_size
|
|
54773
54802
|
};
|
|
54774
54803
|
}
|
|
54804
|
+
function generateOppositeTradeConfig(payload) {
|
|
54805
|
+
const {
|
|
54806
|
+
kind,
|
|
54807
|
+
entry,
|
|
54808
|
+
quantity,
|
|
54809
|
+
target_pnl,
|
|
54810
|
+
ratio = 0.5,
|
|
54811
|
+
global_config
|
|
54812
|
+
} = payload;
|
|
54813
|
+
const diff = target_pnl / quantity;
|
|
54814
|
+
const tp = kind === "long" ? entry + diff : entry - diff;
|
|
54815
|
+
const stop = kind === "long" ? entry - diff : entry + diff;
|
|
54816
|
+
const opposite_pnl = target_pnl * ratio;
|
|
54817
|
+
const app_config = constructAppConfig({
|
|
54818
|
+
account: {
|
|
54819
|
+
expand: {
|
|
54820
|
+
b_config: {
|
|
54821
|
+
entry,
|
|
54822
|
+
stop,
|
|
54823
|
+
symbol: global_config.symbol,
|
|
54824
|
+
risk: target_pnl
|
|
54825
|
+
}
|
|
54826
|
+
}
|
|
54827
|
+
},
|
|
54828
|
+
global_config
|
|
54829
|
+
});
|
|
54830
|
+
const risk_reward = computeRiskReward({
|
|
54831
|
+
app_config,
|
|
54832
|
+
entry: stop,
|
|
54833
|
+
stop: tp,
|
|
54834
|
+
risk_per_trade: opposite_pnl,
|
|
54835
|
+
target_loss: opposite_pnl
|
|
54836
|
+
});
|
|
54837
|
+
return {
|
|
54838
|
+
entry: to_f(stop, global_config.price_places),
|
|
54839
|
+
stop: to_f(tp, global_config.price_places),
|
|
54840
|
+
risk: to_f(opposite_pnl, "%.2f"),
|
|
54841
|
+
risk_reward
|
|
54842
|
+
};
|
|
54843
|
+
}
|
|
54844
|
+
function constructAppConfig(payload) {
|
|
54845
|
+
const { account, global_config, kelly_config } = payload;
|
|
54846
|
+
const config2 = account.expand?.b_config;
|
|
54847
|
+
if (!config2) {
|
|
54848
|
+
return null;
|
|
54849
|
+
}
|
|
54850
|
+
const kelly = config2.kelly;
|
|
54851
|
+
const options = {
|
|
54852
|
+
entry: config2?.entry,
|
|
54853
|
+
stop: config2?.stop,
|
|
54854
|
+
risk_reward: config2?.risk_reward,
|
|
54855
|
+
risk: config2?.risk,
|
|
54856
|
+
symbol: account.symbol,
|
|
54857
|
+
use_kelly: kelly_config?.use_kelly ?? kelly?.use_kelly,
|
|
54858
|
+
kelly_confidence_factor: kelly_config?.kelly_confidence_factor ?? kelly?.kelly_confidence_factor,
|
|
54859
|
+
kelly_minimum_risk: kelly_config?.kelly_minimum_risk ?? kelly?.kelly_minimum_risk,
|
|
54860
|
+
kelly_prediction_model: kelly_config?.kelly_prediction_model ?? kelly?.kelly_prediction_model
|
|
54861
|
+
};
|
|
54862
|
+
const appConfig = buildAppConfig(global_config, options);
|
|
54863
|
+
return appConfig;
|
|
54864
|
+
}
|
|
54775
54865
|
// src/helpers/strategy.ts
|
|
54776
54866
|
class Strategy {
|
|
54777
54867
|
position;
|
|
@@ -57693,6 +57783,9 @@ async function reduceMajorPositionEntry(input, accountInfo, trigger2, exchange_i
|
|
|
57693
57783
|
}
|
|
57694
57784
|
|
|
57695
57785
|
// src/position.ts
|
|
57786
|
+
var import_https_proxy_agent2 = __toESM(require_dist2(), 1);
|
|
57787
|
+
var import_socks_proxy_agent2 = __toESM(require_dist3(), 1);
|
|
57788
|
+
|
|
57696
57789
|
class ExchangePosition {
|
|
57697
57790
|
exchange;
|
|
57698
57791
|
symbol_config;
|
|
@@ -57706,6 +57799,13 @@ class ExchangePosition {
|
|
|
57706
57799
|
this.instance = payload.instance;
|
|
57707
57800
|
this.exchange_account = payload.exchange_account;
|
|
57708
57801
|
}
|
|
57802
|
+
async initialize() {
|
|
57803
|
+
const proxy = await this.getProxyForAccount();
|
|
57804
|
+
if (proxy) {
|
|
57805
|
+
this.exchange.client.globalRequestOptions.httpAgent = proxy;
|
|
57806
|
+
this.exchange.client.globalRequestOptions.httpsAgent = proxy;
|
|
57807
|
+
}
|
|
57808
|
+
}
|
|
57709
57809
|
getInstance() {
|
|
57710
57810
|
return this.instance;
|
|
57711
57811
|
}
|
|
@@ -57719,6 +57819,20 @@ class ExchangePosition {
|
|
|
57719
57819
|
const { p_account } = this.instance.expand;
|
|
57720
57820
|
return p_account;
|
|
57721
57821
|
}
|
|
57822
|
+
async getProxyForAccount() {
|
|
57823
|
+
if (this.instance.expand.proxy) {
|
|
57824
|
+
const result = this.instance.expand.proxy;
|
|
57825
|
+
const { type, ip_address } = result;
|
|
57826
|
+
console.log("position", type, ip_address);
|
|
57827
|
+
if (type === "http") {
|
|
57828
|
+
return new import_https_proxy_agent2.HttpsProxyAgent(`http://${ip_address}`);
|
|
57829
|
+
}
|
|
57830
|
+
if (type === "socks5") {
|
|
57831
|
+
return new import_socks_proxy_agent2.SocksProxyAgent(`socks://${ip_address}`);
|
|
57832
|
+
}
|
|
57833
|
+
}
|
|
57834
|
+
return null;
|
|
57835
|
+
}
|
|
57722
57836
|
async cancelOrders(payload) {
|
|
57723
57837
|
const { limit, price: _price, raw } = payload;
|
|
57724
57838
|
if (limit) {
|
|
@@ -58545,6 +58659,27 @@ class ExchangePosition {
|
|
|
58545
58659
|
}
|
|
58546
58660
|
return config2;
|
|
58547
58661
|
}
|
|
58662
|
+
getOppositeConfig(payload) {
|
|
58663
|
+
return generateOppositeTradeConfig({
|
|
58664
|
+
kind: this.kind,
|
|
58665
|
+
entry: this.instance.entry,
|
|
58666
|
+
quantity: this.instance.quantity,
|
|
58667
|
+
target_pnl: this.instance.target_pnl,
|
|
58668
|
+
global_config: this.symbol_config,
|
|
58669
|
+
ratio: payload.ratio
|
|
58670
|
+
});
|
|
58671
|
+
}
|
|
58672
|
+
async getOptimumRiskReward() {
|
|
58673
|
+
const app_config = await this.tradeConfig({});
|
|
58674
|
+
const risk_reward = computeRiskReward({
|
|
58675
|
+
app_config,
|
|
58676
|
+
entry: app_config.entry,
|
|
58677
|
+
stop: app_config.stop,
|
|
58678
|
+
risk_per_trade: app_config.risk_per_trade,
|
|
58679
|
+
target_loss: app_config.risk_per_trade
|
|
58680
|
+
});
|
|
58681
|
+
return risk_reward;
|
|
58682
|
+
}
|
|
58548
58683
|
}
|
|
58549
58684
|
|
|
58550
58685
|
// src/exchange-account.ts
|
|
@@ -58617,6 +58752,7 @@ class ExchangeAccount {
|
|
|
58617
58752
|
app_db: this.app_db,
|
|
58618
58753
|
without_view: raw_positions.find((x) => x.kind === "long")
|
|
58619
58754
|
});
|
|
58755
|
+
await this.long_position.initialize();
|
|
58620
58756
|
this.short_position = new ExchangePosition({
|
|
58621
58757
|
symbol_config,
|
|
58622
58758
|
exchange: this.exchange,
|
|
@@ -58625,6 +58761,7 @@ class ExchangeAccount {
|
|
|
58625
58761
|
app_db: this.app_db,
|
|
58626
58762
|
without_view: raw_positions.find((x) => x.kind === "short")
|
|
58627
58763
|
});
|
|
58764
|
+
await this.short_position.initialize();
|
|
58628
58765
|
return payload.kind === "long" ? this.long_position : this.short_position;
|
|
58629
58766
|
}
|
|
58630
58767
|
async getActiveAccount(payload) {
|
|
@@ -59984,6 +60121,7 @@ class ExchangeAccount {
|
|
|
59984
60121
|
return;
|
|
59985
60122
|
}
|
|
59986
60123
|
const kind = strategy2.kind;
|
|
60124
|
+
const reward_factor = strategy2.reward_factor;
|
|
59987
60125
|
const { entries, last_value, ...app_config } = await this.tradeConfig({
|
|
59988
60126
|
symbol,
|
|
59989
60127
|
kind
|
|
@@ -60005,6 +60143,36 @@ class ExchangeAccount {
|
|
|
60005
60143
|
});
|
|
60006
60144
|
}
|
|
60007
60145
|
console.log("Checking if focus position has quantity for ", symbol, kind);
|
|
60146
|
+
const focusPosition = await this.getFocusPosition({
|
|
60147
|
+
symbol,
|
|
60148
|
+
kind
|
|
60149
|
+
});
|
|
60150
|
+
const reversePosition = await this.getFocusPosition({
|
|
60151
|
+
symbol,
|
|
60152
|
+
kind: kind === "long" ? "short" : "long"
|
|
60153
|
+
});
|
|
60154
|
+
const opposite_config = focusPosition.getOppositeConfig({
|
|
60155
|
+
ratio: reward_factor
|
|
60156
|
+
});
|
|
60157
|
+
const reverse_config = await reversePosition.getConfig();
|
|
60158
|
+
if ((reverse_config.entry !== opposite_config.entry || reverse_config.stop !== opposite_config.stop || reverse_config.risk !== opposite_config.risk || reverse_config.risk_reward !== opposite_config.risk_reward) && focusPosition.getInstance().quantity > 0) {
|
|
60159
|
+
console.log("Updating reverse config for ", symbol, kind, "with opposite config", opposite_config);
|
|
60160
|
+
await reversePosition.getConfig({
|
|
60161
|
+
params: {
|
|
60162
|
+
entry: opposite_config.entry,
|
|
60163
|
+
stop: opposite_config.stop,
|
|
60164
|
+
risk: opposite_config.risk,
|
|
60165
|
+
risk_reward: opposite_config.risk_reward
|
|
60166
|
+
}
|
|
60167
|
+
});
|
|
60168
|
+
console.log("Placing trade for ", symbol, reversePosition.kind);
|
|
60169
|
+
await reversePosition.placeTrade({
|
|
60170
|
+
ignore_config: true,
|
|
60171
|
+
limit: true,
|
|
60172
|
+
place: true
|
|
60173
|
+
});
|
|
60174
|
+
}
|
|
60175
|
+
console.log("Opposite config for ", symbol, kind, opposite_config);
|
|
60008
60176
|
return {
|
|
60009
60177
|
config_details: {
|
|
60010
60178
|
app_config,
|
|
@@ -60647,6 +60815,7 @@ export {
|
|
|
60647
60815
|
getHedgeZone,
|
|
60648
60816
|
generate_config_params,
|
|
60649
60817
|
generateOptimumAppConfig,
|
|
60818
|
+
generateOppositeTradeConfig,
|
|
60650
60819
|
generateGapTp,
|
|
60651
60820
|
exports_exchange_account as exchange_account,
|
|
60652
60821
|
determine_break_even_price,
|
|
@@ -60658,6 +60827,7 @@ export {
|
|
|
60658
60827
|
determineCompoundLongTrade,
|
|
60659
60828
|
exports_database as database,
|
|
60660
60829
|
createArray,
|
|
60830
|
+
constructAppConfig,
|
|
60661
60831
|
computeRiskReward,
|
|
60662
60832
|
computeProfitDetail,
|
|
60663
60833
|
buildConfig,
|