Finance-Calendar

 view release on metacpan or  search on metacpan

t/tactical_exchanges.t  view on Meta::CPAN

#!/usr/bin/perl

use strict;
use warnings;

use Test::Most;
use Test::FailWarnings;

use Finance::Exchange;
use Finance::Calendar;

# Create a basic calendar for testing
my $calendar = {
    holidays     => {},
    early_closes => {},
    late_opens   => {},
};

my $tc = Finance::Calendar->new(calendar => $calendar);
my ($TACTICAL_FOREX_EURUSD, $TACTICAL_FOREX_GBPUSD, $TACTICAL_FOREX_USDJPY, $TACTICAL_METALS, $TACTICAL_CRYPTO) =
    map { Finance::Exchange->create_exchange($_) }
    qw(TACTICAL_FOREX_EURUSD TACTICAL_FOREX_GBPUSD TACTICAL_FOREX_USDJPY TACTICAL_METALS TACTICAL_CRYPTO);

subtest 'tactical_trading_days' => sub {
    # Test sun_thru_fri pattern for TACTICAL forex exchanges
    my $sunday   = Date::Utility->new('2023-06-11');    # Sunday
    my $monday   = Date::Utility->new('2023-06-12');    # Monday
    my $friday   = Date::Utility->new('2023-06-16');    # Friday
    my $saturday = Date::Utility->new('2023-06-17');    # Saturday

    # tactical Forex exchanges should trade Sunday through Friday
    ok $tc->trades_on($TACTICAL_FOREX_EURUSD,  $sunday),   'TACTICAL_FOREX_EURUSD trades on Sunday';
    ok $tc->trades_on($TACTICAL_FOREX_EURUSD,  $monday),   'TACTICAL_FOREX_EURUSD trades on Monday';
    ok $tc->trades_on($TACTICAL_FOREX_EURUSD,  $friday),   'TACTICAL_FOREX_EURUSD trades on Friday';
    ok !$tc->trades_on($TACTICAL_FOREX_EURUSD, $saturday), 'TACTICAL_FOREX_EURUSD does not trade on Saturday';

    ok $tc->trades_on($TACTICAL_FOREX_GBPUSD,  $sunday),   'TACTICAL_FOREX_GBPUSD trades on Sunday';
    ok !$tc->trades_on($TACTICAL_FOREX_GBPUSD, $saturday), 'TACTICAL_FOREX_GBPUSD does not trade on Saturday';

    ok $tc->trades_on($TACTICAL_FOREX_USDJPY,  $sunday),   'TACTICAL_FOREX_USDJPY trades on Sunday';
    ok !$tc->trades_on($TACTICAL_FOREX_USDJPY, $saturday), 'TACTICAL_FOREX_USDJPY does not trade on Saturday';

    ok $tc->trades_on($TACTICAL_METALS,  $sunday),   'TACTICAL_METALS trades on Sunday';
    ok !$tc->trades_on($TACTICAL_METALS, $saturday), 'TACTICAL_METALS does not trade on Saturday';

    # TACTICAL_CRYPTO should trade every day
    ok $tc->trades_on($TACTICAL_CRYPTO, $sunday),   'TACTICAL_CRYPTO trades on Sunday';
    ok $tc->trades_on($TACTICAL_CRYPTO, $saturday), 'TACTICAL_CRYPTO trades on Saturday';
};

subtest 'tactical_trading_hours_standard' => sub {
    # Test during standard time (non-DST) - using February dates
    my $sunday   = Date::Utility->new('2023-02-12');    # Sunday in standard time
    my $monday   = Date::Utility->new('2023-02-13');    # Monday in standard time
    my $friday   = Date::Utility->new('2023-02-17');    # Friday in standard time
    my $saturday = Date::Utility->new('2023-02-18');    # Saturday in standard time

    # Verify we're in standard time
    ok !$tc->is_in_dst_at($TACTICAL_FOREX_EURUSD, $sunday->epoch), 'February Sunday is in standard time';
    ok !$tc->is_in_dst_at($TACTICAL_FOREX_EURUSD, $friday->epoch), 'February Friday is in standard time';

    # Test TACTICAL_FOREX_EURUSD standard time hours
    my $sunday_open = $tc->opening_on($TACTICAL_FOREX_EURUSD, $sunday);
    is $sunday_open->time_hhmmss, '22:35:00', 'TACTICAL_FOREX_EURUSD opens at 22:35:00 on Sunday (standard time)';

    # Monday should open at 00:00 (0s)
    my $monday_open = $tc->opening_on($TACTICAL_FOREX_EURUSD, $monday);
    is $monday_open->time_hhmmss, '00:00:00', 'TACTICAL_FOREX_EURUSD opens at 00:00:00 on Monday (standard time)';

    # Monday should close at 23:59:59 (23h59m59s)
    my $monday_close = $tc->closing_on($TACTICAL_FOREX_EURUSD, $monday);
    is $monday_close->time_hhmmss, '23:59:59', 'TACTICAL_FOREX_EURUSD closes at 23:59:59 on Monday (standard time)';

    # Friday should close early at 21:55 (21h55m)
    my $friday_close = $tc->closing_on($TACTICAL_FOREX_EURUSD, $friday);
    is $friday_close->time_hhmmss, '21:55:00', 'TACTICAL_FOREX_EURUSD closes at 21:55:00 on Friday (standard time)';

    # Test other tactical forex exchanges have same pattern
    is $tc->opening_on($TACTICAL_FOREX_GBPUSD, $sunday)->time_hhmmss, '22:35:00', 'TACTICAL_FOREX_GBPUSD Sunday opens at 22:35:00 (standard)';



( run in 1.451 second using v1.01-cache-2.11-cpan-5a3173703d6 )