Flows › DomEngine efae447a1

Story:rebalance 5 expects pass

· 6 ms · specs: Spec:rebalance

Open in fiddleStory topicJSON
Expects
✓14payload.total > 24000.0
✓15sizeOf(payload.sells) is 1
✓16"GLDX" in payload.holds
✓17(payload.buys filter (b => b.trimmed ?? false)) is not empty
✓18payload.cashLeft >= 1500.0
Resulting value (payload)
{
  "total": 28320,
  "sells": [
    {
      "ticker": "FRST",
      "action": "sell",
      "shares": 1302,
      "amount": 2734.2000000000003
    }
  ],
  "buys": [
    {
      "ticker": "NRTH",
      "action": "buy",
      "shares": 74,
      "amount": 1369,
      "price": 18.5,
      "trimmed": true
    },
    {
      "ticker": "URNM",
      "action": "buy",
      "shares": 3,
      "amount": 14.399999999999999,
      "price": 4.8,
      "trimmed": true
    }
  ],
  "holds": [
    "CPHD",
    "GLDX"
  ],
  "cashLeft": 1500.8000000000002
}
Flow values (ctx)
{
  "positions": [
    {
      "ticker": "FRST",
      "shares": 4000,
      "price": 2.1,
      "target": 0.2
    },
    {
      "ticker": "CPHD",
      "shares": 1500,
      "price": 3.4,
      "target": 0.2
    },
    {
      "ticker": "NRTH",
      "shares": 300,
      "price": 18.5,
      "target": 0.25
    },
    {
      "ticker": "GLDX",
      "shares": 520,
      "price": 12,
      "target": 0.2
    },
    {
      "ticker": "URNM",
      "shares": 600,
      "price": 4.8,
      "target": 0.15
    }
  ],
  "cash": 0.8000000000002743
}
Trace
valpositions = [{ticker: "FRST", shares: 4000.0, price: 2.1, target: 0.2}, {ticker: "CPHD", shares: 1500.0, price: 3.4, target: 0.2}, {ticker: "NRTH", shares: 300.0, price: 18.5, target: 0.25}, {ticker: "GLDX", shar…line 5
msgpf.rebalance(positions=[{ticker: "FRST", shares: 4000.0, price: 2.1, target: 0.2}, {ticker: "CPHD", shares: 1500.0, price: 3.4, target: 0.2}, {ticker: "NRTH", shares: 300.0, price: 18.5, target: 0.25}, {ticker: "GLDX", shar…, cash=150.0, reserve=1500.0)line 13
rulerule pf.rebalance (line 51)line 51
msgpf.value(positions=[{ticker: "FRST", shares: 4000.0, price: 2.1, target: 0.2}, {ticker: "CPHD", shares: 1500.0, price: 3.4, target: 0.2}, {ticker: "NRTH", shares: 300.0, price: 18.5, target: 0.25}, {ticker: "GLDX", shar…, cash=150.0)line 52
rulerule pf.value (line 7)line 7
valtotal = 28320.0line 8
valpayload = [{ticker: "FRST", shares: 4000.0, price: 2.1, target: 0.2, value: 8400.0, weight: 0.2966101694915254}, {ticker: "CPHD", shares: 1500.0, price: 3.4, target: 0.2, value: 5100.0, weight: 0.18008474576271…line 9
valvalued = [{ticker: "FRST", shares: 4000.0, price: 2.1, target: 0.2, value: 8400.0, weight: 0.2966101694915254}, {ticker: "CPHD", shares: 1500.0, price: 3.4, target: 0.2, value: 5100.0, weight: 0.18008474576271…line 52
valtotal = 28320.0line 53
msgpf.decide(p={ticker: "FRST", shares: 4000.0, price: 2.1, target: 0.2, value: 8400.0, weight: 0.2966101694915254}, total=28320.0)line 54
rulerule pf.decide (line 14)line 14
valn = 1302line 15
valpayload = {ticker: "FRST", action: "sell", shares: 1302, amount: 2734.2000000000003}line 16
msgpf.decide(p={ticker: "CPHD", shares: 1500.0, price: 3.4, target: 0.2, value: 5100.0, weight: 0.18008474576271186}, total=28320.0)line 54
rulerule pf.decide (line 24)line 24
valpayload = {ticker: "CPHD", action: "hold", shares: 0, amount: 0.0}line 25
msgpf.decide(p={ticker: "NRTH", shares: 300.0, price: 18.5, target: 0.25, value: 5550.0, weight: 0.19597457627118645}, total=28320.0)line 54
rulerule pf.decide (line 19)line 19
valn = 82line 20
valpayload = {ticker: "NRTH", action: "buy", shares: 82, amount: 1517.0, price: 18.5}line 21
msgpf.decide(p={ticker: "GLDX", shares: 520.0, price: 12.0, target: 0.2, value: 6240.0, weight: 0.22033898305084745}, total=28320.0)line 54
rulerule pf.decide (line 24)line 24
valpayload = {ticker: "GLDX", action: "hold", shares: 0, amount: 0.0}line 25
msgpf.decide(p={ticker: "URNM", shares: 600.0, price: 4.8, target: 0.15, value: 2880.0, weight: 0.1016949152542373}, total=28320.0)line 54
rulerule pf.decide (line 19)line 19
valn = 284line 20
valpayload = {ticker: "URNM", action: "buy", shares: 284, amount: 1363.2, price: 4.8}line 21
valtrades = [{ticker: "FRST", action: "sell", shares: 1302, amount: 2734.2000000000003}, {ticker: "CPHD", action: "hold", shares: 0, amount: 0.0}, {ticker: "NRTH", action: "buy", shares: 82, amount: 1517.0, price…line 54
valsells = [{ticker: "FRST", action: "sell", shares: 1302, amount: 2734.2000000000003}]line 55
valctx.cash = 1384.2000000000003line 56
msgpf.pay(trade={ticker: "NRTH", action: "buy", shares: 82, amount: 1517.0, price: 18.5})line 57
rulerule pf.pay (line 61)line 61
msgpf.fund(trade={ticker: "NRTH", action: "buy", shares: 82, amount: 1517.0, price: 18.5}, cash=1384.2000000000003)line 63
rulerule pf.fund (line 38)line 38
valn = 74line 39
valpayload = {ticker: "NRTH", action: "buy", shares: 74, amount: 1369.0, price: 18.5, trimmed: true}line 40
valt = {ticker: "NRTH", action: "buy", shares: 74, amount: 1369.0, price: 18.5, trimmed: true}line 63
valctx.cash = 15.200000000000273line 64
valpayload = {ticker: "NRTH", action: "buy", shares: 74, amount: 1369.0, price: 18.5, trimmed: true}line 65
msgpf.pay(trade={ticker: "URNM", action: "buy", shares: 284, amount: 1363.2, price: 4.8})line 57
rulerule pf.pay (line 61)line 61
msgpf.fund(trade={ticker: "URNM", action: "buy", shares: 284, amount: 1363.2, price: 4.8}, cash=15.200000000000273)line 63
rulerule pf.fund (line 38)line 38
valn = 3line 39
valpayload = {ticker: "URNM", action: "buy", shares: 3, amount: 14.399999999999999, price: 4.8, trimmed: true}line 40
valt = {ticker: "URNM", action: "buy", shares: 3, amount: 14.399999999999999, price: 4.8, trimmed: true}line 63
valctx.cash = 0.8000000000002743line 64
valpayload = {ticker: "URNM", action: "buy", shares: 3, amount: 14.399999999999999, price: 4.8, trimmed: true}line 65
valbuys = [{ticker: "NRTH", action: "buy", shares: 74, amount: 1369.0, price: 18.5, trimmed: true}, {ticker: "URNM", action: "buy", shares: 3, amount: 14.399999999999999, price: 4.8, trimmed: true}]line 57
valpayload = {total: 28320.0, sells: [{ticker: "FRST", action: "sell", shares: 1302, amount: 2734.2000000000003}], buys: [{ticker: "NRTH", action: "buy", shares: 74, amount: 1369.0, price: 18.5, trimmed: true}, {t…line 58
expectpayload.total > 24000.0 ✓line 14
expectsizeOf(payload.sells) is 1 ✓line 15
expect"GLDX" in payload.holds ✓line 16
expect(payload.buys filter (b => b.trimmed ?? false)) is not empty ✓line 17
expectpayload.cashLeft >= 1500.0 ✓line 18
Story syntax tree
$val positions = [
{
  "src": "$val positions = [",
  "k": "step",
  "stmt": {
    "k": "assign",
    "sets": [
      {
        "name": "positions",
        "e": {
          "k": "arr",
          "items": [
            {
              "k": "obj",
              "fields": [
                {
                  "key": "ticker",
                  "e": {
                    "k": "str",
                    "parts": [
                      "FRST"
                    ]
                  }
                },
                {
                  "key": "shares",
                  "e": {
                    "k": "lit",
                    "v": 4000
                  }
                },
                {
                  "key": "price",
                  "e": {
                    "k": "lit",
                    "v": 2.1
                  }
                },
                {
                  "key": "target",
                  "e": {
                    "k": "lit",
                    "v": 0.2
                  }
                }
              ]
            },
            {
              "k": "obj",
              "fields": [
                {
                  "key": "ticker",
                  "e": {
                    "k": "str",
                    "parts": [
                      "CPHD"
                    ]
                  }
                },
                {
                  "key": "shares",
                  "e": {
                    "k": "lit",
                    "v": 1500
                  }
                },
                {
                  "key": "price",
                  "e": {
                    "k": "lit",
                    "v": 3.4
                  }
                },
                {
                  "key": "target",
                  "e": {
                    "k": "lit",
                    "v": 0.2
                  }
                }
              ]
            },
            {
              "k": "obj",
              "fields": [
                {
                  "key": "ticker",
                  "e": {
                    "k": "str",
                    "parts": [
                      "NRTH"
                    ]
                  }
                },
                {
                  "key": "shares",
                  "e": {
                    "k": "lit",
                    "v": 300
                  }
                },
                {
                  "key": "price",
                  "e": {
                    "k": "lit",
                    "v": 18.5
                  }
                },
                {
                  "key": "target",
                  "e": {
                    "k": "lit",
                    "v": 0.25
                  }
                }
              ]
            },
            {
              "k": "obj",
              "fields": [
                {
                  "key": "ticker",
                  "e": {
                    "k": "str",
                    "parts": [
                      "GLDX"
                    ]
                  }
                },
                {
                  "key": "shares",
                  "e": {
                    "k": "lit",
                    "v": 520
                  }
                },
                {
                  "key": "price",
                  "e": {
                    "k": "lit",
                    "v": 12
                  }
                },
                {
                  "key": "target",
                  "e": {
                    "k": "lit",
                    "v": 0.2
                  }
                }
              ]
            },
            {
              "k": "obj",
              "fields": [
                {
                  "key": "ticker",
                  "e": {
                    "k": "str",
                    "parts": [
                      "URNM"
                    ]
                  }
                },
                {
                  "key": "shares",
                  "e": {
                    "k": "lit",
                    "v": 600
                  }
                },
                {
                  "key": "price",
                  "e": {
                    "k": "lit",
                    "v": 4.8
                  }
                },
                {
                  "key": "target",
                  "e": {
                    "k": "lit",
                    "v": 0.15
                  }
                }
              ]
            }
          ]
        }
      }
    ]
  }
}
$send pf.rebalance (positions = positions, cash = 150.0, reserve = 1500.0)
{
  "src": "$send pf.rebalance (positions = positions, cash = 150.0, reserve = 1500.0)",
  "k": "step",
  "stmt": {
    "k": "send",
    "msg": "pf.rebalance",
    "args": [
      {
        "name": "positions",
        "e": {
          "k": "ref",
          "name": "positions"
        }
      },
      {
        "name": "cash",
        "e": {
          "k": "lit",
          "v": 150
        }
      },
      {
        "name": "reserve",
        "e": {
          "k": "lit",
          "v": 1500
        }
      }
    ]
  }
}
payload.total > 24000.0
{
  "src": "payload.total > 24000.0",
  "k": "expect",
  "cond": {
    "k": "bin",
    "op": ">",
    "l": {
      "k": "member",
      "obj": {
        "k": "ref",
        "name": "payload"
      },
      "name": "total",
      "safe": false
    },
    "r": {
      "k": "lit",
      "v": 24000
    }
  }
}
sizeOf(payload.sells) is 1
{
  "src": "sizeOf(payload.sells) is 1",
  "k": "expect",
  "cond": {
    "k": "bin",
    "op": "==",
    "l": {
      "k": "call",
      "tool": "sizeOf",
      "args": [
        {
          "e": {
            "k": "member",
            "obj": {
              "k": "ref",
              "name": "payload"
            },
            "name": "sells",
            "safe": false
          }
        }
      ]
    },
    "r": {
      "k": "lit",
      "v": 1
    }
  }
}
"GLDX" in payload.holds
{
  "src": "\"GLDX\" in payload.holds",
  "k": "expect",
  "cond": {
    "k": "bin",
    "op": "in",
    "l": {
      "k": "str",
      "parts": [
        "GLDX"
      ]
    },
    "r": {
      "k": "member",
      "obj": {
        "k": "ref",
        "name": "payload"
      },
      "name": "holds",
      "safe": false
    }
  }
}
(payload.buys filter (b => b.trimmed ?? false)) is not empty
{
  "src": "(payload.buys filter (b => b.trimmed ?? false)) is not empty",
  "k": "expect",
  "cond": {
    "k": "is",
    "neg": true,
    "test": "empty",
    "e": {
      "k": "coll",
      "op": "filter",
      "e": {
        "k": "member",
        "obj": {
          "k": "ref",
          "name": "payload"
        },
        "name": "buys",
        "safe": false
      },
      "fn": {
        "param": "b",
        "body": {
          "k": "bin",
          "op": "??",
          "l": {
            "k": "member",
            "obj": {
              "k": "ref",
              "name": "b"
            },
            "name": "trimmed",
            "safe": false
          },
          "r": {
            "k": "lit",
            "v": false
          }
        }
      }
    }
  }
}
payload.cashLeft >= 1500.0
{
  "src": "payload.cashLeft >= 1500.0",
  "k": "expect",
  "cond": {
    "k": "bin",
    "op": ">=",
    "l": {
      "k": "member",
      "obj": {
        "k": "ref",
        "name": "payload"
      },
      "name": "cashLeft",
      "safe": false
    },
    "r": {
      "k": "lit",
      "v": 1500
    }
  }
}