package org.f1x.v1;
import org.f1x.SessionIDBean;
import org.f1x.api.FixVersion;
import org.f1x.api.message.MessageBuilder;
import org.f1x.api.message.fields.*;
import org.f1x.api.session.SessionID;
import org.f1x.io.OutputChannel;
import org.f1x.util.AsciiUtils;
import org.f1x.util.RealTimeSource;
import org.junit.Ignore;
import org.junit.Test;
import quickfix.InvalidMessage;
import quickfix.Message;
import quickfix.field.MsgType;
import java.io.IOException;
import java.util.Date;
import java.util.Scanner;
public class Test_EncodingNewOrderSingle {
private static final int WARMUP = 20000;
private static final int N = 1000000;
private static final String SENDER_COMP_ID = "A12345B";
private static final String SENDER_SUB_ID = "2DEFGH4";
private static final String TARGET_COMP_ID = "COMPARO";
private static final String TARGET_SUB_ID = "G";
private static final int MSG_SEQ_NUM = 78;
private static final String ACCOUNT = "AU,SY";
private static final String SENDER_LOCATION_ID = "AU,SY";
private static final int ORDER_ID = 4;
private static final int QUANTITY = 50;
private static final double PRICE = 400.5;
private static final String SYMBOL = "OC";
private static final String SECURITY_DESCRIPTION = "AOZ3 C02000";
private static final String TEXT = "NIGEL";
@Ignore
@Test
public void testF1XEncoding() throws IOException {
MessageBuilder mb = new ByteBufferMessageBuilder(256, 2);
RawMessageAssembler asm = new RawMessageAssembler(FixVersion.FIX44, 256, false);
SessionID sessionID = new SessionIDBean(SENDER_COMP_ID, SENDER_SUB_ID, TARGET_COMP_ID, TARGET_SUB_ID);
NullOutputChannel out = new NullOutputChannel();
for (int i = 0; i < WARMUP; i++)
encode(mb, asm, sessionID, out);
long start = System.nanoTime();
for (int i = 0; i < N; i++)
encode(mb, asm, sessionID, out);
long end = System.nanoTime();
System.out.println("Average time " + (end - start) / N + " ns. per encoding, dummy result: " + out);
}
@Ignore
@Test
public void testQuickFIXJEncoding() {
Message msg = new Message();
String dummy = null;
for (int i = 0; i < WARMUP; i++)
dummy = encode(msg);
long start = System.nanoTime();
for (int i = 0; i < N; i++)
dummy = encode(msg);
long end = System.nanoTime();
System.out.println("Average time " + (end - start) / N + " ns. per encoding, dummy result: " + dummy);
}
private static String encode(Message msg) {
msg.clear();
Message.Header header = msg.getHeader();
header.setString(FixTags.BeginString, FixVersion.FIX44.getBeginString());
header.setString(FixTags.MsgType, MsgType.ORDER_SINGLE);
header.setInt(FixTags.MsgSeqNum, MSG_SEQ_NUM);
header.setString(FixTags.SenderCompID, SENDER_COMP_ID);
header.setString(FixTags.SenderSubID, SENDER_SUB_ID);
header.setUtcTimeStamp(FixTags.SendingTime, new Date(), true);
header.setString(FixTags.TargetCompID, TARGET_COMP_ID);
header.setString(FixTags.TargetSubID, TARGET_SUB_ID);
header.setString(FixTags.SenderLocationID, SENDER_LOCATION_ID);
msg.setString(FixTags.Account, ACCOUNT);
msg.setInt(FixTags.ClOrdID, ORDER_ID);
msg.setChar(FixTags.HandlInst, quickfix.field.HandlInst.AUTOMATED_EXECUTION_ORDER_PRIVATE);
msg.setInt(FixTags.OrderQty, QUANTITY);
msg.setChar(FixTags.OrdType, quickfix.field.OrdType.LIMIT);
msg.setDouble(FixTags.Price, PRICE);
msg.setChar(FixTags.Side, quickfix.field.Side.BUY);
msg.setString(FixTags.Symbol, SYMBOL);
msg.setString(FixTags.SecurityDesc, SECURITY_DESCRIPTION);
msg.setString(FixTags.SecurityType, SecurityType.OPTION.getCode());
msg.setString(FixTags.Text, TEXT);
msg.setChar(FixTags.TimeInForce, quickfix.field.TimeInForce.DAY);
msg.setUtcTimeStamp(FixTags.TransactTime, new Date(System.currentTimeMillis()), true);
return msg.toString();
}
private static void encode(MessageBuilder mb, RawMessageAssembler asm, SessionID sessionID, OutputChannel out) throws IOException {
mb.clear();
mb.setMessageType(MsgType.ORDER_SINGLE);
mb.add(FixTags.SenderLocationID, SENDER_LOCATION_ID);
mb.add(FixTags.Account, ACCOUNT);
mb.add(FixTags.ClOrdID, ORDER_ID);
mb.add(FixTags.HandlInst, HandlInst.AUTOMATED_EXECUTION_ORDER_PRIVATE);
mb.add(FixTags.OrderQty, QUANTITY);
mb.add(FixTags.OrdType, OrdType.LIMIT);
mb.add(FixTags.Price, PRICE);
mb.add(FixTags.Side, Side.BUY);
mb.add(FixTags.Symbol, SYMBOL);
mb.add(FixTags.Text, TEXT);
mb.add(FixTags.TimeInForce, TimeInForce.DAY);
mb.addUTCTimestamp(FixTags.TransactTime, System.currentTimeMillis());
mb.add(FixTags.SecurityDesc, SECURITY_DESCRIPTION);
mb.add(FixTags.SecurityType, SecurityType.OPTION);
asm.send(sessionID, MSG_SEQ_NUM, mb, null, RealTimeSource.INSTANCE.currentTimeMillis(), out);
}
private static class NullOutputChannel implements OutputChannel {
private int something;
@Override
public void write(byte[] buffer, int offset, int length) throws IOException {
this.something += length + offset + buffer.length; // just to trick optimizer
}
@Override
public void close() throws IOException {
}
@Override
public String toString() {
return "Something:" + something;
}
}
public static void main(String[] args) throws Exception {
Test_EncodingNewOrderSingle test = new Test_EncodingNewOrderSingle();
while (true) {
test.testF1XEncoding();
test.testQuickFIXJEncoding();
}
}
}