diff --git a/JournalDeBord.md b/docs/JournalDeBord.md similarity index 80% rename from JournalDeBord.md rename to docs/JournalDeBord.md index 1ad0e72a16291989d34a56410a5ae924273f4a4a..82db096f248343ecd10ccb9d84544e68d732cdc8 100644 --- a/JournalDeBord.md +++ b/docs/JournalDeBord.md @@ -1,11 +1,12 @@ -| Date | Travail à réaliser | Travail effectué | Problèmes rencontrés | Commentaires | -|-----------------------|-----------------------------------------------------|------------------------------------------------------------------------|----------------------|-----------------------------------------------------------------------------------------------------------------------| -| 21.10.2024-28.10.2024 | Lancer le projet précédent et essayer le simulateur | Lancement du projet réussi + compréhension des résultats du simulateur | | Avoir la version de python 3.9 pour la compatibilité avec une récente version de numpy demandée dans requirements.txt | -| 28.10.2024-04.11.2024 | Lister les fonctionnalités nécessaires au projet + Lire la documentation de Mr Souzaluz | Lecture des parties "Lexique", "Liste des acronymes", "1.2 TRADING AUTOMATISÉ", "CHAPITRE 2 : LES STRATÉGIES" et "CHAPITRE 3 : MÉTHODOLOGIE" + Début du listage des fonctionnalités | | | -| 04.11.2024-11.11.2024 | Rechercher une API qui permet de récupérer les données de chaque seconde depuis 4-5 ans + Justifier le choix de la technologie | Listage des différentes API avec leurs avantages et désavantages + Justification de la technologie + Trouvé une librairie pour les graphiques | La plupart des API ont des limites de données par requêtes et de fréquences des données (1 min) | | -| 11.11.2024-18.11.2024 | Récupérer les données (200000) et tester la librairie pour faire des graphes | J'ai créer un projet spring boot qui permet de récupérer les données en faisant plusieurs appels à l'api Binance | Problème avec la librairie des graphiques : le graphique s'affiche mais pas les candles | | -| 18.11.2024-26.11.2024 | Afficher les données avec la librairie + Voir le temps que prends le programme pour récupérer 1 an de données + Mise en cache des données si récupération trop longue | Affichage des données avec la librairie. Il faut environ 1 minute pour récupérer 1 an de données. L'utilisateur peut choisir les dates qu'il veut. | Affichage des données pour plus de 10 jours : problème de chevauchement des timestamp de la 1ère requête et de la 2ème | | -| 26.11.2024-02.12.2024 | Commencer à implémenter le simulateur et commencer l'introduction | Début d'une introduction et implémentation d'un ticker (déclencher un évènement toutes les $x$ secondes) | | | -| 02.12.2024-09.12.2024 | Continuer de faire la doc et avancement du simulateur | Développement de l'introduction + ajout des choix technologiques + debut d'algo pour approximation du prix | On connait que les x et y de 2 points et les y des 2 autres points -> problème fonction 1er degré -> droite | Tester algo d'approximation du prix avec des données que l'on connait pour être sûr d'avoir la bonne approximation | +| Date | Travail à réaliser | Travail effectué | Problèmes rencontrés | Commentaires | Solutions aux problèmes | +|-----------------------|-----------------------------------------------------|------------------------------------------------------------------------|----------------------|-----------------------------------------------------------------------------------------------------------------------|--| +| 21.10.2024-28.10.2024 | Lancer le projet précédent et essayer le simulateur | Lancement du projet réussi + compréhension des résultats du simulateur | | Avoir la version de python 3.9 pour la compatibilité avec une récente version de numpy demandée dans requirements.txt | | +| 28.10.2024-04.11.2024 | Lister les fonctionnalités nécessaires au projet + Lire la documentation de Mr Souzaluz | Lecture des parties "Lexique", "Liste des acronymes", "1.2 TRADING AUTOMATISÉ", "CHAPITRE 2 : LES STRATÉGIES" et "CHAPITRE 3 : MÉTHODOLOGIE" + Début du listage des fonctionnalités | | | | +| 04.11.2024-11.11.2024 | Rechercher une API qui permet de récupérer les données de chaque seconde depuis 4-5 ans + Justifier le choix de la technologie | Listage des différentes API avec leurs avantages et désavantages + Justification de la technologie + Trouvé une librairie pour les graphiques | La plupart des API ont des limites de données par requêtes et de fréquences des données (1 min) | | | +| 11.11.2024-18.11.2024 | Récupérer les données (200000) et tester la librairie pour faire des graphes | J'ai créer un projet spring boot qui permet de récupérer les données en faisant plusieurs appels à l'api Binance | Problème avec la librairie des graphiques : le graphique s'affiche mais pas les candles | | | +| 18.11.2024-26.11.2024 | Afficher les données avec la librairie + Voir le temps que prends le programme pour récupérer 1 an de données + Mise en cache des données si récupération trop longue | Affichage des données avec la librairie. Il faut environ 1 minute pour récupérer 1 an de données. L'utilisateur peut choisir les dates qu'il veut. | Affichage des données pour plus de 10 jours : problème de chevauchement des timestamp de la 1ère requête et de la 2ème | | | +| 26.11.2024-02.12.2024 | Commencer à implémenter le simulateur et commencer l'introduction | Début d'une introduction et implémentation d'un ticker (déclencher un évènement toutes les $x$ secondes) | | | | +| 02.12.2024-09.12.2024 | Continuer de faire la doc et avancement du simulateur | Développement de l'introduction + ajout des choix technologiques + debut d'algo pour approximation du prix | On connait que les x et y de 2 points et les y des 2 autres points -> problème fonction 1er degré -> droite | Tester algo d'approximation du prix avec des données que l'on connait pour être sûr d'avoir la bonne approximation | | +| 09.12.2024-16.12.2024 | Continuer la documentation et le simulateur | Passage de la documentation dans le model word + Fin de l'interpolation de Lagrange + Début de l'implémentation de la simulation | | | Problème de la semaine précédente : Générer des temps aléatoires pour le prix high et low | <!-- | | | | | | --> \ No newline at end of file diff --git a/documentation.md b/docs/documentation.md similarity index 100% rename from documentation.md rename to docs/documentation.md diff --git a/documentation.pdf b/docs/documentation.pdf similarity index 100% rename from documentation.pdf rename to docs/documentation.pdf diff --git a/fonctionnalites.md b/docs/fonctionnalites.md similarity index 100% rename from fonctionnalites.md rename to docs/fonctionnalites.md diff --git a/docs/img/y1.png b/docs/img/y1.png new file mode 100644 index 0000000000000000000000000000000000000000..331f1e224714b9b82ad1c6984de64678b062efa5 Binary files /dev/null and b/docs/img/y1.png differ diff --git a/docs/img/y2.png b/docs/img/y2.png new file mode 100644 index 0000000000000000000000000000000000000000..4704574503c2b32f5ea521b440c026ebb3c71627 Binary files /dev/null and b/docs/img/y2.png differ diff --git a/docs/img/y3.png b/docs/img/y3.png new file mode 100644 index 0000000000000000000000000000000000000000..fbd67bcb405cf15ca37eb6e478738bf9cb2df1cb Binary files /dev/null and b/docs/img/y3.png differ diff --git a/docs/img/y4.png b/docs/img/y4.png new file mode 100644 index 0000000000000000000000000000000000000000..535276c9ea2071ffff645569c5e00efd1b5b0e1e Binary files /dev/null and b/docs/img/y4.png differ diff --git a/docs/img/y5.png b/docs/img/y5.png new file mode 100644 index 0000000000000000000000000000000000000000..e26195bb6743334cd3c85088ff1f2beef6630566 Binary files /dev/null and b/docs/img/y5.png differ diff --git a/docs/img/y6.png b/docs/img/y6.png new file mode 100644 index 0000000000000000000000000000000000000000..4df4cb81c89d0cb2dfdd2404206e9a1ce654c2e7 Binary files /dev/null and b/docs/img/y6.png differ diff --git a/docs/img/y7.png b/docs/img/y7.png new file mode 100644 index 0000000000000000000000000000000000000000..b7debc9506d88fe03b1362ab1d612bc633cf3ea2 Binary files /dev/null and b/docs/img/y7.png differ diff --git a/docs/img/y8.png b/docs/img/y8.png new file mode 100644 index 0000000000000000000000000000000000000000..c54e9f12095393c11f695b235c86175b69b3af6f Binary files /dev/null and b/docs/img/y8.png differ diff --git a/docs/rapport_Anthonioz_Benjamin.docx b/docs/rapport_Anthonioz_Benjamin.docx new file mode 100644 index 0000000000000000000000000000000000000000..eb82df56d992aa8df70d515cab58dc3f629acbf0 Binary files /dev/null and b/docs/rapport_Anthonioz_Benjamin.docx differ diff --git a/docs/rapport_Anthonioz_Benjamin.pdf b/docs/rapport_Anthonioz_Benjamin.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cd90d0ae52cd5efb6e09ab93016234d3e858f77a Binary files /dev/null and b/docs/rapport_Anthonioz_Benjamin.pdf differ diff --git a/testApi/src/main/java/com/example/testapi/controller/ApiController.java b/testApi/src/main/java/com/example/testapi/controller/ApiController.java index 839b7d7dccaf873de960fed53d11043594285758..f30a411294720dd0cdb10ea5f4e6e70e65b75168 100644 --- a/testApi/src/main/java/com/example/testapi/controller/ApiController.java +++ b/testApi/src/main/java/com/example/testapi/controller/ApiController.java @@ -52,6 +52,12 @@ public class ApiController { this.simulateur.stopSimulation(); } + @GetMapping("/test") + public void test() { + long[] x_tab = {1, -1, 2, 2}; + float[] y = {3, 2, -1, -1}; + this.simulateur.approximatePrice(x_tab, y, 3); + } diff --git a/testApi/src/main/java/com/example/testapi/model/Interval.java b/testApi/src/main/java/com/example/testapi/model/Interval.java new file mode 100644 index 0000000000000000000000000000000000000000..eb73c65d1f0a8bb6d5d7a11ddecbc65d036460c7 --- /dev/null +++ b/testApi/src/main/java/com/example/testapi/model/Interval.java @@ -0,0 +1,38 @@ +package com.example.testapi.model; + + + +public class Interval { + private int deltaTime; + private Candle currentCandle; + + public Interval(Candle currentCandle) { + this.deltaTime = 0; + this.currentCandle = currentCandle; + } + + public Candle getCurrentCandle() { + return currentCandle; + } + + public int getDeltaTime() { + return deltaTime; + } + + public void updateDeltaTime() { + this.deltaTime += 1000; + } + + public double checkprice(double price) { + if (price > this.currentCandle.getHigh()) { + return this.currentCandle.getHigh(); + } + else if (price < this.currentCandle.getLow()) { + return this.currentCandle.getLow(); + } + else { + return price; + } + } + +} diff --git a/testApi/src/main/java/com/example/testapi/service/ApiService.java b/testApi/src/main/java/com/example/testapi/service/ApiService.java index 7d9b6692500eee1bd3c2587801c8ea9dbdc2529c..a9e54d1acb1f9543207369c40a1d24eab2ad999a 100644 --- a/testApi/src/main/java/com/example/testapi/service/ApiService.java +++ b/testApi/src/main/java/com/example/testapi/service/ApiService.java @@ -1,5 +1,6 @@ package com.example.testapi.service; +import com.example.testapi.model.Interval; import com.fasterxml.jackson.core.type.TypeReference; import com.example.testapi.model.Candle; import com.fasterxml.jackson.databind.ObjectMapper; @@ -29,6 +30,10 @@ public class ApiService { private static final long TIME_10_JOURS = 10 * 24 * 60 * 60 * 1000; + public List<Candle> getCandles() { + return candles; + } + public void getCandles(long startTime, long endTime) throws InterruptedException, com.fasterxml.jackson.core.JsonProcessingException { if (endTime < startTime) { System.out.println("La date de fin ne peut pas être avant la date de début"); @@ -87,18 +92,6 @@ public class ApiService { } -// private final WebClient webClient; -// -// public ApiService(WebClient.Builder webClientBuilder) { -// this.webClient = webClientBuilder.baseUrl("https://api.example.com").build(); -// } -// -// public String callApi() { -// return webClient.get() -// .uri("/resource") -// .retrieve() -// .bodyToMono(String.class) -// .block(); // Bloque pour obtenir le résultat dans un contexte synchrone -// } + } diff --git a/testApi/src/main/java/com/example/testapi/service/SimulateurService.java b/testApi/src/main/java/com/example/testapi/service/SimulateurService.java index fff346dcdbc43b69ccad9a497d1adac220891101..31d958aadfd9be1cad606d8b4add0dda87ed8d7f 100644 --- a/testApi/src/main/java/com/example/testapi/service/SimulateurService.java +++ b/testApi/src/main/java/com/example/testapi/service/SimulateurService.java @@ -1,19 +1,31 @@ package com.example.testapi.service; +import com.example.testapi.model.Candle; +import com.example.testapi.model.Interval; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import java.util.List; +import java.util.function.Function; import java.util.function.LongConsumer; @Service public class SimulateurService { + private final ApiService apiService; private Ticker ticker; private int periodApproximationSec; + private Interval interval; + private List<Candle> candles; + private int indexCurrCandle; - public SimulateurService(@Value("${simulateur.ApproximationPeriod}") int periodApproximationSec) { + public SimulateurService(@Value("${simulateur.ApproximationPeriod}") int periodApproximationSec, ApiService apiService) { this.periodApproximationSec = periodApproximationSec; Runnable task = () -> System.out.println("Print après " + this.periodApproximationSec + " sec"); this.ticker = new Ticker(task); + this.apiService = apiService; + this.candles = apiService.getCandles(); + this.indexCurrCandle = 0; + this.interval = new Interval(this.candles.get(this.indexCurrCandle)); } public void startSimulation() { @@ -24,22 +36,29 @@ public class SimulateurService { this.ticker.stop(); } - public void approximatePrice(long[] x_tab, float[] y, int n) { - LongConsumer funcApproxPrice = (long x) -> { - double[] poly_pts = new double[n]; - for (int i = 0; i < x_tab.length; i++) { - double res = 1; - for (int j = 0; j < n; j++) { - if (i != j) { - res *= (double) (x - x_tab[j]) / (x_tab[i] - x_tab[j]); - } + public double approximatePrice(long[] x_tab, float[] y, long x) { + double res = 0.0; + int n = x_tab.length; + for (int i = 0; i < n; i++) { + double tmp = y[i]; + for (int j = 0; j < n; j++) { + if (i != j) { + tmp *= (double) (x - x_tab[j]) / (x_tab[i] - x_tab[j]); } - poly_pts[i] = res; } - double poly = 0; - for (int i = 0; i < n; i++) { - poly += y[i] * poly_pts[i]; - } - }; + res += tmp; + } + System.out.println("res approx : " + res); + return res; } + + public void taskEachSec() { + long x = interval.getCurrentCandle().getTime() + this.interval.getDeltaTime(); + long[] x_tab = {}; + float[] y = {}; + this.approximatePrice(x_tab, y, x); + + interval.updateDeltaTime(); + } + }