This example repository shows how to use CCXT-compatible exchange adapter for GMX, a decentralised perpetual futures exchange.
The CCXT-compatible adapter is used with FreqTrade, an algorithmic trading framework for Python to run an example automated trading strategy on GMX.
This project is funded by an Arbitrum DAO grant.
The example provide a handful of FreqTrade strategy modules and configs to get started.
- Overview
- Installation
- Backtesting
- Live trading
- FreqUI
- Stale positions
- Fees and tokens
- How GMX is enabled in CCXT and FreqTrade via monkey patch
- Next steps
- Support
- License
- CCXT-compatible interface to GMX's onchain trading
- FreqTrade-compatible run our trading algorithms on deep GMX liquidity
- Backtest with historical GMX data
- Trading vaults for user-investable trading strategies and copy trading on GMX
- DeFi composability and smart contract integration
- Robustness: Arbitrum gas management, MEV blocking and RPC fallback
Note: This is still work-in-progress development. If you intend to use this software check Support section first.
GMX's unique AMM offers benefits for traders
- Deep liquidity
- Self custodial, transparent, less conterparty risk
- Pure onchain, composable with DeFi strategies and smart contracts
- Onchain data and execution availability ensures robust, self-hosted, API access
Python package web3-ethereum-defi includes
GMX-specific CCXT adapter code and monkey-patches to FreqTrade, so that you can run strategies by choosing gmx exchange type
The adapter is provided by eth_defi Python package, which provides necessary low-level primitives for RPC, smart contract interaction, onchain data ignestion. These are mapped to CCXT/FreqTrade transparently, so that you need a minimum modifications to your algorithsm to make them run onchain.
To run this tutorial
- Python 3.12 only+ (see web3-ethereum-defi README for the status of Python version compatibility)
- Git: for cloning and submodule management
- 10GB+ disk space: historical data, a lot of code to check out
- System dependencies: for talib - see below
- Basic UNIX command line knowledge
Microsoft Windows users need to use Windows Subsystem for Linux (WSL).
If you want to start building a real trading strategy, ADX momemntum is the best starting point.
We recommend pyenv to install Python 3.12 or a specific Python version.
# Update repository
sudo apt-get update
# Install packages
sudo apt install -y python3-pip python3-venv python3-dev python3-pandas git curl# Install packages
brew install gettext libompFor other systems or troubleshooting, see the official Freqtrade installation requirements.
# Submodules must be included in the checkout (includes gmx-data-collector)
git clone --recurse-submodules https://github.com/tradingstrategy-ai/gmx-ccxt-freqtrade.git
cd gmx-ccxt-freqtrade
git submodule update --init --recursiveIf you cloned without --recurse-submodules, initialize submodules:
git submodule update --init --recursiveWe need to install Freqtrade from a local checkout:
# Clone freqtrade repository
# this naming is very important else python will get confused because the freqtrade command and the directory name would be same
git clone --depth 1 --branch stable https://github.com/freqtrade/freqtrade.git freqtrade-develop
# Create virtual environment in main project directory using uv
python -m venv .venv
# Activate the virtual environment
source .venv/bin/activate # Linux/macOS
# Install freqtrade dependencies
pip install -r freqtrade-develop/requirements.txt
# Install freqtrade itself (editable mode)
pip install -e freqtrade-develop/The adapter lives in eth_defi/gmx/ccxt submodule. This will add necessary classes to both CCXT and FreqTrade.
The adapter is injected to Python process via monkey patching. Due to internal Python structure,
we need to use a special wrapper command around freqtrade to launch it.
# Install web3-ethereum-defi from local submodule (includes freqtrade integration).
# TODO: Currently there is an installation issue resolving web3-ethereum-defi dependencies with uv.
pip install "web3-ethereum-defi[data,ccxt]"Show installed packages:
pip list|grep -i web3You should see web3-ethereum-defi package which provides CCXT and FreqTrade monkey patches:
web3 7.14.0
web3-ethereum-defi 0.35 /Users/moo/code/gmx-ccxt-freqtrade/deps/web3-ethereum-defiWe run freqtrade using our freqtrade-gmx wrapper command.
See that we can start freqtrade with our GMX monkey patches:
./freqtrade-gmx --versionThis should output:
Applying GMX monkeypatch to Freqtrade...
Verifying GMX monkeypatch...
ccxt.async_support.gmx = <class 'eth_defi.gmx.ccxt.async_support.exchange.GMX'>
Class module: eth_defi.gmx.ccxt.async_support.exchange
β load_markets is async
GMX support enabled successfully!
Operating System: macOS-15.6.1-arm64-arm-64bit
Python Version: Python 3.11.10
CCXT Version: 4.5.20
Freqtrade Version: freqtrade 2025.11
In this section, we run a strategy backtest to see how FreqTrade strategy would have historically performend on GMX.
For a backtest you need
- A FreqTrade strategy module that describes the strategy lofic
- A FreqTrade config that describes the exchange we connect to
- Exchange API keys needed to download historical data (GMX doesn't need this as APIs are public)
Note: Because of GMX's internal limitations, the GMX historical data REST API only serves approximately 4,320 candles (about 6 months of 1h data). This means you must choose a time range within the last ~6 months for backtesting to work. The exact available range shifts forward over time. If you get InsufficientHistoricalDataError, adjust your start date to be more recent.
Here we backtest ADX momentum strategy.
- Trades majors: BTC, SOL, DOGE, ETH
- Uses 1h timeframe
You can obtain GMX historical data in two ways:
The gmx-data-collector submodule collects candles and funding rates from GMX API, Chainlink, and on-chain oracle events, then exports directly to user_data/data/gmx/futures/.
# Ensure submodule is initialized
git submodule update --init --recursive
# Copy .env.example to .env and add your HYPERSYNC_API_TOKEN and JSON_RPC_ARBITRUM
cp .env.example .env
# Run full pipeline: collect + export
source .env && make gmx-dataData is written to user_data/data/gmx/futures/. This provides broader historical coverage than the GMX REST API alone.
FreqTrade provides a command that fetches GMX market data from the GMX GraphQL endpoint and stores it locally. Choose a time range within the last ~6 months. For example, if today is February 2026:
BACKTEST_TIME_RANGE=20250901-20260201
./freqtrade-gmx download-data \
--config configs/adxmomentum_gmx.json \
--config configs/secrets.empty.json \
--exchange gmx \
--timeframe 1h \
--timerange $BACKTEST_TIME_RANGEExample output:
2025-12-10 12:20:51,030 - freqtrade.data.history.history_utils - INFO - Download history data for "ETH/USDC:USDC", 1h, index and store in /Users/moo/code/gmx-ccxt-freqtrade/user_data/data/gmx. From 2025-12-10T09:00:00 to
2025-12-08T00:00:00
2025-12-10 12:20:51,033 - freqtrade.data.history.history_utils - INFO - Downloaded data for ETH/USDC:USDC with length 0.
Timeframe βββββββββββββββββββββββββββββββββββββ 3/3 100% β’ 0:00:01 β’ 0:00:00
Downloading ETH/USDC:USDC βββββββββββββββββββββββββββββββββββββ 4/4 100% β’ 0:00:01 β’ 0:00:00
2025-12-10 12:20:51,111 - eth_defi.gmx.ccxt.async_support.exchange - INFO - Async GMX exchange session closed
# Backtest the ADX momentum strategy
./freqtrade-gmx backtesting \
--config configs/adxmomentum_gmx.json \
--config configs/secrets.empty.json \
--strategy ADXMomentum \
--timerange $BACKTEST_TIME_RANGEYou should see backtest results with trades, profit, and statistics:
BACKTESTING REPORT
ββββββββββββββββββ³βββββββββ³βββββββββββββββ³ββββββββββββββββββ³βββββββββββββββ³βββββββββββββββββββ³βββββββββββββββββββββββββ
β Pair β Trades β Avg Profit % β Tot Profit USDC β Tot Profit % β Avg Duration β Win Draw Loss Win% β
β‘ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ©
β DOGE/USDC:USDC β 17 β 2.31 β 5.894 β 5.89 β 1 day, 10:39:00 β 12 0 5 70.6 β
β SOL/USDC:USDC β 27 β 0.93 β 3.751 β 3.75 β 1 day, 23:00:00 β 16 0 11 59.3 β
β ETH/USDC:USDC β 20 β 0.38 β 1.143 β 1.14 β 1 day, 18:57:00 β 10 0 10 50.0 β
β BTC/USDC:USDC β 15 β 0.34 β 0.773 β 0.77 β 2 days, 22:24:00 β 5 0 10 33.3 β
β TOTAL β 79 β 0.97 β 11.560 β 11.56 β 1 day, 23:46:00 β 43 0 36 54.4 β
ββββββββββββββββββ΄βββββββββ΄βββββββββββββββ΄ββββββββββββββββββ΄βββββββββββββββ΄βββββββββββββββββββ΄βββββββββββββββββββββββββ
LEFT OPEN TRADES REPORT
βββββββββ³βββββββββ³βββββββββββββββ³ββββββββββββββββββ³βββββββββββββββ³βββββββββββββββ³βββββββββββββββββββββββββ
β Pair β Trades β Avg Profit % β Tot Profit USDC β Tot Profit % β Avg Duration β Win Draw Loss Win% β
β‘βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ©
β TOTAL β 0 β 0.0 β 0.000 β 0.0 β 0:00 β 0 0 0 0 β
βββββββββ΄βββββββββ΄βββββββββββββββ΄ββββββββββββββββββ΄βββββββββββββββ΄βββββββββββββββ΄βββββββββββββββββββββββββ
ENTER TAG STATS
βββββββββββββ³ββββββββββ³βββββββββββββββ³ββββββββββββββββββ³βββββββββββββββ³ββββββββββββββββββ³βββββββββββββββββββββββββ
β Enter Tag β Entries β Avg Profit % β Tot Profit USDC β Tot Profit % β Avg Duration β Win Draw Loss Win% β
β‘βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ©
β OTHER β 79 β 0.97 β 11.560 β 11.56 β 1 day, 23:46:00 β 43 0 36 54.4 β
β TOTAL β 79 β 0.97 β 11.560 β 11.56 β 1 day, 23:46:00 β 43 0 36 54.4 β
βββββββββββββ΄ββββββββββ΄βββββββββββββββ΄ββββββββββββββββββ΄βββββββββββββββ΄ββββββββββββββββββ΄βββββββββββββββββββββββββ
EXIT REASON STATS
βββββββββββββββ³ββββββββ³βββββββββββββββ³ββββββββββββββββββ³βββββββββββββββ³ββββββββββββββββββ³βββββββββββββββββββββββββ
β Exit Reason β Exits β Avg Profit % β Tot Profit USDC β Tot Profit % β Avg Duration β Win Draw Loss Win% β
β‘βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ©
β roi β 42 β 5.0 β 31.500 β 31.5 β 1 day, 20:23:00 β 42 0 0 100 β
β exit_signal β 37 β -3.59 β -19.939 β -19.94 β 2 days, 3:36:00 β 1 0 36 2.7 β
β TOTAL β 79 β 0.97 β 11.560 β 11.56 β 1 day, 23:46:00 β 43 0 36 54.4 β
βββββββββββββββ΄ββββββββ΄βββββββββββββββ΄ββββββββββββββββββ΄βββββββββββββββ΄ββββββββββββββββββ΄βββββββββββββββββββββββββ
MIXED TAG STATS
βββββββββββββ³ββββββββββββββ³βββββββββ³βββββββββββββββ³ββββββββββββββββββ³βββββββββββββββ³ββββββββββββββββββ³βββββββββββββββββββββββββ
β Enter Tag β Exit Reason β Trades β Avg Profit % β Tot Profit USDC β Tot Profit % β Avg Duration β Win Draw Loss Win% β
β‘ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ©
β β roi β 42 β 5.0 β 31.500 β 31.5 β 1 day, 20:23:00 β 42 0 0 100 β
β β exit_signal β 37 β -3.59 β -19.939 β -19.94 β 2 days, 3:36:00 β 1 0 36 2.7 β
β TOTAL β β 79 β 0.97 β 11.560 β 11.56 β 1 day, 23:46:00 β 43 0 36 54.4 β
βββββββββββββ΄ββββββββββββββ΄βββββββββ΄βββββββββββββββ΄ββββββββββββββββββ΄βββββββββββββββ΄ββββββββββββββββββ΄βββββββββββββββββββββββββ
SUMMARY METRICS
βββββββββββββββββββββββββββββββββ³ββββββββββββββββββββββββββββββββββ
β Metric β Value β
β‘ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ©
β Backtesting from β 2025-07-01 20:00:00 β
β Backtesting to β 2025-12-08 00:00:00 β
β Trading Mode β Isolated Futures β
β Max open trades β 2 β
β β β
β Total/Daily Avg Trades β 79 / 0.5 β
β Starting balance β 100 USDC β
β Final balance β 111.56 USDC β
β Absolute profit β 11.56 USDC β
β Total profit % β 11.56% β
β CAGR % β 28.55% β
β Sortino β 4.32 β
β Sharpe β 2.04 β
β Calmar β 20.46 β
β SQN β 1.89 β
β Profit factor β 1.58 β
β Expectancy (Ratio) β 0.15 (0.26) β
β Avg. daily profit β 0.073 USDC β
β Avg. stake amount β 15 USDC β
β Total trade volume β 2384.405 USDC β
β β β
β Best Pair β DOGE/USDC:USDC 5.89% β
β Worst Pair β BTC/USDC:USDC 0.77% β
β Best trade β SOL/USDC:USDC 5.00% β
β Worst trade β SOL/USDC:USDC -9.68% β
β Best day β 2.25 USDC β
β Worst day β -1.837 USDC β
β Days win/draw/lose β 28 / 100 / 27 β
β Min/Max/Avg. Duration Winners β 0d 00:00 / 12d 07:00 / 1d 20:14 β
β Min/Max/Avg. Duration Losers β 0d 10:00 / 9d 12:00 / 2d 03:58 β
β Max Consecutive Wins / Loss β 11 / 8 β
β Rejected Entry signals β 898 β
β Entry/Exit Timeouts β 0 / 0 β
β β β
β Min balance β 99.533 USDC β
β Max balance β 119.053 USDC β
β Max % of account underwater β 6.79% β
β Absolute drawdown β 8.082 USDC (6.79%) β
β Drawdown duration β 48 days 07:00:00 β
β Profit at drawdown start β 19.053 USDC β
β Profit at drawdown end β 10.971 USDC β
β Drawdown start β 2025-10-13 19:00:00 β
β Drawdown end β 2025-12-01 02:00:00 β
β Market change β -2.70% β
βββββββββββββββββββββββββββββββββ΄ββββββββββββββββββββββββββββββββββ
Backtested 2025-07-01 20:00:00 -> 2025-12-08 00:00:00 | Max open trades : 2
STRATEGY SUMMARY
βββββββββββββββ³βββββββββ³βββββββββββββββ³ββββββββββββββββββ³βββββββββββββββ³ββββββββββββββββββ³βββββββββββββββββββββββββ³ββββββββββββββββββββ
β Strategy β Trades β Avg Profit % β Tot Profit USDC β Tot Profit % β Avg Duration β Win Draw Loss Win% β Drawdown β
β‘ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ©
β ADXMomentum β 79 β 0.97 β 11.560 β 11.56 β 1 day, 23:46:00 β 43 0 36 54.4 β 8.082 USDC 6.79% β
βββββββββββββββ΄βββββββββ΄βββββββββββββββ΄ββββββββββββββββββ΄βββββββββββββββ΄ββββββββββββββββββ΄βββββββββββββββββββββββββ΄ββββββββββββββββββββ
2025-12-10 13:01:36,182 - eth_defi.gmx.ccxt.async_support.exchange - INFO - Async GMX exchange session closed
You can view the equity curve chart of the backtest results with:
./freqtrade-gmx plot-profit \
--config configs/adxmomentum_gmx.json \
--config configs/secrets.empty.json \
--auto-openYou can view the entries/exits chart of the strategy with. This will render the chart and open a new browser window to display it:
./freqtrade-gmx plot-dataframe \
--config configs/adxmomentum_gmx.json \
--config configs/secrets.empty.json \
--strategy ADXMomentum \
--indicators1 adx plus_di minus_di \
--indicators2 mom
open user_data/plot/freqtrade-plot-ETH_USDC_USDC-1h.htmlFor live trading you are going to need
- USDC on Arbitrum (native variant) as collateral.
- ETH for gas fees
To to start trading we need a funded wallet on Arbitrum.
Create a new private key on a command line:
python -c "from web3 import Web3; w3 = Web3(); acc = w3.eth.account.create(); print(f'private key={w3.to_hex(acc._private_key)}, account={acc.address}')"You will get output like:
private key=<...>, account=0x881B099b365d7B6F92B2Adf18732470AcBBebBE5
Import private key in your wallet like Rabby.
Fund it with WETH and USDC on Arbitrum.
Then you can set this as an environment variable:
export GMX_PRIVATE_KEY=<...>The private key must be 0x prefixed.
We need to use multiple RPC providers with Arbitrum, with the Arbitrum specific sequencer being the MEV-resistant centralised sequencer for broadcasting our transactions.
You also need a high quality commercial RPC provider for JSON-RPC chain reads, as free providers are too flaky and likely to crash your trading in few transactions. You also likely want to configure at least two read providers to ensure that the FreqTrade does not crash if one of them gets flaky.
Set them as a space separated list:
export JSON_RPC_ARBITRUM="mev+https://arb1-sequencer.arbitrum.io/rpc <your providert 1> <your provider 2>"Some providers to try
- dRPC
- Alchemy
- Quicknode
We pass secrets to FreqTrade via a separate config file that lives outside the repository, so we minimise the risk of exposing our secrets. We use .config directory in user home.
We also set a username/password for localhost web UI: freq-ui.
Generate ~/.config/freqtrade.secrets.json from the environment variables set above:
jq -n \
--arg rpcUrl "$JSON_RPC_ARBITRUM" \
--arg privateKey "$GMX_PRIVATE_KEY" \
'{
exchange: {ccxt_config: {rpcUrl: $rpcUrl, privateKey: $privateKey}},
api_server: {
enabled: true,
listen_ip_address: "127.0.0.1",
listen_port: 8080,
username: "tradingstrategy.ai",
password: "tradingstrategy.ai"
}
}' \
> ~/.config/freqtrade.secrets.json
echo "Secret config is:"
cat ~/.config/freqtrade.secrets.jsonWe do a trading test using a ping pong strategy that opens and closes positions on both long and short side to see the trading works. Ping pong opens a long position in one cycle (candle) and closes it in the next. See Pingpong.py here. Ping pong uses 5m candles, so it opens a position in 5 minutes and then closes it in 5 minutes.
The startup is coming to take a minute or so.
./freqtrade-gmx trade \
--strategy Pingpong \
--config configs/pingpong_gmx.json \
--config ~/.config/freqtrade.secrets.json \
--log-file freqtrade.logsYou should see output:
pplying GMX monkeypatch to Freqtrade...
Verifying GMX monkeypatch...
ccxt.async_support.gmx = <class 'eth_defi.gmx.ccxt.async_support.exchange.GMX'>
Class module: eth_defi.gmx.ccxt.async_support.exchange
β load_markets is async
GMX support enabled successfully!
2026-02-12 14:20:02,314 - freqtrade - INFO - freqtrade 2026.1
2026-02-12 14:20:02,555 - freqtrade.worker - INFO - Starting worker 2026.1
2026-02-12 14:20:02,555 - freqtrade.configuration.load_config - INFO - Using config: configs/pingpong_gmx.json ...
2026-02-12 14:20:02,556 - freqtrade.configuration.load_config - INFO - Using config: /Users/moo/.config/freqtrade.secrets.json ...
2026-02-12 14:20:02,556 - freqtrade.configuration.environment_vars - INFO - Loading variable 'FREQTRADE__EXCHANGE__CCXT_CONFIG'
2026-02-12 14:20:02,556 - freqtrade.configuration.environment_vars - INFO - Key parts: ['EXCHANGE', 'CCXT_CONFIG']
2026-02-12 14:20:02,558 - freqtrade.loggers - INFO - Enabling colorized output.
2026-02-12 14:20:02,558 - freqtrade.loggers - INFO - Logfile configured
2026-02-12 14:20:02,558 - freqtrade.loggers - INFO - Verbosity set to 0
2026-02-12 14:20:02,558 - freqtrade.configuration.configuration - INFO - Runmode set to live.
And then:
2026-02-12 14:40:29,011 - eth_defi.gmx.ccxt.async_support.exchange - INFO - Loading markets from REST API (default mode)
2026-02-12 14:41:39,277 - eth_defi.gmx.ccxt.async_support.exchange - INFO - Loaded 110 markets from REST API
2026-02-12 14:41:39,283 - eth_defi.gmx.ccxt.exchange - INFO - Loading markets from REST API (default mode)
2026-02-12 14:41:41,056 - eth_defi.gmx.ccxt.exchange - INFO - Loaded 106 markets from REST API (21 excluded)
And then:
2026-02-12 14:42:24,905 - pingpong - INFO - π― ENTRY SIGNAL: ETH/USDC:USDC | Price: 1967.4872 | Time: 2026-02-12 14:42:24.905823
And then:
2026-02-12 15:27:44,652 - freqtrade.worker - INFO - Bot heartbeat. PID=56064, version='2026.1', state='RUNNING'
2026-02-12 15:27:44,655 - pingpong - INFO - π BOT LOOP START: 2026-02-12 06:27:44.655105+00:00 | Open Trades: 1
2026-02-12 15:27:45,496 - freqtrade.freqtradebot - INFO - No currency pair in active pair whitelist, but checking to exit open trades.
2026-02-12 15:27:59,660 - pingpong - INFO - π BOT LOOP START: 2026-02-12 06:27:59.660384+00:00 | Open Trades: 1
2026-02-12 15:28:14,676 - pingpong - INFO - π BOT LOOP START: 2026-02-12 06:28:14.674233+00:00 | Open Trades: 1
2026-02-12 15:28:29,670 - pingpong - INFO - π BOT LOOP START: 2026-02-12 06:28:29.670521+00:00 | Open Trades: 1
And then:
2026-02-12 15:30:22,597 - eth_defi.gmx.ccxt.exchange - INFO - Closing LONG position: size=$15.00, collateral=$15.00 (15.001809 USDC), leverage=1.0x
And then:
2026-02-12 15:30:30,513 - eth_defi.gmx.ccxt.exchange - INFO - ORDER_TRACE: create_order() - Order EXECUTED successfully - price=1977.77, size_usd=15.00
2026-02-12 15:30:30,514 - eth_defi.gmx.ccxt.exchange - INFO - ORDER_TRACE: create_order() RETURNING - order_id=0x6582468792d733, status=closed, filled=0.00744021,
remaining=0.00000000
20
You can leave the ping pong strategy running and wacthing it slowly eating through your balance in the form of trading fees.
FreqTrade has a web dashboard called FreqUI. It is used to monitor the live trading.
You need to enable it with:
./freqtrade-gmx install-ui
Restart bot.
Then visit http://localhost:8080 - the default username and password we set above are tradingstrategy.ai / tradingstrategy.ai.
You should see the UI:
If FreqTrade crashes in the middle of a trade, it might not be able to recover at the restart.
In this case you need to login to GMX web UI and manually close any stale positions. For this, you need to import the private key to a wallet like Rabby you can connect to a GMX website.
The trading fee to open a position is 0.04% or 0.06% of the position size, similarly there is a 0.04% or 0.06% fee when closing the position. This applies for increasing the position size of an existing position and partially decreasing a position size as well.
If the trade increases the balance of longs and shorts then the fee would be 0.04%, otherwise the fee would be 0.06%.
ETH is needed to pay the gas on Arbitrum. This covers deposit, opening trade and closing the trade. Part of this goes to our Arbitrum transaction costs, part of this we pass to keepers as execution buffer to cover the gas fees for filling our orders.
The monkeypatch (python -m eth_defi.gmx.freqtrade.patched_entrypoint):
- Adds
ccxt.gmxandccxt.async_support.gmxclasses - Registers GMX in Freqtrade's
SUPPORTED_EXCHANGES - Provides CCXT-compatible interface to GMX's on-chain data
- No modifications to Freqtrade or CCXT source code
See docs/architecture.md for technical details.
There is a simple ADX based trading strategy example. It is a momentum strategy with modest profit and risk.
It's a good starting point to start working on a real strategy.
MIT.


