Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Détection de vagues de Wolfe


Sujet :

Algorithmes et structures de données

  1. #1
    Membre du Club
    Détection de vagues de Wolfe
    Bonjour

    Je développé un petit simulateur boursier afin de détecter des vagues de Wolfe sur une courbe de prix. (http://www.broker-forex.fr/trading-vagues-de-wolfe.php)

    Une petite image valant souvent mieux qu un long discours :

    Pour y parvenir je parcours le fichier des prix et stocke les 5 derniers pics/creux dans une collection d objets et ensuite procède ainsi
    pour un Bullish :
    Si 3 < 5 et 1 <3 je calcule l équation de la droite passant par 1 & 3, je vérifie si 5 < la droite calculée, je vérifie que 4 < 2. Si toutes ces conditions sont remplies, j ai un signal pour un achat . Je procède de la même façon pour un signal à la vente.

    Je précise que je mets dans une bdd SQLIte tous les pics et creux successif (date de début, de fin, prix d ouverture, de clôture, sens et l'amplitude du mouvement). Peut être certaines de ces informations son inutiles ou redondantes comme les prix et l évolution du prix qui est la différence entre prix de début et de fin du mouvement mais je ne sais pas ce dont j aurais besoin, je préféré plus que moins.

    J arrive donc à détecter ce type de figure si elle est construite par 5 pics/creux successifs.

    Le pb est que l’évolution des prix entre chaque point est rarement aussi parfaite, rectiligne... Cela correspond plus souvent à ça

    Je cherche donc à identifier ce type de figure dans un 'environnement' complexe .
    Je m'initie à la programmation en Delphi depuis près d un mois et j avoue que là je suis totalement perdu bien en amont du codage mais bel et bien dans le raisonnement.

    Tous vos conseils, vos avis (même sur ma façon de procéder) sot les bienvenus.

    D avance merci

  2. #2
    Membre habitué
    Ton problème de raisonnement, est dû à deux choses: l'incertitude sur la prise de décision et l'aléatoire des données.
    Le problème n'est pas dans la méthode, mais dans la décision, il est donc insoluble par le raisonnement
    Savoir pour comprendre et vice versa.

  3. #3
    Rédacteur/Modérateur

    Tu as une BDD SQLLite ; je ne connais pas précisément SQLLIte, mais je vois SQL, donc c'est une bonne base.

    Supposons que ta table avec toutes les données brutes s'appelle BDD , avec comme colonnes IDValeur, NUMJOUR, VAL_MINI et VAL_MAXI

    Je considère que numjour est un entier, c'est beaucoup plus facile à manipuler qu'une date. Et ça permet de 'by-passer' facilement les jours fériés et les week-ends.

    Voici une requete qui peut donner pas mal de choses :
    Code SQL :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    select A1.IDValeur, A1.Numjour,  A1.val_mini as mini1 ,  A2.numjour  ,   A2.val_maxi as maxi2, A3.numjour,  A3.val_mini as mini3,  A4.numjour, a4.val_maxi as maxi4 ,  a5.numjour , a5.val_mini as mini5 
     from BDD A1 , BDD A2, BDD A3, BDD A4, BDD A5
    where A2.IDValeur = A1.IDValeur and A2.NUMJour > A1.Numjour 
    and  A3.IDValeur = A1.IDValeur and A3.NUMJour > A2.Numjour 
    and  A4.IDValeur = A1.IDValeur and A4.NUMJour > A3.Numjour 
    and  A5.IDValeur = A1.IDValeur and A5.NUMJour > A4.Numjour 
    and A3.VAL_MINI < A1.VAL_MINI
    and (A5.Val_mini-A1.val_mini)/(A5.num_jour-A1.num_jour) <  (A3.Val_mini-A1.val_mini)/(A3.num_jour-A1.num_jour) 
    and a4.val_maxi < A2.val_maxi
    and (A4.Val_maxi-A2.val_maxi)/(A4.num_jour-A2.num_jour) <  (A3.Val_mini-A1.val_mini)/(A3.num_jour-A1.num_jour) 
    and not exists 
    ( select * from BDD A0 
      where a0.idvaleur= A1.idvaleur 
       and a0.numjour between a1.numjour +1 and a5.numjour-1
    and  (A0.Val_mini-A1.val_mini)/(A0.num_jour-A1.num_jour) <  (A0.Val_mini-A1.val_mini)/(A3.num_jour-A1.num_jour) 
    )



    Ca veut dire quoi tout ça ?
    On cherche une action (identifiée par idValeur), on cherche 5 jours pas forcément consécutifs ,
    - on veut que le min du jour 5 soit en dessous de la droite passant par min(jour1) et min(jour3) ... c'est la restriction : and (A5.Val_mini-A1.val_mini)/(A5.num_jour-A1.num_jour) < (A3.Val_mini-A1.val_mini)/(A3.num_jour-A1.num_jour)
    - on veut que la droite passant par les points 2 et 4 descende, et on veut qu'elle descende plus vite que la droite passant par les points 1 et 3, pour que ces 2 droite se croisent dans un point qu'on va appeler ETA.
    - et on veut qu'il n'y ait pas d'autre point entre le jour 1 et le jour 5, qui soit en-dessous de la droite 1-3 : ( toute la partie qui commence par and not exists ...) Toute cette dernière partie a une syntaxe qui n'est peut-être pas acceptée par SQLLite ; tu peux commencer à t'amuser sans cette condition.

    Cette requête nous donne l'identifiant des actions qui ont cette configuration et les numéros des 5 jours qui conviennent, et les valeurs mini ou maxi qui nous intéressent, pour ces 5 jours ;
    On peut ajouter une colonne, avec le n° du jour où les 2 droites se rejoignent, et une autre colonne avec la valeur correspondante (le point ETA dans ton dernier graphique)

    Voilà une bonne base pour travailler.
    A toi de jouer.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  4. #4
    Membre du Club
    Merci.

    C est tellement clair que j ai tout compris à la première lecture.

    J avoue ne pas avoir envisagé les pentes dans mon raisonnement alors que c est d une logique implacable.

    Merci. Je vais potasser tout cela