Skip to content

Commit 169ec27

Browse files
hogan-yuanclaude
andauthored
feat(screener): migrate to /v1/quote/ai/screener/* endpoints (#530)
## Summary Migrates all screener endpoints from `/v1/quote/screener/*` to `/v1/quote/ai/screener/*` per [longbridge-terminal PR #217](longbridge/longbridge-terminal#217). ## Changes | Old endpoint | New endpoint | |---|---| | `GET /v1/quote/screener/strategies/recommend` | `GET /v1/quote/ai/screener/strategies/recommend` | | `GET /v1/quote/screener/strategies/mine` | `GET /v1/quote/ai/screener/strategies/mine` | | `GET /v1/quote/screener/strategy?id=N` | `GET /v1/quote/ai/screener/strategy/{id}` | | `POST /v1/quote/screener/search` | `POST /v1/quote/ai/screener/search` | | `GET /v1/quote/screener/indicators` | `GET /v1/quote/ai/screener/indicators` | ### Breaking changes - `screener_recommend_strategies(market)` and `screener_user_strategies(market)` now require a `market` parameter (Rust/Python/Node.js/Java/C) - `screener_strategy(id)` uses path param instead of query param 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
1 parent 1438878 commit 169ec27

24 files changed

Lines changed: 601 additions & 107 deletions

File tree

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
## [4.2.1]
8+
9+
### Changed
10+
11+
- `ScreenerContext`: screener endpoints migrated to `/v1/quote/ai/screener/*`; `screener_recommend_strategies` / `screener_user_strategies` now accept a `market` parameter; `screener_search` accepts typed `ScreenerCondition` objects (Mode B) instead of raw strings
12+
13+
### Fixed
14+
15+
- `OperatingFinancial`: renamed `counter_id``symbol` (converts `ST/US/AAPL``AAPL.US`)
16+
717
## [4.2.0]
818

919
### Added

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ resolver = "3"
33
members = ["rust", "python", "nodejs", "java", "c"]
44

55
[workspace.package]
6-
version = "4.2.0"
6+
version = "4.2.1"
77
edition = "2024"
88

99
[profile.release]

c/csrc/include/longbridge.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10193,6 +10193,7 @@ void lb_screener_context_release(const struct lb_screener_context_t *ctx);
1019310193
* Returns `CScreenerRecommendStrategiesResponse`.
1019410194
*/
1019510195
void lb_screener_context_recommend_strategies(const struct lb_screener_context_t *ctx,
10196+
const char *market,
1019610197
lb_async_callback_t callback,
1019710198
void *userdata);
1019810199

