You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
501 lines
21 KiB
501 lines
21 KiB
import 'dart:convert';
|
|
|
|
//import 'package:cpay/api/api.dart';
|
|
//import 'package:cpay/items/loading.dart';
|
|
//import 'package:cpay/models/modeltrade.dart';
|
|
import 'package:cpay/models/modeltradenet.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
import 'package:http/http.dart';
|
|
import 'package:syncfusion_flutter_charts/charts.dart';
|
|
import 'package:intl/intl.dart';
|
|
import 'package:syncfusion_flutter_sliders/sliders.dart';
|
|
|
|
class Trading extends StatefulWidget {
|
|
const Trading({super.key});
|
|
|
|
@override
|
|
State<Trading> createState() => _TradingState();
|
|
}
|
|
|
|
class _TradingState extends State<Trading> {
|
|
Map<String, dynamic> titlelist = {};
|
|
late SfRangeValues _rangeValues;
|
|
List<Modeltradenet> chartDatatrade = [];
|
|
List<Modeltradenet> chartDatatrade2 = [];
|
|
CrosshairBehavior crosshairBehavior =
|
|
CrosshairBehavior(enable: true, activationMode: ActivationMode.singleTap);
|
|
DateTime lastDataPointX = DateTime.now();
|
|
double lastDataPointY = 0.0;
|
|
bool loading = false;
|
|
late TrackballBehavior _trackballBehavior;
|
|
// afficherligne() {
|
|
// setState(() {
|
|
// //print(chartDatatrade2);
|
|
// // Rafraîchissez le graphique après chaque mise à jour des données
|
|
// //if (chartDatatrade.isNotEmpty) {
|
|
// lastDataPointX = chartDatatrade.first.date;
|
|
// lastDataPointY = chartDatatrade.first.close;
|
|
// // crosshairBehavior.show(lastDataPointX, lastDataPointY);
|
|
// // _trackballBehavior.show(lastDataPointX, lastDataPointY);
|
|
|
|
// //}
|
|
// });
|
|
// }
|
|
|
|
gettrade() async {
|
|
try {
|
|
chartDatatrade2.clear();
|
|
var requeset = await get(Uri.parse(
|
|
"https://www.alphavantage.co/query?function=FX_INTRADAY&from_symbol=EUR&to_symbol=USD&interval=5min&apikey=demo"));
|
|
if (requeset.statusCode == 200) {
|
|
if (mounted) {
|
|
setState(() {
|
|
var data = jsonDecode(requeset.body);
|
|
chartDatatrade = listaftertransform(data["Time Series FX (5min)"]);
|
|
chartDatatrade2.add(chartDatatrade[0]);
|
|
// chartDatatrade2 =
|
|
// listaftertransform(data["Time Series FX (5min)"][0]);
|
|
titlelist = data["Meta Data"];
|
|
|
|
lastDataPointX = chartDatatrade.first.date;
|
|
lastDataPointY = chartDatatrade.first.close;
|
|
});
|
|
}
|
|
Future.delayed(const Duration(minutes: 5), () {
|
|
gettrade();
|
|
});
|
|
|
|
// Modeltradenet modeltradenet =
|
|
// Modeltradenet.fromJson(data["Time Series FX (5min)"]);
|
|
// list.add(modeltradenet);
|
|
// data["Time Series FX (5min)"]['$formattedDateTime:00']);
|
|
//print(data["Time Series (1min)"]);
|
|
//print(modeltradenet);
|
|
//return (modeltradenet);
|
|
// Future.delayed(Duration(minutes: 5), () {
|
|
// getapitrading();
|
|
// });
|
|
} else {
|
|
return null;
|
|
}
|
|
} catch (error) {
|
|
return error;
|
|
}
|
|
}
|
|
|
|
@override
|
|
void initState() {
|
|
// _chartData = getChartData();
|
|
gettrade();
|
|
_rangeValues = SfRangeValues(
|
|
DateTime(2023, 9, 25, 10, 00), DateTime(2023, 9, 25, 15, 00));
|
|
//_chartDatatrade = listaftertransform(Api.getapitrading());
|
|
_trackballBehavior = TrackballBehavior(
|
|
enable: true, activationMode: ActivationMode.singleTap);
|
|
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return SafeArea(
|
|
child:
|
|
// loading
|
|
// ? const Loading(spincouleur: Colors.red, containcouleur: Colors.white)
|
|
// :
|
|
Scaffold(
|
|
body: Center(
|
|
child: Column(
|
|
children: [
|
|
SizedBox(
|
|
height: 20.sp,
|
|
),
|
|
Container(
|
|
decoration: BoxDecoration(
|
|
color: const Color(0xFF6334A9).withOpacity(0.8),
|
|
borderRadius: BorderRadius.all(Radius.circular(10.sp))),
|
|
width: MediaQuery.of(context).size.width * 0.8,
|
|
height: 60.sp,
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
|
children: [
|
|
Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Text(
|
|
textAlign: TextAlign.center,
|
|
'\$50 000',
|
|
style: TextStyle(
|
|
fontSize: 15.sp,
|
|
fontWeight: FontWeight.normal,
|
|
color: Colors.red,
|
|
fontFamily: 'PlusJakartaSans',
|
|
),
|
|
),
|
|
Text(
|
|
textAlign: TextAlign.center,
|
|
'demo balance',
|
|
style: TextStyle(
|
|
fontSize: 9.sp,
|
|
fontWeight: FontWeight.normal,
|
|
color: Colors.white,
|
|
fontFamily: 'PlusJakartaSans',
|
|
),
|
|
),
|
|
],
|
|
),
|
|
Container(
|
|
color: Colors.white,
|
|
width: 1,
|
|
),
|
|
Text(
|
|
textAlign: TextAlign.center,
|
|
'Finances',
|
|
style: TextStyle(
|
|
fontSize: 15.sp,
|
|
fontWeight: FontWeight.bold,
|
|
color: Colors.white,
|
|
fontFamily: 'PlusJakartaSans',
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
SfRangeSelector(
|
|
activeColor: Colors.red,
|
|
min: DateTime(2023, 9, 25, 5, 00),
|
|
max: DateTime(2023, 9, 25, 16, 00),
|
|
initialValues: _rangeValues,
|
|
showTicks: true,
|
|
enableTooltip: true,
|
|
dateFormat: DateFormat.y(),
|
|
dateIntervalType: DateIntervalType.hours,
|
|
stepDuration: SliderStepDuration(hours: 1),
|
|
onChanged: (SfRangeValues newValues) {
|
|
print(newValues);
|
|
},
|
|
child: SfCartesianChart(
|
|
trackballBehavior: _trackballBehavior,
|
|
crosshairBehavior: CrosshairBehavior(
|
|
enable: true, activationMode: ActivationMode.singleTap),
|
|
annotations: <CartesianChartAnnotation>[
|
|
//Annotations personnalisées pour les signaux d'achat/vente
|
|
CartesianChartAnnotation(
|
|
region: AnnotationRegion.plotArea,
|
|
widget: Container(
|
|
width: 100,
|
|
height: 200,
|
|
color: Colors.orange.withOpacity(0.3),
|
|
// decoration: BoxDecoration(
|
|
// color: const Color(0xFF6334A9),
|
|
// borderRadius: BorderRadius.circular(50)),
|
|
// child: Padding(
|
|
// padding: const EdgeInsets.all(8.0),
|
|
// child: Text(
|
|
// lastDataPointY.toString(),
|
|
// style: TextStyle(color: Colors.white),
|
|
// ),
|
|
// ),
|
|
// height: 40,
|
|
// width: 40,
|
|
//child: Text('hello'),
|
|
),
|
|
//x: DateTime.now().microsecondsSinceEpoch,
|
|
coordinateUnit: CoordinateUnit.point,
|
|
x: lastDataPointX.add(
|
|
Duration(hours: 10)), // Position x en tant que date
|
|
y: lastDataPointY,
|
|
// Valeur de l'axe Y où afficher le signal d'achat
|
|
),
|
|
|
|
//Ajoutez plus d'annotations pour d'autres signaux d'achat/vente
|
|
],
|
|
//crosshairBehavior: crosshairBehavior,
|
|
zoomPanBehavior: ZoomPanBehavior(
|
|
//maximumZoomLevel: 0.1,
|
|
enablePanning: true,
|
|
enablePinching: true,
|
|
zoomMode: ZoomMode.x),
|
|
title: ChartTitle(
|
|
text:
|
|
"${titlelist["2. From Symbol"]}/${titlelist["3. To Symbol"]}"),
|
|
//legend: const Legend(isVisible: true),
|
|
//trackballBehavior: _trackballBehavior,
|
|
series: <ChartSeries>[
|
|
AreaSeries<Modeltradenet, DateTime>(
|
|
borderColor: const Color(0xFF6334A9),
|
|
borderWidth: 1,
|
|
color: const Color(0xFF6334A9).withOpacity(0.2),
|
|
dataSource: chartDatatrade,
|
|
xValueMapper: (Modeltradenet sales, _) => sales.date,
|
|
yValueMapper: (Modeltradenet sales, _) => sales.close,
|
|
|
|
// lowValueMapper: (Modeltradenet sales, _) => sales.low,
|
|
// highValueMapper: (Modeltradenet sales, _) => sales.high,
|
|
// openValueMapper: (Modeltradenet sales, _) => sales.open,
|
|
// closeValueMapper: (Modeltradenet sales, _) => sales.close,
|
|
),
|
|
SplineSeries<Modeltradenet, DateTime>(
|
|
dataSource: chartDatatrade2,
|
|
color: const Color(0xFF6334A9),
|
|
width: 2,
|
|
xValueMapper: (Modeltradenet sales, _) => sales.date,
|
|
yValueMapper: (Modeltradenet sales, _) => sales.close,
|
|
markerSettings: MarkerSettings(
|
|
isVisible: true, // Afficher les marqueurs
|
|
shape: DataMarkerType
|
|
.horizontalLine, // Forme du marqueur (circle, square, etc.)
|
|
color: const Color(0xFF6334A9)
|
|
.withOpacity(0.5), // Couleur des marqueurs
|
|
width: 1000, // Largeur des marqueurs
|
|
),
|
|
dataLabelSettings: const DataLabelSettings(
|
|
offset: Offset(-50, 25),
|
|
useSeriesColor: true,
|
|
borderWidth: 2,
|
|
borderColor: Color(0xFF6334A9),
|
|
// connectorLineSettings: ConnectorLineSettings(
|
|
// width: 2, color: Colors.red, type: ConnectorType.curve),
|
|
isVisible: true,
|
|
alignment: ChartAlignment.center,
|
|
labelAlignment: ChartDataLabelAlignment.bottom,
|
|
),
|
|
),
|
|
SplineSeries<Modeltradenet, DateTime>(
|
|
dataSource: chartDatatrade2,
|
|
color: const Color(0xFF6334A9),
|
|
width: 2,
|
|
xValueMapper: (Modeltradenet sales, _) => sales.date,
|
|
yValueMapper: (Modeltradenet sales, _) => sales.close,
|
|
markerSettings: MarkerSettings(
|
|
isVisible: true, // Afficher les marqueurs
|
|
shape: DataMarkerType
|
|
.circle, // Forme du marqueur (circle, square, etc.)
|
|
color: Colors.white
|
|
.withOpacity(0.5), // Couleur des marqueurs
|
|
width: 4, // Largeur des marqueurs
|
|
),
|
|
)
|
|
],
|
|
primaryXAxis: DateTimeAxis(
|
|
maximum: DateTime.now().add(const Duration(minutes: 15)),
|
|
dateFormat: DateFormat.Hms(),
|
|
majorGridLines: const MajorGridLines(width: 0)),
|
|
primaryYAxis: NumericAxis(
|
|
isVisible: true,
|
|
majorGridLines:
|
|
const MajorGridLines(color: Colors.transparent),
|
|
minorGridLines:
|
|
const MinorGridLines(color: Colors.transparent),
|
|
// minimum: 1,
|
|
// maximum: 1,
|
|
// interval: 0.001,
|
|
// numberFormat:
|
|
// NumberFormat.simpleCurrency(decimalDigits: 0)
|
|
),
|
|
),
|
|
),
|
|
const SizedBox(
|
|
height: 20,
|
|
),
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
|
children: [
|
|
Container(
|
|
height: 50.sp,
|
|
decoration: BoxDecoration(
|
|
color: const Color(0xFF6334A9).withOpacity(0.8),
|
|
borderRadius: BorderRadius.all(Radius.circular(10.sp))),
|
|
//height: 40.sp,
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
IconButton(
|
|
iconSize: 12,
|
|
color: Colors.white,
|
|
onPressed: () {},
|
|
icon: const Icon(Icons.horizontal_rule_outlined)),
|
|
Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Text(
|
|
textAlign: TextAlign.center,
|
|
'\$30 000',
|
|
style: TextStyle(
|
|
fontSize: 15.sp,
|
|
fontWeight: FontWeight.normal,
|
|
color: Colors.black,
|
|
fontFamily: 'PlusJakartaSans',
|
|
),
|
|
),
|
|
FittedBox(
|
|
child: Text(
|
|
textAlign: TextAlign.center,
|
|
'investissemnt',
|
|
style: TextStyle(
|
|
fontSize: 8.sp,
|
|
fontWeight: FontWeight.normal,
|
|
color: Colors.white,
|
|
fontFamily: 'PlusJakartaSans',
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
IconButton(
|
|
iconSize: 12,
|
|
color: Colors.white,
|
|
onPressed: () {},
|
|
icon: const Icon(Icons.add)),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
Container(
|
|
height: 50.sp,
|
|
decoration: BoxDecoration(
|
|
color: const Color(0xFF6334A9).withOpacity(0.8),
|
|
borderRadius: BorderRadius.all(Radius.circular(10.sp))),
|
|
//height: 40.sp,
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
IconButton(
|
|
iconSize: 12,
|
|
color: Colors.white,
|
|
onPressed: () {},
|
|
icon: const Icon(
|
|
Icons.keyboard_arrow_down_outlined)),
|
|
Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Text(
|
|
textAlign: TextAlign.center,
|
|
'\$10 000',
|
|
style: TextStyle(
|
|
fontSize: 15.sp,
|
|
fontWeight: FontWeight.normal,
|
|
color: Colors.black,
|
|
fontFamily: 'PlusJakartaSans',
|
|
),
|
|
),
|
|
FittedBox(
|
|
child: Text(
|
|
textAlign: TextAlign.center,
|
|
'Strike rale',
|
|
style: TextStyle(
|
|
fontSize: 8.sp,
|
|
fontWeight: FontWeight.normal,
|
|
color: Colors.white,
|
|
fontFamily: 'PlusJakartaSans',
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
IconButton(
|
|
iconSize: 12,
|
|
color: Colors.white,
|
|
onPressed: () {},
|
|
icon:
|
|
const Icon(Icons.keyboard_arrow_up_outlined)),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
SizedBox(
|
|
height: 20.sp,
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: Row(
|
|
children: [
|
|
Expanded(
|
|
child: ElevatedButton(
|
|
style: ElevatedButton.styleFrom(
|
|
backgroundColor: Colors.red,
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(10))),
|
|
onPressed: () {},
|
|
child: Column(
|
|
children: [
|
|
Text(
|
|
textAlign: TextAlign.center,
|
|
'Sell',
|
|
style: TextStyle(
|
|
fontSize: 15.sp,
|
|
fontWeight: FontWeight.bold,
|
|
color: Colors.white,
|
|
fontFamily: 'PlusJakartaSans',
|
|
),
|
|
),
|
|
Text(
|
|
textAlign: TextAlign.center,
|
|
'50%',
|
|
style: TextStyle(
|
|
fontSize: 10.sp,
|
|
fontWeight: FontWeight.normal,
|
|
color: Colors.white,
|
|
fontFamily: 'PlusJakartaSans',
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
SizedBox(
|
|
width: 20.sp,
|
|
),
|
|
Expanded(
|
|
child: ElevatedButton(
|
|
style: ElevatedButton.styleFrom(
|
|
backgroundColor: Colors.green,
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(10))),
|
|
onPressed: () {},
|
|
child: Column(
|
|
children: [
|
|
Text(
|
|
textAlign: TextAlign.center,
|
|
'Buy',
|
|
style: TextStyle(
|
|
fontSize: 15.sp,
|
|
fontWeight: FontWeight.bold,
|
|
color: Colors.white,
|
|
fontFamily: 'PlusJakartaSans',
|
|
),
|
|
),
|
|
Text(
|
|
textAlign: TextAlign.center,
|
|
'20%',
|
|
style: TextStyle(
|
|
fontSize: 10.sp,
|
|
fontWeight: FontWeight.normal,
|
|
color: Colors.white,
|
|
fontFamily: 'PlusJakartaSans',
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
)
|
|
],
|
|
),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|