package com.ee.ctp;

import com.ee.ctp.ApplicationRuntime;
import com.ee.ctp.CtpClient;
import com.ee.ctp.dto.ReqAccountRegister;
import com.ee.ctp.dto.ReqContractBank;
import com.ee.ctp.dto.ReqFromBankToFuture;
import com.ee.ctp.dto.ReqFromFutureToBank;
import com.ee.ctp.dto.ReqInputOrder;
import com.ee.ctp.dto.ReqInvestorPosition;
import com.ee.ctp.dto.ReqQryCommissionRate;
import com.ee.ctp.dto.ReqQryInstrument;
import com.ee.ctp.dto.ReqQryMarginRate;
import com.ee.ctp.dto.ReqQryOrder;
import com.ee.ctp.dto.ReqQrySettlementInfoConfirm;
import com.ee.ctp.dto.ReqQryTrade;
import com.ee.ctp.dto.ReqQryTransferSerial;
import com.ee.ctp.dto.ReqSettlementInfo;
import com.ee.ctp.dto.ReqSettlementInfoConfirm;
import com.ee.ctp.dto.ReqTradingAccount;
import com.ee.ctp.dto.ReqUserLogin;
import com.ee.ctp.dto.ReqUserLogout;
import com.ee.ctp.enums.FtdType;
import com.ee.ctp.enums.FtdcType;
import com.ee.ctp.enums.Sequence;
import com.ee.ctp.enums.TID;
import com.ee.ctp.enums.business.FtdcBillHedgeFlag;
import com.ee.ctp.enums.business.FtdcContingentCondition;
import com.ee.ctp.enums.business.FtdcCurrencyID;
import com.ee.ctp.enums.business.FtdcDirection;
import com.ee.ctp.enums.business.FtdcExchange;
import com.ee.ctp.enums.business.FtdcForceCLoseReson;
import com.ee.ctp.enums.business.FtdcOffsetFlagType;
import com.ee.ctp.enums.business.FtdcOrderPriceType;
import com.ee.ctp.enums.business.FtdcPwdFlag;
import com.ee.ctp.enums.business.FtdcTimeCondition;
import com.ee.ctp.enums.business.FtdcTradeCode;
import com.ee.ctp.enums.business.FtdcVolumeCondition;
import com.ee.ctp.enums.business.FtdcYesNoIndicator;
import com.ee.ctp.ftdc.FtdcProtocol;
import com.ee.ctp.handler.PrintResultHandler;

import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import junit.framework.TestCase;

/**
 * simnow地址:
 * 180.168.146.187:10000
 * 180.168.146.187:10030
 * brokerid 9999
 * 
 * @author ee
 *
 */
public class TradeTest extends TestCase{
	/**
	 * 切换环境
	 */
	private static final boolean TEST = true;
	private static String userid;
	private static String passwd;
	private static String brokerid;
	private static String host;
	private static int port = 52205;
	
	private static final long WATI_TIME = 1000 * 1000;
	
	@Override
	protected void setUp() throws Exception {
		if(TEST) {
			userid = "changeme";
			passwd = "changeme";
			brokerid = "9999";
			host = "180.168.146.187";
			port = 10000;
		}else {
			userid = "changeme";
			passwd = "changeme";
			brokerid = "changeme";
			host = "changeme";
			port = 10000;
		}
		
	}
	
	public void testLogin() throws Exception {
		UserLoginReqhandler userLoginReqhandler = new UserLoginReqhandler();
		CtpClient.ctp(host, port, userLoginReqhandler);
		Thread.sleep(WATI_TIME);
	}
	
	public void testLoginAndConstractBank() throws Exception {
		UserLoginReqhandler userLoginReqhandler = new UserLoginReqhandler();
		CtpClient.ctp(host, port, userLoginReqhandler);
		
		Channel ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
		while(ftdcChannel == null) {
			ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
			Thread.sleep(1000);
		}
		
		ByteBuf buffer = ftdcChannel.alloc().buffer();
		ReqContractBank cb = new ReqContractBank();
		cb.setBrokerID(brokerid);
		cb.write(buffer.retain());
		FtdcProtocol ftdc = new FtdcProtocol(FtdType.FTDTypeCompressed, buffer, FtdcType.REQ.type(), 6961, TID.ContractbankReq.id(), Sequence.ContractBank);
		ftdcChannel.writeAndFlush(ftdc);
		
		Thread.sleep(WATI_TIME);
	}
	
