master 0c34615dcfe6 cached
5 files
6.5 KB
1.7k tokens
9 symbols
1 requests
Download .txt
Repository: HenrisonTao/ftx_grid_trading_bot
Branch: master
Commit: 0c34615dcfe6
Files: 5
Total size: 6.5 KB

Directory structure:
gitextract_rozsdchf/

├── .gitignore
├── README.md
├── main.py
├── setting.json.example
└── start.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Personal setting (Henrison)
setting.json
ftx.log
output.log

================================================
FILE: README.md
================================================

# FTX Grid Trading Bot

The program was designed to run the Grid Trading Strategy in [FTX exchange](https://ftx.com/#a=1815639)
 
Grid trading strategy can follow [here](https://www.gridtradingcourse.com/articles/what-is-grid-trading.php).


It requires python 3.x and the following Python packages:
* [ccxt](https://github.com/ccxt/ccxt)
* [simplejson](https://pypi.org/project/simplejson/)
```
pip3 install ccxt simplejson
```
![](https://github.com/HenrisonTao/ftx_grid_trading_bot/blob/master/sample.png)

## Getting Started
The program is suggested to run in the Linux platform; also, you need to edit some parameters before program start. Follow the behind steps. 
**you should prepare the enough USD and spot for grid trading buying and selling . Futures do not need to prepare enough spot to sell.
1. Edit some config settings in `setting.json.example` and rename it to `setting.json`.
2. Run program
```
bash ./start.sh
```


================================================
FILE: main.py
================================================
# coding=utf-8

import ccxt
import datetime
import time
import os
import sys
import simplejson as json
# import random
# import threading

COLOR_RESET = "\033[0;0m"
COLOR_GREEN = "\033[0;32m"
COLOR_RED = "\033[1;31m"
COLOR_BLUE = "\033[1;34m"
COLOR_WHITE = "\033[1;37m"
LOGFILE=""

class Oreder_Info:
    def __init__(self):
        self.done=False
        self.side=None
        self.id=0

class Grid_trader:
    order_list=[]

    def __init__(self,exchange,symbol,grid_level=0,lower_price=0.0,upper_price=0.0,amount=0):
        self.symbol = symbol
        self.exchange=exchange
        self.order_min_inteval= self.exchange.markets[self.symbol]["info"]["priceIncrement"]
        self.grid_level=grid_level
        self.upper_price=upper_price
        self.lower_price=lower_price
        self.amount=amount
        self.inteval_profit=(self.upper_price-self.lower_price) / self.grid_level
        pass

    def place_order_init(self):
        #start cal level and place grid oreder
        for i in range(self.grid_level + 1): #  n+1 lines make n grid
            price = self.lower_price + i * self.inteval_profit
            bid_price, ask_price = self.send_request("get_bid_ask_price")
            order = Oreder_Info()
            if  price < ask_price : 
                order.id = self.send_request("place_order","buy",price)
                log("place buy order id = " + str(order.id) + " in "+ str(price))
            else:
                order.id = self.send_request("place_order","sell",price)
                log("place sell order id = " + str(order.id) + " in "+ str(price))
            self.order_list.append(order)
    
    def loop_job(self):
        for order in self.order_list:
            order_info = self.send_request("get_order",order.id)
            side = order_info["side"]
            if order_info["status"] == "closed":
                new_order_price = 0.0
                old_order_id = order_info["id"]
                bid_price, ask_price = self.send_request("get_bid_ask_price")
                msg = side + " order id : " + str(old_order_id)+" : " + str(order_info["price"]) + " completed , put "
                if side == "buy" :
                    new_order_price = float(order_info["price"]) + self.inteval_profit 
                    order.id = self.send_request("place_order","sell",new_order_price)
                    msg = msg + "sell"
                    log(msg)
                else:
                    new_order_price = float(order_info["price"]) - self.inteval_profit
                    order.id = self.send_request("place_order","buy",new_order_price)
                    msg = msg + "buy"
                msg = msg + " order id : " + str(order.id) + " : " + str(new_order_price)
                log(msg)

    def send_request(self,task,input1=None,input2=None):
        tries = 3
        for i in range(tries):
            try:
                if task == "get_bid_ask_price":
                    ticker =self.exchange.fetch_ticker(self.symbol)
                    return ticker["bid"],  ticker["ask"]

                elif task == "get_order":
                    return self.exchange.fetchOrder(input1)["info"]

                elif task == "place_order":
                    #send_request(self,task,input1=side,input2=price)
                    side = input1
                    price = input2
                    orderid=0
                    if side =="buy":
                        orderid = self.exchange.create_limit_buy_order(self.symbol,self.amount,price )["info"]["id"]
                    else:
                        orderid = self.exchange.create_limit_sell_order(self.symbol,self.amount,price )["info"]["id"]
                    return orderid

                else:
                    return None
            except ccxt.NetworkError as e:
                if i < tries - 1: # i is zero indexed
                    log("NetworkError , try last "+str(i) +"chances" + str(e))
                    time.sleep(0.5)
                    continue
                else:
                    log(str(e))
                    raise
            except ccxt.ExchangeError as e:
                if i < tries - 1: # i is zero indexed
                    log(str(e))
                    time.sleep(0.5)
                    continue
                else:
                    log(str(e))
                    raise
            break

def log(msg):
    timestamp = datetime.datetime.now().strftime("%b %d %Y %H:%M:%S ")
    s = "[%s] %s:%s %s" % (timestamp, COLOR_WHITE, COLOR_RESET, msg)
    print(s)
    try:
        f = open(LOGFILE, "a")
        f.write(s + "\n")
        f.close()
    except:
        pass

def read_setting():
        with open('setting.json') as json_file:
            return json.load(json_file)
             
config = read_setting()
LOGFILE= config["LOGFILE"]

exchange  = ccxt.ftx({
    'verbose': False,
    'apiKey': config["apiKey"],
    'secret': config["secret"],
    'enableRateLimit': True,
    'headers': {
        'FTX-SUBACCOUNT': config["sub_account"],
    },
})

exchange_markets = exchange.load_markets()

main_job = Grid_trader(exchange,config["symbol"],config["grid_level"],config["lower_price"],config["upper_price"],config["amount"])
main_job.place_order_init()
while True:
    print("Loop in :",datetime.datetime.now())
    main_job.loop_job()
    time.sleep(1)


================================================
FILE: setting.json.example
================================================
{
  "LOGFILE":"ftx.log",
  "apiKey":"your api key",
  "secret":"your api secret",
  "sub_account":"sub_account name",
  "symbol":"SRM/USD", 
  "grid_level":30,
  "lower_price":2.0,
  "upper_price":2.5,
  "amount":1
}

================================================
FILE: start.sh
================================================
#!/bin/bash
rm ftx.log output.log
python3 -u main.py > >(tee -a ./output.log) 2>&1
Download .txt
gitextract_rozsdchf/

├── .gitignore
├── README.md
├── main.py
├── setting.json.example
└── start.sh
Download .txt
SYMBOL INDEX (9 symbols across 1 files)

FILE: main.py
  class Oreder_Info (line 19) | class Oreder_Info:
    method __init__ (line 20) | def __init__(self):
  class Grid_trader (line 25) | class Grid_trader:
    method __init__ (line 28) | def __init__(self,exchange,symbol,grid_level=0,lower_price=0.0,upper_p...
    method place_order_init (line 39) | def place_order_init(self):
    method loop_job (line 53) | def loop_job(self):
    method send_request (line 74) | def send_request(self,task,input1=None,input2=None):
  function log (line 116) | def log(msg):
  function read_setting (line 127) | def read_setting():
Condensed preview — 5 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7K chars).
[
  {
    "path": ".gitignore",
    "chars": 61,
    "preview": "# Personal setting (Henrison)\nsetting.json\nftx.log\noutput.log"
  },
  {
    "path": "README.md",
    "chars": 934,
    "preview": "\n# FTX Grid Trading Bot\n\nThe program was designed to run the Grid Trading Strategy in [FTX exchange](https://ftx.com/#a="
  },
  {
    "path": "main.py",
    "chars": 5359,
    "preview": "# coding=utf-8\n\nimport ccxt\nimport datetime\nimport time\nimport os\nimport sys\nimport simplejson as json\n# import random\n#"
  },
  {
    "path": "setting.json.example",
    "chars": 216,
    "preview": "{\n  \"LOGFILE\":\"ftx.log\",\n  \"apiKey\":\"your api key\",\n  \"secret\":\"your api secret\",\n  \"sub_account\":\"sub_account name\",\n  "
  },
  {
    "path": "start.sh",
    "chars": 82,
    "preview": "#!/bin/bash\nrm ftx.log output.log\npython3 -u main.py > >(tee -a ./output.log) 2>&1"
  }
]

About this extraction

This page contains the full source code of the HenrisonTao/ftx_grid_trading_bot GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 5 files (6.5 KB), approximately 1.7k tokens, and a symbol index with 9 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!