4 changed files with 453 additions and 3 deletions
@ -0,0 +1,434 @@
@@ -0,0 +1,434 @@
|
||||
{-# LANGUAGE OverloadedStrings #-} |
||||
|
||||
module Broker.QuikBroker.Trans2QuikApi ( |
||||
Trans2QuikApi(..), |
||||
loadQuikApi |
||||
) where |
||||
|
||||
import Foreign |
||||
import Foreign.C.Types |
||||
import Foreign.C.String |
||||
import Foreign.Marshal.Array |
||||
import Control.Monad.Trans.Except |
||||
import Control.Error.Util |
||||
import Control.Monad.IO.Class |
||||
import System.Win32.DLL |
||||
import System.Win32.Types |
||||
import qualified Data.Text as T |
||||
|
||||
type ConnectF = LPCSTR -> Ptr LONG -> LPSTR -> DWORD -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkConnectFun :: FunPtr ConnectF -> ConnectF |
||||
|
||||
type DisconnectF = Ptr LONG -> LPSTR -> DWORD -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkDisconnectFun :: FunPtr DisconnectF -> DisconnectF |
||||
|
||||
type IsQuikConnectedF = Ptr LONG -> LPSTR -> DWORD -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkIsQuikConnectedFun :: FunPtr IsQuikConnectedF -> IsQuikConnectedF |
||||
|
||||
type IsDllConnectedF = Ptr LONG -> LPSTR -> DWORD -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkIsDllConnectedFun :: FunPtr IsDllConnectedF -> IsDllConnectedF |
||||
|
||||
type SendSyncTransactionF = LPSTR -> Ptr LONG -> Ptr LONG -> Ptr CDouble -> LPSTR -> DWORD -> Ptr LONG -> LPSTR -> DWORD -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkSendSyncTransactionFun :: FunPtr SendSyncTransactionF -> SendSyncTransactionF |
||||
|
||||
type SendAsyncTransactionF = LPSTR -> Ptr LONG -> LPSTR -> DWORD -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkSendAsyncTransactionFun :: FunPtr SendAsyncTransactionF -> SendAsyncTransactionF |
||||
|
||||
type ConnectionStatusCallback = LONG -> LONG -> LPSTR -> IO () |
||||
foreign import ccall "wrapper" |
||||
mkConnectionStatusCallback :: ConnectionStatusCallback -> IO (FunPtr ConnectionStatusCallback) |
||||
|
||||
type SetConnectionStatusCallbackF = FunPtr ConnectionStatusCallback -> Ptr LONG -> LPSTR -> DWORD -> LONG |
||||
foreign import ccall "dynamic" |
||||
mkSetConnectionStatusCallbackFun :: FunPtr SetConnectionStatusCallbackF -> SetConnectionStatusCallbackF |
||||
|
||||
type TransactionsReplyCallback = LONG -> LONG -> LONG -> DWORD -> CDouble -> LPSTR -> IO () |
||||
foreign import ccall "wrapper" |
||||
mkTransactionsReplyCallback :: TransactionsReplyCallback -> IO (FunPtr TransactionsReplyCallback) |
||||
|
||||
type SetTransactionsReplyCallbackF = FunPtr TransactionsReplyCallback -> Ptr LONG -> LPSTR -> DWORD -> LONG |
||||
foreign import ccall "dynamic" |
||||
mkSetTransactionsReplyCallbackFun :: FunPtr SetTransactionsReplyCallbackF -> SetTransactionsReplyCallbackF |
||||
|
||||
type OrderStatusCallback = LONG -> DWORD -> CDouble -> LPSTR -> LPSTR -> CDouble -> LONG -> CDouble -> LONG -> LONG -> LONG -> IO () |
||||
foreign import ccall "wrapper" |
||||
mkOrderStatusCallback :: OrderStatusCallback -> IO (FunPtr OrderStatusCallback) |
||||
|
||||
type TradeStatusCallback = LONG -> CDouble -> CDouble -> LPSTR -> LPSTR -> CDouble -> LONG -> CDouble -> LONG -> LONG -> IO () |
||||
foreign import ccall "wrapper" |
||||
mkTradeStatusCallback :: TradeStatusCallback -> IO (FunPtr TradeStatusCallback) |
||||
|
||||
type SubscribeOrdersF = LPSTR -> LPSTR -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkSubscribeOrdersFun :: FunPtr SubscribeOrdersF -> SubscribeOrdersF |
||||
|
||||
type SubscribeTradesF = LPSTR -> LPSTR -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkSubscribeTradesFun :: FunPtr SubscribeTradesF -> SubscribeTradesF |
||||
|
||||
type StartOrdersF = FunPtr OrderStatusCallback -> IO () |
||||
foreign import ccall "dynamic" |
||||
mkStartOrdersFun :: FunPtr StartOrdersF -> StartOrdersF |
||||
|
||||
type StartTradesF = FunPtr TradeStatusCallback -> IO () |
||||
foreign import ccall "dynamic" |
||||
mkStartTradesFun :: FunPtr StartTradesF -> StartTradesF |
||||
|
||||
type UnsubscribeOrdersF = IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkUnsubscribeOrdersFun :: FunPtr UnsubscribeOrdersF -> UnsubscribeOrdersF |
||||
|
||||
type UnsubscribeTradesF = IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkUnsubscribeTradesFun :: FunPtr UnsubscribeTradesF -> UnsubscribeTradesF |
||||
|
||||
-- Order requests |
||||
|
||||
type OrderQtyF = LONG -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkOrderQtyFun :: FunPtr OrderQtyF -> OrderQtyF |
||||
|
||||
type OrderDateF = LONG -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkOrderDateFun :: FunPtr OrderDateF -> OrderDateF |
||||
|
||||
type OrderTimeF = LONG -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkOrderTimeFun :: FunPtr OrderTimeF -> OrderTimeF |
||||
|
||||
type OrderActivationTimeF = LONG -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkOrderActivationTimeFun :: FunPtr OrderActivationTimeF -> OrderActivationTimeF |
||||
|
||||
type OrderWithdrawTimeF = LONG -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkOrderWithdrawTimeFun :: FunPtr OrderWithdrawTimeF -> OrderWithdrawTimeF |
||||
|
||||
type OrderExpiryF = LONG -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkOrderExpiryFun :: FunPtr OrderExpiryF -> OrderExpiryF |
||||
|
||||
type OrderAccruedIntF = LONG -> IO CDouble |
||||
foreign import ccall "dynamic" |
||||
mkOrderAccruedIntFun :: FunPtr OrderAccruedIntF -> OrderAccruedIntF |
||||
|
||||
type OrderYieldF = LONG -> IO CDouble |
||||
foreign import ccall "dynamic" |
||||
mkOrderYieldFun :: FunPtr OrderYieldF -> OrderYieldF |
||||
|
||||
type OrderUserIdF = LONG -> IO LPSTR |
||||
foreign import ccall "dynamic" |
||||
mkOrderUserIdFun :: FunPtr OrderUserIdF -> OrderUserIdF |
||||
|
||||
type OrderUidF = LONG -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkOrderUidFun :: FunPtr OrderUidF -> OrderUidF |
||||
|
||||
type OrderAccountF = LONG -> IO LPSTR |
||||
foreign import ccall "dynamic" |
||||
mkOrderAccountFun :: FunPtr OrderAccountF -> OrderAccountF |
||||
|
||||
type OrderBrokerRefF = LONG -> IO LPSTR |
||||
foreign import ccall "dynamic" |
||||
mkOrderBrokerRefFun :: FunPtr OrderBrokerRefF -> OrderBrokerRefF |
||||
|
||||
type OrderClientCodeF = LONG -> IO LPSTR |
||||
foreign import ccall "dynamic" |
||||
mkOrderClientCodeFun :: FunPtr OrderClientCodeF -> OrderClientCodeF |
||||
|
||||
type OrderFirmIdF = LONG -> IO LPSTR |
||||
foreign import ccall "dynamic" |
||||
mkOrderFirmIdFun :: FunPtr OrderFirmIdF -> OrderFirmIdF |
||||
|
||||
type OrderVisibleQtyF = LONG -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkOrderVisibleQtyFun :: FunPtr OrderVisibleQtyF -> OrderVisibleQtyF |
||||
|
||||
type OrderPeriodF = LONG -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkOrderPeriodFun :: FunPtr OrderPeriodF -> OrderPeriodF |
||||
|
||||
type OrderDateTimeF = LONG -> LONG -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkOrderDateTimeFun :: FunPtr OrderDateTimeF -> OrderDateTimeF |
||||
|
||||
-- Trade requests |
||||
|
||||
type TradeDateF = LONG -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkTradeDateFun :: FunPtr TradeDateF -> TradeDateF |
||||
|
||||
type TradeSettleDateF = LONG -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkTradeSettleDateFun :: FunPtr TradeSettleDateF -> TradeSettleDateF |
||||
|
||||
type TradeTimeF = LONG -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkTradeTimeFun :: FunPtr TradeTimeF -> TradeTimeF |
||||
|
||||
type TradeIsMarginalF = LONG -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkTradeIsMarginalFun :: FunPtr TradeIsMarginalF -> TradeIsMarginalF |
||||
|
||||
type TradeCurrencyF = LONG -> IO LPSTR |
||||
foreign import ccall "dynamic" |
||||
mkTradeCurrencyFun :: FunPtr TradeCurrencyF -> TradeCurrencyF |
||||
|
||||
type TradeSettleCurrencyF = LONG -> IO LPSTR |
||||
foreign import ccall "dynamic" |
||||
mkTradeSettleCurrencyFun :: FunPtr TradeSettleCurrencyF -> TradeSettleCurrencyF |
||||
|
||||
type TradeSettleCodeF = LONG -> IO LPSTR |
||||
foreign import ccall "dynamic" |
||||
mkTradeSettleCodeFun :: FunPtr TradeSettleCodeF -> TradeSettleCodeF |
||||
|
||||
type TradeAccruedIntF = LONG -> IO CDouble |
||||
foreign import ccall "dynamic" |
||||
mkTradeAccruedIntFun :: FunPtr TradeAccruedIntF -> TradeAccruedIntF |
||||
|
||||
type TradeYieldF = LONG -> IO CDouble |
||||
foreign import ccall "dynamic" |
||||
mkTradeYieldFun :: FunPtr TradeYieldF -> TradeYieldF |
||||
|
||||
type TradeUserIdF = LONG -> IO LPSTR |
||||
foreign import ccall "dynamic" |
||||
mkTradeUserIdFun :: FunPtr TradeUserIdF -> TradeUserIdF |
||||
|
||||
type TradeAccountF = LONG -> IO LPSTR |
||||
foreign import ccall "dynamic" |
||||
mkTradeAccountFun :: FunPtr TradeAccountF -> TradeAccountF |
||||
|
||||
type TradeBrokerRefF = LONG -> IO LPSTR |
||||
foreign import ccall "dynamic" |
||||
mkTradeBrokerRefFun :: FunPtr TradeBrokerRefF -> TradeBrokerRefF |
||||
|
||||
type TradeClientCodeF = LONG -> IO LPSTR |
||||
foreign import ccall "dynamic" |
||||
mkTradeClientCodeFun :: FunPtr TradeClientCodeF -> TradeClientCodeF |
||||
|
||||
type TradeFirmIdF = LONG -> IO LPSTR |
||||
foreign import ccall "dynamic" |
||||
mkTradeFirmIdFun :: FunPtr TradeFirmIdF -> TradeFirmIdF |
||||
|
||||
type TradePartnerFirmIdF = LONG -> IO LPSTR |
||||
foreign import ccall "dynamic" |
||||
mkTradePartnerFirmIdFun :: FunPtr TradePartnerFirmIdF -> TradePartnerFirmIdF |
||||
|
||||
type TradeTsCommissionF = LONG -> IO CDouble |
||||
foreign import ccall "dynamic" |
||||
mkTradeTsCommissionFun :: FunPtr TradeTsCommissionF -> TradeTsCommissionF |
||||
|
||||
type TradeClearingCenterCommissionF = LONG -> IO CDouble |
||||
foreign import ccall "dynamic" |
||||
mkTradeClearingCenterCommissionFun :: FunPtr TradeClearingCenterCommissionF -> TradeClearingCenterCommissionF |
||||
|
||||
type TradeExchangeCommissionF = LONG -> IO CDouble |
||||
foreign import ccall "dynamic" |
||||
mkTradeExchangeCommissionFun :: FunPtr TradeExchangeCommissionF -> TradeExchangeCommissionF |
||||
|
||||
type TradeTradingSystemCommissionF = LONG -> IO CDouble |
||||
foreign import ccall "dynamic" |
||||
mkTradeTradingSystemCommissionFun :: FunPtr TradeTradingSystemCommissionF -> TradeTradingSystemCommissionF |
||||
|
||||
type TradePeriodF = LONG -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkTradePeriodFun :: FunPtr TradePeriodF -> TradePeriodF |
||||
|
||||
type TradeDateTimeF = LONG -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkTradeDateTimeFun :: FunPtr TradeDateTimeF -> TradeDateTimeF |
||||
|
||||
type TradeKindF = LONG -> IO LONG |
||||
foreign import ccall "dynamic" |
||||
mkTradeKindFun :: FunPtr TradeKindF -> TradeKindF |
||||
|
||||
data Trans2QuikApi = Trans2QuikApi { |
||||
connect :: ConnectF, |
||||
disconnect :: DisconnectF, |
||||
isQuikConnected :: IsQuikConnectedF, |
||||
isDllConnected :: IsDllConnectedF, |
||||
sendSyncTransaction :: SendSyncTransactionF, |
||||
sendAsyncTransaction :: SendAsyncTransactionF, |
||||
setConnectionStatusCallback :: SetConnectionStatusCallbackF, |
||||
setTransactionsReplyCallback :: SetTransactionsReplyCallbackF, |
||||
subscribeOrders :: SubscribeOrdersF, |
||||
subscribeTrades :: SubscribeTradesF, |
||||
startOrders :: StartOrdersF, |
||||
startTrades :: StartTradesF, |
||||
unsubscribeOrders :: UnsubscribeOrdersF, |
||||
unsubscribeTrades :: UnsubscribeTradesF, |
||||
|
||||
connectionStatusCallback :: Maybe (FunPtr ConnectionStatusCallback), |
||||
transactionReplyCallback :: Maybe (FunPtr TransactionsReplyCallback), |
||||
orderStatusCallback :: Maybe (FunPtr OrderStatusCallback), |
||||
tradeStatusCallback :: Maybe (FunPtr TradeStatusCallback), |
||||
|
||||
orderQty :: OrderQtyF, |
||||
orderDate :: OrderDateF, |
||||
orderTime :: OrderTimeF, |
||||
orderActivationTime :: OrderActivationTimeF, |
||||
orderWithdrawTime :: OrderWithdrawTimeF, |
||||
orderExpiry :: OrderExpiryF, |
||||
orderAccruedInt :: OrderAccruedIntF, |
||||
orderYield :: OrderYieldF, |
||||
orderUserId :: OrderUserIdF, |
||||
orderUid :: OrderUidF, |
||||
orderAccount :: OrderAccountF, |
||||
orderBrokerRef :: OrderBrokerRefF, |
||||
orderClientCode :: OrderClientCodeF, |
||||
orderFirmId :: OrderFirmIdF, |
||||
orderVisibleQty :: OrderVisibleQtyF, |
||||
orderPeriod :: OrderPeriodF, |
||||
orderDateTime :: OrderDateTimeF, |
||||
|
||||
tradeDate :: TradeDateF, |
||||
tradeSettleDate :: TradeSettleDateF, |
||||
tradeTime :: TradeTimeF, |
||||
tradeIsMarginal :: TradeIsMarginalF, |
||||
tradeCurrency :: TradeCurrencyF, |
||||
tradeSettleCurrency :: TradeSettleCurrencyF, |
||||
tradeSettleCode :: TradeSettleCodeF, |
||||
tradeAccruedInt :: TradeAccruedIntF, |
||||
tradeYield :: TradeYieldF, |
||||
tradeUserId :: TradeUserIdF, |
||||
tradeAccount :: TradeAccountF, |
||||
tradeBrokerRef :: TradeBrokerRefF, |
||||
tradeClientCode :: TradeClientCodeF, |
||||
tradeTsCommission :: TradeTsCommissionF, |
||||
tradePeriod :: TradePeriodF, |
||||
tradeDateTime :: TradeDateTimeF, |
||||
tradeKind :: TradeKindF, |
||||
|
||||
dllHandle :: HMODULE |
||||
} |
||||
|
||||
loadQuikApi :: FilePath -> ExceptT T.Text IO Trans2QuikApi |
||||
loadQuikApi path = do |
||||
dll <- castPtr <$> liftIO (loadLibrary path) |
||||
dll `orFail` "Unable to load Trans2quik.dll" |
||||
connectPtr <- mkConnectFun <$> tryLoad dll "_TRANS2QUIK_CONNECT@16" |
||||
disconnectPtr <- mkDisconnectFun <$> tryLoad dll "_TRANS2QUIK_DISCONNECT@12" |
||||
isQuikConnectedPtr <- mkIsQuikConnectedFun <$> tryLoad dll "_TRANS2QUIK_IS_QUIK_CONNECTED@12" |
||||
isDllConnectedPtr <- mkIsDllConnectedFun <$> tryLoad dll "_TRANS2QUIK_IS_DLL_CONNECTED@12" |
||||
sendSyncTransactionPtr <- mkSendSyncTransactionFun <$> tryLoad dll "_TRANS2QUIK_SEND_SYNC_TRANSACTION@36" |
||||
sendAsyncTransactionPtr <- mkSendAsyncTransactionFun <$> tryLoad dll "_TRANS2QUIK_SEND_ASYNC_TRANSACTION@16" |
||||
setConnectionStatusCallbackPtr <- mkSetConnectionStatusCallbackFun <$> tryLoad dll "_TRANS2QUIK_SET_CONNECTION_STATUS_CALLBACK@16" |
||||
setTransactionsReplyCallbackPtr <- mkSetTransactionsReplyCallbackFun <$> tryLoad dll "_TRANS2QUIK_SET_TRANSACTIONS_REPLY_CALLBACK@16" |
||||
subscribeOrdersPtr <- mkSubscribeOrdersFun <$> tryLoad dll "_TRANS2QUIK_SUBSCRIBE_ORDERS@8" |
||||
subscribeTradesPtr <- mkSubscribeTradesFun <$> tryLoad dll "_TRANS2QUIK_SUBSCRIBE_TRADES@8" |
||||
startOrdersPtr <- mkStartOrdersFun <$> tryLoad dll "_TRANS2QUIK_START_ORDERS@4" |
||||
startTradesPtr <- mkStartTradesFun <$> tryLoad dll "_TRANS2QUIK_START_TRADES@4" |
||||
unsubscribeOrdersPtr <- mkUnsubscribeOrdersFun <$> tryLoad dll "_TRANS2QUIK_UNSUBSCRIBE_ORDERS@0" |
||||
unsubscribeTradesPtr <- mkUnsubscribeTradesFun <$> tryLoad dll "_TRANS2QUIK_UNSUBSCRIBE_TRADES@0" |
||||
|
||||
orderQtyPtr <- mkOrderQtyFun <$> tryLoad dll "_TRANS2QUIK_ORDER_QTY@4" |
||||
orderDatePtr <- mkOrderDateFun <$> tryLoad dll "_TRANS2QUIK_ORDER_DATE@4" |
||||
orderTimePtr <- mkOrderTimeFun <$> tryLoad dll "_TRANS2QUIK_ORDER_TIME@4" |
||||
orderActivationTimePtr <- mkOrderActivationTimeFun <$> tryLoad dll "_TRANS2QUIK_ORDER_ACTIVATION_TIME@4" |
||||
orderWithdrawTimePtr <- mkOrderWithdrawTimeFun <$> tryLoad dll "_TRANS2QUIK_ORDER_WITHDRAW_TIME@4" |
||||
orderExpiryPtr <- mkOrderExpiryFun <$> tryLoad dll "_TRANS2QUIK_ORDER_EXPIRY@4" |
||||
orderAccruedIntPtr <- mkOrderAccruedIntFun <$> tryLoad dll "_TRANS2QUIK_ORDER_ACCRUED_INT@4" |
||||
orderYieldPtr <- mkOrderYieldFun <$> tryLoad dll "_TRANS2QUIK_ORDER_YIELD@4" |
||||
orderUserIdPtr <- mkOrderUserIdFun <$> tryLoad dll "_TRANS2QUIK_ORDER_USERID@4" |
||||
orderUidPtr <- mkOrderUidFun <$> tryLoad dll "_TRANS2QUIK_ORDER_UID@4" |
||||
orderAccountPtr <- mkOrderAccountFun <$> tryLoad dll "_TRANS2QUIK_ORDER_ACCOUNT@4" |
||||
orderBrokerRefPtr <- mkOrderBrokerRefFun <$> tryLoad dll "_TRANS2QUIK_ORDER_BROKERREF@4" |
||||
orderClientCodePtr <- mkOrderClientCodeFun <$> tryLoad dll "_TRANS2QUIK_ORDER_CLIENT_CODE@4" |
||||
orderFirmIdPtr <- mkOrderFirmIdFun <$> tryLoad dll "_TRANS2QUIK_ORDER_FIRMID@4" |
||||
orderVisibleQtyPtr <- mkOrderVisibleQtyFun <$> tryLoad dll "_TRANS2QUIK_ORDER_VISIBLE_QTY@4" |
||||
orderPeriodPtr <- mkOrderPeriodFun <$> tryLoad dll "_TRANS2QUIK_ORDER_PERIOD@4" |
||||
orderDateTimePtr <- mkOrderDateTimeFun <$> tryLoad dll "_TRANS2QUIK_ORDER_DATE_TIME@8" |
||||
|
||||
tradeDatePtr <- mkTradeDateFun <$> tryLoad dll "_TRANS2QUIK_TRADE_DATE@4" |
||||
tradeSettleDatePtr <- mkTradeSettleDateFun <$> tryLoad dll "_TRANS2QUIK_TRADE_SETTLE_DATE@4" |
||||
tradeTimePtr <- mkTradeTimeFun <$> tryLoad dll "_TRANS2QUIK_TRADE_TIME@4" |
||||
tradeIsMarginalPtr <- mkTradeIsMarginalFun <$> tryLoad dll "_TRANS2QUIK_TRADE_IS_MARGINAL@4" |
||||
tradeCurrencyPtr <- mkTradeCurrencyFun <$> tryLoad dll "_TRANS2QUIK_TRADE_CURRENCY@4" |
||||
tradeSettleCurrencyPtr <- mkTradeSettleCurrencyFun <$> tryLoad dll "_TRANS2QUIK_TRADE_SETTLE_CURRENCY@4" |
||||
tradeSettleCodePtr <- mkTradeSettleCodeFun <$> tryLoad dll "_TRANS2QUIK_TRADE_SETTLE_CODE@4" |
||||
tradeAccruedIntPtr <- mkTradeAccruedIntFun <$> tryLoad dll "_TRANS2QUIK_TRADE_ACCRUED_INT@4" |
||||
tradeYieldPtr <- mkTradeYieldFun <$> tryLoad dll "_TRANS2QUIK_TRADE_YIELD@4" |
||||
tradeUserIdPtr <- mkTradeUserIdFun <$> tryLoad dll "_TRANS2QUIK_TRADE_USERID@4" |
||||
tradeAccountPtr <- mkTradeAccountFun <$> tryLoad dll "_TRANS2QUIK_TRADE_ACCOUNT@4" |
||||
tradeBrokerRefPtr <- mkTradeBrokerRefFun <$> tryLoad dll "_TRANS2QUIK_TRADE_BROKERREF@4" |
||||
tradeClientCodePtr <- mkTradeClientCodeFun <$> tryLoad dll "_TRANS2QUIK_TRADE_CLIENT_CODE@4" |
||||
tradeTsCommissionPtr <- mkTradeTsCommissionFun <$> tryLoad dll "_TRANS2QUIK_TRADE_TS_COMMISSION@4" |
||||
tradePeriodPtr <- mkTradePeriodFun <$> tryLoad dll "_TRANS2QUIK_TRADE_PERIOD@4" |
||||
tradeDateTimePtr <- mkTradeDateTimeFun <$> tryLoad dll "_TRANS2QUIK_TRADE_DATE_TIME@8" |
||||
tradeKindPtr <- mkTradeKindFun <$> tryLoad dll "_TRANS2QUIK_TRADE_KIND@4" |
||||
|
||||
return Trans2QuikApi { |
||||
connect = connectPtr, |
||||
disconnect = disconnectPtr, |
||||
isQuikConnected = isQuikConnectedPtr, |
||||
isDllConnected = isDllConnectedPtr, |
||||
sendSyncTransaction = sendSyncTransactionPtr, |
||||
sendAsyncTransaction = sendAsyncTransactionPtr, |
||||
setConnectionStatusCallback = setConnectionStatusCallbackPtr, |
||||
setTransactionsReplyCallback = setTransactionsReplyCallbackPtr, |
||||
subscribeOrders = subscribeOrdersPtr, |
||||
subscribeTrades = subscribeTradesPtr, |
||||
startOrders = startOrdersPtr, |
||||
startTrades = startTradesPtr, |
||||
unsubscribeOrders = unsubscribeOrdersPtr, |
||||
unsubscribeTrades = unsubscribeTradesPtr, |
||||
|
||||
orderQty = orderQtyPtr, |
||||
orderDate = orderDatePtr, |
||||
orderTime = orderTimePtr, |
||||
orderActivationTime = orderActivationTimePtr, |
||||
orderWithdrawTime = orderWithdrawTimePtr, |
||||
orderExpiry = orderExpiryPtr, |
||||
orderAccruedInt = orderAccruedIntPtr, |
||||
orderYield = orderYieldPtr, |
||||
orderUserId = orderUserIdPtr, |
||||
orderUid = orderUidPtr, |
||||
orderAccount = orderAccountPtr, |
||||
orderBrokerRef = orderBrokerRefPtr, |
||||
orderClientCode = orderClientCodePtr, |
||||
orderFirmId = orderFirmIdPtr, |
||||
orderVisibleQty = orderVisibleQtyPtr, |
||||
orderPeriod = orderPeriodPtr, |
||||
orderDateTime = orderDateTimePtr, |
||||
|
||||
tradeDate = tradeDatePtr, |
||||
tradeSettleDate = tradeSettleDatePtr, |
||||
tradeTime = tradeTimePtr, |
||||
tradeIsMarginal = tradeIsMarginalPtr, |
||||
tradeCurrency = tradeCurrencyPtr, |
||||
tradeSettleCurrency = tradeSettleCurrencyPtr, |
||||
tradeSettleCode = tradeSettleCodePtr, |
||||
tradeAccruedInt = tradeAccruedIntPtr, |
||||
tradeYield = tradeYieldPtr, |
||||
tradeUserId = tradeUserIdPtr, |
||||
tradeAccount = tradeAccountPtr, |
||||
tradeBrokerRef = tradeBrokerRefPtr, |
||||
tradeClientCode = tradeClientCodePtr, |
||||
tradeTsCommission = tradeTsCommissionPtr, |
||||
tradePeriod = tradePeriodPtr, |
||||
tradeDateTime = tradeDateTimePtr, |
||||
tradeKind = tradeKindPtr, |
||||
|
||||
dllHandle = dll |
||||
} |
||||
|
||||
where |
||||
orFail :: Ptr p -> T.Text -> ExceptT T.Text IO (Ptr p) |
||||
orFail myPtr t = if nullPtr == myPtr |
||||
then throwE t |
||||
else return myPtr |
||||
|
||||
tryLoad :: HMODULE -> String -> ExceptT T.Text IO (FunPtr a) |
||||
tryLoad dll proc = do |
||||
p <- liftIO (getProcAddress' dll proc) |
||||
p `orFail` ("Unable to load symbol: " `T.append` T.pack proc) |
||||
return $ castPtrToFunPtr p |
||||
|
||||
getProcAddress' dll proc = withCAString proc (c_GetProcAddress dll . castPtr) |
||||
|
||||
Loading…
Reference in new issue