Exchange-core เป็น แกนการแลกเปลี่ยนตลาดโอเพ่นซอร์ส ที่อิงตาม LMAX Disruptor, Eclipse Collections (เช่น Goldman Sachs GS Collections), Real Logic Agrona, OpenHFT Chronicle-Wire, LZ4 Java และ Adaptive Radix Trees
Exchange-core ประกอบด้วย:
ออกแบบมาเพื่อความสามารถในการปรับขนาดสูงและการทำงานตลอด 24 ชั่วโมงทุกวันโดยไม่มีการหยุดชั่วคราวภายใต้สภาวะที่มีโหลดสูงและให้การตอบสนองที่มีความหน่วงต่ำ:
การกำหนดค่าสมุดคำสั่งซื้อเดี่ยวสามารถประมวลผลการดำเนินงาน 5M ต่อวินาทีบนฮาร์ดแวร์อายุ 10 ปี (Intel® Xeon® X5690) โดยมีการลดเวลาแฝงในระดับปานกลาง:
ประเมิน | 50.0% | 90.0% | 95.0% | 99.0% | 99.9% | 99.99% | แย่ที่สุด |
---|---|---|---|---|---|---|---|
125K | 0.6µs | 0.9µs | 1.0µs | 1.4µs | 4ไมโครวินาที | 24µs | 41µs |
250K | 0.6µs | 0.9µs | 1.0µs | 1.4µs | 9ไมโครวินาที | 27ไมโครวินาที | 41µs |
500K | 0.6µs | 0.9µs | 1.0µs | 1.6µs | 14µs | 29µs | 42µs |
1ม | 0.5µs | 0.9µs | 1.2µs | 4ไมโครวินาที | 22ไมโครวินาที | 31ไมโครวินาที | 45µs |
2ม | 0.5µs | 1.2µs | 3.9µs | 10ไมโครวินาที | 30ไมโครวินาที | 39µs | 60ไมโครวินาที |
3เอ็ม | 0.7µs | 3.6µs | 6.2µs | 15ไมโครวินาที | 36µs | 45µs | 60ไมโครวินาที |
4M | 1.0µs | 6.0µs | 9ไมโครวินาที | 25ไมโครวินาที | 45µs | 55µs | 70µs |
5ม | 1.5µs | 9.5µs | 16ไมโครวินาที | 42µs | 150µs | 170µs | 190µs |
6ม | 5ไมโครวินาที | 30ไมโครวินาที | 45µs | 300µs | 500µs | 520µs | 540µs |
7ม | 60µs | 1.3ms | 1.5ms | 1.8ms | 1.9ms | 1.9ms | 1.9ms |
การกำหนดค่ามาตรฐาน:
mvn install
pom.xml
ของโครงการของคุณ : <dependency>
<groupId>exchange.core2</groupId>
<artifactId>exchange-core</artifactId>
<version>0.5.3</version>
</dependency>
หรือคุณสามารถโคลนที่เก็บนี้และรันการทดสอบตัวอย่างได้
สร้างและเริ่มการแลกเปลี่ยนแกนเปล่า:
// simple async events handler
SimpleEventsProcessor eventsProcessor = new SimpleEventsProcessor ( new IEventsHandler () {
@ Override
public void tradeEvent ( TradeEvent tradeEvent ) {
System . out . println ( "Trade event: " + tradeEvent );
}
@ Override
public void reduceEvent ( ReduceEvent reduceEvent ) {
System . out . println ( "Reduce event: " + reduceEvent );
}
@ Override
public void rejectEvent ( RejectEvent rejectEvent ) {
System . out . println ( "Reject event: " + rejectEvent );
}
@ Override
public void commandResult ( ApiCommandResult commandResult ) {
System . out . println ( "Command result: " + commandResult );
}
@ Override
public void orderBook ( OrderBook orderBook ) {
System . out . println ( "OrderBook event: " + orderBook );
}
});
// default exchange configuration
ExchangeConfiguration conf = ExchangeConfiguration . defaultBuilder (). build ();
// no serialization
Supplier < ISerializationProcessor > serializationProcessorFactory = () -> DummySerializationProcessor . INSTANCE ;
// build exchange core
ExchangeCore exchangeCore = ExchangeCore . builder ()
. resultsConsumer ( eventsProcessor )
. serializationProcessorFactory ( serializationProcessorFactory )
. exchangeConfiguration ( conf )
. build ();
// start up disruptor threads
exchangeCore . startup ();
// get exchange API for publishing commands
ExchangeApi api = exchangeCore . getApi ();
สร้างสัญลักษณ์ใหม่:
// currency code constants
final int currencyCodeXbt = 11 ;
final int currencyCodeLtc = 15 ;
// symbol constants
final int symbolXbtLtc = 241 ;
// create symbol specification and publish it
CoreSymbolSpecification symbolSpecXbtLtc = CoreSymbolSpecification . builder ()
. symbolId ( symbolXbtLtc ) // symbol id
. type ( SymbolType . CURRENCY_EXCHANGE_PAIR )
. baseCurrency ( currencyCodeXbt ) // base = satoshi (1E-8)
. quoteCurrency ( currencyCodeLtc ) // quote = litoshi (1E-8)
. baseScaleK ( 1_000_000L ) // 1 lot = 1M satoshi (0.01 BTC)
. quoteScaleK ( 10_000L ) // 1 price step = 10K litoshi
. takerFee ( 1900L ) // taker fee 1900 litoshi per 1 lot
. makerFee ( 700L ) // maker fee 700 litoshi per 1 lot
. build ();
future = api . submitBinaryDataAsync ( new BatchAddSymbolsCommand ( symbolSpecXbtLtc ));
สร้างผู้ใช้ใหม่:
// create user uid=301
future = api . submitCommandAsync ( ApiAddUser . builder ()
. uid ( 301L )
. build ());
// create user uid=302
future = api . submitCommandAsync ( ApiAddUser . builder ()
. uid ( 302L )
. build ());
ดำเนินการฝากเงิน:
// first user deposits 20 LTC
future = api . submitCommandAsync ( ApiAdjustUserBalance . builder ()
. uid ( 301L )
. currency ( currencyCodeLtc )
. amount ( 2_000_000_000L )
. transactionId ( 1L )
. build ());
// second user deposits 0.10 BTC
future = api . submitCommandAsync ( ApiAdjustUserBalance . builder ()
. uid ( 302L )
. currency ( currencyCodeXbt )
. amount ( 10_000_000L )
. transactionId ( 2L )
. build ());
สั่งซื้อ:
// first user places Good-till-Cancel Bid order
// he assumes BTCLTC exchange rate 154 LTC for 1 BTC
// bid price for 1 lot (0.01BTC) is 1.54 LTC => 1_5400_0000 litoshi => 10K * 15_400 (in price steps)
future = api . submitCommandAsync ( ApiPlaceOrder . builder ()
. uid ( 301L )
. orderId ( 5001L )
. price ( 15_400L )
. reservePrice ( 15_600L ) // can move bid order up to the 1.56 LTC, without replacing it
. size ( 12L ) // order size is 12 lots
. action ( OrderAction . BID )
. orderType ( OrderType . GTC ) // Good-till-Cancel
. symbol ( symbolXbtLtc )
. build ());
// second user places Immediate-or-Cancel Ask (Sell) order
// he assumes wost rate to sell 152.5 LTC for 1 BTC
future = api . submitCommandAsync ( ApiPlaceOrder . builder ()
. uid ( 302L )
. orderId ( 5002L )
. price ( 15_250L )
. size ( 10L ) // order size is 10 lots
. action ( OrderAction . ASK )
. orderType ( OrderType . IOC ) // Immediate-or-Cancel
. symbol ( symbolXbtLtc )
. build ());
ขอหนังสือสั่งซื้อ:
future = api . requestOrderBookAsync ( symbolXbtLtc , 10 );
การปรับเปลี่ยนคำสั่ง GtC:
// first user moves remaining order to price 1.53 LTC
future = api . submitCommandAsync ( ApiMoveOrder . builder ()
. uid ( 301L )
. orderId ( 5001L )
. newPrice ( 15_300L )
. symbol ( symbolXbtLtc )
. build ());
// first user cancel remaining order
future = api . submitCommandAsync ( ApiCancelOrder . builder ()
. uid ( 301L )
. orderId ( 5001L )
. symbol ( symbolXbtLtc )
. build ());
ตรวจสอบยอดคงเหลือผู้ใช้และคำสั่งซื้อ GtC:
Future < SingleUserReportResult > report = api . processReport ( new SingleUserReportQuery ( 301 ), 0 );
ตรวจสอบความสมดุลของระบบ:
// check fees collected
Future < TotalCurrencyBalanceReportResult > totalsReport = api . processReport ( new TotalCurrencyBalanceReportQuery (), 0 );
System . out . println ( "LTC fees collected: " + totalsReport . get (). getFees (). get ( currencyCodeLtc ));
Exchange-core เป็นโครงการโอเพ่นซอร์สและยินดีต้อนรับการมีส่วนร่วม!