File fint-bot.spec of Package fint-bot

# Package specification for fint-bot for SUSE Tumbleweed
# Author: Shubin Alexander Stanislavovich
# Email: renard.corp@hotmail.com
#

Name:           fint-bot
Version:        1.0.2
Release:        1
Summary:        Advanced Trading Robot for Tinkoff Invest API with Configuration Management
License:        Proprietary license. See LICENSE file
Group:          Productivity/Financial
URL:            https://github.com/your-repository/fint-bot
Source0:        LICENSE
Source1:        config.json
Source2:        config_manager.py
Source3:        config_tool.py
Source4:        MAEStrategy.py
Source5:        main.py
Source6:        main_stats.py
Source7:        modules.md
Source8:        money.py
Source9:        README.md
Source10:       robot.py
Source11:       statistics.py
Source12:       strategy.py
Source13:       vizualization.py
Source14:       safety_check.py
Source15:       start_robot.py

BuildRequires:  python3-devel
BuildRequires:  gcc-c++
Requires:       python3 >= 3.9
Requires:       python3-matplotlib
Requires:       python3-pandas
Requires:       python3-numpy
Requires:       python3-dataclasses
Recommends:     python3-qt6
Recommends:     python3-qt5
Recommends:     python3-tk

%description
Fint-bot is an advanced trading robot for algorithmic trading on the Tinkoff 
Investments exchange via the Tinkoff Invest API. It features comprehensive
configuration management, risk control, and advanced trading strategies.

Main features:
* Advanced configuration management with JSON config files
* Interactive configuration wizard
* Moving Average Envelope (MAE) strategy with risk management
* Position sizing based on risk percentage
* Stop-loss, take-profit, and trailing stop functionality
* Daily loss limits and consecutive loss protection
* Backtesting on historical data
* Real-time visualization with multiple backend support
* Detailed statistics and reporting
* Both sandbox and live trading modes

%prep
# Create build directory
mkdir -p %{_builddir}/%{name}-%{version}
cd %{_builddir}/%{name}-%{version}

# Copy all source files to build directory
cp -p %{SOURCE0} .
cp -p %{SOURCE1} .
cp -p %{SOURCE2} .
cp -p %{SOURCE3} .
cp -p %{SOURCE4} .
cp -p %{SOURCE5} .
cp -p %{SOURCE6} .
cp -p %{SOURCE7} .
cp -p %{SOURCE8} .
cp -p %{SOURCE9} .
cp -p %{SOURCE10} .
cp -p %{SOURCE11} .
cp -p %{SOURCE12} .
cp -p %{SOURCE13} .
cp -p %{SOURCE14} .
cp -p %{SOURCE15} .

%build
# Nothing to build for Python scripts

%install
cd %{_builddir}/%{name}-%{version}

# Create directory structure
install -d %{buildroot}%{_bindir}
install -d %{buildroot}%{_libdir}/python3.13/site-packages/robotlib
install -d %{buildroot}%{_datadir}/doc/packages/%{name}
install -d %{buildroot}%{_datadir}/licenses/%{name}
install -d %{buildroot}%{_sysconfdir}/%{name}

# Install executable files
install -m 0755 main.py %{buildroot}%{_bindir}/fint-bot
install -m 0755 main_stats.py %{buildroot}%{_bindir}/fint-bot-stats
install -m 0755 config_tool.py %{buildroot}%{_bindir}/fint-bot-config
install -m 0755 safety_check.py %{buildroot}%{_bindir}/fint-bot-safety
install -m 0755 start_robot.py %{buildroot}%{_bindir}/fint-bot-start

# Install robotlib library
install -m 0644 robot.py %{buildroot}%{_libdir}/python3.13/site-packages/robotlib/
install -m 0644 strategy.py %{buildroot}%{_libdir}/python3.13/site-packages/robotlib/
install -m 0644 statistics.py %{buildroot}%{_libdir}/python3.13/site-packages/robotlib/
install -m 0644 money.py %{buildroot}%{_libdir}/python3.13/site-packages/robotlib/
install -m 0644 vizualization.py %{buildroot}%{_libdir}/python3.13/site-packages/robotlib/
install -m 0644 config_manager.py %{buildroot}%{_libdir}/python3.13/site-packages/robotlib/
install -m 0644 MAEStrategy.py %{buildroot}%{_libdir}/python3.13/site-packages/robotlib/
install -m 0644 safety_check.py %{buildroot}%{_libdir}/python3.13/site-packages/robotlib/

# Install default configuration
install -m 0644 config.json %{buildroot}%{_sysconfdir}/%{name}/config.json.default

# Install documentation
install -m 0644 LICENSE %{buildroot}%{_datadir}/licenses/%{name}/
install -m 0644 README.md %{buildroot}%{_datadir}/doc/packages/%{name}/
install -m 0644 modules.md %{buildroot}%{_datadir}/doc/packages/%{name}/