	public void testLoginAndLogout() throws Exception {
		UserLoginReqhandler userLoginReqhandler = new UserLoginReqhandler();
		CtpClient.ctp(host, port, userLoginReqhandler);
		
		Channel ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
		while(ftdcChannel == null) {
			ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
			Thread.sleep(1000);
		}
		
		ByteBuf buffer = ftdcChannel.alloc().buffer();
		ReqUserLogout lout = new ReqUserLogout();
		lout.setUserId(userid);
		lout.setBrokerID(brokerid);
		lout.write(buffer.retain());
		FtdcProtocol ftdc = new FtdcProtocol(FtdType.FTDTypeCompressed, buffer, FtdcType.REQ.type(), 6962, TID.UserLogoutReq.id(), Sequence.UserLogout);
		ftdcChannel.writeAndFlush(ftdc);
		
		Thread.sleep(WATI_TIME);
	}
	
	public void testLoginAndSettlementInfo() throws Exception {
		UserLoginReqhandler userLoginReqhandler = new UserLoginReqhandler();
		CtpClient.ctp(host, port, userLoginReqhandler);
		
		Channel ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
		while(ftdcChannel == null) {
			ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
			Thread.sleep(1000);
		}
		
		ByteBuf buffer = ftdcChannel.alloc().buffer();
		ReqSettlementInfo info = new ReqSettlementInfo();
		info.setBrokerID(brokerid);
		info.setInvestorID(userid);
//		info.setTradingDay("20170922");
		info.write(buffer.retain());
		FtdcProtocol ftdc = new FtdcProtocol(FtdType.FTDTypeCompressed, buffer, FtdcType.REQ.type(), 6963, TID.SettlementInfoReq.id(), Sequence.SettlementInfo);
		ftdcChannel.writeAndFlush(ftdc);
		
		Thread.sleep(WATI_TIME);
	}
	
	public void testLoginAndSettlementInfoConfirm() throws Exception {
		UserLoginReqhandler userLoginReqhandler = new UserLoginReqhandler();
		CtpClient.ctp(host, port, userLoginReqhandler);
		
		Channel ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
		while(ftdcChannel == null) {
			ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
			Thread.sleep(1000);
		}
		
		ByteBuf buffer = ftdcChannel.alloc().buffer();
		ReqSettlementInfoConfirm info = new ReqSettlementInfoConfirm();
		info.setBrokerID(brokerid);
		info.setInvestorID(userid);
//		info.setTradingDay("20170922");
		info.write(buffer.retain());
		FtdcProtocol ftdc = new FtdcProtocol(FtdType.FTDTypeCompressed, buffer, FtdcType.REQ.type(), 6964, TID.SettlementInfoConfirmReq.id(), Sequence.SettlementInfoConfirm);
		ftdcChannel.writeAndFlush(ftdc);
		
		Thread.sleep(WATI_TIME);
	}
	
	public void testLoginAndQrySettlementInfoConfirm() throws Exception {
		UserLoginReqhandler userLoginReqhandler = new UserLoginReqhandler();
		CtpClient.ctp(host, port, userLoginReqhandler);
		
		Channel ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
		while(ftdcChannel == null) {
			ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
			Thread.sleep(1000);
		}
		
		ByteBuf buffer = ftdcChannel.alloc().buffer();
		ReqQrySettlementInfoConfirm info = new ReqQrySettlementInfoConfirm();
		info.setBrokerID(brokerid);
		info.setInvestorID(userid);
		info.write(buffer.retain());
		FtdcProtocol ftdc = new FtdcProtocol(FtdType.FTDTypeCompressed, buffer, FtdcType.REQ.type(), 6965, TID.QrySettlementInfoConfirmReq.id(), Sequence.QrySettlementInfoConfirm);
		ftdcChannel.writeAndFlush(ftdc);
		
		Thread.sleep(WATI_TIME);
	}
	
