2018-05-22 10:11:50 +02:00
using System ;
using System.Collections.Generic ;
using System.Linq ;
using Microsoft.AspNetCore.Http ;
using Core.Main ;
using Core.Helper ;
using Core.Main.DataObjects ;
using Core.Main.DataObjects.PTMagicData ;
2024-01-07 22:53:49 +01:00
using System.Globalization ;
using System.Text ;
2018-05-22 10:11:50 +02:00
2020-07-21 23:29:07 +02:00
namespace Monitor.Pages
{
public class DashboardBottomModel : _Internal . BasePageModelSecureAJAX
{
2018-05-22 10:11:50 +02:00
public ProfitTrailerData PTData = null ;
2024-01-07 22:53:49 +01:00
public StatsData StatsData { get ; set ; }
public PropertiesData PropertiesData { get ; set ; }
public SummaryData SummaryData { get ; set ; }
public List < DailyStatsData > DailyStats { get ; set ; } = new List < DailyStatsData > ( ) ;
public List < DailyPNLData > DailyPNL { get ; set ; } = new List < DailyPNLData > ( ) ;
2018-05-22 10:11:50 +02:00
public List < MarketTrend > MarketTrends { get ; set ; } = new List < MarketTrend > ( ) ;
public string TrendChartDataJSON = "" ;
public string ProfitChartDataJSON = "" ;
public string LastGlobalSetting = "Default" ;
public DateTimeOffset DateTimeNow = Constants . confMinDate ;
2019-04-30 17:36:27 +02:00
public string AssetDistributionData = "" ;
2020-07-17 13:35:43 +02:00
public double totalCurrentValue = 0 ;
2020-07-21 23:29:07 +02:00
public void OnGet ( )
{
2018-05-22 10:11:50 +02:00
// Initialize Config
base . Init ( ) ;
BindData ( ) ;
2023-12-30 06:46:45 +01:00
2019-04-30 17:36:27 +02:00
BuildAssetDistributionData ( ) ;
2018-05-22 10:11:50 +02:00
}
2020-07-21 23:29:07 +02:00
private void BindData ( )
{
2019-10-13 22:08:48 +02:00
PTData = this . PtDataObject ;
2023-12-30 06:46:45 +01:00
StatsData = this . PTData . Stats ;
2024-01-07 22:53:49 +01:00
PropertiesData = this . PTData . Properties ;
SummaryData = this . PTData . Summary ;
List < DailyStatsData > dailyStatsData = this . PTData . DailyStats ;
List < DailyPNLData > dailyPNLData = this . PTData . DailyPNL ;
2018-05-22 10:11:50 +02:00
// Cleanup temp files
FileHelper . CleanupFilesMinutes ( PTMagicMonitorBasePath + "wwwroot" + System . IO . Path . DirectorySeparatorChar + "assets" + System . IO . Path . DirectorySeparatorChar + "tmp" + System . IO . Path . DirectorySeparatorChar , 5 ) ;
// Convert local offset time to UTC
TimeSpan offsetTimeSpan = TimeSpan . Parse ( PTMagicConfiguration . GeneralSettings . Application . TimezoneOffset . Replace ( "+" , "" ) ) ;
DateTimeNow = DateTimeOffset . UtcNow . ToOffset ( offsetTimeSpan ) ;
// Get last and current active setting
2020-07-21 23:29:07 +02:00
if ( ! String . IsNullOrEmpty ( HttpContext . Session . GetString ( "LastGlobalSetting" ) ) )
{
2018-05-22 10:11:50 +02:00
LastGlobalSetting = HttpContext . Session . GetString ( "LastGlobalSetting" ) ;
}
HttpContext . Session . SetString ( "LastGlobalSetting" , Summary . CurrentGlobalSetting . SettingName ) ;
// Get market trends
MarketTrends = PTMagicConfiguration . AnalyzerSettings . MarketAnalyzer . MarketTrends . OrderBy ( mt = > mt . TrendMinutes ) . ThenByDescending ( mt = > mt . Platform ) . ToList ( ) ;
BuildMarketTrendChartData ( ) ;
BuildProfitChartData ( ) ;
}
2020-07-21 23:29:07 +02:00
private void BuildMarketTrendChartData ( )
2024-01-07 22:53:49 +01:00
{
StringBuilder trendChartDataJSON = new StringBuilder ( ) ;
if ( MarketTrends . Count > 0 )
2020-07-21 23:29:07 +02:00
{
2024-01-07 22:53:49 +01:00
trendChartDataJSON . Append ( "[" ) ;
2018-05-22 10:11:50 +02:00
int mtIndex = 0 ;
2020-07-21 23:29:07 +02:00
foreach ( MarketTrend mt in MarketTrends )
{
2024-01-07 22:53:49 +01:00
if ( mt . DisplayGraph )
2020-07-21 23:29:07 +02:00
{
2024-01-07 22:53:49 +01:00
string lineColor = "" ;
if ( mtIndex < Constants . ChartLineColors . Length )
2020-07-21 23:29:07 +02:00
{
2024-01-07 22:53:49 +01:00
lineColor = Constants . ChartLineColors [ mtIndex ] ;
2018-05-22 10:11:50 +02:00
}
2024-01-07 22:53:49 +01:00
else
2020-07-21 23:29:07 +02:00
{
2024-01-07 22:53:49 +01:00
lineColor = Constants . ChartLineColors [ mtIndex - 20 ] ;
}
if ( Summary . MarketTrendChanges . ContainsKey ( mt . Name ) )
{
List < MarketTrendChange > marketTrendChangeSummaries = Summary . MarketTrendChanges [ mt . Name ] ;
if ( marketTrendChangeSummaries . Count > 0 )
{
if ( ! trendChartDataJSON . ToString ( ) . Equals ( "[" ) ) trendChartDataJSON . Append ( "," ) ;
trendChartDataJSON . Append ( "{" ) ;
trendChartDataJSON . Append ( "key: '" + SystemHelper . SplitCamelCase ( mt . Name ) + "'," ) ;
trendChartDataJSON . Append ( "color: '" + lineColor + "'," ) ;
trendChartDataJSON . Append ( "values: [" ) ;
// Get trend ticks for chart
DateTime currentDateTime = new DateTime ( DateTime . UtcNow . Year , DateTime . UtcNow . Month , DateTime . UtcNow . Day , DateTime . UtcNow . Hour , 0 , 0 ) ;
DateTime startDateTime = currentDateTime . AddHours ( - PTMagicConfiguration . GeneralSettings . Monitor . GraphMaxTimeframeHours ) ;
DateTime endDateTime = currentDateTime ;
int trendChartTicks = 0 ;
for ( DateTime tickTime = startDateTime ; tickTime < = endDateTime ; tickTime = tickTime . AddMinutes ( PTMagicConfiguration . GeneralSettings . Monitor . GraphIntervalMinutes ) )
{
List < MarketTrendChange > tickRange = marketTrendChangeSummaries . FindAll ( m = > m . TrendDateTime > = tickTime ) . OrderBy ( m = > m . TrendDateTime ) . ToList ( ) ;
if ( tickRange . Count > 0 )
{
MarketTrendChange mtc = tickRange . First ( ) ;
if ( tickTime ! = startDateTime ) trendChartDataJSON . Append ( ",\n" ) ;
if ( Double . IsInfinity ( mtc . TrendChange ) ) mtc . TrendChange = 0 ;
trendChartDataJSON . Append ( "{ x: new Date('" + tickTime . ToString ( "yyyy-MM-ddTHH:mm:ss" ) . Replace ( "." , ":" ) + "'), y: " + mtc . TrendChange . ToString ( "0.00" , new System . Globalization . CultureInfo ( "en-US" ) ) + "}" ) ;
trendChartTicks + + ;
}
}
// Add most recent tick
List < MarketTrendChange > latestTickRange = marketTrendChangeSummaries . OrderByDescending ( m = > m . TrendDateTime ) . ToList ( ) ;
if ( latestTickRange . Count > 0 )
{
MarketTrendChange mtc = latestTickRange . First ( ) ;
if ( trendChartTicks > 0 ) trendChartDataJSON . Append ( ",\n" ) ;
if ( Double . IsInfinity ( mtc . TrendChange ) ) mtc . TrendChange = 0 ;
trendChartDataJSON . Append ( "{ x: new Date('" + mtc . TrendDateTime . ToString ( "yyyy-MM-ddTHH:mm:ss" ) . Replace ( "." , ":" ) + "'), y: " + mtc . TrendChange . ToString ( "0.00" , new System . Globalization . CultureInfo ( "en-US" ) ) + "}" ) ;
}
trendChartDataJSON . Append ( "]" ) ;
trendChartDataJSON . Append ( "}" ) ;
mtIndex + + ;
}
2018-05-22 10:11:50 +02:00
}
}
}
2024-01-07 22:53:49 +01:00
trendChartDataJSON . Append ( "]" ) ;
2018-05-22 10:11:50 +02:00
}
2024-01-07 22:53:49 +01:00
TrendChartDataJSON = trendChartDataJSON . ToString ( ) ;
}
2018-05-22 10:11:50 +02:00
2020-07-21 23:29:07 +02:00
private void BuildProfitChartData ( )
{
2024-01-07 22:53:49 +01:00
StringBuilder profitPerDayJSON = new StringBuilder ( ) ;
if ( PTData . DailyStats . Count > 0 )
2020-07-21 23:29:07 +02:00
{
2024-01-07 22:53:49 +01:00
DateTime endDate = DateTime . UtcNow . Date ;
DateTime startDate = endDate . AddDays ( - 30 ) ;
for ( DateTime date = startDate ; date < = endDate ; date = date . AddDays ( 1 ) )
{
if ( profitPerDayJSON . Length > 0 )
{
profitPerDayJSON . Append ( ",\n" ) ;
}
DailyStatsData dailyStats = PTData . DailyStats . Find ( ds = > DateTime . ParseExact ( ds . Date , "d-M-yyyy" , CultureInfo . InvariantCulture ) = = date ) ;
double profitFiat = dailyStats ! = null ? Math . Round ( dailyStats . TotalProfitCurrency , 2 ) : 0 ;
profitPerDayJSON . Append ( "{x: new Date('" + date . ToString ( "yyyy-MM-dd" ) + "'), y: " + profitFiat . ToString ( "0.00" , new System . Globalization . CultureInfo ( "en-US" ) ) + "}" ) ;
}
ProfitChartDataJSON = "[{key: 'Profit in " + PTData . Properties . Currency + "',color: '" + Constants . ChartLineColors [ 1 ] + "',values: [" + profitPerDayJSON . ToString ( ) + "]}]" ;
2018-05-22 10:11:50 +02:00
}
}
2024-01-07 22:53:49 +01:00
2019-04-30 17:36:27 +02:00
private void BuildAssetDistributionData ( )
{
2020-07-17 14:34:07 +02:00
// the per PT-Eelroy, the PT API doesn't provide these values when using leverage, so they are calculated here to cover either case.
2020-07-17 07:02:48 +02:00
double PairsBalance = 0.0 ;
double DCABalance = 0.0 ;
double PendingBalance = 0.0 ;
double AvailableBalance = PTData . GetCurrentBalance ( ) ;
2020-07-21 23:29:07 +02:00
bool isSellStrategyTrue = false ;
bool isTrailingSellActive = false ;
2024-01-07 22:53:49 +01:00
foreach ( Core . Main . DataObjects . PTMagicData . DCALogData dcaLogEntry in PTData . DCALog )
{
string sellStrategyText = Core . ProfitTrailer . StrategyHelper . GetStrategyText ( Summary , dcaLogEntry . SellStrategies , dcaLogEntry . SellStrategy , isSellStrategyTrue , isTrailingSellActive ) ;
2020-07-17 14:34:07 +02:00
2020-07-17 07:02:48 +02:00
// Aggregate totals
2021-02-18 10:02:26 +01:00
double leverage = dcaLogEntry . Leverage ;
if ( leverage = = 0 )
2020-07-17 07:02:48 +02:00
{
2021-02-18 10:02:26 +01:00
leverage = 1 ;
2020-07-17 07:02:48 +02:00
}
2021-02-18 10:06:52 +01:00
if ( sellStrategyText . Contains ( "PENDING" ) )
{
PendingBalance = PendingBalance + ( ( dcaLogEntry . Amount * dcaLogEntry . CurrentPrice ) / leverage ) ;
}
else if ( dcaLogEntry . BuyStrategies . Count > 0 )
{
DCABalance = DCABalance + ( ( dcaLogEntry . Amount * dcaLogEntry . CurrentPrice ) / leverage ) ;
}
2020-07-17 07:02:48 +02:00
else
{
2021-02-18 10:06:52 +01:00
PairsBalance = PairsBalance + ( ( dcaLogEntry . Amount * dcaLogEntry . CurrentPrice ) / leverage ) ;
2020-07-17 07:02:48 +02:00
}
}
2020-07-17 13:35:43 +02:00
totalCurrentValue = PendingBalance + DCABalance + PairsBalance + AvailableBalance ;
2019-04-30 17:36:27 +02:00
AssetDistributionData = "[" ;
2019-06-12 02:41:35 +02:00
AssetDistributionData + = "{label: 'Pairs',color: '#82E0AA',value: '" + PairsBalance . ToString ( "0.00" , new System . Globalization . CultureInfo ( "en-US" ) ) + "'}," ;
AssetDistributionData + = "{label: 'DCA',color: '#D98880',value: '" + DCABalance . ToString ( "0.00" , new System . Globalization . CultureInfo ( "en-US" ) ) + "'}," ;
AssetDistributionData + = "{label: 'Pending',color: '#F5B041',value: '" + PendingBalance . ToString ( "0.00" , new System . Globalization . CultureInfo ( "en-US" ) ) + "'}," ;
AssetDistributionData + = "{label: 'Balance',color: '#85C1E9',value: '" + AvailableBalance . ToString ( "0.00" , new System . Globalization . CultureInfo ( "en-US" ) ) + "'}]" ;
2019-04-30 17:36:27 +02:00
}
2018-05-22 10:11:50 +02:00
}
}