interface IFuturesMarket { // all open/close orders are market right now (not limit) sclass OpenOrCloseOrder { settable S orderID; // optional settable HoldSide holdSide; settable double cryptoAmount; // Limit order if set. Otherwise market order. // Limit orders are good-until-cancel. settable double limitPrice = Double.NaN; } sclass OpenOrder extends OpenOrCloseOrder { settable double leverage = 1; settable bool isCross; } sclass CloseOrder extends OpenOrCloseOrder { } // throws exception if order failed void openPosition(OpenOrder order); // throws exception if order failed void closePosition(CloseOrder order); sclass SwappableImplementation is IFuturesMarket { public swappable void openPosition(OpenOrder order) {} public swappable void closePosition(CloseOrder order) {} public swappable double drift() { unimplemented(); } public FutureCoinParameters getCoinParameters() { unimplemented(); } } // Get current drift (sum of longs+shorts in crypto units) double drift(); FutureCoinParameters getCoinParameters(); }