	public void testLoginAndTradingAccount() throws Exception {
		UserLoginReqhandler userLoginReqhandler = new UserLoginReqhandler();
		CtpClient.ctp(host, port, userLoginReqhandler);
		
		Channel ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
		while(ftdcChannel == null) {
			ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
			Thread.sleep(1000);
		}
		
		ByteBuf buffer = ftdcChannel.alloc().buffer();
		ReqTradingAccount reqTradingAccount = new ReqTradingAccount();
		reqTradingAccount.setBrokerID(brokerid);
		reqTradingAccount.setInvestorID(userid);
		reqTradingAccount.write(buffer.retain());
		FtdcProtocol ftdc = new FtdcProtocol(FtdType.FTDTypeCompressed, buffer, FtdcType.REQ.type(), 6966, TID.TradingAccountReq.id(), Sequence.TradingAccount);
		ftdcChannel.writeAndFlush(ftdc);
		
		Thread.sleep(WATI_TIME);
	}
	
	public void testLoginAndOrderInsert() throws Exception {
		UserLoginReqhandler userLoginReqhandler = new UserLoginReqhandler();
		CtpClient.ctp(host, port, userLoginReqhandler);
		
		Channel ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
		while(ftdcChannel == null) {
			ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
			Thread.sleep(1000);
		}
		
		ByteBuf buffer = ftdcChannel.alloc().buffer();
		ReqInputOrder order = new ReqInputOrder();
		order.setInstrumentID("ag1712");
		order.setInvestorID(userid);
		order.setDirection(FtdcDirection.BUY);
		order.setOrderPriceType(FtdcOrderPriceType.FTDC_LimitPrice);
		order.setCombOffsetFlag(FtdcOffsetFlagType.FTDC_Open);
		order.setVolumeTotalOriginal(1);
		order.setCombHedgeFlag(FtdcBillHedgeFlag.FTDC_Speculation);
		order.setLimitPrice(3750);
		order.setTimeCondition(FtdcTimeCondition.FTDC_GFD);
		order.setVolumeCondition(FtdcVolumeCondition.HOST_AV);
		order.setMinVolume(1);
		order.setContingentCondition(FtdcContingentCondition.FTDC_Immediately);
		order.setStopPrice(0);
		order.setForceCloseReason(FtdcForceCLoseReson.THOST_FTDCFCC_NotForceClose);
		order.setExchangeID(FtdcExchange.FTDC_SHFE);
		order.setBrokerID(brokerid);
		order.setRequestID(7000);
		order.setOrderRef("101");
//		order.setIPAddress("122.40.123.44");
		order.write(buffer.retain());
		FtdcProtocol ftdc = new FtdcProtocol(FtdType.FTDTypeCompressed, buffer, FtdcType.REQ.type(), 6967, TID.OrderInsertReq.id(), Sequence.OrderInsert);
		ftdcChannel.writeAndFlush(ftdc);
		
		Thread.sleep(WATI_TIME);
	}
	
	public void testLoginAndInvestorPosition() throws Exception {
		UserLoginReqhandler userLoginReqhandler = new UserLoginReqhandler();
		CtpClient.ctp(host, port, userLoginReqhandler);
		
		Channel ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
		while(ftdcChannel == null) {
			ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
			Thread.sleep(1000);
		}
		
		ByteBuf buffer = ftdcChannel.alloc().buffer();
		ReqInvestorPosition investorPosition = new ReqInvestorPosition();
		investorPosition.setBrokerID(brokerid);
		investorPosition.setInvestorID(userid);
		investorPosition.write(buffer.retain());
		FtdcProtocol ftdc = new FtdcProtocol(FtdType.FTDTypeCompressed, buffer, FtdcType.REQ.type(), 6968, TID.InvestorPositionReq.id(), Sequence.InvestorPosition);
		ftdcChannel.writeAndFlush(ftdc);
		
		Thread.sleep(WATI_TIME);
	}
	
