-
Notifications
You must be signed in to change notification settings - Fork 1
/
importedOptionalField.ipl
74 lines (62 loc) · 1.89 KB
/
importedOptionalField.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
//
// Imandra Inc.
// Copyright (c) 2024
//
// Minimal FIX 4.4 model with example optional treatment
// of imported optional value
//
// 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
req Price
// an example of how to reason about incoming optional values using a case statement
opt Account valid when present(it) valid when (case(it){None:""}{Some x: x}) == "acct_01"
opt AccountType valid when it == (Some AccountType.CarriedCustomerSide) && state.CumQty == 0.0
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 Price
opt DayAvgPx
}
// 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 = 0.0;
OrdType : OrdType = OrdType.Limit;
DayAvgPx :? Price
}
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);
temp_Price : Price = 0.0;
// Define the opening and closing times
opening_time : UTCTimeOnly = UTCTimeOnly (8, 0, 0, None);
closing_time : UTCTimeOnly = UTCTimeOnly (16, 0, 0, None);
}