# Create init file for robotlib package
cat > %{buildroot}%{_libdir}/python3.13/site-packages/robotlib/__init__.py << 'EOF'
"""
robotlib - Trading robot library for Tinkoff Invest API
"""

__version__ = '%{version}'
__author__ = 'Shubin Alexander Stanislavovich'
__email__ = 'renard.corp@hotmail.com'

from .robot import TradingRobot, TradingRobotFactory
from .strategy import TradeStrategyBase, TradeStrategyParams, RobotTradeOrder, StrategyDecision
from .statistics import TradeStatisticsAnalyzer, BalanceProcessor, BalanceCalculator
from .money import Money
from .vizualization import Visualizer
from .config_manager import ConfigManager, AppConfig, TradingConfig, StrategyConfig, \
    BacktestConfig, VisualizationConfig, LoggingConfig

__all__ = [
    'TradingRobot',
    'TradingRobotFactory',
    'TradeStrategyBase',
    'TradeStrategyParams',
    'RobotTradeOrder',
    'StrategyDecision',
    'TradeStatisticsAnalyzer',
    'BalanceProcessor',
    'BalanceCalculator',
    'Money',
    'Visualizer',
    'ConfigManager',
    'AppConfig',
    'TradingConfig',
    'StrategyConfig',
    'BacktestConfig',
    'VisualizationConfig',
    'LoggingConfig'
]
EOF

# Create launcher scripts with proper shebang
cat > %{buildroot}%{_bindir}/fint-bot << 'EOF'
#!/usr/bin/env python3
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'lib', 'python3.13', 'site-packages'))

# Check for config file in user's home directory
user_config = os.path.expanduser('~/.config/fint-bot/config.json')
if not os.path.exists(user_config):
    # Copy default config if doesn't exist
    os.makedirs(os.path.dirname(user_config), exist_ok=True)
    import shutil
    shutil.copy('/etc/fint-bot/config.json.default', user_config)
    print(f"Created default configuration at {user_config}")
    print("Edit this file or run 'fint-bot-config wizard' to customize settings.")

from robotlib.config_manager import ConfigManager
config_manager = ConfigManager(user_config)

from main import main
if __name__ == '__main__':
    sys.exit(main())
EOF

cat > %{buildroot}%{_bindir}/fint-bot-stats << 'EOF'
#!/usr/bin/env python3
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'lib', 'python3.13', 'site-packages'))

from main_stats import main
if __name__ == '__main__':
    sys.exit(main())
EOF

cat > %{buildroot}%{_bindir}/fint-bot-config << 'EOF'
#!/usr/bin/env python3
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'lib', 'python3.13', 'site-packages'))

# Check for config file in user's home directory
user_config = os.path.expanduser('~/.config/fint-bot/config.json')
if not os.path.exists(user_config):
    # Copy default config if doesn't exist
    os.makedirs(os.path.dirname(user_config), exist_ok=True)
    import shutil
    shutil.copy('/etc/fint-bot/config.json.default', user_config)

# Set config path for config_manager
os.environ['FINT_BOT_CONFIG'] = user_config

from config_tool import main
if __name__ == '__main__':
    sys.exit(main())
EOF

cat > %{buildroot}%{_bindir}/fint-bot-safety << 'EOF'
#!/usr/bin/env python3
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'lib', 'python3.13', 'site-packages'))

# Check for config file in user's home directory
user_config = os.path.expanduser('~/.config/fint-bot/config.json')
if not os.path.exists(user_config):
    # Copy default config if doesn't exist
    os.makedirs(os.path.dirname(user_config), exist_ok=True)
    import shutil
    shutil.copy('/etc/fint-bot/config.json.default', user_config)

from safety_check import main
if __name__ == '__main__':
    sys.exit(main())
EOF

cat > %{buildroot}%{_bindir}/fint-bot-start << 'EOF'
#!/usr/bin/env python3
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'lib', 'python3.13', 'site-packages'))

from start_robot import main
if __name__ == '__main__':
    sys.exit(main())
EOF

chmod 755 %{buildroot}%{_bindir}/fint-bot
chmod 755 %{buildroot}%{_bindir}/fint-bot-stats
chmod 755 %{buildroot}%{_bindir}/fint-bot-config
chmod 755 %{buildroot}%{_bindir}/fint-bot-safety
chmod 755 %{buildroot}%{_bindir}/fint-bot-start

%post
# Update Python module cache
%{__python3} -m compileall %{_libdir}/python3.13/site-packages/robotlib/ >/dev/null 2>&1 || :

# Create user config directory
if [ ! -d ~/.config/fint-bot ]; then
    mkdir -p ~/.config/fint-bot