	public void testLoginAndQryOrder() throws Exception {
		UserLoginReqhandler userLoginReqhandler = new UserLoginReqhandler();
		CtpClient.ctp(host, port, userLoginReqhandler);
		
		Channel ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
		while(ftdcChannel == null) {
			ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
			Thread.sleep(1000);
		}
		
		ByteBuf buffer = ftdcChannel.alloc().buffer();
		ReqQryOrder order = new ReqQryOrder();
		order.setBrokerID(brokerid);
		order.setInvestorID(userid);
		order.setInsertTimeStart("20170928");
		order.write(buffer.retain());
		FtdcProtocol ftdc = new FtdcProtocol(FtdType.FTDTypeCompressed, buffer, FtdcType.REQ.type(), 6969, TID.QryOrderReq.id(), Sequence.QryOrder);
		ftdcChannel.writeAndFlush(ftdc);
		
		Thread.sleep(WATI_TIME);
	}
	
	public void testLoginAndQryTrade() throws Exception {  
		UserLoginReqhandler userLoginReqhandler = new UserLoginReqhandler();
		CtpClient.ctp(host, port, userLoginReqhandler);
		
		Channel ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
		while(ftdcChannel == null) {
			ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
			Thread.sleep(1000);
		}
		
		ByteBuf buffer = ftdcChannel.alloc().buffer();
		ReqQryTrade trade = new ReqQryTrade();
		trade.setBrokerID(brokerid);
		trade.setInvestorID(userid);
		trade.write(buffer.retain());
		FtdcProtocol ftdc = new FtdcProtocol(FtdType.FTDTypeCompressed, buffer, FtdcType.REQ.type(), 6970, TID.QryTradeReq.id(), Sequence.QryTrade);
		ftdcChannel.writeAndFlush(ftdc);
		
		Thread.sleep(WATI_TIME);
	}
	
	public void testLoginAndQryMarginRate() throws Exception {
		UserLoginReqhandler userLoginReqhandler = new UserLoginReqhandler();
		CtpClient.ctp(host, port, userLoginReqhandler);
		
		Channel ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
		while(ftdcChannel == null) {
			ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
			Thread.sleep(1000);
		}
		
		ByteBuf buffer = ftdcChannel.alloc().buffer();
		ReqQryMarginRate rate = new ReqQryMarginRate();
		rate.setBrokerID(brokerid);
		rate.setInvestorID(userid);
		rate.setInstrumentID("m1803");
		rate.setHedgeFlag(FtdcBillHedgeFlag.FTDC_Speculation);
		rate.write(buffer.retain());
		FtdcProtocol ftdc = new FtdcProtocol(FtdType.FTDTypeCompressed, buffer, FtdcType.REQ.type(), 6971, TID.QryMarginRateReq.id(), Sequence.QryMarginRate);
		ftdcChannel.writeAndFlush(ftdc);
		
		Thread.sleep(WATI_TIME);
	}
	
	public void testLoginAndQryCommissionRate() throws Exception {
		UserLoginReqhandler userLoginReqhandler = new UserLoginReqhandler();
		CtpClient.ctp(host, port, userLoginReqhandler);
		
		Channel ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
		while(ftdcChannel == null) {
			ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
			Thread.sleep(1000);
		}
		
		ByteBuf buffer = ftdcChannel.alloc().buffer();
		ReqQryCommissionRate rate = new ReqQryCommissionRate();
		rate.setBrokerID(brokerid);
		rate.setInvestorID(userid);
		rate.setInstrumentID("ag1712");
		rate.write(buffer.retain());
		FtdcProtocol ftdc = new FtdcProtocol(FtdType.FTDTypeCompressed, buffer, FtdcType.REQ.type(), 6972, TID.QryCommissionRateReq.id(), Sequence.QryCommissionRate);
		ftdcChannel.writeAndFlush(ftdc);
		
		Thread.sleep(WATI_TIME);
	}
	
