@@ -404,6 +404,27 @@ const orderOco = (privCall, payload = {}, url) => {
404404 )
405405}
406406
407+ const updateOrder = ( privCall , payload = { } , url ) => {
408+ const newPayload = { ...payload }
409+
410+ if ( ! newPayload . cancelReplaceMode ) {
411+ newPayload . cancelReplaceMode = 'STOP_ON_FAILURE'
412+ }
413+
414+ if ( ! newPayload . timeInForce ) {
415+ newPayload . timeInForce = 'GTC'
416+ }
417+
418+ if ( ! newPayload . newClientOrderId ) {
419+ newPayload . newClientOrderId = spotP ( )
420+ }
421+
422+ return (
423+ checkParams ( 'updateOrder' , newPayload , [ 'symbol' , 'side' , 'type' ] ) &&
424+ privCall ( url , newPayload , 'POST' )
425+ )
426+ }
427+
407428/**
408429 * Zip asks and bids reponse from order book
409430 */
@@ -486,6 +507,7 @@ export default opts => {
486507
487508 // Order endpoints
488509 order : payload => order ( privCall , payload , '/api/v3/order' ) ,
510+ updateOrder : payload => updateOrder ( privCall , payload , '/api/v3/order/cancelReplace' ) ,
489511 orderOco : payload => orderOco ( privCall , payload , '/api/v3/order/oco' ) ,
490512 orderTest : payload => order ( privCall , payload , '/api/v3/order/test' ) ,
491513 getOrder : payload => privCall ( '/api/v3/order' , payload ) ,
@@ -570,15 +592,114 @@ export default opts => {
570592 futuresFundingRate : payload =>
571593 checkParams ( 'fundingRate' , payload , [ 'symbol' ] ) &&
572594 pubCall ( '/fapi/v1/fundingRate' , payload ) ,
573- futuresOrder : payload => order ( privCall , payload , '/fapi/v1/order' ) ,
595+ futuresOrder : payload => {
596+ // Check if this is a conditional order type that should be routed to algo endpoint
597+ const orderType = payload ?. type ?. toUpperCase ( )
598+ const conditionalTypes = [
599+ 'STOP' ,
600+ 'STOP_MARKET' ,
601+ 'TAKE_PROFIT' ,
602+ 'TAKE_PROFIT_MARKET' ,
603+ 'TRAILING_STOP_MARKET' ,
604+ ]
605+
606+ if ( orderType && conditionalTypes . includes ( orderType ) ) {
607+ // Route to algo order endpoint
608+ const algoPayload = { ...payload }
609+ if ( ! algoPayload . clientAlgoId ) {
610+ algoPayload . clientAlgoId = futuresP ( )
611+ }
612+ delete algoPayload . newClientOrderId
613+ algoPayload . algoType = 'CONDITIONAL'
614+ if ( algoPayload . stopPrice && ! algoPayload . triggerPrice ) {
615+ algoPayload . triggerPrice = algoPayload . stopPrice
616+ delete algoPayload . stopPrice
617+ }
618+ return privCall ( '/fapi/v1/algoOrder' , algoPayload , 'POST' )
619+ }
620+ // Use regular order endpoint
621+ return order ( privCall , payload , '/fapi/v1/order' )
622+ } ,
623+ futuresUpdateOrder : payload => {
624+ if ( payload && 'conditional' in payload ) {
625+ // for now it is not supported
626+ // const payloadCopy = { ...payload }
627+ // delete payloadCopy.conditional
628+ // return privCall('/fapi/v1/algoOrder', payloadCopy, 'PUT')
629+ }
630+ return privCall ( '/fapi/v1/order' , payload , 'PUT' )
631+ } ,
574632 futuresBatchOrders : payload => privCall ( '/fapi/v1/batchOrders' , payload , 'POST' ) ,
575- futuresGetOrder : payload => privCall ( '/fapi/v1/order' , payload ) ,
576- futuresCancelOrder : payload => privCall ( '/fapi/v1/order' , payload , 'DELETE' ) ,
577- futuresCancelAllOpenOrders : payload =>
578- privCall ( '/fapi/v1/allOpenOrders' , payload , 'DELETE' ) ,
633+ futuresGetOrder : payload => {
634+ // Check if this is a request for a conditional/algo order
635+ const isConditional = payload ?. conditional
636+ const hasAlgoId = payload ?. algoId || payload ?. clientAlgoId
637+ let payloadCopy = payload
638+ if ( payload && 'conditional' in payload ) {
639+ payloadCopy = { ...payload }
640+ delete payloadCopy . conditional
641+ }
642+
643+ if ( isConditional || hasAlgoId ) {
644+ return privCall ( '/fapi/v1/algoOrder' , payloadCopy )
645+ }
646+ return privCall ( '/fapi/v1/order' , payloadCopy )
647+ } ,
648+ futuresCancelOrder : payload => {
649+ // Check if this is a request for a conditional/algo order
650+ const isConditional = payload ?. conditional
651+ const hasAlgoId = payload ?. algoId || payload ?. clientAlgoId
652+ let payloadCopy = payload
653+ if ( payload && 'conditional' in payload ) {
654+ payloadCopy = { ...payload }
655+ delete payloadCopy . conditional
656+ }
657+
658+ if ( isConditional || hasAlgoId ) {
659+ return privCall ( '/fapi/v1/algoOrder' , payloadCopy , 'DELETE' )
660+ }
661+ return privCall ( '/fapi/v1/order' , payloadCopy , 'DELETE' )
662+ } ,
663+ futuresCancelAllOpenOrders : payload => {
664+ const isConditional = payload ?. conditional
665+ let payloadCopy = payload
666+ if ( payload && 'conditional' in payload ) {
667+ payloadCopy = { ...payload }
668+ delete payloadCopy . conditional
669+ }
670+
671+ if ( isConditional ) {
672+ return privCall ( '/fapi/v1/algoOpenOrders' , payloadCopy , 'DELETE' )
673+ }
674+ return privCall ( '/fapi/v1/allOpenOrders' , payloadCopy , 'DELETE' )
675+ } ,
579676 futuresCancelBatchOrders : payload => privCall ( '/fapi/v1/batchOrders' , payload , 'DELETE' ) ,
580- futuresOpenOrders : payload => privCall ( '/fapi/v1/openOrders' , payload ) ,
581- futuresAllOrders : payload => privCall ( '/fapi/v1/allOrders' , payload ) ,
677+ futuresOpenOrders : payload => {
678+ const isConditional = payload ?. conditional
679+ let payloadCopy = payload
680+ if ( payload && 'conditional' in payload ) {
681+ payloadCopy = { ...payload }
682+ delete payloadCopy . conditional
683+ }
684+
685+ if ( isConditional ) {
686+ return privCall ( '/fapi/v1/openAlgoOrders' , payloadCopy )
687+ }
688+ return privCall ( '/fapi/v1/openOrders' , payloadCopy )
689+ } ,
690+ futuresAllOrders : payload => {
691+ const isConditional = payload ?. conditional
692+ let payloadCopy = payload
693+ if ( payload && 'conditional' in payload ) {
694+ payloadCopy = { ...payload }
695+ delete payloadCopy . conditional
696+ }
697+
698+ if ( isConditional ) {
699+ return privCall ( '/fapi/v1/allAlgoOrders' , payloadCopy )
700+ }
701+ return privCall ( '/fapi/v1/allOrders' , payloadCopy )
702+ } ,
582703 futuresPositionRisk : payload => privCall ( '/fapi/v2/positionRisk' , payload ) ,
583704 futuresLeverageBracket : payload => privCall ( '/fapi/v1/leverageBracket' , payload ) ,
584705 futuresAccountBalance : payload => privCall ( '/fapi/v2/balance' , payload ) ,
@@ -594,6 +715,26 @@ export default opts => {
594715 futuresIncome : payload => privCall ( '/fapi/v1/income' , payload ) ,
595716 getMultiAssetsMargin : payload => privCall ( '/fapi/v1/multiAssetsMargin' , payload ) ,
596717 setMultiAssetsMargin : payload => privCall ( '/fapi/v1/multiAssetsMargin' , payload , 'POST' ) ,
718+ futuresRpiDepth : payload => book ( pubCall , payload , '/fapi/v1/rpiDepth' ) ,
719+ futuresSymbolAdlRisk : payload => pubCall ( '/fapi/v1/symbolAdlRisk' , payload ) ,
720+ futuresCommissionRate : payload => privCall ( '/fapi/v1/commissionRate' , payload ) ,
721+
722+ // Algo Orders (Conditional Orders)
723+ futuresCreateAlgoOrder : payload => {
724+ if ( ! payload . clientAlgoId ) {
725+ payload . clientAlgoId = futuresP ( )
726+ }
727+ if ( ! payload . algoType ) {
728+ payload . algoType = 'CONDITIONAL'
729+ }
730+ return privCall ( '/fapi/v1/algoOrder' , payload , 'POST' )
731+ } ,
732+ futuresCancelAlgoOrder : payload => privCall ( '/fapi/v1/algoOrder' , payload , 'DELETE' ) ,
733+ futuresCancelAllAlgoOpenOrders : payload =>
734+ privCall ( '/fapi/v1/algoOpenOrders' , payload , 'DELETE' ) ,
735+ futuresGetAlgoOrder : payload => privCall ( '/fapi/v1/algoOrder' , payload ) ,
736+ futuresGetOpenAlgoOrders : payload => privCall ( '/fapi/v1/openAlgoOrders' , payload ) ,
737+ futuresGetAllAlgoOrders : payload => privCall ( '/fapi/v1/allAlgoOrders' , payload ) ,
597738
598739 // Delivery endpoints
599740 deliveryPing : ( ) => pubCall ( '/dapi/v1/ping' ) . then ( ( ) => true ) ,
0 commit comments