/****************************************************************************
** Copyright (c) 2001-2014
**
** This file is part of the QuickFIX FIX Engine
**
** This file may be distributed under the terms of the quickfixengine.org
** license as defined by quickfixengine.org and appearing in the file
** LICENSE included in the packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.quickfixengine.org/LICENSE for licensing information.
**
** Contact ask@quickfixengine.org if any conditions of this licensing are
** not clear to you.
**
****************************************************************************/
package quickfix.banzai;
import java.util.Date;
import java.util.Observable;
import java.util.Observer;
import java.util.Set;
import java.util.HashSet;
import java.util.Map;
import java.util.HashMap;
import quickfix.*;
import quickfix.banzai.Order;
import quickfix.field.*;
import javax.swing.SwingUtilities;
public class BanzaiApplication implements Application {
private OrderTableModel orderTableModel = null;
private ExecutionTableModel executionTableModel = null;
private ObservableOrder observableOrder = new ObservableOrder();
private ObservableLogon observableLogon = new ObservableLogon();
static private TwoWayMap sideMap = new TwoWayMap();
static private TwoWayMap typeMap = new TwoWayMap();
static private TwoWayMap tifMap = new TwoWayMap();
static private HashMap execIDs = new HashMap();
public BanzaiApplication(OrderTableModel orderTableModel,
ExecutionTableModel executionTableModel) {
this.orderTableModel = orderTableModel;
this.executionTableModel = executionTableModel;
}
public void onCreate(SessionID sessionID) {}
public void onLogon(SessionID sessionID) {
observableLogon.logon(sessionID);
}
public void onLogout(SessionID sessionID) {
observableLogon.logout(sessionID);
}
public void toAdmin(quickfix.Message message,
SessionID sessionID) {}
public void toApp(quickfix.Message message,
SessionID sessionID) throws DoNotSend {}
public void fromAdmin(quickfix.Message message,SessionID sessionID)
throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon {}
public void fromApp(quickfix.Message message, SessionID sessionID)
throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType {
try {
SwingUtilities.invokeLater(new doFromApp(message, sessionID));
} catch(Exception e) {}
}
public class doFromApp implements Runnable {
private quickfix.Message message;
private SessionID sessionID;
public doFromApp(quickfix.Message message, SessionID sessionID) {
this.message = message;
this.sessionID = sessionID;
}
public void run() {
try {
MsgType msgType = new MsgType();
if(message.getHeader().getField(msgType).valueEquals("8"))
executionReport(message, sessionID);
if(message.getHeader().getField(msgType).valueEquals("9"))
cancelReject(message, sessionID);
} catch(FieldNotFound e) {
System.out.println(e);
}
}
}
private void executionReport(Message message, SessionID sessionID)
throws FieldNotFound {
ExecID execID = (ExecID)message.getField(new ExecID());
if(alreadyProcessed(execID, sessionID))
return;
String id = message.getField(new ClOrdID()).getValue();
Order order = orderTableModel.getOrder(id);
if(order == null)
return;
LastShares lastShares = new LastShares(0);
try {
OrderQty orderQty = (OrderQty)message.getField(new OrderQty());
int diff = order.getQuantity() - (int)orderQty.getValue();
order.setQuantity((int)orderQty.getValue());
order.setOpen(order.getOpen() - diff);
} catch(FieldNotFound e) {}
try {
Price price = (Price)message.getField(new Price());
order.setLimit(new Double(price.getValue()));
} catch(FieldNotFound e) {}
try {
message.getField(lastShares);
} catch(FieldNotFound e) {}
if(lastShares.getValue() > 0) {
order.setExecuted((int)message.getField(new CumQty()).getValue());
order.setAvgPx(message.getField(new AvgPx()).getValue());
}
OrdStatus ordStatus = (OrdStatus)message.getField(new OrdStatus());
try {
order.setOpen((int)message.getField(new LeavesQty()).getValue());
} catch(FieldNotFound e) {
// FIX40 doesn't have LeavesQty
if(ordStatus.valueEquals(OrdStatus.REJECTED) ||
ordStatus.valueEquals(OrdStatus.CANCELED))
order.setOpen(0);
else if(ordStatus.valueEquals(OrdStatus.NEW)) {
if(order.isNew()) {
order.setOpen(order.getQuantity());
order.setNew(false);
}
}
order.setOpen(order.getOpen() - (int)lastShares.getValue());
}
if(ordStatus.valueEquals(OrdStatus.REJECTED))
order.setRejected(true);
else if(ordStatus.valueEquals(OrdStatus.CANCELED) ||
ordStatus.valueEquals(OrdStatus.DONE_FOR_DAY))
order.setCanceled(true);
try {
order.setMessage(message.getField(new Text()).getValue());
} catch(FieldNotFound e) {
order.setMessage(null);
}
orderTableModel.updateOrder(order, id);
observableOrder.update(order);
if(lastShares.getValue() > 0) {
Execution execution = new Execution();
execution.setExchangeID(sessionID + message.getField(new ExecID()).getValue());
execution.setSymbol(message.getField(new Symbol()).getValue());
execution.setQuantity((int)lastShares.getValue());
execution.setPrice(message.getField(new LastPx()).getValue());
Side side = (Side)message.getField(new Side());
execution.setSide(FIXSideToSide(side));
executionTableModel.addExecution(execution);
}
}
private void cancelReject(Message message, SessionID sessionID)
throws FieldNotFound {
String id = message.getField(new ClOrdID()).getValue();
Order order = orderTableModel.getOrder(id);
if(order == null)
return;
if(order.getOriginalID() != null)
order = orderTableModel.getOrder(order.getOriginalID());
try {
order.setMessage(message.getField(new Text()).getValue());
} catch(FieldNotFound e) {}
orderTableModel.updateOrder(order, order.getID());
}
private boolean alreadyProcessed(ExecID execID, SessionID sessionID) {
HashSet set = (HashSet)execIDs.get(sessionID);
if(set == null) {
set = new HashSet();
set.add(execID);
execIDs.put(sessionID, set);
return false;
} else {
if(set.contains(execID))
return true;
set.add(execID);
return false;
}
}
private void send(quickfix.Message message, SessionID sessionID) {
try {
Session.sendToTarget(message, sessionID);
} catch(SessionNotFound e) {
System.out.println(e);
}
}
public void send(Order order) throws IllegalArgumentException {
String beginString = order.getSessionID().getBeginString();
if(beginString.equals("FIX.4.0"))
send40(order);
else if(beginString.equals("FIX.4.1"))
没有合适的资源?快使用搜索试试~ 我知道了~
QuickFix 实现代码例子
需积分: 32 32 下载量 95 浏览量
2017-03-09
17:28:06
上传
评论
收藏 20.79MB GZ 举报
温馨提示
共3590个文件
html:798个
h:715个
def:470个
金融信息交换(FIX)协议是为促进证券交易信息的电子交换而制定的信息标准。它的目的是用于贸易伙伴之间希望自动通信 .
资源推荐
资源详情
资源评论
收起资源包目录
QuickFix 实现代码例子 (3590个子文件)
configure.ac 8KB
Makefile.am 4KB
Makefile.am 1KB
Makefile.am 930B
Makefile.am 752B
Makefile.am 676B
Makefile.am 393B
Makefile.am 318B
Makefile.am 317B
Makefile.am 299B
Makefile.am 207B
Makefile.am 180B
Makefile.am 128B
Makefile.am 106B
Makefile.am 98B
Makefile.am 52B
Makefile.am 38B
Makefile.am 35B
Makefile.am 35B
Makefile.am 32B
Makefile.am 28B
Makefile.am 19B
Makefile.am 19B
Makefile.am 18B
Makefile.am 18B
Makefile.am 18B
Makefile.am 16B
Makefile.am 14B
Makefile.am 14B
Makefile.am 14B
Makefile.am 13B
AUTHORS 38B
generate_net.bat 1KB
setup.bat 1KB
runat_threaded.bat 861B
generate_c++.bat 804B
runat.bat 657B
runnewat.bat 419B
build_vs10.bat 353B
build_vs11.bat 353B
build_vs12.bat 341B
runut.bat 323B
runpt.bat 319B
generate.bat 314B
build.bat 230B
run_banzai.bat 227B
test.bat 193B
create.bat 165B
document.bat 86B
create.bat 68B
create.bat 58B
run_tradeclient.bat 55B
run_executor_cpp.bat 54B
run_tradeclient_debug.bat 53B
run_ordermatch.bat 52B
run_executor_cpp_debug.bat 52B
run_ordermatch_debug.bat 50B
create.bat 34B
bootstrap 308B
strptime.c 7KB
getopt.c 4KB
executor.cfg 2KB
banzai.cfg 791B
ordermatch.cfg 719B
tradeclient.cfg 547B
ut.cfg 415B
ChangeLog 4KB
tidy.config 55B
configure 592KB
COPYING 34KB
COPYING 1KB
QuickfixPython.cpp 10.53MB
QuickfixRuby.cpp 8.49MB
pugixml.cpp 271KB
SessionTestCase.cpp 46KB
Session.cpp 41KB
MessagesTestCase.cpp 36KB
pt.cpp 24KB
HttpConnection.cpp 23KB
Application.cpp 22KB
TestCheckMacros.cpp 21KB
DataDictionary.cpp 20KB
DataDictionaryTestCase.cpp 18KB
Message.cpp 16KB
FieldConvertorsTestCase.cpp 12KB
PostgreSQLStore.cpp 11KB
SessionSettingsTestCase.cpp 11KB
MySQLStore.cpp 11KB
OdbcStore.cpp 11KB
OrderMatcherTestCase.cpp 11KB
Utility.cpp 11KB
TimeRangeTestCase.cpp 11KB
SessionFactory.cpp 10KB
Application.cpp 10KB
FileStore.cpp 9KB
TestChecks.cpp 9KB
TestTestRunner.cpp 8KB
PostgreSQLLog.cpp 8KB
MySQLLog.cpp 7KB
SocketMonitor.cpp 7KB
共 3590 条
- 1
- 2
- 3
- 4
- 5
- 6
- 36
资源评论
志汉天涯
- 粉丝: 24
- 资源: 23
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功