独学で詰まった時の質問の書き方|最小の再現例を作る手順と実例

MQL5やPythonを独学していると、エラーの原因が分からず、フォーラムやQ&Aサイトで質問したくなる時があります。その時、自分のコードを全部貼り付けて「動きません」と書くと、答えが返ってこないことが多いです。回答を得やすくするために勧められているのが、「最小の再現例」(短く、自己完結していて、再現できるサンプルコード)を作ることです。この記事では、スタック・オーバーフローのヘルプセンターの説明をもとに作り方を整理し、実際に起きたエラーを最小の再現例に縮めるまでを、実行した結果で示します。

(確認:スタック・オーバーフロー(日本語版)ヘルプセンター「再現可能な短いサンプルコードの書き方」、英語版「How to create a Minimal, Reproducible Example」。例のコードは、筆者のPC(Python 3.13)で2026年10月21日に実行したものです。エラーの表示の中のフォルダーのパスは「…」に置き換えています)

良いサンプルコードの3つの条件(ヘルプセンター)

条件 ヘルプセンターの説明
短く できるだけコードを削った上で、同じ問題が出るようにする
自己完結している 問題を再現するために必要なコードとデータを漏れなく書く
再現可能である 投稿する前にサンプルコードを実行して、問題が再現するかを確かめる

削り方には、「いちから作り直す」(新しく作り、問題の再現に必要な部分だけを足す)と、「各個撃破する」(問題が出なくなるまで少しずつ削り、最後に削った部分が問題の箇所)の2つがある、と説明されています。また、「うまくいかない」だけでは説明にならず、期待する動きと、エラーメッセージを一字一句書くこと、コードはスクリーンショットではなくテキストで貼ることも挙げられています。

実例:トレード記録のCSVを読むと KeyError

次の元のスクリプトは、トレード記録のCSV(Excelなどで保存した、文字コードがUTF-8のBOM付きのもの)を読んで集計するものです。実行すると、途中で止まりました。

# 質問する前の元のスクリプト(集計の途中で止まる)
import csv
from collections import defaultdict

total, by_symbol = 0, defaultdict(int)
with open("trades.csv", encoding="utf-8", newline="") as f:
    for row in csv.DictReader(f):
        pnl = int(row["損益"])
        total += pnl
        by_symbol[row["銘柄"]] += pnl
        month = row["決済日"][:7]
print("総損益", total)
print(dict(by_symbol))

このまま「KeyErrorが出ます」と質問すると、回答者はCSVのファイルを持っていないので、再現できません。そこで、「いちから作り直す」方法で、データもコードの中に入れた最小の再現例を作ります。

# 最小の再現例:データも中に含め、同じエラーが出る最小の形
import csv, io
data = "\ufeff決済日,損益\n2026/08/05,-8000\n".encode("utf-8")   # 先頭にBOMがあるCSV(中身は2行だけ)
row = next(csv.DictReader(io.StringIO(data.decode("utf-8"))))
print(list(row.keys()))
print(row["決済日"])

最小の再現例では、エラーの前に、列の名前の一覧を表示するようにしました。

実行の結果

> python before.py
Traceback (most recent call last):
  File "…\before.py", line 11, in <module>
    month = row["決済日"][:7]
            ~~~^^^^^^^^^^
KeyError: '決済日'

> python minimal.py
['\ufeff決済日', '損益']
Traceback (most recent call last):
  File "…\minimal.py", line 6, in <module>
    print(row["決済日"])
          ~~~^^^^^^^^^^
KeyError: '決済日'

> python fixed.py
['決済日', '損益']
2026/08/05

読み取れることは、次の3つです。

  • 元のスクリプトは、8行目の row["損益"] と10行目の row["銘柄"] は通り、11行目の row["決済日"] で止まった。1列目だけ名前が違うことが分かる
  • 最小の再現例で列名を表示すると、1列目は '決済日' だった。先頭の見えない文字(BOM)が、列名の一部になっている
  • 直した版(下)は、ファイルを utf-8-sig で読み、BOMを取り除いたので、row["決済日"] が読めた
# 直した版:BOMを取り除く "utf-8-sig" で読む
import csv, io
data = "\ufeff決済日,損益\n2026/08/05,-8000\n".encode("utf-8")
row = next(csv.DictReader(io.StringIO(data.decode("utf-8-sig"))))
print(list(row.keys()))
print(row["決済日"])

このように、最小の再現例を作る途中で、原因が自分で分かることも多くあります。ヘルプセンターにも、サンプルコードを作っている間に問題が消えることがある、と書かれています。BOMの扱いは、Power QueryでCSVを読む時にも関わります(Power Queryで月別CSVを1つの表にまとめる方法)。

MQL5で質問する時に添えるもの

  • エラーメッセージの全文(コンパイルのエラーなら、行番号と番号付きのメッセージ)。MQL5のコンパイルエラーは、最初の1つだけ直す考え方も参考に
  • MT5のビルド、銘柄・時間足、口座の種類(デモか)
  • 期待した動きと、実際の動き
  • 最小の再現例:OnInit・OnTick だけの短いEAで、同じ問題が出るもの

外注したEAの不具合を出品者に伝える時も、考え方は同じです(EAの修正を頼む時に書く8項目)。学ぶ順番の全体はMQL5を学ぶ順番(独学とスクールの分かれ目)にまとめています。

この記事で確かめていないこと

  • MQL5の公式フォーラムの投稿ルールの細部
  • Excelのどの保存形式がBOMを付けるか(この記事の例は、BOM付きのデータを自分で作っています)

まとめ

  • 質問の前に、短く・自己完結した・再現できるサンプルコードを作る(スタック・オーバーフローのヘルプセンター)
  • データもコードの中に入れ、エラーメッセージは一字一句そのまま書く
  • 実例では、最小の再現例で列名を表示したことで、BOMが原因だと分かり、utf-8-sig で直った

本記事は、質問の準備の方法の説明です。特定のサイトでの回答を保証するものではありません。