	public void testLoginAndAccountRegister() throws Exception {
		UserLoginReqhandler userLoginReqhandler = new UserLoginReqhandler();
		CtpClient.ctp(host, port, userLoginReqhandler);
		
		Channel ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
		while(ftdcChannel == null) {
			ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
			Thread.sleep(1000);
		}
		
		ByteBuf buffer = ftdcChannel.alloc().buffer();
		ReqAccountRegister reqAccountRegister = new ReqAccountRegister();
		reqAccountRegister.setBrokerID(brokerid);
		reqAccountRegister.setAccountID(userid);
		reqAccountRegister.write(buffer.retain());
		FtdcProtocol ftdc = new FtdcProtocol(FtdType.FTDTypeCompressed, buffer, FtdcType.REQ.type(), 6973, TID.AccountRegisterReq.id(), Sequence.AccountRegister);
		ftdcChannel.writeAndFlush(ftdc);
		
		Thread.sleep(WATI_TIME);
	}
	
	public void testQryTransferSerial() throws Exception {
		UserLoginReqhandler userLoginReqhandler = new UserLoginReqhandler();
		CtpClient.ctp(host, port, userLoginReqhandler);
		
		Channel ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
		while(ftdcChannel == null) {
			ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
			Thread.sleep(1000);
		}
		
		ByteBuf buffer = ftdcChannel.alloc().buffer();
		ReqQryTransferSerial reqQryTransferSerial = new ReqQryTransferSerial();
		reqQryTransferSerial.setAccountID(userid);
//		reqQryTransferSerial.setBankID("");
		reqQryTransferSerial.setBrokerID(brokerid);
//		reqQryTransferSerial.setCurrencyID("CNY");
		reqQryTransferSerial.write(buffer.retain());
		FtdcProtocol ftdc = new FtdcProtocol(FtdType.FTDTypeCompressed, buffer, FtdcType.REQ.type(), 6969, TID.QryTransferSerialReq.id(), Sequence.QryTransferSerial);
		ftdcChannel.writeAndFlush(ftdc);
		
		Thread.sleep(WATI_TIME);
	}
	
	public void testQryInstrument() throws Exception {
		UserLoginReqhandler userLoginReqhandler = new UserLoginReqhandler();
		CtpClient.ctp(host, port, userLoginReqhandler);
		
		Channel ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
		while(ftdcChannel == null) {
			ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
			Thread.sleep(1000);
		}
		
		ByteBuf buffer = ftdcChannel.alloc().buffer();
		ReqQryInstrument reqQryInstrument = new ReqQryInstrument();
//		reqQryInstrument.setInstrumentID("ag1712"); // 合约ag1712
		reqQryInstrument.setExchangeID(FtdcExchange.FTDC_SHFE); // 上海期货交易所,CZCE,DCE,CFFEX,INE
		reqQryInstrument.write(buffer.retain());
		FtdcProtocol ftdc = new FtdcProtocol(FtdType.FTDTypeCompressed, buffer, FtdcType.REQ.type(), 6970, TID.QryInstrumentReq.id(), Sequence.QryInstrument);
		ftdcChannel.writeAndFlush(ftdc);
		
		Thread.sleep(WATI_TIME);
	}
	
