独学で詰まった時の質問の書き方|最小の再現例を作る手順と実例
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で直った
本記事は、質問の準備の方法の説明です。特定のサイトでの回答を保証するものではありません。


