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 CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "beast-agent",
3
3
  "productName": "Beast Agent",
4
- "version": "2.74.0",
4
+ "version": "2.75.0",
5
5
  "description": "Ultra-fast local agent shell for Windows.",
6
6
  "author": "algokodcom (AlgoKod)",
7
7
  "license": "MIT",
@@ -802,7 +802,8 @@ const handlers = {
802
802
  }
803
803
  const pos = await bcall('positions', {}, 8000);
804
804
  const list = (pos && pos.positions) || [];
805
- const maxPos = Number(cfg.maxPositions) || 3;
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
- return finrisk.disciplineError(finJournalTail(400), Date.now(), finCfg(), side, symbol, positions);
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
- /* faktör yalnız bitişik yazımdan okunur: "martingale 1.5", "martingale x2",
13771
- "martingale çarpanı 1.5" — "martingale kullan, 1R..." gibi metinden sayı kapmaz */
13772
- m = low.match(/mart[ıi]ngale\s*(?:x|×|çarpan[ıi]?|carpan[ıi]?)?\s*(\d+(?:[.,]\d+)?)/);
13773
- out.martingale = m ? Math.max(1.1, Math.min(5, finInstrNum(m[1]) || 2)) : 2;
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 slotsLeft = (Number(f.maxPositions) || 3) - pendCount - posList.length - opened;
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}/${Number(f.maxPositions) || 3}) — bu tur açılmadı`);
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 */
@@ -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.5</code><code>martingale x2</code>',
10938
- '<b>Kod otomatik uygular.</b> Kayıp serisinde lot katlanır (varsayılan ×2; seri en çok ×3, toplam risk tavanı %10 ve max lot kilidi geçerli).'],
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 (x2)\n3- her mumda işlem açmak zorundasın\n4- başlangıç bakiye 10.000\n5- günlük zarar %3`;
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.';