İş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.

İşlemci ve analist çalışma istasyonu: ekranda Python günlük analizi betikleri bulunan kod düzenleyicisi ve Pine Script göstergeli grafik
60 saniyede temel noktalar
  • 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 pandas ve matplotlib (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.

Analiz hattı: CSV günlük dışa aktarımı Python betiklerine girer; ölçüler ve öz sermaye eğrisi çıkar; sonuçlar haftalık incelemeye ve oyun kitabına veri sağlar CSV günlükEk F biçimi Python: S1–S3ölçüler · eğri · düşüş EOW incelemesiörneklem, bağımlılıklar, belirsizlik Oyun kitabıkuralları ve testleri sürümleyin bu iş akışında “kod → emir” oku yoktur; bu bir dikkatsizlik değildir

S1 · CSV günlüğü yükleme

Python 3 · pandas

S2 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 · pandas

P5 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 + matplotlib

Birikimli 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.

Test dosyası ve beklenen çıktı (S1 + S2 + S3) CSV · PL biçimi

Ş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üphane

k × 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österge

Volatilite 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österge

Planı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.

TradingView EUR/USD grafiğinde Pine Script v6 göstergeleri: vurgulu plan seans pencereleri (S6) ve altta %80 uyarı seviyeli günlük aralık/ATR paneli (S5)
TradingView EUR/USD grafiğinde Pine Script v6 göstergeleri: vurgulu plan seans pencereleri (S6) ve altta %80 uyarı seviyeli günlük aralık/ATR paneli (S5)
Tüm set tek dosyada tarayıcınızda yerel üretilir

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.

Beş test işlemi için gerçek S3 çıktısı: oluşturulmuş öz sermaye eğrisi ve düşüş grafiğinin yanında Python betiği ve terminal ölçüleriyle kod düzenleyicisi penceresi
Beş test işlemi için gerçek S3 çıktısı: oluşturulmuş öz sermaye eğrisi ve düşüş grafiğinin yanında Python betiği ve terminal ölçüleriyle kod düzenleyicisi penceresi

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.

Açıklayıcı senaryo: “daha düzgün sayıya” yuvarlama. Boyutlandırıcı 0.07 lot hesapladı; işlemci 0.1'e tıkladı: “kozmetik fark, yuvarlak sayı”. Bu kozmetik ayarın sayısı: her işlemde, sistematik olarak tüm çeyrek boyunca +%43 risk. Günlük −2R limiti fiilen −2.9R oldu; her ayarı kozmetik gören işlemcinin öz sermaye eğrisi düşüşü planı aştı. Bu yüzden math.floor S4'te, şu yöntem yerine kullanılır: round; makine tartışmadan aşağı yuvarlar, insan gerekçeyle yukarı.
Açıklayıcı senaryo: yalnızca eğride görülen kayıp kümesi. Çeyrek ölçüleri makuldü: pozitif beklenen değer, beklenen aralıkta düşüş. Yalnızca S3 grafiği tüm düşüşün tek haftadan geldiğini gösterdi; S2'ye eklenen giriş saati filtresi daha da belirginleştirdi: tüm kayıplar 21:00 ile 23:00 UTC arasındaydı (Ek F günlüğü UTC kaydeder), geniş spreadlerde, “biraz daha kalayım” diye. Bu saatlerin rollover ile çakışması aracı kurum ve saat dilimine bağlıdır; varsaymak yerine özellikleri kontrol edin. Toplu sayı ortalar, eğri sistemin NE ZAMAN kan kaybettiğini gösterir. Plandaki tek satır, 21:00 UTC veya 23:00 CEST / 22:00 CET sonrası yeni giriş yok kuralı (planda ve S6 pencerelerinde Europe/Warsaw saatiyle kaydedin), bu senaryoda hazır sonuç iyileştirmesi değil, sonraki haftalarda test edilecek çıkarımdır. Setin desteklemek için tasarlandığı çıkarım tam budur.
Açıklama: bu sayfa eğitim amaçlıdır; yatırım tavsiyesi değildir. Kod parçaları kendi sorumluluğunuzda çalıştırdığınız analiz araçlarıdır: kullanmadan önce kodu okuyun, sonuçları örneğin Ek C hesaplayıcısıyla doğrulayın ve işlem kararlarını kendi planınızla verin. Python parçaları (S1–S4) internete veya hesabınıza bağlanmaz; yerel dosyaları okur ve grafik çizer. Pine göstergeleri (S5–S6) grafik platformunuzda, onun verileriyle çalışır. Hiçbiri alış/satış sinyali üretmez veya emir göndermez.

Kaynaklar

  1. 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.
  2. 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.
  3. 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.

Jarosław Wasiński

Baş editör, ForexMechanics.com • Makro ve FX analisti

Finansal piyasalarda 20 yılı aşkın deneyime sahip bağımsız ve profesyonel analist. 2007'den bu yana Forex piyasasında aktif; temel analiz, OTC piyasa yapısı ve disiplinli sermaye risk yönetimi alanlarında uzmanlaşmıştır.

  • 2004'ten itibaren güvenilir finansal eğitim sunan MyBank.pl'in kurucusu ve baş editörüdür.
  • Yatırımcılar ve traderlar için yüzlerce derinlikli piyasa yorumu, yapısal analiz ve eğitim materyalinin yazarıdır.
  • Piyasa şeffaflığının savunucusudur; somut verilere ve kurumsal raporlara (BIS, ESMA, CFTC) dayalı eğitimi destekler.

Tüm içerikler yalnızca eğitim ve bilgilendirme amaçlıdır – yatırım tavsiyesi veya herhangi bir öneri niteliği taşımaz. Unutmayın: kaldıraçlı işlemler (Forex/CFD) hızlı sermaye kaybı riski taşır.