beast-agent 2.74.0 → 2.75.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/agent/financetools.js +2 -1
- package/src/main.js +56 -7
- package/src/renderer/renderer.js +5 -3
package/package.json
CHANGED
|
@@ -802,7 +802,8 @@ const handlers = {
|
|
|
802
802
|
}
|
|
803
803
|
const pos = await bcall('positions', {}, 8000);
|
|
804
804
|
const list = (pos && pos.positions) || [];
|
|
805
|
-
|
|
805
|
+
/* EFEKTİF TAVAN: talimattaki "en fazla N işlem/pozisyon" ayarı ezer */
|
|
806
|
+
const maxPos = Number(cfg.maxPositionsNote) > 0 ? Number(cfg.maxPositionsNote) : Number(cfg.maxPositions) || 3;
|
|
806
807
|
if (list.length >= maxPos) {
|
|
807
808
|
return { ok: false, error: `max eşzamanlı pozisyon dolu (${list.length}/${maxPos}) — önce bir pozisyon kapat` };
|
|
808
809
|
}
|
package/src/main.js
CHANGED
|
@@ -10018,6 +10018,27 @@ function finCfg() {
|
|
|
10018
10018
|
try { saveSettings(); } catch {}
|
|
10019
10019
|
}
|
|
10020
10020
|
if (!Number.isFinite(Number(f.maxPerCurrency))) f.maxPerCurrency = 3;
|
|
10021
|
+
/* TALİMATTAN ÜST SINIR: "aynı anda en fazla 10 işlem/pozisyon" → eşzamanlı
|
|
10022
|
+
tavan; "günde en fazla 10 işlem" → günlük işlem tavanı. Ayarı KALICI
|
|
10023
|
+
ezmez: not yalnız talimat metninde durdukça geçerlidir (0 = not yok). */
|
|
10024
|
+
f.maxPositionsNote = 0;
|
|
10025
|
+
f.maxTradesPerDayNote = 0;
|
|
10026
|
+
try {
|
|
10027
|
+
const txt = (String(f.strategy || '') + '\n' + String(f.posManagerNote || '')).toLowerCase();
|
|
10028
|
+
const re = /(en\s*fazla|en\s*[çc]ok|max(?:imum)?|maks(?:imum)?)\s*(\d{1,2})\s*(?:i[şs]lem|islem|trade|emir|pozisyon|poz)/g;
|
|
10029
|
+
let mm;
|
|
10030
|
+
while ((mm = re.exec(txt))) {
|
|
10031
|
+
const n = Number(mm[2]);
|
|
10032
|
+
if (!(n >= 1 && n <= 20)) continue;
|
|
10033
|
+
/* GÜNLÜK ayrımı: "günde/günlük/gün içinde ... en fazla N işlem" — cümle
|
|
10034
|
+
sınırı (nokta/virgül) aşılmaz; "günlük zarar %3, maks 4 pozisyon"
|
|
10035
|
+
ifadesindeki "günlük" günlük tavana YAZILMAZ, eşzamanlı sayılır. */
|
|
10036
|
+
const before = txt.slice(0, mm.index);
|
|
10037
|
+
const daily = /(?:g[üu]nde|g[üu]nl[üu]k|g[üu]n\s*i[çc]inde)[^.;,\n]{0,14}$/.test(before);
|
|
10038
|
+
if (daily) f.maxTradesPerDayNote = n;
|
|
10039
|
+
else if (!f.maxPositionsNote) f.maxPositionsNote = n; /* eşzamanlı tavan */
|
|
10040
|
+
}
|
|
10041
|
+
} catch {}
|
|
10021
10042
|
/* SHADOW MOD: emir gönderilmez — kararlar gerekçesiyle günlüğe yazılır */
|
|
10022
10043
|
if (typeof f.shadowMode !== 'boolean') f.shadowMode = false;
|
|
10023
10044
|
/* POZİSYON YÖNETİCİSİ: açık pozisyonları 5 sn'de bir Jev ile yöneten ayrı
|
|
@@ -10379,12 +10400,31 @@ function finTeamDigest() {
|
|
|
10379
10400
|
/* KODLA DİSİPLİN kancası: financetools işlem öncesi bunu çağırır. */
|
|
10380
10401
|
function finDisciplineError(side, symbol, positions) {
|
|
10381
10402
|
try {
|
|
10382
|
-
|
|
10403
|
+
const cfg = finCfg();
|
|
10404
|
+
/* TALİMAT: "günde en fazla N işlem" → günlük işlem tavanını ezer */
|
|
10405
|
+
if (Number(cfg.maxTradesPerDayNote) > 0) {
|
|
10406
|
+
return finrisk.disciplineError(
|
|
10407
|
+
finJournalTail(400),
|
|
10408
|
+
Date.now(),
|
|
10409
|
+
{ ...cfg, maxTradesPerDay: Number(cfg.maxTradesPerDayNote) },
|
|
10410
|
+
side,
|
|
10411
|
+
symbol,
|
|
10412
|
+
positions
|
|
10413
|
+
);
|
|
10414
|
+
}
|
|
10415
|
+
return finrisk.disciplineError(finJournalTail(400), Date.now(), cfg, side, symbol, positions);
|
|
10383
10416
|
} catch {
|
|
10384
10417
|
return null;
|
|
10385
10418
|
}
|
|
10386
10419
|
}
|
|
10387
10420
|
|
|
10421
|
+
/* EFEKTİF POZİSYON TAVANI: talimattaki "en fazla N işlem/pozisyon" ayarı ezer */
|
|
10422
|
+
function finPosCap(f) {
|
|
10423
|
+
const note = Number(f && f.maxPositionsNote) > 0 ? Number(f.maxPositionsNote) : 0;
|
|
10424
|
+
const base = Number(f && f.maxPositions) || 3;
|
|
10425
|
+
return Math.max(1, Math.min(20, note > 0 ? note : base));
|
|
10426
|
+
}
|
|
10427
|
+
|
|
10388
10428
|
/* ---------- MAE/MFE: pozisyonun gördüğü en iyi/en kötü seviye ---------- */
|
|
10389
10429
|
function finExcLoad() {
|
|
10390
10430
|
try {
|
|
@@ -13767,10 +13807,13 @@ function finParseInstructions(text) {
|
|
|
13767
13807
|
if (m) out.lotMult = finInstrNum(m[1] || m[2] || m[3]);
|
|
13768
13808
|
if (out.lotMult != null) out.lotMult = Math.max(1, Math.min(5, out.lotMult));
|
|
13769
13809
|
if (/martingale|mart[ıi]ngale/.test(low)) {
|
|
13770
|
-
/*
|
|
13771
|
-
"martingale çarpanı 1.
|
|
13772
|
-
|
|
13773
|
-
|
|
13810
|
+
/* Faktör serbest: "martingale 1.2", "martingale x1.20", "martingale 1,2",
|
|
13811
|
+
"martingale çarpanı 1.2", "1.2x martingale", "1.2 kat martingale".
|
|
13812
|
+
Yalnız bilinen bağlaçlardan sonra sayı okunur — "martingale kullan, 1R..."
|
|
13813
|
+
gibi metinden yanlış sayı kapmaz. Varsayılan ×2 (1.01–5 arası geçerli). */
|
|
13814
|
+
m = low.match(/(?:mart[ıi]ngale\s*(?:x|×|çarpan[ıi]?|carpan[ıi]?|oran[ıi]?|fakt[öo]r[üu]?|kat[ıi]?)?\s*(\d+(?:[.,]\d+)?))|(?:(\d+(?:[.,]\d+)?)\s*(?:x|×|kat[ıi]?)?\s*mart[ıi]ngale)/);
|
|
13815
|
+
const mf = m ? finInstrNum(m[1] || m[2]) : null;
|
|
13816
|
+
out.martingale = Math.max(1.01, Math.min(5, mf != null && mf > 1 ? mf : 2));
|
|
13774
13817
|
}
|
|
13775
13818
|
/* kısmi kapatma: "1R'de %50" → atR=1, pct=50; "%50 1R" → aynı; "kısmi %50" → atR=1 */
|
|
13776
13819
|
m = low.match(/(\d+(?:[.,]\d+)?)\s*r[^%\d]{0,28}%\s*(\d+(?:[.,]\d+)?)/);
|
|
@@ -13820,6 +13863,11 @@ function finInstrSummary(ins) {
|
|
|
13820
13863
|
if (ins.entry.startBalance != null) p.push(`gün başı ${ins.entry.startBalance}`);
|
|
13821
13864
|
if (ins.entry.dailyLossPct != null) p.push(`günlük zarar limiti %${ins.entry.dailyLossPct}`);
|
|
13822
13865
|
if (ins.manage.partial) p.push(`kısmi %${ins.manage.partial.pct} @${ins.manage.partial.atR}R`);
|
|
13866
|
+
try {
|
|
13867
|
+
const f = finCfg();
|
|
13868
|
+
if (Number(f.maxPositionsNote) > 0) p.push(`maks ${f.maxPositionsNote} pozisyon`);
|
|
13869
|
+
if (Number(f.maxTradesPerDayNote) > 0) p.push(`günde maks ${f.maxTradesPerDayNote} işlem`);
|
|
13870
|
+
} catch {}
|
|
13823
13871
|
return p.join(' · ');
|
|
13824
13872
|
} catch {
|
|
13825
13873
|
return '';
|
|
@@ -14701,9 +14749,10 @@ async function finTypeSafeRound(sid, agent) {
|
|
|
14701
14749
|
}
|
|
14702
14750
|
/* ÇOKLU GİRİŞ: aynı turda birden çok sembol açılabilir — yalnız toplam
|
|
14703
14751
|
slot (pozisyon + bekleyen emir + bu turda açılanlar) tavanı korur */
|
|
14704
|
-
const
|
|
14752
|
+
const posCap = finPosCap(f);
|
|
14753
|
+
const slotsLeft = posCap - pendCount - posList.length - opened;
|
|
14705
14754
|
if (slotsLeft <= 0) {
|
|
14706
|
-
lines.push(`- ${sym}: sinyal güçlü (${c.choice} p=${c.p.toFixed(2)}) ama pozisyon+bekleyen emir sınırı dolu (${posList.length + pendCount}/${
|
|
14755
|
+
lines.push(`- ${sym}: sinyal güçlü (${c.choice} p=${c.p.toFixed(2)}) ama pozisyon+bekleyen emir sınırı dolu (${posList.length + pendCount}/${posCap}) — bu tur açılmadı`);
|
|
14707
14756
|
continue;
|
|
14708
14757
|
}
|
|
14709
14758
|
/* GİRİŞ TİPİ + RİSK PROFİLİ (JEV kararı) — seviyeleri KOD hesaplar */
|
package/src/renderer/renderer.js
CHANGED
|
@@ -10934,8 +10934,8 @@ function finHelpHtml(which) {
|
|
|
10934
10934
|
'<b>Kod otomatik uygular.</b> Girişler %2 risk ile açılır (kalibrasyon çarpanı devre dışı, 0.1-10 arası).'],
|
|
10935
10935
|
['<code>lot x1.5</code><code>poz başı lot 1.5</code><code>lotu 2 kat yap</code>',
|
|
10936
10936
|
'<b>Kod otomatik uygular.</b> Tüm giriş riskine/lotuna çarpan.'],
|
|
10937
|
-
['<code>martingale</code><code>martingale 1.
|
|
10938
|
-
'<b>Kod otomatik uygular.</b> Kayıp serisinde lot katlanır (
|
|
10937
|
+
['<code>martingale</code><code>martingale 1.2</code><code>martingale x1.20</code><code>1.2 kat martingale</code>',
|
|
10938
|
+
'<b>Kod otomatik uygular.</b> Kayıp serisinde lot katlanır — faktör serbest (ör. 1.2). Varsayılan ×2; 1.01–5 arası geçerli, seri en çok ×3, toplam risk tavanı %10 ve max lot kilidi geçerli.'],
|
|
10939
10939
|
['<code>her mumda işlem açmak zorundasın</code><code>her barda işlem</code><code>her zaman işlem</code>',
|
|
10940
10940
|
'<b>ZORUNLU GİRİŞ modu.</b> "bekle" seçeneği kaldırılır, eşik/teyit kapıları atlanır, emir market olur. "zorunlu değil" yazarsan mod açılmaz.'],
|
|
10941
10941
|
['<code>M1</code><code>1m</code><code>5 dk</code><code>4 saat</code>',
|
|
@@ -10944,10 +10944,12 @@ function finHelpHtml(which) {
|
|
|
10944
10944
|
'Gün başı bakiyesi — her turda günlük K/Z otomatik hesaplanır ve Jev\'e durum olarak verilir.'],
|
|
10945
10945
|
['<code>günlük zarar %3</code><code>max günlük kayıp 3</code>',
|
|
10946
10946
|
'<b>Kod otomatik uygular.</b> Limit aşılırsa yeni işlem açılmaz; günlük kayıp otomasyonunun limiti bu olur.'],
|
|
10947
|
+
['<code>aynı anda en fazla 10 işlem</code><code>en fazla 10 pozisyon</code><code>günde en fazla 10 işlem</code>',
|
|
10948
|
+
'<b>Kod otomatik uygular.</b> Eşzamanlı tavan (pozisyon + bekleyen emir) ya da günlük işlem tavanı. Talimatta yazdığın sürece Ayarlar\'daki değeri ezer; metinden kaldırınca ayar geçerli olur.'],
|
|
10947
10949
|
];
|
|
10948
10950
|
const example = posmgr
|
|
10949
10951
|
? `1- 1R'de %50 kısmi kapat\n2- kâr 2R'ye gelince kalanı kapat\n3- zarar -0.5R'yi geçerse kes`
|
|
10950
|
-
: `1- risk yüzde 2\n2- martingale kullan (
|
|
10952
|
+
: `1- risk yüzde 2\n2- martingale kullan (x1.2)\n3- her mumda işlem açmak zorundasın\n4- aynı anda en fazla 10 işlem\n5- başlangıç bakiye 10.000\n6- günlük zarar %3`;
|
|
10951
10953
|
const head = posmgr
|
|
10952
10954
|
? 'Pozisyon Yöneticisi (5 sn turu) açık pozisyonları yönetir: kapat / kısmi kapat / SL taşı.'
|
|
10953
10955
|
: 'Trade Ajanı girişleri yönetir: yön, emir tipi, risk, lot, martingale ve günlük limitler.';
|