shape-runtime 0.3.2

Bytecode compiler, builtins, and runtime infrastructure for Shape
Documentation
/// @module std::finance::signals
/// Finance Trading Signals
///
/// Finance-specific signal definitions for trading strategies.
/// Uses the core signal module for domain-agnostic signal handling.

// Import core signal functionality
// (Note: imports will be resolved by the stdlib loader)

// ===== Long Entry/Exit Signals =====

/// Signal to enter a long position (buy)
pub fn buy(magnitude = 1.0, metadata = {}) {
    signal("buy", magnitude, metadata, {})
}

/// Signal to enter a long position (alias for buy)
pub fn long(magnitude = 1.0, metadata = {}) {
    signal("long", magnitude, metadata, {})
}

/// Signal to exit a long position
pub fn sell(magnitude = 1.0, metadata = {}) {
    signal("sell", magnitude, metadata, {})
}

/// Signal to exit a long position (alias for sell)
pub fn exit_long(magnitude = 1.0, metadata = {}) {
    signal("exit_long", magnitude, metadata, {})
}

// ===== Short Entry/Exit Signals =====

/// Signal to enter a short position
pub fn short(magnitude = 1.0, metadata = {}) {
    signal("short", magnitude, metadata, {})
}

/// Signal to exit a short position (cover)
pub fn cover(magnitude = 1.0, metadata = {}) {
    signal("cover", magnitude, metadata, {})
}

/// Signal to exit a short position (alias for cover)
pub fn exit_short(magnitude = 1.0, metadata = {}) {
    signal("exit_short", magnitude, metadata, {})
}

// ===== Position Management Signals =====

/// Signal to close all positions and go flat
pub fn flat() {
    signal("flat", 1.0, {}, {})
}

/// Signal to close all positions (alias for flat)
pub fn close_all() {
    signal("close_all", 1.0, {}, {})
}

/// Signal to do nothing (hold current position)
pub fn hold() {
    signal_none()
}

// ===== Signals with Risk Management =====

/// Buy signal with stop loss and optional take profit
pub fn buy_with_stop(stop_loss, take_profit = None, magnitude = 1.0) {
    signal_with_targets("buy", stop_loss, take_profit, magnitude)
}

/// Sell signal with stop loss and optional take profit
pub fn sell_with_stop(stop_loss, take_profit = None, magnitude = 1.0) {
    signal_with_targets("sell", stop_loss, take_profit, magnitude)
}

/// Short signal with stop loss and optional take profit
pub fn short_with_stop(stop_loss, take_profit = None, magnitude = 1.0) {
    signal_with_targets("short", stop_loss, take_profit, magnitude)
}

// ===== Signal with Sizing =====

/// Buy signal with position sizing hint
pub fn buy_sized(size_percent, magnitude = 1.0) {
    signal("buy", magnitude, { size_percent: size_percent }, {})
}

/// Short signal with position sizing hint
pub fn short_sized(size_percent, magnitude = 1.0) {
    signal("short", magnitude, { size_percent: size_percent }, {})
}

// ===== Signal Classification =====

/// Check if signal is a buy/long entry
pub fn is_buy(sig) {
    if !is_signal(sig) {
        return false;
    }
    let action = sig.action;
    action == "buy" || action == "long"
}

/// Check if signal is a sell/exit_long
pub fn is_sell(sig) {
    if !is_signal(sig) {
        return false;
    }
    let action = sig.action;
    action == "sell" || action == "exit_long"
}

/// Check if signal is a short entry
pub fn is_short(sig) {
    if !is_signal(sig) {
        return false;
    }
    sig.action == "short"
}

/// Check if signal is a cover/exit_short
pub fn is_cover(sig) {
    if !is_signal(sig) {
        return false;
    }
    let action = sig.action;
    action == "cover" || action == "exit_short"
}

/// Check if signal is a flat/close_all
pub fn is_flat(sig) {
    if !is_signal(sig) {
        return false;
    }
    let action = sig.action;
    action == "flat" || action == "close_all"
}

/// Check if signal is an entry signal (buy, long, or short)
pub fn is_entry(sig) {
    is_buy(sig) || is_short(sig)
}

/// Check if signal is an exit signal (sell, cover, flat)
pub fn is_exit(sig) {
    is_sell(sig) || is_cover(sig) || is_flat(sig)
}