【chatGPT】FXスキャルピングの記録をブログにつけるためのツールを開発した話|Python

目的
スキャルピングの日誌を付けるためにGUIを使ったツールをPythonで構築する。

作業
chatGPTを使ってベースとなるプログラムを書いてもらいそこから発展させていく
以下のようなプロンプトを与えて出力させる。

prompt
GUIでスキャルピングの履歴をHTMLでつけたいです。以下のようなプログラムを生成してください。スキャルピングの記録を付けてその金額と収益をHTMLでまとめていきます。 1、通貨を選びます(ドル円等のよく取引される組み合わせの中からプルダウンで選べるようにします)2、新規ポジションの価格を入力します 3,買いor売りを選択します 4,決済時の収益を入力しますPipsで入力する。5,確定ボタンを押します。押すとその行が確定し記録されます。これを推した回数分記載できるようにします。6,最後に結果・反省点の欄を入力できるようにします。 7、出力しますか?はいボタンを作ります。押すとブログ用のHTMLが出力されるようにしてください。 以下のようにHTMLを組んでください。h2タグでタイトル(本日のスキャルピング記録)h3タグで通貨の種類 h4タグでポジション詳細 以下 購入価格、買い売り結果(Pips表記)、収支がプラスの場合はHTMLコードにicon_katiマイナスの際はicon_makeを組み込む(勝ち負けアイコンを表示するショートコードです)

※ショートコードに関しては別開発したものです。

出力結果
import tkinter as tk
from tkinter import ttk, messagebox
from tkinter.scrolledtext import ScrolledText
from datetime import datetime

class ScalpingLogger:
    def __init__(self, root):
        self.root = root
        self.root.title("スキャルピング記録GUI")
        self.records = []

        # 通貨選択
        ttk.Label(root, text="通貨ペア").grid(row=0, column=0, sticky="w")
        self.currency_var = tk.StringVar()
        self.currency_cb = ttk.Combobox(root, textvariable=self.currency_var, values=[
            "ドル円", "ユーロドル", "ポンド円", "豪ドル円", "ユーロ円", "ドルスイス"
        ])
        self.currency_cb.grid(row=0, column=1)
        self.currency_cb.set("ドル円")

        # 新規価格
        ttk.Label(root, text="新規価格").grid(row=1, column=0, sticky="w")
        self.entry_price = ttk.Entry(root)
        self.entry_price.grid(row=1, column=1)

        # 買い/売り
        ttk.Label(root, text="売買").grid(row=2, column=0, sticky="w")
        self.side_var = tk.StringVar()
        ttk.Radiobutton(root, text="買い", variable=self.side_var, value="買い").grid(row=2, column=1, sticky="w")
        ttk.Radiobutton(root, text="売り", variable=self.side_var, value="売り").grid(row=2, column=1)

        # Pips
        ttk.Label(root, text="Pips").grid(row=3, column=0, sticky="w")
        self.pips_entry = ttk.Entry(root)
        self.pips_entry.grid(row=3, column=1)

        # 確定ボタン
        ttk.Button(root, text="確定", command=self.add_record).grid(row=4, column=0, columnspan=2, pady=5)

        # 結果表示
        self.record_display = ScrolledText(root, width=60, height=10)
        self.record_display.grid(row=5, column=0, columnspan=2)

        # 結果・反省点
        ttk.Label(root, text="結果・反省点").grid(row=6, column=0, sticky="nw")
        self.memo = ScrolledText(root, width=60, height=5)
        self.memo.grid(row=6, column=1)

        # 出力ボタン
        ttk.Button(root, text="ブログ用HTML表示", command=self.export_html).grid(row=7, column=0, columnspan=2, pady=10)

        # HTML表示エリア
        ttk.Label(root, text="生成されたHTML").grid(row=8, column=0, sticky="nw")
        self.html_display = ScrolledText(root, width=80, height=15)
        self.html_display.grid(row=8, column=1)

    def add_record(self):
        try:
            price = float(self.entry_price.get())
            pips = float(self.pips_entry.get())
            currency = self.currency_var.get()
            side = self.side_var.get()

            if not side:
                messagebox.showerror("エラー", "売買区分を選択してください")
                return

            icon = "WIN" if pips >= 0 else "LOSE"
            timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

            record = {
                "currency": currency,
                "price": price,
                "side": side,
                "pips": pips,
                "icon": icon,
                "timestamp": timestamp
            }

            self.records.append(record)
            self.record_display.insert(tk.END, f"{currency} {side} {price} Pips:{pips} {icon} {timestamp}\n")

            self.entry_price.delete(0, tk.END)
            self.pips_entry.delete(0, tk.END)
            self.side_var.set("")
        except ValueError:
            messagebox.showerror("入力エラー", "価格とPipsは数値で入力してください。")

    def export_html(self):
        if not self.records:
            messagebox.showwarning("警告", "記録がありません。")
            return

        html = "<h2>本日のスキャルピング記録</h2>\n"
        total_pips = 0

        for idx, record in enumerate(self.records, 1):
            html += f"<h4>{record['currency']}</h4>\n"
            html += f"<p>購入価格:{record['price']}({record['side']}){record['timestamp']}</p>\n"
            html += f"<p>結果(Pips):{record['pips']} {record['icon']}</p>\n"
            html += "<hr>\n"
            total_pips += record['pips']

        # 総合計用のアイコンを判定
        total_icon = "WIN" if total_pips >= 0 else "LOSE"
        html += f"<h4>結果の総合計:{round(total_pips)} Pips {total_icon}</h4>\n"

        memo_text = self.memo.get("1.0", tk.END).strip()
        if memo_text:
            html += f"<h3>結果・反省点</h3>\n<p>{memo_text}</p>\n"

        self.html_display.delete("1.0", tk.END)
        self.html_display.insert(tk.END, html)

if __name__ == "__main__":
    root = tk.Tk()
    app = ScalpingLogger(root)
    root.mainloop()

通貨ペアの選択、購入時のレートを入力して買い売りの選択からHTMLを自動で出力するプログラム

取引→決済ごとに入力を繰り返して最終的な結果をoutputすることが可能、この出力したコードをブログに張り付けることで簡単に取引結果を日誌化できるようになった。合計結果の出力もできるようになっているので勝ち負けの結果がわかりやすい。

お好みでタグのCSSをカスタムすればOK

コード中のショートコードについては別途chatGPTで出力したもので不要であればコードを削除した下記のコードを利用する。

 

忘備録

最近chatGPTと会話する事ばかりになってきてprompt調の文章しか書けなくなってきた…どうしたものか…推しに対しても業務的というかなんというか。ちょっと前まで持っていた情熱的な感じが全くなくなっていて悩ましいところ(笑)生写真ブログなんかを書いていたころはもっと人間的で良かったなぁなんてそんな気分になっちゃう。プログマチックな思考をもう少し柔らかくしていこうと思う…