	public void testFromBankToFuture() throws Exception {
		UserLoginReqhandler userLoginReqhandler = new UserLoginReqhandler();
		CtpClient.ctp(host, port, userLoginReqhandler);
		
		Channel ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
		while(ftdcChannel == null) {
			ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
			Thread.sleep(1000);
		}
		
		ByteBuf buffer = ftdcChannel.alloc().buffer();
		ReqFromBankToFuture reqFromBankToFuture = new ReqFromBankToFuture();
		reqFromBankToFuture.setBrokerID(brokerid);
		reqFromBankToFuture.setRequestID(6971);
		reqFromBankToFuture.setBankID("4");// 4(int 872415232)
		reqFromBankToFuture.setBankBranchID("0000");
		reqFromBankToFuture.setAccountID(userid);
		reqFromBankToFuture.setPassword("241398");
		reqFromBankToFuture.setTradeAmount(1);
		reqFromBankToFuture.setBankPassWord("241398");
		reqFromBankToFuture.setTradeCode(FtdcTradeCode.FutureToBank);
		reqFromBankToFuture.setSecuPwdFlag(FtdcPwdFlag.FTDC_BlankCheck);
		reqFromBankToFuture.setBankPwdFlag(FtdcPwdFlag.FTDC_NoCheck);
		reqFromBankToFuture.setVerifyCertNoFlag(FtdcYesNoIndicator.TDC_No);
		reqFromBankToFuture.setCurrencyID(FtdcCurrencyID.CNY);//CNY
		reqFromBankToFuture.write(buffer.retain());
		FtdcProtocol ftdc = new FtdcProtocol(FtdType.FTDTypeCompressed, buffer, FtdcType.REQ.type(), 6971, TID.FromBankToFutureReq.id(), Sequence.FromBankToFuture);
		ftdcChannel.writeAndFlush(ftdc);
		
		Thread.sleep(WATI_TIME);
	}
	
	public void testFromFutureToBank() throws Exception {
		UserLoginReqhandler userLoginReqhandler = new UserLoginReqhandler();
		CtpClient.ctp(host, port, userLoginReqhandler);
		
		Channel ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
		while(ftdcChannel == null) {
			ftdcChannel = ApplicationRuntime.getFtdcChannel(brokerid, userid);
			Thread.sleep(1000);
		}
		
		ByteBuf buffer = ftdcChannel.alloc().buffer();
		ReqFromFutureToBank reqFromFutureToBank = new ReqFromFutureToBank();
		reqFromFutureToBank.setBrokerID(brokerid);
		reqFromFutureToBank.setRequestID(6972);
		reqFromFutureToBank.setBankID("4");
		reqFromFutureToBank.setBankBranchID("0000");
		reqFromFutureToBank.setAccountID(userid);
		reqFromFutureToBank.setPassword("241398");
		reqFromFutureToBank.setTradeAmount(1);
		reqFromFutureToBank.setBankPassWord("241398");
		reqFromFutureToBank.setTradeCode(FtdcTradeCode.FutureToBank);
		reqFromFutureToBank.setSecuPwdFlag(FtdcPwdFlag.FTDC_BlankCheck);
		reqFromFutureToBank.setBankPwdFlag(FtdcPwdFlag.FTDC_NoCheck);
		reqFromFutureToBank.setVerifyCertNoFlag(FtdcYesNoIndicator.TDC_No);
		reqFromFutureToBank.setCurrencyID(FtdcCurrencyID.CNY); // int 1129208064
		reqFromFutureToBank.write(buffer.retain());
		FtdcProtocol ftdc = new FtdcProtocol(FtdType.FTDTypeCompressed, buffer, FtdcType.REQ.type(), 6972, TID.FromFutureToBankReq.id(), Sequence.FromFutureToBank);
		ftdcChannel.writeAndFlush(ftdc);
		
		Thread.sleep(WATI_TIME);
	}
	
	static class UserLoginReqhandler implements ChannelFutureListener {

		@Override
		public void operationComplete(ChannelFuture future) throws Exception {
			Channel channel = future.channel();
			ReqUserLogin userLogin = new ReqUserLogin();
			userLogin.setTradingDay("19800100");
			userLogin.setBrokerID(brokerid);
			userLogin.setUserId(userid);
			userLogin.setPasswd(passwd);
			userLogin.setInterfaceProductInfo("THOST User");
			userLogin.setProtocolInfo("FTDC 0");
			userLogin.setMacAddress("99:01:A7:9E:92:d7");
			ByteBuf buffer = channel.alloc().buffer();
			userLogin.write(buffer.retain());
			new PrintResultHandler().reqister(channel);
			FtdcProtocol ftdc = new FtdcProtocol(FtdType.FTDTypeCompressed, buffer, FtdcType.REQ.type(),6960, TID.UserLoginReq.id());
			channel.writeAndFlush(ftdc);
		}
		
	}
}