96 lines
2.9 KiB
Dart
96 lines
2.9 KiB
Dart
import 'package:equatable/equatable.dart';
|
|
|
|
class DerivativeItemModel extends Equatable {
|
|
final String isin;
|
|
final String name;
|
|
final String optionType;
|
|
final String productCategoryName;
|
|
final String nextGenProductCategoryName;
|
|
final double strike;
|
|
final double barrier;
|
|
final double leverage;
|
|
final double? size;
|
|
final double? factor;
|
|
final double? delta;
|
|
final String currency;
|
|
final String? expiry;
|
|
final String issuer;
|
|
final String issuerDisplayName;
|
|
final String? issuerImageId;
|
|
final String underlyingIsin;
|
|
|
|
const DerivativeItemModel({
|
|
required this.isin,
|
|
this.name = '',
|
|
this.optionType = 'Long',
|
|
this.productCategoryName = '',
|
|
this.nextGenProductCategoryName = '',
|
|
this.strike = 0.0,
|
|
this.barrier = 0.0,
|
|
this.leverage = 1.0,
|
|
this.size,
|
|
this.factor,
|
|
this.delta,
|
|
this.currency = 'EUR',
|
|
this.expiry,
|
|
this.issuer = '',
|
|
this.issuerDisplayName = '',
|
|
this.issuerImageId,
|
|
this.underlyingIsin = '',
|
|
});
|
|
|
|
bool get isLong => optionType.toLowerCase().contains('long') || optionType.toLowerCase().contains('call');
|
|
|
|
double distanceToBarrier(double currentUnderlyingPrice) {
|
|
if (barrier <= 0 || currentUnderlyingPrice <= 0) return 0.0;
|
|
return ((currentUnderlyingPrice - barrier).abs() / currentUnderlyingPrice) * 100.0;
|
|
}
|
|
|
|
factory DerivativeItemModel.fromJson(Map<String, dynamic> json) {
|
|
double parseDbl(dynamic val) {
|
|
if (val == null) return 0.0;
|
|
if (val is num) return val.toDouble();
|
|
return double.tryParse(val.toString()) ?? 0.0;
|
|
}
|
|
|
|
double? parseOptDbl(dynamic val) {
|
|
if (val == null) return null;
|
|
if (val is num) return val.toDouble();
|
|
return double.tryParse(val.toString());
|
|
}
|
|
|
|
return DerivativeItemModel(
|
|
isin: json['isin']?.toString() ?? '',
|
|
name: json['name']?.toString() ?? '',
|
|
optionType: json['optionType']?.toString() ?? 'Long',
|
|
productCategoryName: json['productCategoryName']?.toString() ?? '',
|
|
nextGenProductCategoryName: json['nextGenProductCategoryName']?.toString() ?? '',
|
|
strike: parseDbl(json['strike']),
|
|
barrier: parseDbl(json['barrier']),
|
|
leverage: parseDbl(json['leverage']),
|
|
size: parseOptDbl(json['size']),
|
|
factor: parseOptDbl(json['factor']),
|
|
delta: parseOptDbl(json['delta']),
|
|
currency: json['currency']?.toString() ?? 'EUR',
|
|
expiry: json['expiry']?.toString(),
|
|
issuer: json['issuer']?.toString() ?? '',
|
|
issuerDisplayName: json['issuerDisplayName']?.toString() ?? (json['issuer']?.toString() ?? ''),
|
|
issuerImageId: json['issuerImageId']?.toString(),
|
|
underlyingIsin: json['underlyingIsin']?.toString() ?? '',
|
|
);
|
|
}
|
|
|
|
@override
|
|
List<Object?> get props => [
|
|
isin,
|
|
name,
|
|
optionType,
|
|
productCategoryName,
|
|
strike,
|
|
barrier,
|
|
leverage,
|
|
issuer,
|
|
underlyingIsin,
|
|
];
|
|
}
|