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 )