İşlemci kod seti — Python ve Pine Script
Kopyalanabilir altı kod parçası: dördü Python'da (CSV günlük yükleme, ölçüler, düşüşle birlikte öz sermaye eğrisi ve ATR pozisyon boyutlandırıcısı), ikisi Pine Script'te (uyarılı günlük aralık/ATR karşılaştırması ve grafikte işlem planı seans pencereleri). Hepsi ANALİZ aracıdır; hesaplar, çizer ve hatırlatır. Hiçbiri alış/satış sinyali üretmez veya karar vermez; bu oyun kitabının işidir. Kod tanımlayıcıları ve API adları, pandas ve Pine Script belgeleriyle uyumlu biçimde İngilizce kalır. Bu Türkçe sürümde yorumlar ve kullanıcıya gösterilen iletiler çevrilmiştir; kodun işlevi korunur. Aynı ayrım, kod içeren istemlerde yapay zekâ atölyesinde de izlenir; çevredeki açıklamalar kurs dilini kullanarak adım adım yol gösterir. Ortam: Python kurulumu ve ilk çalıştırmalar şu bölümde anlatılır: 11.8; günlük sütun başlıkları şu kaynaktadır: Ek F.
- Stratejiler değil, araçlar: kod SİZİN verilerinizden ölçü hesaplar ve SİZİN planınızı izler. Sınır, Ek H'deki “yapay zekânın yapmadıkları” bölümüyle aynıdır ve aynı nedenlere dayanır.
- Ortak veri biçimi: Python parçaları günlük elektronik tablosunun (Ek F) başlıklarını okur. Kazanma oranı başabaş işlemleri paydaya katar, beklenen değer net sonucu kullanır; bunlar P5 istemindeki tanımların aynısıdır.
- lookahead olmadan Pine Script: S5 günlük veriyi şu ayarla alır:
lookahead=barmerge.lookahead_off; S6 daha yüksek zaman dilimine hiç erişmez; yalnızca şu fonksiyonu kullanır:time. lookahead bulunmaması, yeniden çizimin yokluğunu kanıtlamaz. S5 açıklaması geçmiş barlarda ve gerçek zamanda ne gördüğünüzü açıklar. Bunlar P3 kod incelemesinin aradığı tuzaklardır. - Boyutlandırıcı hacmi AŞAĞI yuvarlar: riski lota çevirirken yukarı yuvarlamak riski sistematik olarak planın üzerine çıkarır. O tek kod satırı %1 ile “yaklaşık %1” arasındaki farktır.
Kodu çalıştırmadan önce: üç kural
- Çalıştırmadan önce okuyun. Her parça bilerek kısadır; her satırı anlamalısınız. Anlamadığınız kodu tahminle değil P3 incelemesi yardımıyla değiştirin; bu kural forum ve sohbetlerden alınan parçalarda iki kat geçerlidir.
- Veri dosyalardan girer; kararlar koddan çıkmaz. Betikler, günlük dışa aktarımını (Ek F biçimi) ve açıkça verdiğiniz parametreleri okur. Çıktı haftalık inceleme için sayılar ve grafiklerdir. 15.10'daki denetim sürecini izleyip örneklem büyüklüğünü, işlemler arası bağımlılığı ve sonucun belirsizliğini dikkate alarak çıkarımı siz yaparsınız.
- 11.8'deki ortam: Python 3.11 veya sonrası ve
pandasvematplotlib(kurulum ve ilk betik orada anlatılır). S1–S4 parçaları 17 Eylül 2026'da Python 3.12.10, pandas 3.0.5 ve matplotlib 3.11.1 ile yeniden çalıştırıldı. Diğer sürümler test edilmedi. Pine Script'i grafik platformunuzun gösterge düzenleyicisine yapıştırın; iki gösterge de sürüm 6 kullanır.
Kodu çalıştırmanın asgari adımları: Python 3.11+ ortamınızda sürümü şu komutla kontrol edin: python --version, sonra paketleri şu komutla kurun: python -m pip install pandas==3.0.5 matplotlib==3.11.1, S1+S2+S3'ü şu adla kaydedin: analiza_dziennika.py ve test CSV'sini şu adla: dziennik.csv, sonra şunu çalıştırın: python analiza_dziennika.py. S4 yalnızca standart kütüphaneyi gerektirir. S5 ve S6'yı Pine Editor'a ayrı ayrı yapıştırın. İki Pine parçası v6 belgeleriyle kontrol edildi; derlenmedi ve uyarıları TradingView'de test edilmedi.
S1 · CSV günlüğü yükleme
Python 3 · pandasS2 ve S3 için giriş noktası: Ek F elektronik tablo dışa aktarımını okur, başlıkları ve alan sayısını kontrol eder, sonra şu sütunu temizler: r_net . Yinelenen sütun adları, boş başlık ve fazla veya eksik alan içe aktarmayı durdurur. Betik iki sonuç sütunundan birini seçmez veya veriyi indekse taşımaz. Boş alanı ayırıcıyla gösterin; örneğin ;A+;;0; kesilmiş satır farklı bir durumdur. CSV varyantı için ayırıcıyı ve ondalık karakterini (PL: noktalı virgül ve virgül; EN: virgül ve nokta) ve kodlamayı ayarlayın. Ek F üreticisi UTF-8 kullanır; Excel'de “CSV UTF-8” olarak kaydedilen varyant da UTF-8 okunabilir. Eski Lehçe kod sayfası dışa aktarımı cp1250 gerektirebilir. Arayüz dili tek başına kodlamayı belirlemediğinden kayıt biçimini kontrol edin. Boş r_net ve boş close_time_utc işlemin henüz kapanmadığını ve atlandığını belirtir. Sonuçsuz kapanış zamanı eksik kayıttır ve hesabı durdurur. Sayı olarak okunamayan, “NA” veya tire dâhil, boş olmayan değer betiği durdurup kayıt numarasını bildirir. Ek F biçiminde kapanış zamanı olmayan kapanmış işlem de aynı şekilde durdurur (2026-07-08 13:15); aksi hâlde eğrinin sırası tahmin edilmek zorunda kalırdı.
import pandas as pd
CSV_PATH = "dziennik.csv" # günlük dışa aktarımı (Ek F yapısı)
CSV_SEP = ";" # Lehçe yerel ayarlı CSV için ";", EN için ","
DECIMAL = "," # Lehçe yerel ayarlı CSV için ",", EN için "."
ENCODING = "utf-8-sig" # Ek F üreticisi UTF-8 yazar (BOM işlenir); eski Lehçe kod sayfalı CSV için "cp1250" gerekebilir
REQUIRED = ["r_net", "setup", "setup_class", "error_code", "close_time_utc"]
# DataFrame oluşturmadan ÖNCE yerel dosyayı oku ve yapısını doğrula.
# pandas.read_csv yinelenen başlıkları yeniden adlandırabilir veya fazla alanlardan indeks çıkarabilir.
import csv
try:
with open(CSV_PATH, encoding=ENCODING, newline="") as source:
reader = csv.reader(source, delimiter=CSV_SEP, strict=True)
header = next(reader, None)
if not header:
raise SystemExit("CSV okunamıyor: başlık boş.")
if any(not name or name != name.strip() for name in header):
raise SystemExit("Boş veya kenarlarında boşluk bulunan sütun adı — CSV başlığını düzeltin.")
duplicates = sorted({name for name in header if header.count(name) > 1})
if duplicates:
raise SystemExit(f"Yinelenen sütunlar: {duplicates} — bunları günlükte düzeltin.")
rows, record_indexes = [], []
for index, row in enumerate(reader):
if not row: # tamamen boş CSV kaydı
continue
if len(row) != len(header):
raise SystemExit(f"Kayıt {index + 1}: beklenen alan sayısı {len(header)}, alınan {len(row)} "
f"— ayırıcıları ve tırnakları kontrol edin; hiçbir alan atılmadı.")
rows.append(row)
record_indexes.append(index)
df = pd.DataFrame(rows, columns=header, index=record_indexes, dtype="string").replace("", pd.NA)
except UnicodeDecodeError:
raise SystemExit(f"Kodlama çözülemedi: {CSV_PATH}; kullanılan kodlama {ENCODING} — UTF-8 veya eski cp1250 kodlamasını kontrol edin.") from None
except (OSError, csv.Error) as exc:
raise SystemExit(f"Okunamayan dosya: {CSV_PATH}: {exc}") from None
missing = [c for c in REQUIRED if c not in df.columns]
if missing:
raise SystemExit(f"Eksik sütunlar: {missing} — başlıkları Ek F ve CSV_SEP ayarıyla karşılaştırın.")
raw = df["r_net"] # boş sonuç yalnızca kapanış zamanı da boşsa kabul edilir
txt = raw.astype("string").str.strip().str.replace(DECIMAL, ".", regex=False) # sütunu kendimiz ayrıştırıyoruz: tek kötü hücre okunabilir olanları gizlememeli
r = pd.to_numeric(txt, errors="coerce").astype("Float64") # sonraki toplamlarda tam sayı taşmasını önle
r = r.where(r.abs() != float("inf")) # inf de geçerli bir R katı değildir
invalid = raw.notna() & r.isna() # doldurulmuş, ancak sayı olarak okunamıyor
if invalid.any():
raise SystemExit(f"Geçersiz r_net bulunan kayıtlar: {(df.index[invalid] + 1).tolist()} "
f"(kayıt 1 = başlığın altındaki ilk satır) — değerleri ve DECIMAL ayarını kontrol edin; "
f"NA, tireler ve sonsuzluk sayı değildir.")
blank = df.isna().all(axis=1) # satırın tümü boş = kullanılmayan sayfa satırı (tüm sayfanın XLSX dışa aktarımı), işlem değil
df, r = df[~blank], r[~blank]
has_close = df["close_time_utc"].fillna("").str.strip().ne("")
incomplete = r.isna() & has_close
if incomplete.any():
raise SystemExit(f"Kapanmış kayıtlarda eksik r_net: {(df.index[incomplete] + 1).tolist()} "
f"— ölçüleri hesaplamadan önce net sonucu tamamlayın.")
open_trades = int(r.isna().sum())
df = df.assign(r_net=r).dropna(subset=["r_net"]) # indeks korunur = aşağıdaki ileti için kayıt numaraları
# öz sermaye eğrisi ve düşüş kronolojik sıra gerektirir (Ek F: kapanış zamanına göre); okunabilir kapanış zamanı olmayan kapanmış işlem betiği durdurur
close_text = df["close_time_utc"].fillna("").str.strip()
has_time = close_text.str.fullmatch(r"\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:\d{2})?")
closed = pd.to_datetime(close_text.where(has_time), errors="coerce", format="ISO8601", utc=True) # Ek F 2026-07-08 13:15 yazar; sabit biçim kontrolü satır sırasından bağımsız tutar, utc=True beklenmedik "Z"/"+00:00" ekinin betiği çökertmesini önler
if closed.isna().any():
raise SystemExit(f"close_time_utc okunamayan kayıtlar: {(df.index[closed.isna()] + 1).tolist()} "
f"— her kapanmış işlemin Ek F biçiminde (2026-07-08 13:15) kapanış zamanı olmalıdır; betiği değil günlüğü düzeltin.")
df = df.assign(_t=closed).sort_values("_t", kind="stable").drop(columns="_t").reset_index(drop=True)
print(f"Yüklendi: {len(df)} kapalı işlem ({open_trades} satır atlandı: kapanış zamanı ve r_net yok).")
Elde edilen: bir DataFrame, df; sonraki parçalar için hazırdır, kapanış zamanına göre sıralıdır (eğri ve düşüş bu sırayla hesaplanır) ve atlanan açık işlem sayısı verilir. Boş satır, tüm XLSX sayfası dışa aktarımındaki gibi tamamen boş kayıttır; betik bunları saymaz. Veri içeren ama sonucu veya kapanış zamanı olmayan satır henüz kapanmamış sayılarak atlanır; sonuçsuz kapanmış kayıt betiği durdurur. Kayıt listesiyle durursa betiği değil, günlükteki belirtilen satırları düzeltin. Tüm sütun etkileniyorsa şu sabiti de kontrol edin: DECIMAL . Kayıt numaraları başlıktan sonra başlar ve boş kayıtları içerir; tırnaklı alan ayırıcı veya yeni satır içerebilir ve yine aynı kayda aittir. Her işlem bir kez görünmelidir; dışa aktarımları birleştirmeden önce şu kimlikleri kontrol edin: trade_id . S1 geçmişi tekilleştirmez. Saatsiz tarih sırayı yeniden kurmaya yetmez. Saat dilimi işareti olmayan zaman UTC sayılır; açık ISO 8601 farkı UTC'ye çevrilir. Aynı zamanlarda betik kayıt sırasını korur; bu sıra düşüş yolunu etkilediğinden günlükte belirleyin.
S2 · Günlük ölçüleri
Python 3 · pandasP5 istemi ve elektronik tablo panosuyla aynı tanımlar: kazanma oranı başabaş işlemleri paydaya katar; profit faktörü sıfıra bölmek yerine ileti döndürür; beklenen değer, net R'nin (r_net) ortalamasıdır. Düşüş, 0 R'den başlayan birikimli eğriden ölçülür; ilk kayıp zaten düşüştür, F tablosundaki formül gibi. S1'den sonra çalıştırın. Ölçü tanımları ortaktır, ama hata politikası P5'ten farklıdır: kapanmış işlemde geçersiz sonuç varsa S1 analizi durdurur; P5 ise satırı atlayıp saymayı söyler. Sonuçları ancak iki örnekleme hangi işlemlerin girdiğini belirledikten sonra karşılaştırın.
import math
def metrics(r):
"Net R katları serisindeki temel günlük ölçüleri.\n Tanımlar (Ek F panosuyla aynı):\n - kazanma oranı: r > 0 olan işlemler / TÜM geçerli işlemler (başabaş paydaya dâhil)\n - profit faktörü: pozitif r toplamı / abs(negatif r toplamı)\n - beklenen değer: r'nin aritmetik ortalaması (maliyetlerden sonra net)\n - maksimum düşüş: birikimli R eğrisinin hareketli zirvesinden en büyük gerilemesi,\n eğri 0 R'den başlar (dolayısıyla ilk kayıp -1 R ise zaten 1 R düşüş vardır)"
n = len(r)
if n == 0:
raise SystemExit("Geçerli işlem yok — ölçülecek bir şey yok.")
try:
r = r.astype(float)
except (TypeError, ValueError):
raise SystemExit("Ölçüler sayısal net R değerleri gerektirir — önce S1'i çalıştırın.") from None
if not r.map(math.isfinite).all():
raise SystemExit("Ölçüler sonlu net R değerleri gerektirir — önce S1'i çalıştırın.")
wins = r[r > 0]
losses = r[r < 0]
equity = r.cumsum()
peak = equity.cummax().clip(lower=0) # Ek F: MAX(0; hareketli zirve)
drawdown = peak - equity
try:
total = math.fsum(r)
pf_value = None if losses.empty else math.fsum(wins) / abs(math.fsum(losses))
except (OverflowError, ValueError, ZeroDivisionError):
raise SystemExit("Sayısal aralık aşıldı — R değerlerini kontrol edin; hiçbir ölçü döndürülmedi.") from None
if (not equity.map(math.isfinite).all() or not drawdown.map(math.isfinite).all()
or (pf_value is not None and not math.isfinite(pf_value))):
raise SystemExit("Sayısal aralık aşıldı — R değerlerini kontrol edin; hiçbir ölçü döndürülmedi.")
pf = "örneklemde kayıp yok" if pf_value is None else round(pf_value, 2)
return {
"trades": n,
"win_rate": round(len(wins) / n, 3),
"profit_factor": pf,
"expectancy_R": round(total / n, 3),
"sum_R": round(total, 2),
"max_drawdown_R": round(drawdown.max(), 2),
}
for key, value in metrics(df["r_net"]).items():
print(f"{key:>16}: {value}")
Elde edilen: haftalık inceleme için altı ölçü; kayıp yoksa PF sayı değil iletidir. Değerler hesap aralığını aşarsa betik, inf, NaN veya görünürde sıfır düşüş döndürmek yerine analizi durdurur. WR = 0.4, %40 demektir. PF, PLN değil R cinsinden hesaplanır; parasal risk değişirken sonuçlar farklı olabilir. Maliyetler zaten şuna dâhildir: r_net ; S2 tekrar düşmez. Yalnızca ortalamadan veya 20 ya da 50 işlemi geçmekten avantaj değerlendirmesi beklemeyin. Pano tanımlarını Ek F'de, örneklem seçimi, maliyet ve doğrulama planını Ek N'de bulabilirsiniz..
S3 · Öz sermaye eğrisi ve düşüş
Python 3 · pandas + matplotlibBirikimli R eğrisini ve altında zirveden düşüşü çizer; PNG'yi şu değişkende belirtilen CSV dosyasının yanına kaydeder: CSV_PATH (S1); betiği çalıştırdığınız dizinden bağımsızdır. Eğri, toplu sayılarda kaybolan sonuç sırasını ve kayıp kümelerini gösterir. Bu R toplamıdır; PLN hesap bakiyesi veya yüzdesel öz sermaye değildir. Parasal risk değişirse bakiye değişimini yeniden üretmez. Grafik yatırma, çekme veya açık pozisyon sonuçlarını içermez. S1'den sonra çalıştırın.
import math
import matplotlib.pyplot as plt
from pathlib import Path
if len(df) == 0:
raise SystemExit("Kapanmış işlem yok — çizilecek bir şey yok.")
equity = df["r_net"].astype(float).cumsum()
drawdown = equity.cummax().clip(lower=0) - equity # S2 ve Ek F ile aynı tanım (eğri 0 R'den başlar)
if not equity.map(math.isfinite).all() or not drawdown.map(math.isfinite).all():
raise SystemExit("Sayısal aralık aşıldı — R değerlerini kontrol edin; grafik kaydedilmedi.")
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(9, 6), sharex=True,
gridspec_kw={"height_ratios": [3, 1]})
x = [0, *(equity.index + 1)] # işlem 0 = düşüşün ölçüldüğü 0 R başlangıç noktası
ax1.plot(x, [0.0, *equity.values])
ax1.set_ylabel("öz sermaye (R)")
ax1.set_title("Öz sermaye eğrisi — birikimli net R")
ax1.grid(True, alpha=0.3)
ax2.fill_between(x, [0.0, *(-drawdown.values)], 0, alpha=0.5)
ax2.set_ylabel("düşüş (R)")
ax2.set_xlabel("işlem #")
ax2.grid(True, alpha=0.3)
fig.tight_layout()
PNG_PATH = Path(CSV_PATH).with_name("equity_curve.png") # çalışma dizini ne olursa olsun günlük dosyasının yanında
fig.savefig(PNG_PATH, dpi=150)
plt.close(fig)
print(f"Kaydedildi: {PNG_PATH}")
Elde edilen: bir equity_curve.png dosyası, günlüğün yanında. Eğri 0 R'den (işlem 0) başlar; düşüş buradan ölçülür. Alt panel, birikimli R'nin zirvesinden düşüşü (0 R'den başlayarak, S2 ve F tablosu gibi) tüm geçmiş boyunca gösterir; bu haftalık kayıp değildir. Planın (Ek E) haftalık limitini, plandaki birim ve sıfırlama kuralıyla her hafta ayrıca kontrol edin.
Şu adla kaydedin: dziennik.csv (UTF-8), birleştirilmiş S1+S2+S3 betiğinin yanına koyup çalıştırın. Dosya yalnızca S1'in ihtiyaç duyduğu sütunları içerir; Ek F'nin tam dışa aktarımı da (26 sütun) aynı şekilde yüklenir. Son satır açık işlemdir (boş r_net); ilk iki kapanmış işlem kayıptır, bu nedenle düşüş 0 R'den ölçülür.
trade_id;close_time_utc;setup;setup_class;r_net;error_code 2026-041;2026-07-08 13:15;wybicie-azja-londyn;A+;-1,00;5 2026-042;2026-07-09 16:40;powrot-do-sredniej;B;-1,08;3 2026-043;2026-07-10 09:05;wybicie-azja-londyn;A+;1,83;0 2026-044;2026-07-13 12:20;wybicie-azja-londyn;B;0,00;0 2026-045;2026-07-14 14:30;powrot-do-sredniej;C;2,40;0 2026-046;;wybicie-azja-londyn;B;;
Beklenen çıktı (Python 3.12.10, pandas 3.0.5, matplotlib 3.11.1; 17 Eylül 2026'da çalıştırıldı):
Yüklendi: 5 kapalı işlem (1 satır atlandı: kapanış zamanı ve r_net yok).
trades: 5
win_rate: 0.4
profit_factor: 2.03
expectancy_R: 0.43
sum_R: 2.15
max_drawdown_R: 2.08
Kaydedildi: equity_curve.png
Elle kontrol hesabı: kazançlar 1.83 + 2.40 = 4.23 R, kayıplar 1.00 + 1.08 = 2.08 R → PF 2.03; toplam 2.15 R / 5 = 0.43 R; eğri −1.00 → −2.08 → −0.25 → −0.25 → 2.15, başlangıç zirvesi 0 R → düşüş 2.08 R. 0 R noktası olmadan 1.08 R olurdu; Ek F tanımının arkasındaki ayrım budur. Çıktı tam bu dosya ve belirtilen sürümler içindir. Fark varsa sırayla veriyi (ayırıcı, ondalık karakteri, kodlama, satır sırası), S1 sabitlerini, kodu ve paket sürümlerini kontrol edin.
S4 · ATR pozisyon boyutlandırıcısı
Python 3 · standart kütüphanek × ATR stop mesafesi için lot cinsinden hacim: risk tutarı sermaye ve yüzdeden, mesafe ATR'den gelir; hacim hesabınızın lot adımına AŞAĞI yuvarlanır (şu parametreler: lot_step ve min_lot , ikisi de varsayılan 0.01). Böylece PLANLANAN risk bütçeyi aşmaz. Gerçek kayıp daha büyük olabilir; hesap kaymayı, stopu aşan boşlukları, spreadi, komisyonu ve swapı dışlar. Sermaye ve pip değeri aynı hesap para biriminde olmalıdır; özelliklerde maksimum hacmi ve teminat gereğini ayrıca kontrol edin. Şunu girin: ATR pip cinsinden (EURUSD 0.0080 → 80; USDJPY 0.80 → 80; pip büyüklüğü Ek B parite profilinde anlatılır). 1 lotun pip değeri enstrüman özelliklerindedir veya Ek C hesaplayıcısıyla hesaplanabilir.
import math
from decimal import Decimal
from fractions import Fraction
def atr_position_size(capital, risk_pct, atr_pips, atr_mult, pip_value_per_lot,
lot_step=0.01, min_lot=0.01):
"atr_mult × ATR stopu için lot cinsinden hacim.\n atr_pips: fiyat birimi değil PİP cinsinden ATR (EURUSD ATR 0.0080 -> 80; USDJPY ATR 0.80 -> 80 — paritenin pip büyüklüğü).\n pip_value_per_lot: 1 pipin 1.00 lot için hesap para birimindeki değeri\n (ör. USD hesapta EURUSD için ~10 USD — enstrüman özelliklerini kontrol edin).\n lot_step / min_lot: SİZİN hesabınızın hacim adımı ve minimumu (0.01 yaygındır, evrensel değildir).\n Sıfırdan ölçülen lot_step katlarına AŞAĞI yuvarlar. Fraction aritmetiği,\n genel Decimal hassasiyetine bağlı olmadan ondalık girdileri korur.\n Planlanan risk maksimum kayıp değildir: kayma, boşluklar, spread ve swap bu modelde yoktur."
inputs = (capital, risk_pct, atr_pips, atr_mult, pip_value_per_lot, lot_step, min_lot)
if any(isinstance(x, bool) or not isinstance(x, (int, float, Decimal)) for x in inputs):
raise ValueError("Metin veya mantıksal değer değil sayısal değer kullanın (Python ondalıkları nokta kullanır).")
decimals = tuple(Decimal(str(x)) for x in inputs)
if not all(x.is_finite() and x > 0 for x in decimals):
raise ValueError("Tüm girdiler sonlu ve pozitif sayılar olmalıdır.")
c, p, a, k, v, step, minimum = map(Fraction, decimals)
if p > 100:
raise ValueError("risk_pct sermayenin yüzdesidir (1.0 = %1).")
risk_amount = c * p / 100
sl_pips = a * k
lots = math.floor(risk_amount / (sl_pips * v * step)) * step
if lots < minimum:
return {"warning": "Risk bütçesi içinde bu lot_step ve min_lot için uygun hacim yok."}
exact = {"risk_amount": risk_amount, "sl_pips": sl_pips,
"lots": lots, "planned_risk": lots * sl_pips * v}
try:
result = {key: float(value) for key, value in exact.items()}
except OverflowError:
raise ValueError("Girdiler çıktının sayısal aralığını aşıyor.") from None
if not all(math.isfinite(value) and value > 0 for value in result.values()):
raise ValueError("Girdiler çıktının sayısal aralığını aşıyor.")
return result # görüntüleme için float; stop veya parasal değerler ayrıca yuvarlanmaz
print(atr_position_size(capital=10_000, risk_pct=1.0,
atr_pips=80, atr_mult=1.5, pip_value_per_lot=10.0))
# {'risk_amount': 100.0, 'sl_pips': 120.0, 'lots': 0.08, 'planned_risk': 96.0}
Elde edilen: adıma aşağı yuvarlanmış lot ve buna karşılık gelen PLANLANAN risk tutarı; maliyetsiz modelde ≤ bütçe, gerçek kayıp daha büyük olabilir. Adım sıfırdan ölçülür; hesabınızın bu hacim ızgarasını kullandığını kontrol edin. Stop ve parasal tutarlar ayrıca yuvarlanmaz: örneğin 0.26 pip ATR × 1.25, 0.325 pip verir, 0.3 değil. Çıktı okunmak üzere şu türde döner: float ; lot adımı sayısı ise tam kesirlerle hesaplanır. Enstrümanın asgari fiyat adımı yine ayrıca kontrol edilmelidir. Stopu o adıma ayarlarsanız hacmi yeniden hesaplayın. Giriş kararı beklemeyin; boyutlandırıcı “ne kadar”ı hesaplar, asla “girilmeli mi”yi değil.
S5 · Uyarılı günlük aralık ve ATR
Pine Script v6 · göstergeVolatilite farkındalığı aracı, gün içi gösterge: canlı barlarda piyasanın günlük ATR'nin yüzde kaçını “kullandığını” gösterir ve eşik geçilince uyarır. Bu, hareketi kovalamak değil plana danışmak içindir. Günlük veri lookahead olmadan, yani gelecek değerler kullanılmadan alınır. Geçmiş barlarda, request.security son onaylı günlük değeri bir sonraki D dönemi sonuna kadar tutar; o dönemin yeni sonucu son gün içi barında görünür. Gerçek zamanda mevcut D mumunun gelişen aralığını ve ATR'sini alır; bu yüzden önceki okumalar yeniden yüklemeden sonra değişebilir (yeniden çizim). Gün, Europe/Warsaw takvim günü değil, veri sağlayıcının D mumudur. Paydadaki ATR de gün içinde değişir; %100 fiyatın ne kadar hareket edebileceğine sınır değildir. Bu yöntem geçmiş barlarda bugünkü ardışık eşik geçişlerini yeniden oluşturamaz.
//@version=6
indicator("Günlük aralık ve ATR karşılaştırması (farkındalık aracı)", overlay=false)
if not timeframe.isintraday
runtime.error("1D altı, zamana dayalı gün içi grafik kullanın.")
atrLen = input.int(14, "ATR uzunluğu", minval=2)
warnPct = input.int(80, "Günlük aralık ATR'nin %'sine ulaştığında uyar", minval=10, maxval=200)
// Geçmiş: her D döneminin SONUNDA güncellenen son onaylanmış D değeri.
// Gerçek zamanlı: oluşmakta olan D değerleri; geçmişte kalmış gerçek zamanlı okumalar yeniden yüklemede değişebilir.
dayHigh = request.security(syminfo.tickerid, "D", high, lookahead=barmerge.lookahead_off)
dayLow = request.security(syminfo.tickerid, "D", low, lookahead=barmerge.lookahead_off)
dayAtr = request.security(syminfo.tickerid, "D", ta.atr(atrLen), lookahead=barmerge.lookahead_off)
rangePct = dayAtr > 0 ? 100.0 * (dayHigh - dayLow) / dayAtr : na
plot(rangePct, "Günlük aralık, ATR'nin %'si olarak", linewidth=2)
hline(100, "ATR'nin %100'ü")
hline(warnPct, "Uyarı seviyesi", linestyle=hline.style_dotted)
alertcondition(ta.crossover(rangePct, warnPct),
title="Aralık ATR'nin %'sine ulaştı",
message="Günlük aralık seçtiğiniz ATR yüzdesine ulaştı; yeni bir girişten önce planı yeniden okuyun.")
Elde edilen: grafik altında panel ve uyarı koşulu. Göstergeyi ekledikten sonra platformda “Aralık ATR'nin %'sine ulaştı” seçerek uyarıyı kendiniz oluşturun. Standart zamana dayalı gün içi mumlar kullanın; Heikin Ashi/Renko verisinin özellikleri farklı olabilir. Eksik okuma (na), gerekli ATR veya verinin bulunmadığı anlamına gelir; %0 değildir. Koşul, ≤ eşik değerinden > eşik değerine geçiş gerektirir; yalnızca üzerinde kalmak tekrar uyarmaz. “Once Per Bar Close”, uyarıyı gün içi mum kapanışıyla sınırlar; tüm D mumunu onaylamaz. Parametreleri değiştirdikten sonra uyarıyı yeniden oluşturun. Yön sinyali beklemeyin; yüksek okuma “hareket zaten oldu” der, ne yapacağınızı oyun kitabı söyler.
S6 · Grafikte işlem planı seans pencereleri
Pine Script v6 · göstergePlanın (Ek E) bölüm 3'ünün grafikte gösterimi: pozisyon açmaya İZİN VERİLEN saatleri vurgular ve pencere kapanınca uyarır. Saat dilimini planınızda belirtilen tam IANA kimliğine ayarlayın ve planın pencerelerini aynı dilimde girin. Örneğin Europe/London, tarihe göre GMT/BST uygular. Kod Europe/Warsaw değerini bölgesel örnek (CET/CEST) olarak korur; planınız başka dilim kullanıyorsa bu varsayılanı değiştirin. Varsayılan pencereler pazartesiden cumaya geçerlidir; bir seçenek tüm günlere uzatır. Vurgu, diğer giriş koşullarını değil yalnızca plandaki zamanı doğrular. Standart zamana dayalı gün içi mumlar kullanın.
//@version=6
indicator("İşlem planı seans pencereleri", overlay=true)
if not timeframe.isintraday
runtime.error("1D altı, zamana dayalı gün içi grafik kullanın.")
// Bölgesel örnek: varsayılanı planınızdaki tam IANA saat dilimiyle değiştirin.
tz = input.string("Europe/Warsaw", "Planın IANA saat dilimi")
win1 = input.session("0900-1200", "Pencere 1")
win2 = input.session("1400-1700", "Pencere 2")
weekdaysOnly = input.bool(true, "Yalnızca pazartesiden cumaya")
days = weekdaysOnly ? ":23456" : ":1234567"
inWin = not na(time(timeframe.period, win1 + days, tz)) or not na(time(timeframe.period, win2 + days, tz))
bgcolor(inWin ? color.new(color.teal, 88) : na, title="Plan penceresinin içinde")
windowJustClosed = inWin[1] and not inWin
alertcondition(windowJustClosed,
title="Plan penceresi kapandı",
message="İşlem pencereniz az önce kapandı; yalnızca açık pozisyonları yönetin, yeni giriş yapmayın (plan, bölüm 3).")
Elde edilen: işlem saatlerinde arka plan gölgelemesi ve pencere kapanışında uyarı koşulu (“Plan penceresi kapandı”; göstergeyi ekledikten sonra platformda uyarı oluşturun). Uyarı, içerideki bir mumun ardından pencere dışındaki ilk mumu algılar; tam kapanış saatinde bildirim garanti etmez. Yeni mum ve veri güncellemesi olmadan kontrol yapmaz. Açılış ve kapanışları pencere sınırlarıyla hizalanan zaman dilimi kullanın. Örneğin M15'te, 09:00–12:00 penceresi ve mevcut 12:00 mumu ile gölgeleme 12:00'de biter; koşul dışarıdaki o ilk mumda etkindir. “Once Per Bar” ilk güncellemede, “Once Per Bar Close” yalnızca kapanışta bildirebilir. Çakışan pencereler birleşim oluşturur; ilkinin sonu ikincisini kapatmaz. Saatleri değiştirince uyarıyı yeniden oluşturun. Emir engelleme beklemeyin; gösterge planı hatırlatır, işlem öncesi kontrol listeniz onu uygulatır.
Tek metin dosyasında başlıklarıyla altı kod parçası, kurulum talimatları ve kütüphane sürümleri, ardından test CSV'si ve beklenen çıktı. Günlüğün yanında arşivlemek veya kendi deponuzda tutmak içindir. TXT farklı dilleri birleştirir; tüm dosyayı Python olarak çalıştırmayın. S1+S2+S3'ü, bağımsız S4'ü veya tek Pine göstergesini seçin.
Sık sorulan sorular
Kaynak Lehçe kursta İngilizce olan kod yorumları bu sürümde neden Türkçe?
Kaynak setin kuralı, API adları, pandas ve Pine Script belgeleri ve zaten İngilizce okunan hata iletileriyle tutarlı İngilizce yorumlardır; yapay zekâ atölyesi de kod içeren istemlerde bu yaklaşımı ele alır (Ek H, P3). Kaynak Lehçe açıklamalar kodun NE yaptığını ve ne zaman kullanılacağını, içteki yorumlar NASIL çalıştığını açıklar. Bu Türkçe yerelleştirmede tanımlayıcılar ve API adları korunur; çevredeki açıklamalar, yorumlar ve kullanıcıya dönük iletiler Türkçedir. Kaynak Lehçe P5 isteminin size özel üretilen kodda Lehçe yorum istisnası, kütüphane yerine tek seferlik kod bağlamındadır; burada setin kaynak işlevi ve yapısı korunur.
Python parçalarını nasıl çalıştırırım?
11.8 Python, ortam ve paket kurulumunu adım adım anlatır; pandas ve matplotlib bu set için yeterlidir. S1–S3 parçalarını tek dosyada birleştirin: analiza_dziennika.py (S1 en üstte), sonra şunu çalıştırın: python analiza_dziennika.py günlük dışa aktarımının bulunduğu dizinde. S4 bağımsız çalışır. Göreli CSV_PATH terminalin çalışma dizinine göre yorumlanır. Test CSV'siyle başlayın, gerçek günlüğün kopyasını analiz edin; equity_curve.png bir sonraki çalıştırmada üzerine yazılır. Terminalde anlamadığınız hata varsa kodu ve tam iletiyi şu kaynağın P3 incelemesine yapıştırın: Ek H; tahmin yürütmeyin.
Bu parçaları değiştirip genişletebilir miyim?
Bunun için varlar; BAŞLANGIÇ seti. Doğal uzantılar arasında kurulum başına ölçüler (S2 fonksiyonundan önce setup sütununa göre gruplayın), hatasız uygulamanın beklenen değeri için error_code filtresi ve A+/B sınıflarının ayrı eğrileri yer alır. Değişiklik için iki kural: her değişikliği P3 incelemesinden geçirin, özellikle Pine'da request.security içerenleri; hem ölçü tanımlarını hem strateji kurallarını sürümleyin. Hesap hatasını hemen düzeltip karşılaştırılan dönemleri aynı yöntemle yeniden hesaplayın. Strateji kuralı değişikliğini test protokolünde (Ek N) belgeleyip yeni veride kontrol edin. Çeyreğin bitmesi tek başına değişikliği gerekçelendirmez; çeyreğin ortasında olmak da hatayı korumayı gerekçelendirmez.
Set neden strateji veya EA içermiyor?
Yapay zekâ atölyesinin sinyal üretmemesiyle aynı nedenle: internetten hazır stratejinin avantajı ve varsayımları bilinmez, planınızla bağlantısı yoktur. Başkasının mantığını hesabınızda uygulayan EA, bedelini yalnız sizin ödediğiniz kararları devretmektir. Kurstaki kod süreci ölçüm, görselleştirme ve plana uyumla güçlendirir; onun yerini almaz. Kendi test edilmiş stratejinizi otomatikleştirmek istiyorsanız yol 15.4'teki geriye dönük testten, Ek N test protokolünden ve P3 kod incelemesinden geçer; “kârlı” betikleri kopyalamaktan değil.
math.floor S4'te, şu yöntem yerine kullanılır: round; makine tartışmadan aşağı yuvarlar, insan gerekçeyle yukarı.İlgili kurs materyalleri
- 11.8 İşlemlerde Python — ortam kurulumu, ilk betiğiniz ve paketlerle çalışma
- Ek F — günlük elektronik tablosu — S1–S3'ün okuduğu CSV biçimi ve elektronik tablo formülleriyle aynı ölçüler
- Ek H, P3 istemi — bu kodun her değişikliğini inceleme (lookahead, yeniden çizim, mantık hataları)
- Araçlar bölümü — hesaplayıcılar — S4 sonuçlarını kontrol etmek için tarayıcıda pip değeri ve pozisyon boyutlandırma
- Ek E — plan şablonu — S6'nın grafiğe çizdiği işlem pencereleri ve limitler
- 15.10 Strateji denetimi — setin ürettiği sayıların disiplinli yorumu
Kaynaklar
- Belgeler: pandas 3.0.5 ve matplotlib 3.11.1 (S1–S3'te kullanılan fonksiyonlar); Python: CSV okuma ve Fraction aritmetiği (biçim doğrulama ve lot adımı sayısının tam hesabı). S1–S4 parçaları sentetik veride 17 Eylül 2026'da Python 3.12.10 ile çalıştırıldı; TradingView Pine Script v6: diğer zaman dilimleri ve veriler, seanslar, zaman ve saat dilimleri, uyarılar (lookahead parametreli request.security ve yeniden çizim, hline, input.session, alertcondition). S5–S6 kodu belgelerle incelendi, derlenmedi.
- Dâhili: 11.8 İşlemlerde Python (ortam), 15.9 (ölçü tanımları ve günlük biçimi), 15.10 (çıkarım yapma ilkeleri); bu set bunların sıkıştırılmış uygulamasıdır.
- Van K. Tharp, Trade Your Way to Financial Freedom, 2. baskı, McGraw-Hill 2007 — R katları ve beklenen değer; S2, F tablosu ve P5 isteminin ortak dili.