-
Notifications
You must be signed in to change notification settings - Fork 1
/
sentFieldsRecordComplete.ipl
98 lines (79 loc) · 2.34 KB
/
sentFieldsRecordComplete.ipl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//
// Imandra Inc.
// Copyright (c) 2024
//
// Minimal FIX 4.4 model with setting sent fields
// using an internal record (successfully)
//
// For further info see https://docs.imandra.ai
//
//
import FIX_4_4
// Import inbound NewOrderSingle message
message NewOrderSingle {
req ClOrdID
req Side
req TransactTime
req OrdType valid when it in [ OrdType.Limit, OrdType.Market ]
req OrderQtyData.OrderQty
opt Price
validate { state.live_order == false }
validate { state.OrdStatus in [ OrdStatus.New ]}
}
// Import an outbound message ExecutionReport
outbound message ExecutionReport {
req OrderID
req ExecID
req ExecType
req OrdStatus
req Side
req LeavesQty
req CumQty
req AvgPx
opt OrderQtyData.OrderQty
}
// Define the interface state
internal state {
// The following fields would be assigned to
assignable {
OrdStatus : OrdStatus = OrdStatus.New;
Side : Side = Side.Buy;
OrderID : string = "";
LeavesQty : Qty = 0.0;
CumQty : Qty = 0.0;
AvgPx : Price = 0.0;
Price :? Price = None;
OrdType : OrdType = OrdType.Limit;
}
live_order : bool = false;
// These are not required within the orders, etc...
OrdQty : Qty = 0.0;
filledQty : Qty = 0.0;
current_time : UTCTimeOnly = UTCTimeOnly (8, 0, 0, None);
// Define the opening and closing times
opening_time : UTCTimeOnly = UTCTimeOnly (8, 0, 0, None);
closing_time : UTCTimeOnly = UTCTimeOnly (16, 0, 0, None);
//internal records
OrderQtyData : OrderQtyData = {
CashOrderQty = None;
OrderPercent = None;
RoundingDirection = None;
RoundingModulus = None;
OrderQty = Some 0.0;
};
}
// Define how the model should process a validated
// incoming NewOrderSingle message
receive ( msg : NewOrderSingle ) {
// Extract all relevant fields from within the message
assignFrom (msg, state)
state.live_order = true
send ExecutionReport {
state with
ExecID = "";
ExecType = ExecType.New;
// assignment to an entire record which is allowed
// in this case optionality matches so we can assign
OrderQtyData.OrderQty = state.OrderQtyData.OrderQty;
}
}