{"id":49585372,"url":"https://github.com/howlrs/buy-the-dips","last_synced_at":"2026-05-03T22:06:36.803Z","repository":{"id":277355638,"uuid":"932012193","full_name":"howlrs/buy-the-dips","owner":"howlrs","description":"このプロジェクトは、Bybit取引所における自動押し目買いBotを開発することを目的としています。指定された下落率を検知すると自動でエントリーし、保有ポジションを自動で決済することで、効率的な取引を可能にします。","archived":false,"fork":false,"pushed_at":"2025-02-13T13:33:34.000Z","size":100,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-13T14:32:53.604Z","etag":null,"topics":["bybit","go","google-cloud-platform"],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/howlrs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-13T08:13:12.000Z","updated_at":"2025-02-13T13:33:37.000Z","dependencies_parsed_at":"2025-02-13T14:44:07.939Z","dependency_job_id":null,"html_url":"https://github.com/howlrs/buy-the-dips","commit_stats":null,"previous_names":["howlrs/buy-the-dips"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/howlrs/buy-the-dips","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/howlrs%2Fbuy-the-dips","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/howlrs%2Fbuy-the-dips/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/howlrs%2Fbuy-the-dips/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/howlrs%2Fbuy-the-dips/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/howlrs","download_url":"https://codeload.github.com/howlrs/buy-the-dips/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/howlrs%2Fbuy-the-dips/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32586236,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bybit","go","google-cloud-platform"],"created_at":"2026-05-03T22:06:32.049Z","updated_at":"2026-05-03T22:06:36.772Z","avatar_url":"https://github.com/howlrs.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 技術ドキュメント: Buy-the-Dips Bot\n\n## 1. プロジェクト概要\n\n### 1.1 プロジェクトの目的と用途\nこのプロジェクトは、Bybit取引所における自動押し目買いBotを開発することを目的としています。指定された下落率を検知すると自動でエントリーし、保有ポジションを自動で決済することで、効率的な取引を可能にします。\n\n### 1.2 対象読者\n- 開発者: Botの機能拡張や保守を行う担当者。\n- DevOpsエンジニア: Botのデプロイや運用を行う担当者。\n- トレーダー: Botの設定や利用方法を理解し、実際に運用するユーザー。\n\n## 2. まず利用するために (Getting Started)\n\n### 2.1 導入手順\n\n1.  **環境変数の設定**: `.env.local` または `.env.production` ファイルを作成し、必要な環境変数を設定します。以下は必要な環境変数の例です。\n\n    ```\n    PORT=8080\n    BYBIT=YOUR_BYBIT_API_KEY.YOUR_BYBIT_API_SECRET #ドット区切りでkey.secretと結合\n    CATEGORY=linear\n    SYMBOL=BTCUSDT\n    IS_TEST=true  # テスト環境の場合\n    IS_MARKET=false # Limit注文の場合\n    IS_EXIT=true # ポジションを決済する場合\n    DIPS_RATIO=-0.02 # 下落率（例: -2%）\n    SIZEUSD=100 # 一度の取引額（USD）\n    ORDERLINKID=your_unique_order_link_id\n    ```\n\n2.  **依存関係のインストール**: 以下のコマンドで必要なGoの依存関係をインストールします。 `go mod tidy`を実行してください。\n\n    ```bash\n    go mod tidy\n    ```\n\n3.  **アプリケーションの起動**: 以下のコマンドでアプリケーションを起動します。\n\n    ```bash\n    go run main.go\n    ```\n\n4.  **Cloud Runにデプロイする場合**: `deploy.md` に記述されている `gcloud run deploy btd --source .` コマンドを実行します。 事前にgcloud SDKをインストールして、初期設定を済ませてください。\n\n### 2.2 初期設定のヒント\n\n-   `IS_TEST` 環境変数を `true` に設定すると、取引所への実際の注文は行われず、ログに注文内容が出力されるだけになります。なお、設定IDへのキャンセル及び各種情報取得は行われます。\n-   `ORDERLINKID` 環境変数は、当プログラムに依る注文を特定するための一意なIDです。同じIDを複数回使用すると、意図しない動作を引き起こす可能性があります。\n\n## 3. ファイル構造図とディレクトリ説明\n\n### 3.1 ファイル構造図 (ツリービュー)\n\n```\n├── funcs/\n│   ├── buy-the-dips.go\n│   ├── buy-the-dip_test.go\n│   ├── client.go\n│   ├── getter.go\n│   └── order.go\n├── main.go\n├── utils/\n│   └── utils.go\n├── deploy.md\n├── README.md\n└── go.mod\n```\n\n### 3.2 ディレクトリとファイルの役割詳細\n\n-   **`funcs/`**: 主要なビジネスロジックを含むディレクトリ。\n    -   **`buy-the-dips.go`**: メインの処理関数 `BuyTheDips` が含まれています。指定された下落率に基づいて取引判断を行います。\n    -   **`buy-the-dip_test.go`**: `buy-the-dips.go` のテストコードが含まれています。\n    -   **`client.go`**: Bybit APIクライアントの設定や、環境変数の読み込みを行う関数が含まれています。\n    -   **`getter.go`**: OHLCVデータやポジション、ティッカー情報を取得する関数が含まれています。\n    -   **`order.go`**: 注文、決済、キャンセル処理を行う関数が含まれています。\n-   **`main.go`**: アプリケーションのエントリーポイント。Echoフレームワークを使用してHTTPサーバーを起動し、APIエンドポイントを定義します。\n-   **`utils/`**: ユーティリティ関数を含むディレクトリ。文字列操作やテスト用のログ出力など、汎用的な処理を行います。\n-   **`deploy.md`**: Cloud Runへのデプロイ手順が記述されています。\n-   **`README.md`**: 当ドキュメントです。\n-   **`go.mod`**: Goのモジュール管理ファイル。依存関係が記述されています。\n\n### 3.3 ファイル構造の意図\n\nこのファイル構造は、機能ごとにファイルを分割し、関心事の分離を重視しています。`funcs/` ディレクトリには取引ロジックが集中しており、`main.go` は取引ロジックを内包し、発火リクエストを受信するプログラムの主体です。`utils/` ディレクトリは、複数の場所で使用される共通関数を提供します。\n\n## 4. 各ファイル・モジュールの詳細\n\n### 4.1 `funcs/buy-the-dips.go`\n\n-   **目的**: 指定値以上の下落を検知した場合にエントリーする主要な関数 `BuyTheDips` を提供します。\n-   **主要な関数/クラス**:\n    -   **`BuyTheDips(c echo.Context) error`**:\n        -   **引数**: `c` (echo.Context): HTTPリクエストのコンテキスト。\n        -   **返り値**: `error`: エラーが発生した場合。\n        -   **使用例**: `/buy-the-dips` エンドポイントへのリクエストを処理し、下落率を計算してエントリーまたはイグジットの判断を行います。\n        -   **エラー処理**: 設定値の取得失敗、APIリクエストの失敗、計算エラーなどを検出し、HTTPステータスコードとエラーメッセージを返します。\n    -   **`ArgsForLogic.HasPosition(positions []map[string]any) (float64, bool)`**:\n        -   **引数**: `positions` ([]map[string]any): ポジションデータ\n        -   **返り値**: `float64`: ポジションサイズ, `bool`: ポジションの有無\n        -   **使用例**: 現在のポジションサイズを取得します。\n    -   **`ArgsForLogic.IsDip(targetNumber int, ohlcv []Ohlcv) bool`**:\n        -   **引数**: `targetNumber` (int): 比較対象のローソク足の本数, `ohlcv` ([]Ohlcv): OHLCVデータ\n        -   **返り値**: `bool`: 指定値以上の下落を検知した場合、trueを返します。\n        -   **使用例**: 過去のローソク足との価格を比較して、下落率が指定値を超えているかどうかを判断します。\n-   **依存関係**:\n    -   `context`: タイムアウトやキャンセルを扱うためのコンテキスト。\n    -   `fmt`: 文字列フォーマット。\n    -   `net/http`: HTTPステータスコード。\n    -   `strconv`: 文字列変換。\n    -   `github.com/howlrs/buy-the-dips/utils`: ユーティリティ関数。\n    -   `github.com/labstack/echo/v4`: HTTPフレームワーク。\n-   **ポイント**:\n    -   環境変数から設定を読み込み、取引ロジックを実行します。\n    -   エラーハンドリングを徹底し、APIからのエラーや計算エラーを適切に処理します。\n    -   Bybit APIとのインタラクションを集約し、取引に必要な情報を取得します。\n\n### 4.2 `funcs/client.go`\n\n-   **目的**: Bybit APIクライアントの設定と、環境変数の読み込みを行います。\n-   **主要な関数/クラス**:\n    -   **`NewArgsForLogic() (*ArgsForLogic, error)`**:\n        -   **引数**: なし\n        -   **返り値**: `*ArgsForLogic`: 設定値, `error`: エラーが発生した場合\n        -   **使用例**: 環境変数から必要な設定値を読み込み、`ArgsForLogic` 構造体を初期化します。\n        -   **エラー処理**: 必須の環境変数が設定されていない場合、エラーを返します。\n-   **依存関係**:\n    -   `fmt`: 文字列フォーマット。\n    -   `os`: 環境変数へのアクセス。\n    -   `strconv`: 文字列変換。\n    -   `github.com/howlrs/buy-the-dips/utils`: ユーティリティ関数。\n    -   `github.com/wuhewuhe/bybit.go.api`: Bybit APIクライアント。\n-   **ポイント**:\n    -   Bybit APIキーを環境変数から安全に読み込みます。\n    -   APIクライアントをシングルトンとして提供し、リソースの浪費を防ぎます。\n\n### 4.3 `funcs/getter.go`\n\n-   **目的**: OHLCVデータ、ポジション、ティッカー情報を取得する関数を提供します。\n-   **主要な関数/クラス**:\n    -   **`ArgsForLogic.GetOHLCV(ctx context.Context, targetNumber int) ([]Ohlcv, error)`**:\n        -   **引数**: `ctx` (context.Context): コンテキスト, `targetNumber` (int): 取得するローソク足の本数\n        -   **返り値**: `[]Ohlcv`: OHLCVデータ, `error`: エラーが発生した場合\n        -   **使用例**: Bybit APIからOHLCVデータを取得し、指定された本数分のデータを返します。\n        -   **エラー処理**: APIエラー、データ形式のエラー、タイムアウトなどを検出し、エラーを返します。\n    -   **`ArgsForLogic.GetPositions(ctx context.Context) ([]map[string]any, error)`**:\n        -   **引数**: `ctx` (context.Context): コンテキスト\n        -   **返り値**: `[]map[string]any`: ポジションデータ, `error`: エラーが発生した場合\n        -   **使用例**: Bybit APIからポジション情報を取得し、未決済のポジションを返します。\n    -   **`ArgsForLogic.GetTicker(ctx context.Context) (*Ticker, error)`**:\n        -   **引数**: `ctx` (context.Context): コンテキスト\n        -   **返り値**: `*Ticker`: ティッカーデータ, `error`: エラーが発生した場合\n        -   **使用例**: Bybit APIからティッカー情報を取得し、最新の価格情報を返します。\n-   **依存関係**:\n    -   `context`: タイムアウトやキャンセルを扱うためのコンテキスト。\n    -   `fmt`: 文字列フォーマット。\n    -   `strconv`: 文字列変換。\n    -   `time`: 時間操作。\n    -   `github.com/howlrs/buy-the-dips/utils`: ユーティリティ関数。\n-   **ポイント**:\n    -   APIからのレスポンスを適切にパースし、必要なデータを取り出します。\n    -   エラーハンドリングを徹底し、APIエラーやデータ形式のエラーを適切に処理します。\n\n### 4.4 `funcs/order.go`\n\n-   **目的**: 注文、決済、キャンセル処理を行う関数を提供します。\n-   **主要な関数/クラス**:\n    -   **`ArgsForLogic.Entry(ctx context.Context, bestBid string) error`**:\n        -   **引数**: `ctx` (context.Context): コンテキスト, `bestBid` (string): 最良買い気配\n        -   **返り値**: `error`: エラーが発生した場合\n        -   **使用例**: Bybit APIを使用して買い注文を送信します。\n        -   **エラー処理**: APIエラー、注文サイズのバリデーションエラーなどを検出し、エラーを返します。\n    -   **`ArgsForLogic.Exit(ctx context.Context, tokenSize float64, bestAsk string) error`**:\n        -   **引数**: `ctx` (context.Context): コンテキスト, `tokenSize` (string): 注文数量, `bestAsk` (string): 最良売り気配\n        -   **返り値**: `error`: エラーが発生した場合\n        -   **使用例**: Bybit APIを使用して売り注文を送信し、ポジションを決済します。\n        -   **エラー処理**: APIエラー、注文サイズのバリデーションエラーなどを検出し、エラーを返します。\n    -   **`ArgsForLogic.Cancel(ctx context.Context) error`**:\n        -   **引数**: `ctx` (context.Context): コンテキスト\n        -   **返り値**: `error`: エラーが発生した場合\n        -   **使用例**: Bybit APIを使用して注文をキャンセルします。\n        -   **エラー処理**: APIエラー、注文が見つからないエラーなどを検出し、エラーを返します。\n-   **依存関係**:\n    -   `context`: タイムアウトやキャンセルを扱うためのコンテキスト。\n    -   `fmt`: 文字列フォーマット。\n    -   `os`: 環境変数へのアクセス。\n    -   `time`: 時間操作。\n    -   `github.com/howlrs/buy-the-dips/utils`: ユーティリティ関数。\n    -   `github.com/rs/zerolog/log`: ロギング。\n-   **ポイント**:\n    -   注文の種類（成行/指値）、注文価格、注文数量を適切に設定します。\n    -   テスト環境では、APIリクエストを送信せずにログを出力します。\n\n### 4.5 `main.go`\n\n-   **目的**: アプリケーションのエントリーポイントです。\n-   **主要な関数/クラス**:\n    -   **`main()`**:\n        -   **引数**: なし\n        -   **返り値**: なし\n        -   **使用例**: HTTPサーバーを起動し、APIエンドポイントを定義します。\n        -   **エラー処理**: サーバー起動に失敗した場合、エラーログを出力して終了します。\n-   **依存関係**:\n    -   `fmt`: 文字列フォーマット。\n    -   `net/http`: HTTPステータスコード。\n    -   `os`: 環境変数へのアクセス。\n    -   `runtime`: 実行環境。\n    -   `github.com/howlrs/buy-the-dips/funcs`: 関数パッケージ。\n    -   `github.com/labstack/echo/v4`: HTTPフレームワーク。\n    -   `github.com/labstack/echo/v4/middleware`: ミドルウェア。\n    -   `github.com/rs/zerolog`: ロギング。\n    -   `github.com/rs/zerolog/log`: ロギング。\n    -   `github.com/joho/godotenv`: 環境変数ファイル。\n-   **ポイント**:\n    -   HTTPサーバーを起動し、APIエンドポイントを定義します。\n    -   CORSミドルウェアを有効にし、異なるオリジンからのリクエストを許可します。\n\n### 4.6 `utils/utils.go`\n\n-   **目的**: 汎用的なユーティリティ関数を提供します。\n-   **主要な関数/クラス**:\n    -   **`Split(env string) []string`**:\n        -   **引数**: `env` (string): 分割する文字列\n        -   **返り値**: `[]string`: 分割後の文字列\n        -   **使用例**: 環境変数を分割します。\n    -   **`GetInnerData(result any) map[string]any`**:\n        -   **引数**: `result` (any): APIからのレスポンス\n        -   **返り値**: `map[string]any`: 内部データ\n        -   **使用例**: APIからのレスポンスから内部データを取り出します。\n    -   **`GetInnerList(result any) []map[string]any`**:\n        -   **引数**: `result` (any): APIからのレスポンス\n        -   **返り値**: `[]map[string]any`: 内部リストデータ\n        -   **使用例**: APIからのレスポンスから内部リストデータを取り出します。\n    -   **`DipsRatio(numbers []float64) float64`**:\n        -   **引数**: `numbers` ([]float64): 価格データ\n        -   **返り値**: `float64`: 下落率\n        -   **使用例**: 価格データから下落率を計算します。\n    -   **`ToString(isMarket bool) string`**:\n        -   **引数**: `isMarket` (bool): 成行注文かどうか\n        -   **返り値**: `string`: 成行注文かどうか\n        -   **使用例**: 真偽値から文字列に変換します。\n    -   **`ToFloat64(s string) float64`**:\n        -   **引数**: `s` (string): 変換する文字列\n        -   **返り値**: `float64`: 変換後の浮動小数点数\n        -   **使用例**: 文字列を浮動小数点数に変換します。\n    -   **`TestLog(isTest bool, format string, a ...any)`**:\n        -   **引数**: `isTest` (bool): テストモードかどうか, `format` (string): フォーマット文字列, `a` (...any): 引数\n        -   **返り値**: なし\n        -   **使用例**: テストモードの場合にログを出力します。\n-   **依存関係**:\n    -   `fmt`: 文字列フォーマット。\n    -   `strconv`: 文字列変換。\n    -   `strings`: 文字列操作。\n    -   `github.com/rs/zerolog/log`: ロギング。\n\n## 5. 設計アルゴリズムやパターン\n\n### 5.1 主要なアルゴリズム\n\n1.  **下落率計算**: `DipsRatio` 関数で計算された下落率が、`DIPS_RATIO` 環境変数で設定された閾値以下になった場合に買いエントリーを行います。\n2.  **ポジション管理**: ポジションの有無をチェックし、ポジションを持っている場合は決済処理を行います。\n3.  **注文処理**: Bybit APIを使用して、買い注文または売り注文を送信します。\n\n\n## 6. 環境構築・セットアップ手順\n\n### 6.1 必要な依存関係のインストール\n\n以下の手順で必要な依存関係をインストールしてください。\n\n1.  Goがインストールされていることを確認してください。\n2.  プロジェクトディレクトリに移動します。\n\n    ```bash\n    cd [プロジェクトディレクトリ]\n    ```\n\n3.  依存関係をダウンロードします。\n\n    ```bash\n    go mod tidy\n    ```\n\n### 6.2 環境変数の設定\n\n`.env.local` ファイルまたは `.env.production` ファイルを作成し、必要な環境変数を設定します。\n\n### 6.3 開発環境における問題と解決策\n\n-   **問題**: APIキーが正しく設定されていない。\n    -   **解決策**: `.env.local` または `.env.production` ファイルに正しいAPIキーが設定されていることを確認してください。\n-   **問題**: 依存関係が正しくインストールされていない。\n    -   **解決策**: `go mod tidy` コマンドを実行し、依存関係を再インストールしてください。\n-   **問題**: テスト環境でAPIリクエストが送信される。\n    -   **解決策**: `IS_TEST` 環境変数を `true` に設定してください。\n\n## 7. ベストプラクティスと拡張方法\n\n### 7.1 ベストプラクティス\n\n-   **ロギング**: 重要な処理やエラーが発生した場合には、適切なログを出力するようにしましょう。\n-   **エラーハンドリング**: APIからのエラーや計算エラーを適切に処理し、アプリケーションが停止しないようにしましょう。\n-   **テスト**: 単体テストや結合テストを記述し、コードの品質を確保しましょう。\n-   **セキュリティ**: APIキーなどの機密情報は環境変数で管理し、コードに直接記述しないようにしましょう。\n\n### 7.2 プロジェクトの拡張方法\n\n-   **新しい取引戦略の追加**: ストラテジーパターンを利用して、新しい取引戦略を簡単に追加できるようにしましょう。\n-   **異なる取引所への対応**: ファクトリーパターンを利用して、異なる取引所のAPIクライアントを切り替えられるようにしましょう。\n-   **自動デプロイ**: CI/CDパイプラインを構築し、コードの変更を自動的にデプロイできるようにしましょう。\n\n### 7.3 新規参加者向け追記\n\n-   **依存ライブラリ**: このプロジェクトでは、`github.com/labstack/echo/v4` (HTTPフレームワーク), `github.com/wuhewuhe/bybit.go.api` (Bybit APIクライアント), `github.com/rs/zerolog` (ロギング) を使用しています。\n-   **動作上の特殊な要件**: Cloud Runにデプロイする場合、`ORDERLINKID` 環境変数は必ず設定してください。また、Bybit APIを使用するため、APIキーが必要です。\n-   **推奨される使用ケース**: `funcs/buy-the-dips.go` は、指定された下落率に基づいて取引判断を行う場合に利用します。`utils/utils.go` は、複数の場所で使用される共通関数を提供します。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhowlrs%2Fbuy-the-dips","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhowlrs%2Fbuy-the-dips","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhowlrs%2Fbuy-the-dips/lists"}