2 unstable releases

0.1.0 Aug 26, 2023
0.0.1 Jun 15, 2023

#2897 in Magic Beans

37 downloads per month

Apache-2.0

130KB
1K SLoC

oscillatorsetups

Financial Technical Analysis Library

oscillatorsetups is a Rust-based financial technical analysis library designed to determine the most profitable configurations for various technical oscillators.
It offers capabilities for a wide range of financial data, making it suitable for stocks, commodities, forex, and cryptocurrencies.

Main Modules::

  • Oscillators: Perform technical analysis computations on trading data.
  • Profit and Loss Simulation: Analyze potential profits and losses across various oscillator configurations.
  • Data Fetching: Although not its primary focus, the library can fetch trading data from cryptocurrency exchanges as a supplementary tool to assist in oscillator analysis.

The choice of cryptocurrency OHLCV candlestick data was chosen due to its accessibility and cost-free API options, facilitating efficient testing and development.
However, any other stock index, commodities, forex data can also be used for analysis.

Current Analysis Capabilities:

  • Stochastic Analysis: The library currently supports stochastic oscillator analysis for financial data.
  • In Development: Analysis for other technical indicators such as MACD, RSI, and more are currently under development and will be introduced in upcoming versions.

Installation

To include oscillatorsetups in your project, add the following to your Cargo.toml:

[dependencies]
oscillatorsetups = "0.1.0"

Usage

Analyzing Oscillator Configurations:

Here's how you can utilize the library to determine profitable Stochastic Oscillator configurations.

use oscillatorsetups::exchange::chart_data::klines::{Intervals, KlineParams};
use oscillatorsetups::pnl_simulator::stochastic::{PnlParams, Stochastic};

fn main() {
    let stochastic = match Stochastic::new(
        "binance",  // or "coinbase"
        KlineParams {
            base_asset  : "ETH",
            quote_asset : "USDT",
            interval    : Intervals::H4, // Refer to exchange api for correct intervals set values
            limit       : 1000,
            base_url    : None, // Defaults: binance is https://api.binance.us or coinbase is "https://api.exchange.coinbase.com"
            source      : Some("api"),
        }) {
        Ok(s) => s
            .exchange_fee(0.00075)  // Default None
            .min_qty(0.0001)        // Default None
            .min_price(0.01),       // Default None
        Err(e) => {
            eprintln!("Failed to create Stochastic: {}", e);
            return;
        }
    };
    stochastic.top_net_profit(PnlRange { k_length:5..=42, k_smoothing:3..=42, d_length:3..=42, });
    
    /* At the time of analyzing, above results were:
    Net profit: 416.82, Parameters: PnlParams { k_length:  7, k_smoothing: 41, d_length: 24 }
    Net profit: 418.47, Parameters: PnlParams { k_length: 11, k_smoothing: 40, d_length: 17 }
    Net profit: 424.65, Parameters: PnlParams { k_length:  8, k_smoothing: 41, d_length: 21 }
    Net profit: 426.67, Parameters: PnlParams { k_length:  8, k_smoothing: 41, d_length: 24 }
    Net profit: 427.69, Parameters: PnlParams { k_length: 23, k_smoothing: 8, d_length: 41 }
    Net profit: 435.26, Parameters: PnlParams { k_length:  8, k_smoothing: 40, d_length: 16 }
    Net profit: 437.07, Parameters: PnlParams { k_length:  6, k_smoothing: 42, d_length: 15 }
    Net profit: 440.80, Parameters: PnlParams { k_length:  8, k_smoothing: 41, d_length: 23 }
    Net profit: 444.60, Parameters: PnlParams { k_length:  8, k_smoothing: 40, d_length: 24 }
    Net profit: 456.35, Parameters: PnlParams { k_length: 42, k_smoothing: 3, d_length: 4 }
    */
    
    // Further to get full breakdown of most profitable configurations
    let pnl = stochastic.pnl(PnlParams { k_length: 42, k_smoothing: 3, d_length: 4, });
    println!("{:#?}",pnl);
    
    /* Prints 
    PnL { 
        net_profit: 456.35, 
        gross_profit: 1143.09, 
        gross_loss: -686.74, 
        buy_and_hold_return: 102.81, 
        profit_factor: 1.665, 
        commission_paid: Some(191.792,), 
        total_closed_trades: 94, 
        num_winning_trades: 36, 
        num_losing_trades: 58, 
        percent_profitable: 38.3, 
        avg_winning_trade: 31.75, 
        avg_losing_trade: -11.84, 
        ratio_avg_win_loss: 2.682, 
        largest_winning_trade: 130.9, 
        largest_losing_trade: -39.92, 
        avg_ticks_in_winning_trades: 7.36, 
        avg_ticks_in_losing_trades: 3.65, 
    } 
    */
}

Exchange fees info

Each exchange has its fee structure, and the fee calculations can be different based on factors such as trading volume, order types, membership levels, and the use of native exchange tokens.

As an example coinbase fee tiers typically start at 0.50% for Taker and 0.50% for Maker and can be reduced to as low as 0.04% for Taker and 0.00% for Maker for high-volume traders.
Hypothetically, if you were to purchase an asset worth $1000 on Coinbase Pro and the trading fee is 0.50%, you can calculate the fee as follows:\

Coinbase

The fee percentage will be in decimal form 0.50% = 0.005 (because 0.50 ÷ 100 = 0.005)
Fee = $1000 (asset value) x 0.005 (fee percentage in decimal form) = $5.00

Binance

Standard Fee = $1000 (asset value) x 0.001 (standard fee percentage in decimal form)
Standard Fee = $1
BNB Discount Fee at 25% = $0.75
NOTE: as of this post, Binance offers 0% on Tier 0 pairs Fees - Binance US Bitcoin and Ethereum trading in the U.S

Testing

To run the tests for the library, use the command cargo test.

Common Issues and Solutions

  1. Failed to create Stochastic: error decoding response body: invalid type: map, expected a sequence at line 1 column 0
    Ensure that the exchange you are querying supports the specified interval. Check and modify the interval in the following configuration
KlineParams {
    base_asset  : "ETH",
    quote_asset : "USDT",
    interval    : Intervals::M15, // Refer to the exchange API for the correct set of interval values.
    limit       : 1000,
    base_url    : None, // Defaults: Binance is "https://api.binance.us" and Coinbase is "https://api.exchange.coinbase.com"
    source      : Some("api"),
}

Contributing

Your contributions are welcome and appreciated!

  1. Fork the repository.
  2. Create your feature branch (git checkout -b feature/YourFeatureName).
  3. Commit your changes (git commit -am 'Add some feature').
  4. Push to the branch (git push origin feature/YourFeatureName).
  5. Open a pull request.

For significant changes, it's recommended to open an issue first to discuss the proposed modifications.

Disclaimer:

This library offers tools for technical analysis based on historical market data. Please understand its limitations:

  • Past vs. Future: Analysis results are based on historical data, which doesn't guarantee future outcomes.
  • No Predictive Guarantees: While grounded in established financial theories, the library doesn't guarantee market predictions.
  • Diversify Strategies: Do not rely solely on this tool. It's wise to merge its outputs with other strategies and insights.
  • Invest Responsibly: Especially if new to trading or technical analysis, start with smaller investments to grasp market dynamics.

Your trading and investment decisions should always be backed by comprehensive research. When in doubt, seek advice from financial experts.

License

This project is licensed under the Apache License 2.0 License. See the LICENSE file for more information.

Dependencies

~10–25MB
~367K SLoC