Guide DataFeed Dukascopy

La librairie Dukascopy fournit l'accès à des données de marché historiques gratuites de Dukascopy Bank SA, couvrant plus de 1600 instruments financiers.

Qu'est-ce que Dukascopy ?

Dukascopy Bank SA est une banque suisse qui fournit des données de marché historiques gratuites (ticks et bars) via ses serveurs publics. La librairie Dukascopy de TheoryCraft facilite le téléchargement et le streaming de ces données directement dans vos pipelines de backtesting.

Cela fait de Dukascopy une source de données idéale pour backtester des stratégies sur le forex, les actions, les matières premières et les cryptomonnaies.

Instruments Disponibles

Catégorie Exemples Nombre
Forex Majors EUR/USD, GBP/USD, USD/JPY 7
Forex Crosses EUR/GBP, GBP/JPY, AUD/NZD 290+
Métaux XAU/USD (Or), XAG/USD (Argent) 50+
Actions AAPL.US/USD, MSFT.US/USD, GOOGL.US/USD 1000+
Matières premières Pétrole, Gaz Naturel 10+
Agricoles Blé, Maïs, Soja 6

Installation

En tant que Librairie

Ajoutez à votre mix.exs :

def deps do
[
{:dukascopy, github: "theorycraft-trading/dukascopy"}
]
end

En tant qu'Outil CLI

Installez l'interface en ligne de commande :

$> mix escript.install github theorycraft-trading/dukascopy

Utilisation CLI

Le CLI fournit deux commandes : download et search.

Rechercher des Instruments

Trouvez les instruments disponibles par symbole :

# Rechercher les paires EUR
$> dukascopy search EUR
# Rechercher l'action Apple
$> dukascopy search AAPL
# Rechercher Bitcoin
$> dukascopy search BTC

Télécharger des Données

Téléchargez des données historiques dans différents formats :

# Données journalières EUR/USD pour 2024
$> dukascopy download -i EUR/USD --from 2024-01-01 --to 2024-12-31
# Barres 5 minutes en format JSON
$> dukascopy download -i EUR/USD -t m5 --from 2024-01-01 -f json
# Données tick (très granulaires)
$> dukascopy download -i EUR/USD -t tick --from 2024-01-01 --to 2024-01-02
# Données horaires Or avec prix ask
$> dukascopy download -i XAU/USD -t h1 --from 2024-01-01 -p ask

Options CLI

