Introducing State

We extend the basic model by introducing state. The model is a state transition system where incoming events can update internal state.

State initialization

internal state {
  Side : Side
  Price :? Price
  live_order : bool = false;
}

Assignment to and from state

receive (msg:NewOrderSingle){
  state.live_order = true
  state.Side = msg.Side
  state.Price = msg.Price
 
  send ExecutionReport {
    OrderID = msg.ClOrdID;
    ExecID = "";
    ExecType = ExecType.New;
    OrdStatus = OrdStatus.New;
    Side = state.Side;
    LeavesQty = 0.0;
    CumQty = 0.0;
    OrderQtyData.OrderQty = msg.OrderQtyData.OrderQty;
  }
}

Automatic assignment using assignable

internal state {
  assignable{
    Side                  :  Side
    Price                 :? Price
    OrderQtyData.OrderQty :  Qty
    OrdType               :  OrdType
    OrdStatus             :  OrdStatus = OrdStatus.PendingNew;
    ExecType              :  ExecType  = ExecType.PendingNew;
    LeavesQty             :  Qty
    CumQty                :  Qty
    OrderID               :  string
  }
  live_order : bool = false;
  AvgPx : float
  bestBid : float
  bestAsk : float
}
receive (msg:NewOrderSingle){
  state.live_order = true
  state.LeavesQty = msg.OrderQtyData.OrderQty
  state.OrderID = fresh()
  state.OrdStatus = OrdStatus.New
  assignFrom(msg,state)
  send ExecutionReport {
    state with
    ExecID = fresh();
    ExecType = ExecType.New;
  }
}

Related: State and Advanced Features.