diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1e5158655..2752d3c6b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,7 +2,7 @@ name: Release on: push: branches: - - release + - release1 jobs: build-python-sdk: @@ -515,236 +515,3 @@ jobs: runs-on: ubuntu-24.04 steps: - run: echo "All builds are done" - - publish-rust-sdk: - needs: - - build - runs-on: ubuntu-24.04 - strategy: - fail-fast: true - max-parallel: 1 - matrix: - package: - - name: longport-proto - registryName: longport-proto - path: rust/crates/proto - - name: longport-httpcli - registryName: longport-httpcli - path: rust/crates/httpclient - - name: longport-wscli - registryName: longport-wscli - path: rust/crates/wsclient - - name: longport-candlesticks - registryName: longport-candlesticks - path: rust/crates/candlesticks - - name: longport - registryName: longport - path: rust - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - submodules: true - - uses: dtolnay/rust-toolchain@stable - with: - toolchain: stable - - name: get version - run: echo PACKAGE_VERSION=$(sed -nE 's/^\s*version = "(.*?)"/\1/p' Cargo.toml) >> $GITHUB_ENV - - name: check published version - run: echo PUBLISHED_VERSION=$(cargo search ${{ matrix.package.registryName }} --limit 1 | sed -nE 's/^[^"]*"//; s/".*//1p' -) >> $GITHUB_ENV - - name: cargo login - if: env.PACKAGE_VERSION != env.PUBLISHED_VERSION - run: cargo login ${{ secrets.CRATES_TOKEN }} - - name: cargo package - if: env.PACKAGE_VERSION != env.PUBLISHED_VERSION - working-directory: ${{ matrix.package.path }} - run: | - cargo package - echo "We will publish:" $PACKAGE_VERSION - echo "This is current latest:" $PUBLISHED_VERSION - - name: Publish ${{ matrix.package.name }} - if: env.PACKAGE_VERSION != env.PUBLISHED_VERSION - working-directory: ${{ matrix.package.path }} - run: | - echo "# Cargo Publish" - cargo publish --no-verify - - publish-cpp-sdk: - needs: - - build - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - - - name: Download includes - uses: actions/download-artifact@v5 - with: - path: ./sdk/libs - pattern: libs-* - merge-multiple: true - - - name: Download includes - uses: actions/download-artifact@v5 - with: - path: ./sdk/include - pattern: include-* - merge-multiple: true - - - name: Get Version - run: echo SDK_VERSION=$(sed -nE 's/^\s*version = "(.*?)"/\1/p' Cargo.toml) >> $GITHUB_ENV - - - name: Package - run: tar czvf openapi-cpp-sdk-$SDK_VERSION.tar.gz ./sdk - - - name: Upload SDK to BJ - env: - AWS_ACCESS_KEY_ID: ${{ secrets.FE_S3_OPEN_STATIC_PROD_BJ_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.FE_S3_OPEN_STATIC_PROD_BJ_ACCESS_KEY_SECRET }} - run: | - aws --region=${{ secrets.PROD_BJ_AWS_DEFAULT_REGION }} s3 cp openapi-cpp-sdk-$SDK_VERSION.tar.gz s3://${{ secrets.FE_S3_OPEN_STATIC_PROD_BJ_BUCKET }}/openapi-sdk/ --cache-control max-age=31536000 - - - name: Upload SDK to HK - env: - AWS_ACCESS_KEY_ID: ${{ secrets.FE_S3_OPEN_STATIC_PROD_HK_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.FE_S3_OPEN_STATIC_PROD_HK_ACCESS_KEY_SECRET }} - run: | - aws --region=${{ secrets.PROD_HK_AWS_DEFAULT_REGION }} s3 cp openapi-cpp-sdk-$SDK_VERSION.tar.gz s3://${{ secrets.FE_S3_OPEN_STATIC_PROD_HK_BUCKET }}/openapi-sdk/ --cache-control max-age=31536000 - - publish-python-sdk: - runs-on: ubuntu-24.04 - environment: - name: pypi - url: https://pypi.org/p/longport - permissions: - id-token: write - needs: - - build - steps: - - uses: actions/download-artifact@v5 - with: - path: dist - pattern: wheels-* - merge-multiple: true - - uses: actions/setup-python@v5 - with: - python-version: 3.8 - - name: Publish to PyPi - uses: pypa/gh-action-pypi-publish@release/v1 - - publish-nodejs-sdk: - runs-on: ubuntu-24.04 - needs: - - build - steps: - - uses: actions/checkout@v4 - - name: Update versions - run: node ./.github/misc/update_jssdk_version.mjs $(sed -nE 's/^\s*version = "(.*?)"/\1/p' Cargo.toml) - - name: Setup node - uses: actions/setup-node@v4 - with: - node-version: 20 - check-latest: true - - name: Install napi-rs/cli - run: npm install -g @napi-rs/cli - - name: Download all artifacts - uses: actions/download-artifact@v5 - with: - path: ./nodejs/artifacts - pattern: bindings-*we - merge-multiple: true - - name: Move artifacts - run: napi artifacts - working-directory: ./nodejs - - name: List packages - run: ls -R ./npm - shell: bash - working-directory: ./nodejs - - name: Publish - run: | - echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc - npm publish --access public - working-directory: ./nodejs - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - publish-java-sdk: - runs-on: ubuntu-24.04 - needs: build - steps: - - uses: actions/checkout@v4 - with: - submodules: true - - - name: Install JDK - uses: actions/setup-java@v5 - with: - java-version: "11" - distribution: "temurin" - - - name: Download all artifacts - uses: actions/download-artifact@v5 - with: - path: ./java/jnis - pattern: jnis-* - merge-multiple: true - - - name: Configure Maven settings.xml - run: | - mkdir -p ~/.m2 - cat > ~/.m2/settings.xml << EOF - - - - gpg - - true - - - gpg - ${{ secrets.GPG_PASSPHRASE }} - - - - - - central - ${{ secrets.CENTRAL_USERNAME }} - ${{ secrets.CENTRAL_PASSWORD }} - - - - EOF - - - name: Copy jnis - working-directory: java - run: | - mkdir -p javasrc/target/natives/linux_64 - mkdir -p javasrc/target/natives/linux_arm64 - mkdir -p javasrc/target/natives/windows_64 - mkdir -p javasrc/target/natives/osx_64 - mkdir -p javasrc/target/natives/osx_arm64 - mv jnis/longport_java-x86_64-unknown-linux-gnu.so javasrc/target/natives/linux_64/liblongport_java.so - mv jnis/longport_java-aarch64-unknown-linux-gnu.so javasrc/target/natives/linux_arm64/liblongport_java.so - mv jnis/longport_java-x86_64-pc-windows-msvc.dll javasrc/target/natives/windows_64/longport_java.dll - mv jnis/longport_java-x86_64-apple-darwin.dylib javasrc/target/natives/osx_64/liblongport_java.dylib - mv jnis/longport_java-aarch64-apple-darwin.dylib javasrc/target/natives/osx_arm64/liblongport_java.dylib - - - name: Get version - run: echo PACKAGE_VERSION=$(sed -nE 's/^\s*version = "(.*?)"/\1/p' Cargo.toml) >> $GITHUB_ENV - - - name: Update version - working-directory: java/javasrc - run: mvn versions:set -DnewVersion=${PACKAGE_VERSION} - - - name: Import GPG private key - env: - GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} - GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - run: | - echo "$GPG_PRIVATE_KEY" > private.key - gpg --import --batch private.key - rm private.key - - - name: Deploy Maven package - working-directory: java/javasrc - run: mvn deploy --activate-profiles release diff --git a/c/csrc/include/longport.h b/c/csrc/include/longport.h index 8f901212a..7261c70a3 100644 --- a/c/csrc/include/longport.h +++ b/c/csrc/include/longport.h @@ -1928,6 +1928,18 @@ typedef struct lb_replace_order_options_t { * Trailing percent (can be null) */ const struct lb_decimal_t *trailing_percent; + /** + * Limit depth level (can be null) + */ + const int32_t *limit_depth_level; + /** + * Trigger count (can be null) + */ + const int32_t *trigger_count; + /** + * Monitor price (can be null) + */ + const struct lb_decimal_t *monitor_price; /** * Remark (can be null) */ @@ -1987,6 +1999,18 @@ typedef struct lb_submit_order_options_t { * Enable or disable outside regular trading hours (can be null) */ const enum lb_outside_rth_t *outside_rth; + /** + * Limit depth level (can be null) + */ + const int32_t *limit_depth_level; + /** + * Trigger count (can be null) + */ + const int32_t *trigger_count; + /** + * Monitor price (can be null) + */ + const struct lb_decimal_t *monitor_price; /** * Remark (Maximum 64 characters) (can be null) */ @@ -2859,6 +2883,18 @@ typedef struct lb_order_t { * Enable or disable outside regular trading hours (maybe null) */ const enum lb_outside_rth_t *outside_rth; + /** + * Limit depth level (maybe null) + */ + const int32_t *limit_depth_level; + /** + * Trigger count (maybe null) + */ + const int32_t *trigger_count; + /** + * Monitor price (maybe null) + */ + const struct lb_decimal_t *monitor_price; /** * Remark */ @@ -3399,6 +3435,18 @@ typedef struct lb_order_detail_t { * Enable or disable outside regular trading hours (maybe null) */ const enum lb_outside_rth_t *outside_rth; + /** + * Limit depth level (maybe null) + */ + const int32_t *limit_depth_level; + /** + * Trigger count (maybe null) + */ + const int32_t *trigger_count; + /** + * Monitor price (maybe null) + */ + const struct lb_decimal_t *monitor_price; /** * Remark */ diff --git a/c/src/trade_context/context.rs b/c/src/trade_context/context.rs index 8853c1b79..4ae7739f3 100644 --- a/c/src/trade_context/context.rs +++ b/c/src/trade_context/context.rs @@ -393,6 +393,15 @@ pub unsafe extern "C" fn lb_trade_context_replace_order( if !(*opts).trailing_percent.is_null() { opts2 = opts2.trailing_percent((*(*opts).trailing_percent).value); } + if !(*opts).limit_depth_level.is_null() { + opts2 = opts2.limit_depth_level(*(*opts).limit_depth_level); + } + if !(*opts).trigger_count.is_null() { + opts2 = opts2.trigger_count(*(*opts).trigger_count); + } + if !(*opts).monitor_price.is_null() { + opts2 = opts2.monitor_price((*(*opts).monitor_price).value); + } if !(*opts).remark.is_null() { opts2 = opts2.remark(cstr_to_rust((*opts).remark)); } @@ -446,6 +455,15 @@ pub unsafe extern "C" fn lb_trade_context_submit_order( if !(*opts).outside_rth.is_null() { opts2 = opts2.outside_rth((*(*opts).outside_rth).into()); } + if !(*opts).limit_depth_level.is_null() { + opts2 = opts2.limit_depth_level(*(*opts).limit_depth_level); + } + if !(*opts).trigger_count.is_null() { + opts2 = opts2.trigger_count(*(*opts).trigger_count); + } + if !(*opts).monitor_price.is_null() { + opts2 = opts2.monitor_price((*(*opts).monitor_price).value); + } if !(*opts).remark.is_null() { opts2 = opts2.remark(cstr_to_rust((*opts).remark)); } diff --git a/c/src/trade_context/types.rs b/c/src/trade_context/types.rs index 2113bb129..6d9efb987 100644 --- a/c/src/trade_context/types.rs +++ b/c/src/trade_context/types.rs @@ -397,6 +397,12 @@ pub struct COrder { pub currency: *const c_char, /// Enable or disable outside regular trading hours (maybe null) pub outside_rth: *const COutsideRTH, + /// Limit depth level (maybe null) + pub limit_depth_level: *const i32, + /// Trigger count (maybe null) + pub trigger_count: *const i32, + /// Monitor price (maybe null) + pub monitor_price: *const CDecimal, /// Remark pub remark: *const c_char, } @@ -428,6 +434,9 @@ pub(crate) struct COrderOwned { trigger_status: Option, currency: CString, outside_rth: Option, + limit_depth_level: Option, + trigger_count: Option, + monitor_price: Option, remark: CString, } @@ -459,6 +468,9 @@ impl From for COrderOwned { trigger_status, currency, outside_rth, + limit_depth_level, + trigger_count, + monitor_price, remark, } = order; COrderOwned { @@ -487,6 +499,9 @@ impl From for COrderOwned { trigger_status: trigger_status.map(Into::into), currency: currency.into(), outside_rth: outside_rth.map(Into::into), + limit_depth_level, + trigger_count, + monitor_price: monitor_price.map(Into::into), remark: remark.into(), } } @@ -522,6 +537,9 @@ impl ToFFI for COrderOwned { trigger_status, currency, outside_rth, + limit_depth_level, + trigger_count, + monitor_price, remark, } = self; COrder { @@ -586,6 +604,18 @@ impl ToFFI for COrderOwned { .as_ref() .map(|value| value as *const COutsideRTH) .unwrap_or(std::ptr::null()), + limit_depth_level: limit_depth_level + .as_ref() + .map(|value| value as *const i32) + .unwrap_or(std::ptr::null()), + trigger_count: trigger_count + .as_ref() + .map(|value| value as *const i32) + .unwrap_or(std::ptr::null()), + monitor_price: monitor_price + .as_ref() + .map(ToFFI::to_ffi_type) + .unwrap_or(std::ptr::null()), remark: remark.to_ffi_type(), } } @@ -647,6 +677,12 @@ pub struct CReplaceOrderOptions { pub trailing_amount: *const CDecimal, /// Trailing percent (can be null) pub trailing_percent: *const CDecimal, + /// Limit depth level (can be null) + pub limit_depth_level: *const i32, + /// Trigger count (can be null) + pub trigger_count: *const i32, + /// Monitor price (can be null) + pub monitor_price: *const CDecimal, /// Remark (can be null) pub remark: *const c_char, } @@ -680,6 +716,12 @@ pub struct CSubmitOrderOptions { pub expire_date: *const CDate, /// Enable or disable outside regular trading hours (can be null) pub outside_rth: *const COutsideRTH, + /// Limit depth level (can be null) + pub limit_depth_level: *const i32, + /// Trigger count (can be null) + pub trigger_count: *const i32, + /// Monitor price (can be null) + pub monitor_price: *const CDecimal, /// Remark (Maximum 64 characters) (can be null) pub remark: *const c_char, } @@ -1692,6 +1734,12 @@ pub struct COrderDetail { pub currency: *const c_char, /// Enable or disable outside regular trading hours (maybe null) pub outside_rth: *const COutsideRTH, + /// Limit depth level (maybe null) + pub limit_depth_level: *const i32, + /// Trigger count (maybe null) + pub trigger_count: *const i32, + /// Monitor price (maybe null) + pub monitor_price: *const CDecimal, /// Remark pub remark: *const c_char, /// Commission-free Status @@ -1747,6 +1795,9 @@ pub(crate) struct COrderDetailOwned { trigger_status: Option, currency: CString, outside_rth: Option, + limit_depth_level: Option, + trigger_count: Option, + monitor_price: Option, remark: CString, free_status: CCommissionFreeStatus, free_amount: Option, @@ -1789,6 +1840,9 @@ impl From for COrderDetailOwned { trigger_status, currency, outside_rth, + limit_depth_level, + trigger_count, + monitor_price, remark, free_status, free_amount, @@ -1828,6 +1882,9 @@ impl From for COrderDetailOwned { trigger_status: trigger_status.map(Into::into), currency: currency.into(), outside_rth: outside_rth.map(Into::into), + limit_depth_level, + trigger_count, + monitor_price: monitor_price.map(Into::into), remark: remark.into(), free_status: free_status.into(), free_amount: free_amount.map(Into::into), @@ -1874,6 +1931,9 @@ impl ToFFI for COrderDetailOwned { trigger_status, currency, outside_rth, + limit_depth_level, + trigger_count, + monitor_price, remark, free_status, free_amount, @@ -1949,6 +2009,18 @@ impl ToFFI for COrderDetailOwned { .as_ref() .map(|value| value as *const COutsideRTH) .unwrap_or(std::ptr::null()), + limit_depth_level: limit_depth_level + .as_ref() + .map(|value| value as *const i32) + .unwrap_or(std::ptr::null()), + trigger_count: trigger_count + .as_ref() + .map(|value| value as *const i32) + .unwrap_or(std::ptr::null()), + monitor_price: monitor_price + .as_ref() + .map(ToFFI::to_ffi_type) + .unwrap_or(std::ptr::null()), remark: remark.to_ffi_type(), free_status: *free_status, free_amount: free_amount diff --git a/cpp/include/types.hpp b/cpp/include/types.hpp index 1b6ed1252..5d7a495a4 100644 --- a/cpp/include/types.hpp +++ b/cpp/include/types.hpp @@ -1490,6 +1490,12 @@ struct Order std::string currency; /// Enable or disable outside regular trading hours std::optional outside_rth; + /// Limit depth level + std::optional limit_depth_level; + /// Trigger count + std::optional trigger_count; + /// Monitor price + std::optional monitor_price; /// Remark std::string remark; }; @@ -1598,6 +1604,12 @@ struct ReplaceOrderOptions std::optional trailing_amount; /// Trailing percent std::optional trailing_percent; + /// Limit depth level + std::optional limit_depth_level; + /// Trigger count + std::optional trigger_count; + /// Monitor price + std::optional monitor_price; /// Remark std::optional remark; }; @@ -1630,6 +1642,12 @@ struct SubmitOrderOptions std::optional expire_date; /// Enable or disable outside regular trading hours std::optional outside_rth; + /// Limit depth level + std::optional limit_depth_level; + /// Trigger count + std::optional trigger_count; + /// Monitor price + std::optional monitor_price; /// Remark (Maximum 64 characters) std::optional remark; }; @@ -1985,6 +2003,12 @@ struct OrderDetail std::string currency; /// Enable or disable outside regular trading hours std::optional outside_rth; + /// Limit depth level + std::optional limit_depth_level; + /// Trigger count + std::optional trigger_count; + /// Monitor price + std::optional monitor_price; /// Remark std::string remark; /// Commission-free Status diff --git a/cpp/src/convert.hpp b/cpp/src/convert.hpp index 4e7848ce3..2592e6cca 100644 --- a/cpp/src/convert.hpp +++ b/cpp/src/convert.hpp @@ -1304,6 +1304,12 @@ convert(const lb_order_t* order) order->currency, order->outside_rth ? std::optional{ convert(*order->outside_rth) } : std::nullopt, + order->limit_depth_level ? std::optional{ *order->limit_depth_level } + : std::nullopt, + order->trigger_count ? std::optional{ *order->trigger_count } + : std::nullopt, + order->monitor_price ? std::optional{ Decimal(order->monitor_price) } + : std::nullopt, order->remark }; } @@ -1720,6 +1726,12 @@ convert(const lb_order_detail_t* order) order->currency, order->outside_rth ? std::optional{ convert(*order->outside_rth) } : std::nullopt, + order->limit_depth_level ? std::optional{ *order->limit_depth_level } + : std::nullopt, + order->trigger_count ? std::optional{ *order->trigger_count } + : std::nullopt, + order->monitor_price ? std::optional{ Decimal(order->monitor_price) } + : std::nullopt, order->remark, convert(order->free_status), order->free_amount ? std::optional{ Decimal(order->free_amount) } diff --git a/cpp/src/trade_context.cpp b/cpp/src/trade_context.cpp index 354fd2e38..92b9cf02f 100644 --- a/cpp/src/trade_context.cpp +++ b/cpp/src/trade_context.cpp @@ -377,6 +377,9 @@ TradeContext::replace_order(const ReplaceOrderOptions& opts, nullptr, nullptr, nullptr, + nullptr, + nullptr, + nullptr, }; opts2.price = opts.price ? (const lb_decimal_t*)opts.price.value() : nullptr; @@ -392,6 +395,13 @@ TradeContext::replace_order(const ReplaceOrderOptions& opts, opts2.trailing_percent = opts.trailing_percent ? (const lb_decimal_t*)opts.trailing_percent.value() : nullptr; + opts2.limit_depth_level = + opts.limit_depth_level ? &opts.limit_depth_level.value() : nullptr; + opts2.trigger_count = + opts.trigger_count ? &opts.trigger_count.value() : nullptr; + opts2.monitor_price = opts.monitor_price + ? (const lb_decimal_t*)opts.monitor_price.value() + : nullptr; opts2.remark = opts.remark ? opts.remark->c_str() : nullptr; lb_trade_context_replace_order( @@ -426,6 +436,9 @@ TradeContext::submit_order( nullptr, nullptr, nullptr, + nullptr, + nullptr, + nullptr, opts.remark ? opts.remark->c_str() : nullptr, }; lb_date_t expire_date; @@ -450,6 +463,15 @@ TradeContext::submit_order( expire_date = convert(&opts.expire_date.value()); opts2.expire_date = &expire_date; } + if (opts.limit_depth_level) { + opts2.limit_depth_level = &opts.limit_depth_level.value(); + } + if (opts.trigger_count) { + opts2.trigger_count = &opts.trigger_count.value(); + } + if (opts.monitor_price) { + opts2.monitor_price = (const lb_decimal_t*)opts.monitor_price.value(); + } if (opts.outside_rth) { outside_rth = convert(*opts.outside_rth); opts2.outside_rth = &outside_rth; diff --git a/java/javasrc/src/main/java/com/longport/trade/Order.java b/java/javasrc/src/main/java/com/longport/trade/Order.java index 20135c5b0..70e91ecaa 100644 --- a/java/javasrc/src/main/java/com/longport/trade/Order.java +++ b/java/javasrc/src/main/java/com/longport/trade/Order.java @@ -30,6 +30,9 @@ public class Order { private TriggerStatus triggerStatus; private String currency; private OutsideRTH outsideRth; + private Integer limitDepthLevel; + private Integer triggerCount; + private BigDecimal monitorPrice; private String remark; public String getOrderId() { @@ -136,15 +139,29 @@ public String remark() { return remark; } + public Integer getLimitDepthLevel() { + return limitDepthLevel; + } + + public Integer getTriggerCount() { + return triggerCount; + } + + public BigDecimal getMonitorPrice() { + return monitorPrice; + } + @Override public String toString() { - return "Order [currency=" + currency + ", executedPrice=" + executedPrice + ", executedQuantity=" - + executedQuantity + ", expireDate=" + expireDate + ", lastDone=" + lastDone + ", limitOffset=" - + limitOffset + ", msg=" + msg + ", orderId=" + orderId + ", orderType=" + orderType + ", outsideRth=" - + outsideRth + ", price=" + price + ", quantity=" + quantity + ", side=" + side + ", status=" + status - + ", stockName=" + stockName + ", submittedAt=" + submittedAt + ", symbol=" + symbol + ", tag=" + tag - + ", timeInForce=" + timeInForce + ", trailingAmount=" + trailingAmount + ", trailingPercent=" - + trailingPercent + ", triggerAt=" + triggerAt + ", triggerPrice=" + triggerPrice + ", triggerStatus=" - + triggerStatus + ", updatedAt=" + updatedAt + ", remark=" + remark + "]"; + return "Order [orderId=" + orderId + ", status=" + status + ", stockName=" + stockName + ", quantity=" + + quantity + ", executedQuantity=" + executedQuantity + ", price=" + price + ", executedPrice=" + + executedPrice + ", submittedAt=" + submittedAt + ", side=" + side + ", symbol=" + symbol + + ", orderType=" + orderType + ", lastDone=" + lastDone + ", triggerPrice=" + triggerPrice + ", msg=" + + msg + ", tag=" + tag + ", timeInForce=" + timeInForce + ", expireDate=" + expireDate + ", updatedAt=" + + updatedAt + ", triggerAt=" + triggerAt + ", trailingAmount=" + trailingAmount + ", trailingPercent=" + + trailingPercent + ", limitOffset=" + limitOffset + ", triggerStatus=" + triggerStatus + ", currency=" + + currency + ", outsideRth=" + outsideRth + ", limitDepthLevel=" + limitDepthLevel + ", triggerCount=" + + triggerCount + ", monitorPrice=" + monitorPrice + ", remark=" + remark + "]"; } + } \ No newline at end of file diff --git a/java/javasrc/src/main/java/com/longport/trade/OrderDetail.java b/java/javasrc/src/main/java/com/longport/trade/OrderDetail.java index ea56420d9..7f059eec0 100644 --- a/java/javasrc/src/main/java/com/longport/trade/OrderDetail.java +++ b/java/javasrc/src/main/java/com/longport/trade/OrderDetail.java @@ -31,6 +31,9 @@ public class OrderDetail { private TriggerStatus triggerStatus; private String currency; private OutsideRTH outsideRth; + private Integer limitDepthLevel; + private Integer triggerCount; + private BigDecimal monitorPrice; private String remark; private CommissionFreeStatus freeStatus; private BigDecimal freeAmount; @@ -144,6 +147,18 @@ public OutsideRTH getOutsideRth() { return outsideRth; } + public Integer getLimitDepthLevel() { + return limitDepthLevel; + } + + public Integer getTriggerCount() { + return triggerCount; + } + + public BigDecimal getMonitorPrice() { + return monitorPrice; + } + public String getRemark() { return remark; } @@ -201,7 +216,8 @@ public String toString() { + msg + ", tag=" + tag + ", timeInForce=" + timeInForce + ", expireDate=" + expireDate + ", updatedAt=" + updatedAt + ", triggerAt=" + triggerAt + ", trailingAmount=" + trailingAmount + ", trailingPercent=" + trailingPercent + ", limitOffset=" + limitOffset + ", triggerStatus=" + triggerStatus + ", currency=" - + currency + ", outsideRth=" + outsideRth + ", remark=" + remark + ", freeStatus=" + freeStatus + + currency + ", outsideRth=" + outsideRth + ", limitDepthLevel=" + limitDepthLevel + ", triggerCount=" + + triggerCount + ", monitorPrice=" + monitorPrice + ", remark=" + remark + ", freeStatus=" + freeStatus + ", freeAmount=" + freeAmount + ", freeCurrency=" + freeCurrency + ", deductionsStatus=" + deductionsStatus + ", deductionsAmount=" + deductionsAmount + ", deductionsCurrency=" + deductionsCurrency + ", platformDeductedStatus=" + platformDeductedStatus diff --git a/java/javasrc/src/main/java/com/longport/trade/ReplaceOrderOptions.java b/java/javasrc/src/main/java/com/longport/trade/ReplaceOrderOptions.java index 206c4151e..601ffa0b2 100644 --- a/java/javasrc/src/main/java/com/longport/trade/ReplaceOrderOptions.java +++ b/java/javasrc/src/main/java/com/longport/trade/ReplaceOrderOptions.java @@ -11,6 +11,9 @@ public class ReplaceOrderOptions { private BigDecimal limitOffset; private BigDecimal trailingAmount; private BigDecimal trailingPercent; + private Integer limitDepthLevel; + private Integer triggerCount; + private BigDecimal monitorPrice; private String remark; public ReplaceOrderOptions(String orderId, BigDecimal quantity) { @@ -43,6 +46,21 @@ public ReplaceOrderOptions setTrailingPercent(BigDecimal trailingPercent) { return this; } + public ReplaceOrderOptions setLimitDepthLevel(Integer limitDepthLevel) { + this.limitDepthLevel = limitDepthLevel; + return this; + } + + public ReplaceOrderOptions setTriggerCount(Integer triggerCount) { + this.triggerCount = triggerCount; + return this; + } + + public ReplaceOrderOptions setMonitorPrice(BigDecimal monitorPrice) { + this.monitorPrice = monitorPrice; + return this; + } + public ReplaceOrderOptions setRemark(String remark) { this.remark = remark; return this; diff --git a/java/javasrc/src/main/java/com/longport/trade/SubmitOrderOptions.java b/java/javasrc/src/main/java/com/longport/trade/SubmitOrderOptions.java index c21832e9f..41359dbdf 100644 --- a/java/javasrc/src/main/java/com/longport/trade/SubmitOrderOptions.java +++ b/java/javasrc/src/main/java/com/longport/trade/SubmitOrderOptions.java @@ -17,6 +17,9 @@ public class SubmitOrderOptions { private BigDecimal trailingPercent; private LocalDate expireDate; private OutsideRTH outsideRth; + private Integer limitDepthLevel; + private Integer triggerCount; + private BigDecimal monitorPrice; private String remark; public SubmitOrderOptions( @@ -67,6 +70,21 @@ public SubmitOrderOptions setOutsideRth(OutsideRTH outsideRth) { return this; } + public SubmitOrderOptions setLimitDepthLevel(Integer limitDepthLevel) { + this.limitDepthLevel = limitDepthLevel; + return this; + } + + public SubmitOrderOptions setTriggerCount(Integer triggerCount) { + this.triggerCount = triggerCount; + return this; + } + + public SubmitOrderOptions setMonitorPrice(BigDecimal monitorPrice) { + this.monitorPrice = monitorPrice; + return this; + } + public SubmitOrderOptions setRemark(String remark) { this.remark = remark; return this; diff --git a/java/src/trade_context.rs b/java/src/trade_context.rs index f04a7ade5..839bef950 100644 --- a/java/src/trade_context.rs +++ b/java/src/trade_context.rs @@ -350,6 +350,18 @@ pub unsafe extern "system" fn Java_com_longport_SdkNative_tradeContextReplaceOrd if let Some(trailing_percent) = trailing_percent { new_opts = new_opts.trailing_percent(trailing_percent); } + let limit_depth_level: Option = get_field(env, &opts, "limitDepthLevel")?; + if let Some(limit_depth_level) = limit_depth_level { + new_opts = new_opts.limit_depth_level(limit_depth_level); + } + let trigger_count: Option = get_field(env, &opts, "triggerCount")?; + if let Some(trigger_count) = trigger_count { + new_opts = new_opts.trigger_count(trigger_count); + } + let monitor_price: Option = get_field(env, &opts, "monitorPrice")?; + if let Some(monitor_price) = monitor_price { + new_opts = new_opts.monitor_price(monitor_price); + } let remark: Option = get_field(env, &opts, "remark")?; if let Some(remark) = remark { new_opts = new_opts.remark(remark); @@ -407,6 +419,18 @@ pub unsafe extern "system" fn Java_com_longport_SdkNative_tradeContextSubmitOrde if let Some(outside_rth) = outside_rth { new_opts = new_opts.outside_rth(outside_rth); } + let limit_depth_level: Option = get_field(env, &opts, "limitDepthLevel")?; + if let Some(limit_depth_level) = limit_depth_level { + new_opts = new_opts.limit_depth_level(limit_depth_level); + } + let trigger_count: Option = get_field(env, &opts, "triggerCount")?; + if let Some(trigger_count) = trigger_count { + new_opts = new_opts.trigger_count(trigger_count); + } + let monitor_price: Option = get_field(env, &opts, "monitorPrice")?; + if let Some(monitor_price) = monitor_price { + new_opts = new_opts.monitor_price(monitor_price); + } let remark: Option = get_field(env, &opts, "remark")?; if let Some(remark) = remark { new_opts = new_opts.remark(remark); diff --git a/java/src/types/classes.rs b/java/src/types/classes.rs index c7c1d9b40..a03c0ccfd 100644 --- a/java/src/types/classes.rs +++ b/java/src/types/classes.rs @@ -652,6 +652,9 @@ impl_java_class!( trigger_status, currency, outside_rth, + limit_depth_level, + trigger_count, + monitor_price, remark ] ); @@ -912,6 +915,9 @@ impl_java_class!( trigger_status, currency, outside_rth, + limit_depth_level, + trigger_count, + monitor_price, remark, free_status, free_amount, diff --git a/mcp/src/server.rs b/mcp/src/server.rs index 7e78f617a..73c6c4860 100644 --- a/mcp/src/server.rs +++ b/mcp/src/server.rs @@ -417,6 +417,12 @@ impl Longport { /// - GTC: Good Till Cancel /// - GTD: Good Till Date time_in_force: String, + /// Limit depth level + limit_depth_level: Option, + /// Trigger count + trigger_count: Option, + /// Monitor price + monitor_price: Option, ) -> Result, Error> { let mut opts = SubmitOrderOptions::new( symbol, @@ -475,6 +481,16 @@ impl Longport { })?); } + if let Some(limit_depth_level) = limit_depth_level { + opts = opts.limit_depth_level(limit_depth_level); + } + if let Some(trigger_count) = trigger_count { + opts = opts.trigger_count(trigger_count); + } + if let Some(monitor_price) = monitor_price { + opts = opts.monitor_price(monitor_price); + } + self.trade_context.submit_order(opts).await.map(Json) } diff --git a/nodejs/index.d.ts b/nodejs/index.d.ts index 3f6047016..0a087c4d8 100644 --- a/nodejs/index.d.ts +++ b/nodejs/index.d.ts @@ -638,6 +638,12 @@ export declare class Order { get currency(): string /** Enable or disable outside regular trading hours */ get outsideRth(): OutsideRTH | null + /** Limit depth level */ + get limitDepthLevel(): number | null + /** Trigger count */ + get triggerCount(): number | null + /** Monitor price */ + get monitorPrice(): Decimal | null /** Remark */ get remark(): string } @@ -734,6 +740,12 @@ export declare class OrderDetail { get currency(): string /** Enable or disable outside regular trading hours */ get outsideRth(): OutsideRTH | null + /** Limit depth level */ + get limitDepthLevel(): number | null + /** Trigger count */ + get triggerCount(): number | null + /** Monitor price */ + get monitorPrice(): Decimal | null /** Remark */ get remark(): string /** Commission-free Status */ @@ -2979,6 +2991,12 @@ export interface ReplaceOrderOptions { trailingAmount?: Decimal /** Trailing percent (`TSLPPCT` / `TSMAPCT` Required) */ trailingPercent?: Decimal + /** Limit depth level */ + limitDepthLevel?: number + /** Trigger count */ + triggerCount?: number + /** Monitor price */ + monitorPrice?: Decimal /** Remark (Maximum 64 characters) */ remark?: string } @@ -3094,6 +3112,12 @@ export interface SubmitOrderOptions { expireDate?: NaiveDate /** Enable or disable outside regular trading hours */ outsideRth?: OutsideRTH + /** Limit depth level */ + limitDepthLevel?: number + /** Trigger count */ + triggerCount?: number + /** Monitor price */ + monitorPrice?: Decimal /** Remark (Maximum 64 characters) */ remark?: string } diff --git a/nodejs/src/trade/requests/replace_order.rs b/nodejs/src/trade/requests/replace_order.rs index 4bb4b0f51..e25a858ae 100644 --- a/nodejs/src/trade/requests/replace_order.rs +++ b/nodejs/src/trade/requests/replace_order.rs @@ -19,6 +19,12 @@ pub struct ReplaceOrderOptions<'env> { pub trailing_amount: Option>, /// Trailing percent (`TSLPPCT` / `TSMAPCT` Required) pub trailing_percent: Option>, + /// Limit depth level + pub limit_depth_level: Option, + /// Trigger count + pub trigger_count: Option, + /// Monitor price + pub monitor_price: Option>, /// Remark (Maximum 64 characters) pub remark: Option, } @@ -42,6 +48,15 @@ impl<'env> From> for longport::trade::ReplaceOrderOpti if let Some(trailing_percent) = opts.trailing_percent { opts2 = opts2.trailing_percent(trailing_percent.0); } + if let Some(limit_depth_level) = opts.limit_depth_level { + opts2 = opts2.limit_depth_level(limit_depth_level); + } + if let Some(trigger_count) = opts.trigger_count { + opts2 = opts2.trigger_count(trigger_count); + } + if let Some(monitor_price) = opts.monitor_price { + opts2 = opts2.monitor_price(monitor_price.0); + } if let Some(remark) = opts.remark { opts2 = opts2.remark(remark); } diff --git a/nodejs/src/trade/requests/submit_order.rs b/nodejs/src/trade/requests/submit_order.rs index 3b411751c..d966222c6 100644 --- a/nodejs/src/trade/requests/submit_order.rs +++ b/nodejs/src/trade/requests/submit_order.rs @@ -34,6 +34,12 @@ pub struct SubmitOrderOptions<'env> { pub expire_date: Option>, /// Enable or disable outside regular trading hours pub outside_rth: Option, + /// Limit depth level + pub limit_depth_level: Option, + /// Trigger count + pub trigger_count: Option, + /// Monitor price + pub monitor_price: Option>, /// Remark (Maximum 64 characters) pub remark: Option, } @@ -69,6 +75,15 @@ impl<'env> From> for longport::trade::SubmitOrderOption if let Some(outside_rth) = opts.outside_rth { opts2 = opts2.outside_rth(outside_rth.into()); } + if let Some(limit_depth_level) = opts.limit_depth_level { + opts2 = opts2.limit_depth_level(limit_depth_level); + } + if let Some(trigger_count) = opts.trigger_count { + opts2 = opts2.trigger_count(trigger_count); + } + if let Some(monitor_price) = opts.monitor_price { + opts2 = opts2.monitor_price(monitor_price.0); + } if let Some(remark) = opts.remark { opts2 = opts2.remark(remark); } diff --git a/nodejs/src/trade/types.rs b/nodejs/src/trade/types.rs index 290261aa0..86476604d 100644 --- a/nodejs/src/trade/types.rs +++ b/nodejs/src/trade/types.rs @@ -261,6 +261,15 @@ pub struct Order { /// Enable or disable outside regular trading hours #[js(opt)] outside_rth: Option, + /// Limit depth level + #[js(opt)] + limit_depth_level: Option, + /// Trigger count + #[js(opt)] + trigger_count: Option, + /// Monitor price + #[js(opt)] + monitor_price: Option, /// Remark remark: String, } @@ -443,6 +452,15 @@ pub struct OrderDetail { /// Enable or disable outside regular trading hours #[js(opt)] outside_rth: Option, + /// Limit depth level + #[js(opt)] + limit_depth_level: Option, + /// Trigger count + #[js(opt)] + trigger_count: Option, + /// Monitor price + #[js(opt)] + monitor_price: Option, /// Remark remark: String, /// Commission-free Status diff --git a/python/pysrc/longport/openapi.pyi b/python/pysrc/longport/openapi.pyi index 7a8ea6894..c831f2438 100644 --- a/python/pysrc/longport/openapi.pyi +++ b/python/pysrc/longport/openapi.pyi @@ -4212,6 +4212,21 @@ class Order: Enable or disable outside regular trading hours """ + limit_depth_level: Optional[int] + """ + Limit depth level + """ + + trigger_count: Optional[int] + """ + Trigger count + """ + + monitor_price: Optional[Decimal] + """ + Monitor price + """ + remark: str """ Remark @@ -4530,6 +4545,21 @@ class OrderDetail: Enable or disable outside regular trading hours """ + limit_depth_level: Optional[int] + """ + Limit depth level + """ + + trigger_count: Optional[int] + """ + Trigger count + """ + + monitor_price: Optional[Decimal] + """ + Monitor price + """ + remark: str """ Remark @@ -5153,7 +5183,7 @@ class TradeContext: print(resp) """ - def replace_order(self, order_id: str, quantity: Decimal, price: Optional[Decimal] = None, trigger_price: Optional[Decimal] = None, limit_offset: Optional[Decimal] = None, trailing_amount: Optional[Decimal] = None, trailing_percent: Optional[Decimal] = None, remark: Optional[str] = None) -> None: + def replace_order(self, order_id: str, quantity: Decimal, price: Optional[Decimal] = None, trigger_price: Optional[Decimal] = None, limit_offset: Optional[Decimal] = None, trailing_amount: Optional[Decimal] = None, trailing_percent: Optional[Decimal] = None, limit_depth_level: Optional[int] = None, trigger_count: Optional[int] = None, monitor_price: Optional[Decimal] = None, remark: Optional[str] = None) -> None: """ Replace order @@ -5164,6 +5194,9 @@ class TradeContext: limit_offset: Limit offset amount (`TSLPAMT` / `TSLPPCT` Required) trailing_amount: Trailing amount (`TSLPAMT` / `TSMAMT` Required) trailing_percent: Trailing percent (`TSLPPCT` / `TSMAPCT` Required) + limit_depth_level: Limit depth level + trigger_count: Trigger count + monitor_price: Monitor price remark: Remark (Maximum 64 characters) Examples: @@ -5182,7 +5215,7 @@ class TradeContext: ) """ - def submit_order(self, symbol: str, order_type: Type[OrderType], side: Type[OrderSide], submitted_quantity: Decimal, time_in_force: Type[TimeInForceType], submitted_price: Optional[Decimal] = None, trigger_price: Optional[Decimal] = None, limit_offset: Optional[Decimal] = None, trailing_amount: Optional[Decimal] = None, trailing_percent: Optional[Decimal] = None, expire_date: Optional[date] = None, outside_rth: Optional[Type[OutsideRTH]] = None, remark: Optional[str] = None) -> SubmitOrderResponse: + def submit_order(self, symbol: str, order_type: Type[OrderType], side: Type[OrderSide], submitted_quantity: Decimal, time_in_force: Type[TimeInForceType], submitted_price: Optional[Decimal] = None, trigger_price: Optional[Decimal] = None, limit_offset: Optional[Decimal] = None, trailing_amount: Optional[Decimal] = None, trailing_percent: Optional[Decimal] = None, expire_date: Optional[date] = None, outside_rth: Optional[Type[OutsideRTH]] = None, limit_depth_level: Optional[int] = None, trigger_count: Optional[int] = None, monitor_price: Optional[Decimal] = None, remark: Optional[str] = None) -> SubmitOrderResponse: """ Submit order @@ -5199,6 +5232,9 @@ class TradeContext: trailing_percent: Trailing percent (`TSLPPCT` / `TSMAPCT` Required) expire_date: Long term order expire date (Required when `time_in_force` is `GoodTilDate`) outside_rth: Enable or disable outside regular trading hours + limit_depth_level: Limit depth level + trigger_count: Trigger count + monitor_price: Monitor price remark: Remark (Maximum 64 characters) Returns: diff --git a/python/src/trade/context.rs b/python/src/trade/context.rs index c6fa52bd3..fdf90f0f1 100644 --- a/python/src/trade/context.rs +++ b/python/src/trade/context.rs @@ -205,7 +205,7 @@ impl TradeContext { } /// Replace order - #[pyo3(signature = (order_id, quantity, price = None, trigger_price = None, limit_offset = None, trailing_amount = None, trailing_percent = None, remark = None))] + #[pyo3(signature = (order_id, quantity, price = None, trigger_price = None, limit_offset = None, trailing_amount = None, trailing_percent = None, limit_depth_level = None, trigger_count = None, monitor_price = None, remark = None))] #[allow(clippy::too_many_arguments)] fn replace_order( &self, @@ -216,6 +216,9 @@ impl TradeContext { limit_offset: Option, trailing_amount: Option, trailing_percent: Option, + limit_depth_level: Option, + trigger_count: Option, + monitor_price: Option, remark: Option, ) -> PyResult<()> { let mut opts = ReplaceOrderOptions::new(order_id, quantity.into()); @@ -235,6 +238,15 @@ impl TradeContext { if let Some(trailing_percent) = trailing_percent { opts = opts.trailing_percent(trailing_percent.into()); } + if let Some(limit_depth_level) = limit_depth_level { + opts = opts.limit_depth_level(limit_depth_level); + } + if let Some(trigger_count) = trigger_count { + opts = opts.trigger_count(trigger_count); + } + if let Some(monitor_price) = monitor_price { + opts = opts.monitor_price(monitor_price.into()); + } if let Some(remark) = remark { opts = opts.remark(remark); } @@ -244,7 +256,7 @@ impl TradeContext { } /// Submit order - #[pyo3(signature = (symbol, order_type, side, submitted_quantity, time_in_force, submitted_price = None, trigger_price = None, limit_offset = None, trailing_amount = None, trailing_percent = None, expire_date = None, outside_rth = None, remark = None))] + #[pyo3(signature = (symbol, order_type, side, submitted_quantity, time_in_force, submitted_price = None, trigger_price = None, limit_offset = None, trailing_amount = None, trailing_percent = None, expire_date = None, outside_rth = None, limit_depth_level = None, trigger_count = None, monitor_price = None, remark = None))] #[allow(clippy::too_many_arguments)] fn submit_order( &self, @@ -260,6 +272,9 @@ impl TradeContext { trailing_percent: Option, expire_date: Option, outside_rth: Option, + limit_depth_level: Option, + trigger_count: Option, + monitor_price: Option, remark: Option, ) -> PyResult { let mut opts = SubmitOrderOptions::new( @@ -291,6 +306,15 @@ impl TradeContext { if let Some(outside_rth) = outside_rth { opts = opts.outside_rth(outside_rth.into()); } + if let Some(limit_depth_level) = limit_depth_level { + opts = opts.limit_depth_level(limit_depth_level); + } + if let Some(trigger_count) = trigger_count { + opts = opts.trigger_count(trigger_count); + } + if let Some(monitor_price) = monitor_price { + opts = opts.monitor_price(monitor_price.into()); + } if let Some(remark) = remark { opts = opts.remark(remark); } diff --git a/python/src/trade/types.rs b/python/src/trade/types.rs index 5ba6fa37a..7d76d2544 100644 --- a/python/src/trade/types.rs +++ b/python/src/trade/types.rs @@ -263,6 +263,15 @@ pub(crate) struct Order { /// Enable or disable outside regular trading hours #[py(opt)] outside_rth: Option, + /// Limit depth level + #[py(opt)] + limit_depth_level: Option, + /// Trigger count + #[py(opt)] + trigger_count: Option, + /// Monitor price + #[py(opt)] + monitor_price: Option, /// Remark remark: String, } @@ -445,6 +454,15 @@ pub(crate) struct OrderDetail { /// Enable or disable outside regular trading hours #[py(opt)] outside_rth: Option, + /// Limit depth level + #[py(opt)] + limit_depth_level: Option, + /// Trigger count + #[py(opt)] + trigger_count: Option, + /// Monitor price + #[py(opt)] + monitor_price: Option, /// Remark remark: String, /// Commission-free Status diff --git a/rust/src/serde_utils.rs b/rust/src/serde_utils.rs index 21f1dd94f..27b6cc9fa 100644 --- a/rust/src/serde_utils.rs +++ b/rust/src/serde_utils.rs @@ -361,3 +361,30 @@ pub(crate) mod int64_str_empty_is_none { } } } + +pub(crate) mod int32_opt_0_is_none { + + use super::*; + + pub(crate) fn serialize(value: &Option, serializer: S) -> Result + where + S: Serializer, + { + match value { + Some(value) => serializer.serialize_i32(*value), + _ => serializer.serialize_none(), + } + } + + pub(crate) fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> + where + D: Deserializer<'de>, + { + let value = i32::deserialize(deserializer)?; + if value == 0 { + Ok(None) + } else { + Ok(Some(value)) + } + } +} diff --git a/rust/src/trade/requests/replace_order.rs b/rust/src/trade/requests/replace_order.rs index 531e3836d..26151a5ad 100644 --- a/rust/src/trade/requests/replace_order.rs +++ b/rust/src/trade/requests/replace_order.rs @@ -17,6 +17,12 @@ pub struct ReplaceOrderOptions { #[serde(skip_serializing_if = "Option::is_none")] trailing_percent: Option, #[serde(skip_serializing_if = "Option::is_none")] + limit_depth_level: Option, + #[serde(skip_serializing_if = "Option::is_none")] + trigger_count: Option, + #[serde(skip_serializing_if = "Option::is_none")] + monitor_price: Option, + #[serde(skip_serializing_if = "Option::is_none")] remark: Option, } @@ -32,6 +38,9 @@ impl ReplaceOrderOptions { limit_offset: None, trailing_amount: None, trailing_percent: None, + limit_depth_level: None, + trigger_count: None, + monitor_price: None, remark: None, } } @@ -86,6 +95,36 @@ impl ReplaceOrderOptions { } } + /// Set the limit depth level + #[inline] + #[must_use] + pub fn limit_depth_level(self, limit_depth_level: i32) -> Self { + Self { + limit_depth_level: Some(limit_depth_level), + ..self + } + } + + /// Set the trigger count + #[inline] + #[must_use] + pub fn trigger_count(self, trigger_count: i32) -> Self { + Self { + trigger_count: Some(trigger_count), + ..self + } + } + + /// Set the monitor price + #[inline] + #[must_use] + pub fn monitor_price(self, monitor_price: Decimal) -> Self { + Self { + monitor_price: Some(monitor_price), + ..self + } + } + /// Set the remark #[inline] #[must_use] diff --git a/rust/src/trade/requests/submit_order.rs b/rust/src/trade/requests/submit_order.rs index b2eaa658d..aa301b180 100644 --- a/rust/src/trade/requests/submit_order.rs +++ b/rust/src/trade/requests/submit_order.rs @@ -30,6 +30,12 @@ pub struct SubmitOrderOptions { #[serde(skip_serializing_if = "Option::is_none")] outside_rth: Option, #[serde(skip_serializing_if = "Option::is_none")] + limit_depth_level: Option, + #[serde(skip_serializing_if = "Option::is_none")] + trigger_count: Option, + #[serde(skip_serializing_if = "Option::is_none")] + monitor_price: Option, + #[serde(skip_serializing_if = "Option::is_none")] remark: Option, } @@ -56,6 +62,9 @@ impl SubmitOrderOptions { trailing_percent: None, expire_date: None, outside_rth: None, + limit_depth_level: None, + trigger_count: None, + monitor_price: None, remark: None, } } @@ -130,6 +139,30 @@ impl SubmitOrderOptions { } } + /// Set the limit depth level + pub fn limit_depth_level(self, level: i32) -> Self { + Self { + limit_depth_level: Some(level), + ..self + } + } + + /// Set the trigger count + pub fn trigger_count(self, count: i32) -> Self { + Self { + trigger_count: Some(count), + ..self + } + } + + /// Set the monitor price + pub fn monitor_price(self, price: Decimal) -> Self { + Self { + monitor_price: Some(price), + ..self + } + } + /// Set the remark #[inline] #[must_use] diff --git a/rust/src/trade/types.rs b/rust/src/trade/types.rs index cf9a379d2..d78082f73 100644 --- a/rust/src/trade/types.rs +++ b/rust/src/trade/types.rs @@ -309,6 +309,15 @@ pub struct Order { /// Enable or disable outside regular trading hours #[serde(with = "serde_utils::outside_rth")] pub outside_rth: Option, + /// Limit depth level + #[serde(with = "serde_utils::int32_opt_0_is_none")] + pub limit_depth_level: Option, + /// Trigger count + #[serde(with = "serde_utils::int32_opt_0_is_none")] + pub trigger_count: Option, + /// Monitor price + #[serde(with = "serde_utils::decimal_opt_empty_is_none")] + pub monitor_price: Option, /// Remark pub remark: String, } @@ -494,6 +503,15 @@ pub struct OrderDetail { /// Enable or disable outside regular trading hours #[serde(with = "serde_utils::outside_rth")] pub outside_rth: Option, + /// Limit depth level + #[serde(with = "serde_utils::int32_opt_0_is_none")] + pub limit_depth_level: Option, + /// Trigger count + #[serde(with = "serde_utils::int32_opt_0_is_none")] + pub trigger_count: Option, + /// Monitor price + #[serde(with = "serde_utils::decimal_opt_empty_is_none")] + pub monitor_price: Option, /// Remark pub remark: String, /// Commission-free Status @@ -1075,6 +1093,9 @@ mod tests { "trigger_price": "", "trigger_status": "NOT_USED", "updated_at": "1651644898", + "limit_depth_level": 0, + "trigger_count": 0, + "monitor_price": "", "remark": "abc" } ] @@ -1149,6 +1170,9 @@ mod tests { "trigger_price": "", "trigger_status": "NOT_USED", "updated_at": "1651644898", + "limit_depth_level": 0, + "trigger_count": 0, + "monitor_price": "", "remark": "abc" } ] @@ -1256,6 +1280,9 @@ mod tests { "trigger_status": "NOT_USED", "outside_rth": "ANY_TIME", "currency": "USD", + "limit_depth_level": 0, + "trigger_count": 0, + "monitor_price": "", "remark": "1680863603.927165", "free_status": "None", "free_amount": "",