@@ -10201,6 +10202,7 @@ void lb_screener_context_recommend_strategies(const struct lb_screener_context_t
1020110202
* Returns `CScreenerUserStrategiesResponse`.
1020210203
*/
1020310204
void lb_screener_context_user_strategies(const struct lb_screener_context_t *ctx,
10205+
const char *market,
1020410206
lb_async_callback_t callback,
1020510207
void *userdata);
1020610208

c/src/screener_context/context.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,16 @@ pub unsafe extern "C" fn lb_screener_context_release(ctx: *const CScreenerContex
3838
#[unsafe(no_mangle)]
3939
pub unsafe extern "C" fn lb_screener_context_recommend_strategies(
4040
ctx: *const CScreenerContext,
41+
market: *const c_char,
4142
callback: CAsyncCallback,
4243
userdata: *mut c_void,
4344
) {
4445
let ctx_inner = (*ctx).ctx.clone();
46+
let market = cstr_to_rust(market);
4547
execute_async(callback, ctx, userdata, async move {
4648
let resp: CCow<CScreenerRecommendStrategiesResponseOwned> =
4749
CCow::new(CScreenerRecommendStrategiesResponseOwned::from(
48-
ctx_inner.screener_recommend_strategies().await?,
50+
ctx_inner.screener_recommend_strategies(market).await?,
4951
));
5052
Ok(resp)
5153
});
@@ -56,14 +58,17 @@ pub unsafe extern "C" fn lb_screener_context_recommend_strategies(
5658
#[unsafe(no_mangle)]
5759
pub unsafe extern "C" fn lb_screener_context_user_strategies(
5860
ctx: *const CScreenerContext,
61+
market: *const c_char,
5962
callback: CAsyncCallback,
6063
userdata: *mut c_void,
6164
) {
6265
let ctx_inner = (*ctx).ctx.clone();
66+
let market = cstr_to_rust(market);
6367
execute_async(callback, ctx, userdata, async move {
64-
let resp: CCow<CScreenerUserStrategiesResponseOwned> = CCow::new(
65-
CScreenerUserStrategiesResponseOwned::from(ctx_inner.screener_user_strategies().await?),
66-
);
68+
let resp: CCow<CScreenerUserStrategiesResponseOwned> =
69+
CCow::new(CScreenerUserStrategiesResponseOwned::from(
70+
ctx_inner.screener_user_strategies(market).await?,
71+
));
6772
Ok(resp)
6873
});
6974
}
@@ -110,7 +115,7 @@ pub unsafe extern "C" fn lb_screener_context_search(
110115
let resp: CCow<CScreenerSearchResponseOwned> =
111116
CCow::new(CScreenerSearchResponseOwned::from(
112117
ctx_inner
113-
.screener_search(market, strategy_id, page, size)
118+
.screener_search(market, strategy_id, vec![], vec![], page, size)
114119
.await?,
115120
));
116121
Ok(resp)

cpp/include/screener_context.hpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,13 @@ class ScreenerContext
2424

2525
static ScreenerContext create(const Config& config);
2626

27-
/// Get recommended built-in screener strategies (raw JSON string)
28-
void screener_recommend_strategies(AsyncCallback<ScreenerContext, std::string> callback) const;
27+
/// Get preset screener strategies for a given market (raw JSON string)
28+
void screener_recommend_strategies(const std::string& market,
29+
AsyncCallback<ScreenerContext, std::string> callback) const;
2930

3031
/// Get the current user's saved screener strategies (raw JSON string)
31-
void screener_user_strategies(AsyncCallback<ScreenerContext, std::string> callback) const;
32+
void screener_user_strategies(const std::string& market,
33+
AsyncCallback<ScreenerContext, std::string> callback) const;
3234

3335
/// Get detail for one screener strategy by ID (raw JSON string)
3436
void screener_strategy(int64_t id, AsyncCallback<ScreenerContext, std::string> callback) const;

cpp/src/screener_context.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ extern "C" {
88
const lb_screener_context_t* lb_screener_context_new(const lb_config_t* config);
99
void lb_screener_context_retain(const lb_screener_context_t* ctx);
1010
void lb_screener_context_release(const lb_screener_context_t* ctx);
11-
void lb_screener_context_recommend_strategies(const lb_screener_context_t*, lb_async_callback_t, void*);
12-
void lb_screener_context_user_strategies(const lb_screener_context_t*, lb_async_callback_t, void*);
11+
// Declarations already present in longbridge.h (with market param) — no need to redeclare.
1312
void lb_screener_context_strategy(const lb_screener_context_t*, int64_t, lb_async_callback_t, void*);
1413
void lb_screener_context_search(const lb_screener_context_t*, const char*, int64_t, bool, uint32_t, uint32_t, lb_async_callback_t, void*);
1514
void lb_screener_context_indicators(const lb_screener_context_t*, lb_async_callback_t, void*);
@@ -39,12 +38,12 @@ ScreenerContext ScreenerContext::create(const Config& config) {
3938
else{(*cb)(AsyncResult<ScreenerContext,std::string>(sctx,std::move(status),nullptr));} \
4039
}, new AsyncCallback<ScreenerContext,std::string>(callback))
4140

42-
void ScreenerContext::screener_recommend_strategies(AsyncCallback<ScreenerContext, std::string> callback) const {
43-
S_JSON(lb_screener_context_recommend_strategies, lb_screener_recommend_strategies_response_t, ctx_);
41+
void ScreenerContext::screener_recommend_strategies(const std::string& market, AsyncCallback<ScreenerContext, std::string> callback) const {
42+
S_JSON(lb_screener_context_recommend_strategies, lb_screener_recommend_strategies_response_t, ctx_, market.c_str());
4443
}
4544

46-
void ScreenerContext::screener_user_strategies(AsyncCallback<ScreenerContext, std::string> callback) const {
47-
S_JSON(lb_screener_context_user_strategies, lb_screener_user_strategies_response_t, ctx_);
45+
void ScreenerContext::screener_user_strategies(const std::string& market, AsyncCallback<ScreenerContext, std::string> callback) const {
46+
S_JSON(lb_screener_context_user_strategies, lb_screener_user_strategies_response_t, ctx_, market.c_str());
4847
}
4948

5049
void ScreenerContext::screener_strategy(int64_t id, AsyncCallback<ScreenerContext, std::string> callback) const {

java/javasrc/src/main/java/com/longbridge/SdkNative.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,9 +335,11 @@ public static native void marketContextRankList(long context, Object opts,
335335
public static native void freeScreenerContext(long context);
336336

337337
public static native void screenerContextRecommendStrategies(long context,
338+
String market,
338339
AsyncCallback callback);
339340

340341
public static native void screenerContextUserStrategies(long context,
342+
String market,
341343
AsyncCallback callback);
342344

343345
public static native void screenerContextStrategy(long context, Object opts,

java/javasrc/src/main/java/com/longbridge/fundamental/OperatingFinancial.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
public class OperatingFinancial {
55
/** Ticker code (may be empty). */
66
public String code;
7-
/** Raw counter ID (may be empty). */
8-
public String counterId;
7+
/** Symbol in CODE.MARKET format (may be empty). */
8+
public String symbol;
99
/** Reporting currency. */
1010
public String currency;
1111
/** Company name. */

java/javasrc/src/main/java/com/longbridge/screener/ScreenerContext.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,24 @@ public void close() throws Exception {
2020
SdkNative.freeScreenerContext(raw);
2121
}
2222

23-
/** Get platform-recommended screener strategies. */
23+
/** Get platform-preset screener strategies for the given market (default "US"). */
24+
public CompletableFuture<ScreenerRecommendStrategiesResponse> getRecommendStrategies(String market) throws OpenApiException {
25+
return AsyncCallback.executeTask((callback) -> SdkNative.screenerContextRecommendStrategies(raw, market, callback));
26+
}
27+
28+
/** Get platform-preset screener strategies (defaults to US market). */
2429
public CompletableFuture<ScreenerRecommendStrategiesResponse> getRecommendStrategies() throws OpenApiException {
25-
return AsyncCallback.executeTask((callback) -> SdkNative.screenerContextRecommendStrategies(raw, callback));
30+
return getRecommendStrategies("US");
31+
}
32+
33+
/** Get the current user's saved screener strategies for the given market (default "US"). */
34+
public CompletableFuture<ScreenerUserStrategiesResponse> getUserStrategies(String market) throws OpenApiException {
35+
return AsyncCallback.executeTask((callback) -> SdkNative.screenerContextUserStrategies(raw, market, callback));
2636
}
2737

28-
/** Get the current user's saved screener strategies. */
38+
/** Get the current user's saved screener strategies (defaults to US market). */
2939
public CompletableFuture<ScreenerUserStrategiesResponse> getUserStrategies() throws OpenApiException {
30-
return AsyncCallback.executeTask((callback) -> SdkNative.screenerContextUserStrategies(raw, callback));
40+
return getUserStrategies("US");
3141
}
3242

3343
/** Get detail for one screener strategy by ID. */

java/src/screener_context.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ use std::sync::Arc;
22

33
use jni::{
44
JNIEnv,
5-
objects::{JClass, JObject},
5+
objects::{JClass, JObject, JString},
66
};
77
use longbridge::{Config, ScreenerContext};
88

99
use crate::{
1010
async_util,
1111
error::jni_result,
12-
types::{JavaInteger, get_field},
12+
types::{FromJValue, JavaInteger, get_field},
1313
};
1414

1515
struct ContextObj {
@@ -41,12 +41,14 @@ pub unsafe extern "system" fn Java_com_longbridge_SdkNative_screenerContextRecom
4141
mut env: JNIEnv,
4242
_class: JClass,
4343
context: i64,
44+
market: JString,
4445
callback: JObject,
4546
) {
4647
jni_result(&mut env, (), |env| {
4748
let context = &*(context as *const ContextObj);
49+
let market: String = FromJValue::from_jvalue(env, market.into())?;
4850
async_util::execute(env, callback, async move {
49-
let resp = context.ctx.screener_recommend_strategies().await?;
51+
let resp = context.ctx.screener_recommend_strategies(market).await?;
5052
Ok(resp)
5153
})?;
5254
Ok(())
@@ -58,12 +60,14 @@ pub unsafe extern "system" fn Java_com_longbridge_SdkNative_screenerContextUserS
5860
mut env: JNIEnv,
5961
_class: JClass,
6062
context: i64,
63+
market: JString,
6164
callback: JObject,
6265
) {
6366
jni_result(&mut env, (), |env| {
6467
let context = &*(context as *const ContextObj);
68+
let market: String = FromJValue::from_jvalue(env, market.into())?;
6569
async_util::execute(env, callback, async move {
66-
let resp = context.ctx.screener_user_strategies().await?;
70+
let resp = context.ctx.screener_user_strategies(market).await?;
6771
Ok(resp)
6872
})?;
6973
Ok(())
@@ -107,7 +111,7 @@ pub unsafe extern "system" fn Java_com_longbridge_SdkNative_screenerContextSearc
107111
async_util::execute(env, callback, async move {
108112
let resp = context
109113
.ctx
110-
.screener_search(market, strategy_id, page, size)
114+
.screener_search(market, strategy_id, vec![], vec![], page, size)
111115
.await?;
112116
Ok(resp)
113117
})?;

0 commit comments

Comments
 (0)