Flag Défaut Description
-i, --instrument - Symbole de l'instrument (requis)
--from - Date de début AAAA-MM-JJ (requis)
--to now Date de fin (AAAA-MM-JJ ou "now")
-t, --timeframe D tick, m1, m5, m15, m30, h1, h4, D, W, M
-p, --price-type bid bid, ask, mid
-v, --volume-units millions millions, thousands, units
--flats false Inclure les barres à volume zéro
-f, --format csv csv, json, ndjson, none
-o, --output ./download Répertoire de sortie
--filename - Nom de fichier personnalisé (sans extension)
-s, --silent false Pas de sortie en-tête
--timezone Etc/UTC Fuseau horaire (ex : America/New_York)
--utc-offset 0 Décalage UTC en minutes
--market-open 00:00:00 Heure d'ouverture du marché (HH:MM:SS)
--weekly-open monday Jour de début de semaine
--batch-size 10 Téléchargements parallèles par batch
--batch-pause 1000 Pause entre les batches (ms)
--cache false Activer la mise en cache
--cache-path .dukascopy-cache Chemin du dossier de cache
--retries 3 Tentatives par requête
--retry-pause 500 Pause entre les tentatives (ms)
--proxy - URL du proxy (http://[user:pass@]host:port ou socks5://host:port)
--continue-on-error false Continuer malgré les erreurs (ATTENTION : peut causer des gaps de données)
-h, --help - Afficher l'aide

API Elixir

Module Instruments

iex> alias Dukascopy.Instruments
iex> Instruments.all()
["EUR/USD", "GBP/USD", "AAPL.US/USD", ...]
iex> Instruments.forex() # Tout le forex
iex> Instruments.forex_majors() # EUR/USD, GBP/USD, USD/JPY, etc.
iex> Instruments.forex_crosses() # EUR/GBP, GBP/JPY, etc.
iex> Instruments.metals() # XAU/USD, XAG/USD, etc.
iex> Instruments.stocks() # AAPL.US/USD, MSFT.US/USD, etc.
iex> Instruments.commodities() # Pétrole, Gaz Naturel, etc.
iex> Instruments.agriculturals() # Blé, Maïs, etc.
iex> Instruments.search("XAU")
["XAU/USD"]
iex> Instruments.search("AAPL")
["AAPL.US/USD"]

Streaming de Données

La fonction Dukascopy.stream/3 crée un stream lazy de données de marché.

iex> stream = Dukascopy.stream("EUR/USD", :tick, from: ~D[2024-01-01], to: ~D[2024-01-02])
iex> for tick <- stream do
...> IO.puts("#{tick.time}: bid=#{tick.bid} ask=#{tick.ask}")
...> end
2024-01-01 00:00:00.123Z: bid=1.10452 ask=1.10455
2024-01-01 00:00:00.456Z: bid=1.10453 ask=1.10456
2024-01-01 00:00:00.789Z: bid=1.10451 ask=1.10454
...
iex> stream = Dukascopy.stream("EUR/USD", :m5, from: ~D[2024-01-01], to: ~D[2024-01-31])
iex> for bar <- stream do
...> IO.puts("#{bar.time}: O=#{bar.open} H=#{bar.high} L=#{bar.low} C=#{bar.close}")
...> end
2024-01-01 00:00:00Z: O=1.10450 H=1.10480 L=1.10445 C=1.10472
2024-01-01 00:05:00Z: O=1.10472 H=1.10495 L=1.10468 C=1.10491
2024-01-01 00:10:00Z: O=1.10491 H=1.10502 L=1.10485 C=1.10498
...

Options de Stream

Plage de Dates (requis) :

Fournissez soit :from et :to (intervalle semi-ouvert [from, to)) soit :date_range (inclusif Date.Range).

# Avec from/to
iex> Dukascopy.stream("EUR/USD", :h1, from: ~D[2024-01-01], to: ~D[2024-02-01])
# Avec date_range
iex> Dukascopy.stream("EUR/USD", :h1, date_range: Date.range(~D[2024-01-01], ~D[2024-01-31]))

Toutes les Options :

Option Défaut Description
:price_type :bid :bid, :ask, ou :mid
:timezone "Etc/UTC" Chaîne de fuseau horaire (supporte DST)
:volume_units :millions :millions, :thousands, ou :units
:ignore_flats true Ignorer les barres à volume zéro
:batch_size 10 Requêtes parallèles par batch
:pause_between_batches_ms 1000 Délai entre les batches (ms)
:use_cache false Activer la mise en cache
:cache_folder_path ".dukascopy-cache" Répertoire de cache
:max_retries 3 Tentatives par requête
:market_open ~T[00:00:00] Heure d'ouverture du marché pour l'alignement
:weekly_open :monday Jour de début de semaine

Types de Prix

iex> Dukascopy.stream("EUR/USD", :h1, price_type: :bid, from: ~D[2024-01-01]) # Bid (défaut)
iex> Dukascopy.stream("EUR/USD", :h1, price_type: :ask, from: ~D[2024-01-01]) # Ask
iex> Dukascopy.stream("EUR/USD", :h1, price_type: :mid, from: ~D[2024-01-01]) # Mid

Intégration avec TheoryCraft

Utilisez Dukascopy.DataFeed comme source de données dans votre pipeline MarketSource :

iex> alias TheoryCraft.MarketSource
iex> opts = [
...> instrument: "EUR/USD",
...> granularity: :tick,
...> from: ~D[2024-01-01],
...> to: ~D[2024-01-31]
...> ]
iex> market =
...> %MarketSource{}
...> |> MarketSource.add_data({Dukascopy.DataFeed, opts}, name: "EURUSD")
...> |> MarketSource.resample("m5", name: "EURUSD_m5")
...> |> MarketSource.resample("h1", name: "EURUSD_h1")
iex> for event <- MarketSource.stream(market) do
...> IO.inspect(event)
...> end

Référence des Timeframes

Les timeframes peuvent être des atomes ou des chaînes (ex : :m5 ou "m5").
Le 1 est optionnel : D1 = D, h1 = h, etc...

Pattern Description Exemples
:tick Données tick brutes ticks
t<N> N ticks par barre t5, t100
s<N> Barres de N secondes s30
m<N> Barres de N minutes m1, m5, m15, m30
h<N> Barres de N heures h1, h4
D<N> Barres de N jours D, D3
W<N> Barres de N semaines W
M<N> Barres de N mois M

Conseils et Bonnes Pratiques

Utilisez le Cache

Activez la mise en cache pour éviter les téléchargements redondants :

iex> Dukascopy.stream("EUR/USD", :h1,
...> from: ~D[2024-01-01],
...> to: ~D[2024-06-30],
...> use_cache: true
...> )
$> dukascopy download -i EUR/USD -t h1 --from 2024-01-01 --to 2024-06-30 --cache

Commencez par les Timeframes Supérieurs

Commencez par les timeframes supérieurs pour un prototypage rapide, puis passez aux timeframes inférieurs pour des données plus précises :

# Itération rapide pendant le développement
iex> Dukascopy.stream("EUR/USD", :D, from: ~D[2020-01-01], to: ~D[2024-01-01])
# Données détaillées pour les tests finaux
iex> Dukascopy.stream("EUR/USD", :m1, from: ~D[2024-01-01], to: ~D[2024-03-01])
# Itération rapide pendant le développement
$> dukascopy download -i EUR/USD -t D --from 2020-01-01 --to 2024-01-01
# Données détaillées pour les tests finaux
$> dukascopy download -i EUR/USD -t m1 --from 2024-01-01 --to 2024-03-01

Gérez les Horaires de Marché

Les marchés forex ferment le weekend. Vos données auront des gaps du vendredi soir au dimanche soir.

Prochaines Étapes