fi

# Copy default config if user config doesn't exist
if [ ! -f ~/.config/fint-bot/config.json ]; then
    cp /etc/fint-bot/config.json.default ~/.config/fint-bot/config.json
fi

# Install Python dependencies if pip is available
if command -v pip3 >/dev/null 2>&1; then
    pip3 install tinkoff-invest-sdk --user 2>/dev/null || true
    pip3 install colorama --user 2>/dev/null || true
else
    echo "Note: pip3 not found. Please install dependencies manually:"
    echo "  pip3 install tinkoff-invest-sdk"
    echo "  pip3 install colorama"
fi

echo "========================================="
echo "Fint-bot v%{version} successfully installed!"
echo ""
echo "Available commands:"
echo "  fint-bot                    - Run trading robot"
echo "  fint-bot-start             - Start with safety checks (recommended)"
echo "  fint-bot-safety            - Security check only"
echo "  fint-bot --install          - Show installation instructions"
echo "  fint-bot --config           - Show current configuration"
echo "  fint-bot --wizard           - Run configuration wizard"
echo "  fint-bot-stats             - View trading statistics"
echo "  fint-bot-config            - Configuration management tool"
echo ""
echo "Configuration management:"
echo "  fint-bot-config show        - Show current config"
echo "  fint-bot-config wizard      - Interactive configuration wizard"
echo "  fint-bot-config set <section> <key> <value>"
echo "  fint-bot-config reset       - Reset to defaults"
echo "  fint-bot-config validate    - Validate configuration"
echo "  fint-bot-config safety      - Security check"
echo ""
echo "Required environment variables:"
echo "  export TINKOFF_TOKEN='your_token'"
echo "  export TINKOFF_ACCOUNT='your_account'"
echo ""
echo "Configuration file location:"
echo "  ~/.config/fint-bot/config.json"
echo ""
echo "For GUI support (recommended in order):"
echo "  1. sudo zypper install python3-qt6  (most modern)"
echo "  2. sudo zypper install python3-qt5  (alternative)"
echo "  3. sudo zypper install python3-tk   (fallback)"
echo "========================================="

%postun
# Clean cache when removing
%{__python3} -m compileall --clear %{_libdir}/python3.13/site-packages/robotlib/ >/dev/null 2>&1 || :

%files
%defattr(-,root,root,-)
%license LICENSE
%doc README.md modules.md
%dir %{_sysconfdir}/%{name}
%config(noreplace) %{_sysconfdir}/%{name}/config.json.default
%{_bindir}/fint-bot
%{_bindir}/fint-bot-stats
%{_bindir}/fint-bot-config
%{_bindir}/fint-bot-safety
%{_bindir}/fint-bot-start
%dir %{_libdir}/python3.13/site-packages/robotlib
%{_libdir}/python3.13/site-packages/robotlib/__init__.py
%{_libdir}/python3.13/site-packages/robotlib/*.py
%dir %{_datadir}/doc/packages/%{name}
%{_datadir}/doc/packages/%{name}/*
%dir %{_datadir}/licenses/%{name}
%{_datadir}/licenses/%{name}/*

%changelog
* Mon Jan 06 2026 Shubin Alexander Stanislavovich <renard.corp@hotmail.com> 1.0.2-1
- Added multi-level security system with safety_check.py
- Added start_robot.py for safe startup with mandatory checks
- Added interactive confirmation for real trading mode
- Enhanced main.py with integrated security validation
- Added TokenValidator and ConfigSafetyChecker classes
- Improved user interface with colorama support
- Added fint-bot-safety command for standalone security checks
- Added fint-bot-start command for recommended startup

* Sat Jan 06 2026 Shubin Alexander Stanislavovich <renard.corp@hotmail.com> 1.0.1-1
- Added comprehensive configuration management system
- Added config_tool.py for command-line configuration management
- Added dataclass-based configuration with validation
- Added interactive configuration wizard
- Updated MAEStrategy with advanced risk management
- Added position sizing based on risk percentage
- Added stop-loss, take-profit, and trailing stops
- Added daily loss limits and consecutive loss protection
- Improved visualization with multiple backend support
- Added separate configuration management utility
- User configuration stored in ~/.config/fint-bot/
- Default configuration provided in /etc/fint-bot/

* Fri Dec 15 2023 Shubin Alexander Stanislavovich <renard.corp@hotmail.com> 1.0.0-1
- Initial package version for SUSE Tumbleweed
- Included main modules: robot, strategy, statistics, visualization
- Added MAE (Moving Average Envelope) strategy
- Support for both GUI and console modes
- Modern Qt6 backend support with fallback to Qt5 and Tk
- Automatic dependency checking for SUSE Tumbleweed
openSUSE Build Service is sponsored by