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 +1 -1
- package/src/main.js +110 -34
- package/src/renderer/index.html +1 -1
package/package.json
CHANGED
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
|
-
|
|
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
|
-
/*
|
|
13669
|
-
|
|
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:
|
|
14106
|
-
|
|
14107
|
-
|
|
14108
|
-
|
|
14109
|
-
|
|
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
|
-
|
|
14119
|
-
|
|
14120
|
-
|
|
14121
|
-
|
|
14122
|
-
|
|
14123
|
-
|
|
14124
|
-
|
|
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
|
-
|
|
14237
|
-
|
|
14238
|
-
|
|
14239
|
-
|
|
14240
|
-
|
|
14241
|
-
|
|
14242
|
-
|
|
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
|
-
|
|
14267
|
-
const
|
|
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=${
|
|
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:
|
|
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=${
|
|
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
|
-
|
|
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
|
}
|
package/src/renderer/index.html
CHANGED
|
@@ -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>
|