beast-agent 2.71.0 → 2.72.1

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.71.0",
4
+ "version": "2.72.1",
5
5
  "description": "Ultra-fast local agent shell for Windows.",
6
6
  "author": "algokodcom (AlgoKod)",
7
7
  "license": "MIT",
package/src/main.js CHANGED
@@ -10005,7 +10005,15 @@ function finCfg() {
10005
10005
  if (!Number.isFinite(Number(f.maxTradesPerDay))) f.maxTradesPerDay = 10;
10006
10006
  if (!Number.isFinite(Number(f.lossStreakLimit))) f.lossStreakLimit = 2;
10007
10007
  if (!Number.isFinite(Number(f.lossStreakPauseMin))) f.lossStreakPauseMin = 30;
10008
- if (!Number.isFinite(Number(f.reentryCooldownMin))) f.reentryCooldownMin = 15;
10008
+ /* RE-ENTRY BEKLEME: kural VARSAYILAN KAPALI (0) — isteyen Gelişmiş
10009
+ ayarlardan açar. Eski sürümün zorla koyduğu 15 dk değeri BİR KEZ
10010
+ sıfırlanır; kullanıcı bilerek başka değer girdiyse dokunulmaz. */
10011
+ if (!Number.isFinite(Number(f.reentryCooldownMin))) f.reentryCooldownMin = 0;
10012
+ if (f.reentryDefaultCleared !== true) {
10013
+ f.reentryDefaultCleared = true;
10014
+ if (Number(f.reentryCooldownMin) === 15) f.reentryCooldownMin = 0;
10015
+ try { saveSettings(); } catch {}
10016
+ }
10009
10017
  if (!Number.isFinite(Number(f.maxPerCurrency))) f.maxPerCurrency = 3;
10010
10018
  /* SHADOW MOD: emir gönderilmez — kararlar gerekçesiyle günlüğe yazılır */
10011
10019
  if (typeof f.shadowMode !== 'boolean') f.shadowMode = false;
@@ -13665,9 +13673,53 @@ function finTsFeedText(limit) {
13665
13673
  return feed.map((x) => `- ${x.who}: ${String(x.text || '').replace(/\s+/g, ' ').slice(0, 220)}`).join('\n');
13666
13674
  }
13667
13675
 
13668
- /* ZAMAN DİLİMİ BOT KARARI: önce öğrenmede en iyi net getiren periyot (>=3
13669
- işlem), sonra ajanın seçimi, sonra rol varsayılanı */
13676
+ /* SAHİP TALİMATI: Trade Ajanı kartına yazılan strateji notu (Jev state'ine girer) */
13677
+ function finTsStrategyText() {
13678
+ try {
13679
+ return String(finCfg().strategy || '').slice(0, 1000);
13680
+ } catch {
13681
+ return '';
13682
+ }
13683
+ }
13684
+
13685
+ /* Talimattan ZAMAN DİLİMİ çıkar: "M15", "1m", "1 dk", "4 saat" → M15/M1/H4 */
13686
+ function finTsStrategyTf() {
13687
+ const s = String(finTsStrategyText() || '');
13688
+ const m = s.match(/\b(M1|M5|M15|M30|H1|H4|D1|W1|MN1)\b/i);
13689
+ if (m) return m[1].toUpperCase();
13690
+ const dk = s.match(/\b(\d{1,2})\s*(?:m|dk|dakika)\b/i);
13691
+ if (dk) return finLearnNormTf('M' + Number(dk[1]));
13692
+ const st = s.match(/\b(\d{1,2})\s*(?:h|saat)\b/i);
13693
+ if (st) return finLearnNormTf('H' + Number(st[1]));
13694
+ return '';
13695
+ }
13696
+
13697
+ /* Talimat "zorunlu giriş" istiyor mu? ("her mumda işlem açmak zorundasın" gibi)
13698
+ Olumsuz yazım ("zorunlu değil") modu AÇMAZ. */
13699
+ function finTsMandatoryEntry() {
13700
+ const s = String(finTsStrategyText() || '').toLowerCase();
13701
+ if (!s) return false;
13702
+ if (/zorunlu değil|mecbur değil|zorunda değil/.test(s)) return false;
13703
+ return /her mum|her barda?|her mumda|işlem açmak zorunda|her zaman işlem|sürekli işlem|durmadan işlem|zorunlu (?:olarak )?(?:işlem|giriş|al|sat)|mecbur/.test(s);
13704
+ }
13705
+
13706
+ /* Ritim: talimatta M1 → işlem ajanı turları en hızlı 60 sn, M5 → 300 sn
13707
+ (rol ajanları analiz ritmini korur; yalnız trader + sembol işçileri hızlanır) */
13708
+ function finTsStrategyPaceSec(agent) {
13709
+ const base = finPaceSec();
13710
+ if (!agent || agent.role) return base;
13711
+ const tf = finTsStrategyTf();
13712
+ if (tf === 'M1') return Math.max(30, Math.min(base, 60));
13713
+ if (tf === 'M5') return Math.max(60, Math.min(base, 300));
13714
+ return base;
13715
+ }
13716
+
13717
+ /* ZAMAN DİLİMİ: önce SAHİBİN TALİMATI (işlem ajanları için), sonra öğrenmede
13718
+ en iyi net getiren periyot (>=3 işlem), sonra ajanın seçimi, sonra rol
13719
+ varsayılanı (rol ajanları kendi analiz periyodunu korur) */
13670
13720
  function finTsPickTf(agent, symbol) {
13721
+ const owned = !(agent && agent.role) ? finTsStrategyTf() : '';
13722
+ if (owned) return owned;
13671
13723
  try {
13672
13724
  const sym = String(symbol || '').toUpperCase();
13673
13725
  const e = finLearnLoad().symbols[sym];
@@ -14078,6 +14130,10 @@ async function finTypeSafeRound(sid, agent) {
14078
14130
  /* KALİBRASYON: öğrenilmiş eşik + risk çarpanı + kazandıran kurallar */
14079
14131
  kalibrasyon: symbols.map((s) => finTsCalState(s, market[s] && market[s].tf)).filter(Boolean).join('\n') || '(kalibrasyon verisi henüz yok)',
14080
14132
  ekip_yanitlari: finTsFeedText(6),
14133
+ /* SAHİBİN TALİMATI (Trade Ajanı kartı): Jev bunu BİRİNCİL kural kabul eder;
14134
+ talimat "zorunlu giriş" içeriyorsa kod eşikleri devre dışı bırakır. */
14135
+ sahip_talimati: finTsStrategyText() || '(yok — temel teknik okuma)',
14136
+ talimat_modu: finTsMandatoryEntry() ? 'ZORUNLU GİRİŞ — bu turda işlem açmak zorunlu (bekle yok); yönü sen seç' : '',
14081
14137
  };
14082
14138
  for (const sym of symbols) {
14083
14139
  const d = market[sym];
@@ -14099,31 +14155,42 @@ async function finTypeSafeRound(sid, agent) {
14099
14155
  if (symbols.includes(s)) posBySym[s] = p;
14100
14156
  }
14101
14157
  const questions = {};
14158
+ const talimatZorunlu = finTsMandatoryEntry();
14102
14159
  symbols.forEach((sym, i) => {
14103
14160
  questions['yon_' + i] = {
14104
14161
  type: 'choice',
14105
- instructions: `${sym} ${market[sym].tf} grafiğinde verilen fiyat, gösterge, pozisyon, öğrenme geçmişi ve ekip yanıtlarına göre kısa vadeli doğru aksiyon nedir? Emin değilsen bekle.`,
14106
- criteria: {
14107
- buy: 'LONG aç — yükseliş teyidi var (yapı/momentum/EMA eğimi destekliyor)',
14108
- sell: 'SHORT aç — düşüş teyidi var',
14109
- bekle: 'İşlem açma — teyit yok, belirsiz ya da riskli',
14110
- },
14162
+ instructions: talimatZorunlu
14163
+ ? `${sym} ${market[sym].tf}: SAHİBİN TALİMATI GEREĞİ bu turda işlem açmak ZORUNDASIN — 'bekle' YOK. Yönü sen seç: gösterge/momentum/yapıya göre en olası yön (buy/sell). Sahip talimatı state'tedir, birincil kuraldır.`
14164
+ : `${sym} ${market[sym].tf} grafiğinde verilen fiyat, gösterge, pozisyon, öğrenme geçmişi, ekip yanıtları ve SAHİP TALİMATINA göre kısa vadeli doğru aksiyon nedir? Emin değilsen bekle.`,
14165
+ criteria: talimatZorunlu
14166
+ ? {
14167
+ buy: 'LONG aç — bu turda giriş zorunlu, yükseliş tarafı daha olası',
14168
+ sell: 'SHORT aç — bu turda giriş zorunlu, düşüş tarafı daha olası',
14169
+ }
14170
+ : {
14171
+ buy: 'LONG aç — yükseliş teyidi var (yapı/momentum/EMA eğimi destekliyor)',
14172
+ sell: 'SHORT aç — düşüş teyidi var',
14173
+ bekle: 'İşlem açma — teyit yok, belirsiz ya da riskli',
14174
+ },
14111
14175
  };
14112
14176
  questions['teyit_' + i] = {
14113
14177
  type: 'noul',
14114
14178
  instructions: `${sym} fiyat yapısı ve momentum, 'yon_' + ${i} kararını gerçekten destekliyor mu?`,
14115
14179
  criteria: { true: 'Net destekliyor', false: 'Zayıf/çelişkili' },
14116
14180
  };
14117
- /* GİRİŞ TİPİ + RİSK PROFİLİ: seviyeleri KOD hesaplar (ATR/EMA), kararı Jev verir */
14118
- questions['emir_' + i] = {
14119
- type: 'choice',
14120
- instructions: `${sym} sinyali onaylanırsa giriş tipi ne olsun? Anında mı gir (market), geri çekilme mi bekle (limit), kırılım teyidi mi bekle (stop)? Giriş seviyesini kod ATR/EMA'dan hesaplar.`,
14121
- criteria: {
14122
- market: 'Anında piyasadan gir — kaçırma riski yok, fiyat şimdiki',
14123
- limit: 'Geri çekilmede limit emir — daha iyi fiyat bekle (ATR/EMA seviyesi)',
14124
- stop: 'Kırılımda stop emir — momentum teyidi bekle (ATR seviyesi)',
14125
- },
14126
- };
14181
+ /* GİRİŞ TİPİ + RİSK PROFİLİ: seviyeleri KOD hesaplar (ATR/EMA), kararı Jev verir.
14182
+ "Zorunlu giriş" modunda bekleyen emir sorulmaz — giriş garanti olsun diye market. */
14183
+ if (!talimatZorunlu) {
14184
+ questions['emir_' + i] = {
14185
+ type: 'choice',
14186
+ instructions: `${sym} sinyali onaylanırsa giriş tipi ne olsun? Anında mı gir (market), geri çekilme mi bekle (limit), kırılım teyidi mi bekle (stop)? Giriş seviyesini kod ATR/EMA'dan hesaplar.`,
14187
+ criteria: {
14188
+ market: 'Anında piyasadan gir — kaçırma riski yok, fiyat şimdiki',
14189
+ limit: 'Geri çekilmede limit emir — daha iyi fiyat bekle (ATR/EMA seviyesi)',
14190
+ stop: 'Kırılımda stop emir — momentum teyidi bekle (ATR seviyesi)',
14191
+ },
14192
+ };
14193
+ }
14127
14194
  questions['risk_' + i] = {
14128
14195
  type: 'choice',
14129
14196
  instructions: `${sym} için SL/TP profili? Seviyeleri kod ATR'den hesaplar; volatilite ve öğrenme geçmişini dikkate al.`,
@@ -14207,6 +14274,7 @@ async function finTypeSafeRound(sid, agent) {
14207
14274
  if (!financeState.agents.has(sidS)) return;
14208
14275
  const c = finTsChoice(ans, 'yon_' + i);
14209
14276
  const conf = finTsNoul(ans, 'teyit_' + i);
14277
+ const confVal = conf == null ? 0 : conf;
14210
14278
  const pos = posBySym[sym];
14211
14279
  /* JEV FİYAT ALARMI: seçilen seviyeye tek seferlik alarm (kurulumu kod yapar) */
14212
14280
  try { await finTsSetAlarm(sidS, agent, sym, market[sym], ans, i, lines); } catch {}
@@ -14233,13 +14301,17 @@ async function finTypeSafeRound(sid, agent) {
14233
14301
  lines.push(`- ${sym}: ${finTsFmtChoice(c)} → BEKLE`);
14234
14302
  continue;
14235
14303
  }
14236
- if (!(c.p >= thAction) || c.p - c.second < FIN_TS_MARGIN_P) {
14237
- lines.push(`- ${sym}: ${finTsFmtChoice(c)} → öğrenilmiş eşik p≥${thAction.toFixed(2)}/fark altı, BEKLE`);
14238
- continue;
14239
- }
14240
- if (conf == null || conf < FIN_TS_CONFIRM_P) {
14241
- lines.push(`- ${sym}: ${finTsFmtChoice(c)} · teyit=${conf == null ? 'yok' : conf.toFixed(2)} < ${FIN_TS_CONFIRM_P} → BEKLE`);
14242
- continue;
14304
+ /* SAHİP TALİMATI "zorunlu giriş" diyorsa eşik/teyit kapıları UYGULANMAZ
14305
+ (talimat birincil kural) — yön Jev'in seçimidir. */
14306
+ if (!talimatZorunlu) {
14307
+ if (!(c.p >= thAction) || c.p - c.second < FIN_TS_MARGIN_P) {
14308
+ lines.push(`- ${sym}: ${finTsFmtChoice(c)} → öğrenilmiş eşik p≥${thAction.toFixed(2)}/fark altı, BEKLE`);
14309
+ continue;
14310
+ }
14311
+ if (conf == null || conf < FIN_TS_CONFIRM_P) {
14312
+ lines.push(`- ${sym}: ${finTsFmtChoice(c)} · teyit=${conf == null ? 'yok' : conf.toFixed(2)} < ${FIN_TS_CONFIRM_P} → BEKLE`);
14313
+ continue;
14314
+ }
14243
14315
  }
14244
14316
  if (opened >= 1 || posList.length + pendCount >= (Number(f.maxPositions) || 3)) {
14245
14317
  lines.push(`- ${sym}: sinyal güçlü (${c.choice} p=${c.p.toFixed(2)}) ama pozisyon+bekleyen emir sınırı dolu — bu tur açılmadı`);
@@ -14262,9 +14334,10 @@ async function finTypeSafeRound(sid, agent) {
14262
14334
  const prof = { siki: [1.0, 2.0], dengeli: [1.5, 2.5], genis: [2.0, 3.5] }[profKey];
14263
14335
  const slDist = Math.max(atr > 0 ? atr * prof[0] : entryRef * 0.003, entryRef * 0.0004);
14264
14336
  const tpDist = Math.max(atr > 0 ? atr * prof[1] : entryRef * 0.006, slDist * 1.2);
14265
- /* EMİR TİPİ: market / limit / stop — Jev seçer, giriş seviyesini kod kurar */
14266
- const emirC = finTsChoice(ans, 'emir_' + i);
14267
- const emirKind = emirC && emirC.p >= FIN_TS_CONFIRM_P && emirC.p - emirC.second >= FIN_TS_MARGIN_P ? String(emirC.choice) : 'market';
14337
+ /* EMİR TİPİ: market / limit / stop — Jev seçer, giriş seviyesini kod kurar.
14338
+ Zorunlu giriş modunda MARKET sabittir (bekleyen emir açık pozisyon değildir). */
14339
+ const emirC = talimatZorunlu ? null : finTsChoice(ans, 'emir_' + i);
14340
+ const emirKind = talimatZorunlu ? 'market' : (emirC && emirC.p >= FIN_TS_CONFIRM_P && emirC.p - emirC.second >= FIN_TS_MARGIN_P ? String(emirC.choice) : 'market');
14268
14341
  let orderType = 'market';
14269
14342
  let entry = entryRef;
14270
14343
  if (emirKind === 'limit') {
@@ -14303,9 +14376,10 @@ async function finTypeSafeRound(sid, agent) {
14303
14376
  timeframe: market[sym].tf,
14304
14377
  comment: 'TS',
14305
14378
  reason:
14306
- `TypeSafe: yön ${c.choice} p=${c.p.toFixed(2)} fark=${(c.p - c.second).toFixed(2)} teyit=${conf.toFixed(2)}` +
14379
+ `TypeSafe: yön ${c.choice} p=${c.p.toFixed(2)} fark=${(c.p - c.second).toFixed(2)} teyit=${confVal.toFixed(2)}` +
14307
14380
  (orderType !== 'market' ? ` · ${orderType} @${entry}` : '') +
14308
- ` · ${profKey} profil`,
14381
+ ` · ${profKey} profil` +
14382
+ (talimatZorunlu ? ' · SAHİP TALİMATI (zorunlu giriş)' : ''),
14309
14383
  },
14310
14384
  { sessionId: sidS }
14311
14385
  );
@@ -14323,7 +14397,7 @@ async function finTypeSafeRound(sid, agent) {
14323
14397
  action: c.choice,
14324
14398
  p: c.p,
14325
14399
  pSecond: c.second,
14326
- confirm: conf,
14400
+ confirm: confVal,
14327
14401
  hour: new Date().getHours(),
14328
14402
  emaAlign: ind.ema50 != null && ind.ema200 != null ? (ind.ema50 > ind.ema200) === (c.choice === 'buy') : null,
14329
14403
  rsi: ind.rsi14,
@@ -14336,7 +14410,8 @@ async function finTypeSafeRound(sid, agent) {
14336
14410
  (orderType === 'market'
14337
14411
  ? `- ${sym}: ⚡ MARKET ${c.choice.toUpperCase()} açıldı (lot ${r.opened && r.opened.volume}, SL ${sl}, TP ${tp}, risk %${riskPct}${cal.riskMult !== 1 ? ` ×${cal.riskMult}` : ''})`
14338
14412
  : `- ${sym}: ⏳ ${emirLabel} emri kondu @${entry} (${profKey} profil, SL ${sl}, TP ${tp}, risk %${riskPct})`) +
14339
- ` · p=${c.p.toFixed(2)} teyit=${conf.toFixed(2)} · tf=${market[sym].tf}` +
14413
+ ` · p=${c.p.toFixed(2)} teyit=${confVal.toFixed(2)} · tf=${market[sym].tf}` +
14414
+ (talimatZorunlu ? ' · TALİMAT: zorunlu giriş' : '') +
14340
14415
  (thAction !== FIN_TS_DEFAULT_TH.action ? ` · öğrenilmiş eşik p≥${thAction.toFixed(2)}` : '')
14341
14416
  );
14342
14417
  } else if (r && r.ok && r.shadow) {
@@ -14426,7 +14501,8 @@ async function finTypeSafeRound(sid, agent) {
14426
14501
  try { financeLog('[typesafe] tur hatası (' + sidS + '): ' + String((e && e.message) || e)); } catch {}
14427
14502
  } finally {
14428
14503
  agent.tsBusy = false;
14429
- finTsSchedule(sidS, agent, finPaceSec());
14504
+ /* RİTİM: sahip talimatı M1/M5 diyorsa ana trader turları ona göre hızlanır */
14505
+ finTsSchedule(sidS, agent, finTsStrategyPaceSec(agent));
14430
14506
  if (agent.main && financeState.agents.has(sidS)) finPush('trader', { state: 'idle', round: agent.round, mode: 'typesafe' });
14431
14507
  }
14432
14508
  }
@@ -203,7 +203,7 @@
203
203
  <div class="fin-field"><span>Günlük max işlem</span><input id="finMaxTradesDay" type="number" min="0" max="50" step="1" title="Bir günde en fazla kaç işlem açılabilir (0 = sınırsız)" /></div>
204
204
  <div class="fin-field"><span>Kayıp serisi limiti</span><input id="finLossStreak" type="number" min="0" max="10" step="1" title="Üst üste bu kadar kayıptan sonra yeni işlem kilidi (0 = kapalı)" /></div>
205
205
  <div class="fin-field"><span>Seri molası (dk)</span><input id="finLossStreakPause" type="number" min="0" max="1440" step="5" title="Kayıp serisi limitine ulaşınca kaç dakika yeni işlem açılmaz" /></div>
206
- <div class="fin-field"><span>Re-entry bekleme (dk)</span><input id="finReentry" type="number" min="0" max="1440" step="5" title="Aynı sembolda bir işlem kapandıktan sonra yeni giriş için beklenecek süre (0 = kapalı)" /></div>
206
+ <div class="fin-field"><span>Re-entry bekleme (dk)</span><input id="finReentry" type="number" min="0" max="1440" step="5" title="Aynı sembolda bir işlem kapandıktan sonra yeni giriş için beklenecek süre — VARSAYILAN KAPALI (0 = kapalı)" /></div>
207
207
  <div class="fin-field"><span>Kur başına max</span><input id="finMaxPerCurrency" type="number" min="0" max="20" step="1" title="Yönlü kur maruziyeti (korelasyon) limiti — örn. 3: aynı para biriminde en fazla ±3 net pozisyon (0 = kapalı)" /></div>
208
208
  <div class="fin-field"><span>Plan / Review (saat)</span><div class="fin-time-row"><input id="finPlanTime" type="time" title="Hafta içi günlük plan saati (boş = kapalı)" /><input id="finReviewTime" type="time" title="Hafta içi günlük review saati (boş = kapalı)" /></div></div>
209
209
  </div>