beast-agent 2.75.0 → 2.76.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/main.js +92 -10
- package/src/renderer/index.html +6 -2
- package/src/renderer/renderer.js +8 -4
package/package.json
CHANGED
package/src/main.js
CHANGED
|
@@ -9906,7 +9906,8 @@ const financeState = {
|
|
|
9906
9906
|
watchTickAt: 0,
|
|
9907
9907
|
/* POZİSYON YÖNETİCİSİ (JEV): açık pozisyon varken 5 sn'lik watchdog turundan
|
|
9908
9908
|
tetiklenen ayrı Jev ajanı — kapat/kısmi/SL kararlarını kendi talimatıyla verir */
|
|
9909
|
-
posManager: { busy: false, rounds: 0, lastAt: 0, lastErr: '', lastPosCount: 0, tsPartials: new Set() },
|
|
9909
|
+
posManager: { busy: false, rounds: 0, lastAt: 0, lastErr: '', lastPosCount: 0, timer: null, tsPartials: new Set() },
|
|
9910
|
+
posSnapshot: null, /* son watchdog turunun pozisyon/hesap anlık görüntüsü (yönetici yeniden kullanır) */
|
|
9910
9911
|
hoursTimer: null, /* trade saatleri otomatik duraklatma denetimi (10 sn) */
|
|
9911
9912
|
hoursPaused: null, /* pencere kapanınca durdurulan ajanların planı — açılınca geri gelir */
|
|
9912
9913
|
alerts: [], /* fiyat alarmları (kalıcı: finance/alerts.json) */
|
|
@@ -10045,6 +10046,9 @@ function finCfg() {
|
|
|
10045
10046
|
ajan — varsayılan AÇIK; kendi talimatı (posManagerNote) yalnız onu bağlar. */
|
|
10046
10047
|
if (typeof f.posManagerEnabled !== 'boolean') f.posManagerEnabled = true;
|
|
10047
10048
|
if (typeof f.posManagerNote !== 'string') f.posManagerNote = '';
|
|
10049
|
+
/* Yönetici kontrol sıklığı (sn): 1-300; varsayılan 5 */
|
|
10050
|
+
if (!Number.isFinite(Number(f.posManagerSec))) f.posManagerSec = 5;
|
|
10051
|
+
f.posManagerSec = Math.max(1, Math.min(300, Math.round(Number(f.posManagerSec) || 5)));
|
|
10048
10052
|
/* GÜNLÜK RUTİN: plan/review saatleri (HH:MM; boş = kapalı) — hafta içi cron */
|
|
10049
10053
|
if (typeof f.planTime !== 'string') f.planTime = '';
|
|
10050
10054
|
if (typeof f.reviewTime !== 'string') f.reviewTime = '';
|
|
@@ -11664,10 +11668,13 @@ async function finWatchTick() {
|
|
|
11664
11668
|
try { await finRecordClose(ticket, st); } catch {}
|
|
11665
11669
|
}
|
|
11666
11670
|
}
|
|
11667
|
-
/* POZİSYON YÖNETİCİSİ (JEV):
|
|
11668
|
-
|
|
11669
|
-
if (positionsOk
|
|
11670
|
-
|
|
11671
|
+
/* POZİSYON YÖNETİCİSİ (JEV): pozisyon anlık görüntüsü saklanır (yönetici
|
|
11672
|
+
kendi zamanlayıcısında yeniden kullanır) + tur burada da tetiklenir */
|
|
11673
|
+
if (positionsOk) {
|
|
11674
|
+
financeState.posSnapshot = { at: Date.now(), positions, account };
|
|
11675
|
+
if (positions.length) {
|
|
11676
|
+
try { finPosManagerMaybe(positions, account); } catch {}
|
|
11677
|
+
}
|
|
11671
11678
|
}
|
|
11672
11679
|
try { await finCheckAlerts(); } catch {}
|
|
11673
11680
|
if (!financeState.lastStatsAt || Date.now() - financeState.lastStatsAt > 120000) {
|
|
@@ -11683,9 +11690,12 @@ async function finWatchTick() {
|
|
|
11683
11690
|
}
|
|
11684
11691
|
|
|
11685
11692
|
function finWatchStart() {
|
|
11686
|
-
if (financeState.watchTimer)
|
|
11687
|
-
|
|
11688
|
-
|
|
11693
|
+
if (!financeState.watchTimer) {
|
|
11694
|
+
financeState.watchTimer = setInterval(() => { finWatchTick().catch(() => {}); }, 5000);
|
|
11695
|
+
finWatchTick().catch(() => {});
|
|
11696
|
+
}
|
|
11697
|
+
/* Pozisyon yöneticisinin KENDİ zamanlayıcısı (ayarlı aralık; 1-300 sn) */
|
|
11698
|
+
try { finPosManagerStart(); } catch {}
|
|
11689
11699
|
}
|
|
11690
11700
|
|
|
11691
11701
|
function finWatchStop() {
|
|
@@ -11693,6 +11703,7 @@ function finWatchStop() {
|
|
|
11693
11703
|
clearInterval(financeState.watchTimer);
|
|
11694
11704
|
financeState.watchTimer = null;
|
|
11695
11705
|
}
|
|
11706
|
+
try { finPosManagerStop(); } catch {}
|
|
11696
11707
|
}
|
|
11697
11708
|
|
|
11698
11709
|
function finWatchLoad() {
|
|
@@ -14222,6 +14233,66 @@ async function finTsToolRequest(sidS, agent, ans, lines) {
|
|
|
14222
14233
|
const FIN_POSMGR_ID = 'posmanager';
|
|
14223
14234
|
const FIN_POSMGR_AGENT = { main: false, role: '', __posmgr: true };
|
|
14224
14235
|
|
|
14236
|
+
/* Yönetici kontrol sıklığı (sn) — ayarlardan; 1-300 */
|
|
14237
|
+
function finPosMgrSec() {
|
|
14238
|
+
try {
|
|
14239
|
+
return Math.max(1, Math.min(300, Math.round(Number(finCfg().posManagerSec) || 5)));
|
|
14240
|
+
} catch {
|
|
14241
|
+
return 5;
|
|
14242
|
+
}
|
|
14243
|
+
}
|
|
14244
|
+
|
|
14245
|
+
/* KENDİ ZAMANLAYICISI: 1 sn'lik yoklama, ayarlı aralık dolunca turu başlatır —
|
|
14246
|
+
böylece 5 sn'den hızlı (ör. 2 sn) ve yavaş (ör. 60 sn) aralıklar da çalışır.
|
|
14247
|
+
Taze watchdog anlık görüntüsü varsa onu kullanır (ekstra MT5 sorgusu yok). */
|
|
14248
|
+
async function finPosManagerTick() {
|
|
14249
|
+
const pm = financeState.posManager;
|
|
14250
|
+
if (!pm || pm.busy) return;
|
|
14251
|
+
let f = {};
|
|
14252
|
+
try { f = finCfg(); } catch {}
|
|
14253
|
+
if (f.posManagerEnabled === false) return;
|
|
14254
|
+
const sec = finPosMgrSec();
|
|
14255
|
+
if (pm.lastAt && Date.now() - pm.lastAt < sec * 1000) return;
|
|
14256
|
+
if (!mt5bridge.running) return;
|
|
14257
|
+
let positions = null;
|
|
14258
|
+
let account = null;
|
|
14259
|
+
const snap = financeState.posSnapshot;
|
|
14260
|
+
if (snap && Date.now() - Number(snap.at || 0) < 5000) {
|
|
14261
|
+
positions = snap.positions;
|
|
14262
|
+
account = snap.account;
|
|
14263
|
+
} else {
|
|
14264
|
+
try {
|
|
14265
|
+
const [posR, accR] = await Promise.all([
|
|
14266
|
+
mt5bridge.call('positions', {}, 8000).catch(() => null),
|
|
14267
|
+
mt5bridge.call('account', {}, 8000).catch(() => null),
|
|
14268
|
+
]);
|
|
14269
|
+
positions = (posR && posR.ok && posR.data && posR.data.positions) || [];
|
|
14270
|
+
account = (accR && accR.ok && accR.data && accR.data.account) || null;
|
|
14271
|
+
financeState.posSnapshot = { at: Date.now(), positions, account };
|
|
14272
|
+
} catch {
|
|
14273
|
+
return;
|
|
14274
|
+
}
|
|
14275
|
+
}
|
|
14276
|
+
if (!Array.isArray(positions) || !positions.length) {
|
|
14277
|
+
pm.lastPosCount = 0;
|
|
14278
|
+
return;
|
|
14279
|
+
}
|
|
14280
|
+
finPosManagerMaybe(positions, account);
|
|
14281
|
+
}
|
|
14282
|
+
|
|
14283
|
+
function finPosManagerStart() {
|
|
14284
|
+
const pm = financeState.posManager;
|
|
14285
|
+
if (!pm || pm.timer) return;
|
|
14286
|
+
pm.timer = setInterval(() => { finPosManagerTick().catch(() => {}); }, 1000);
|
|
14287
|
+
}
|
|
14288
|
+
|
|
14289
|
+
function finPosManagerStop() {
|
|
14290
|
+
const pm = financeState.posManager;
|
|
14291
|
+
if (!pm || !pm.timer) return;
|
|
14292
|
+
clearInterval(pm.timer);
|
|
14293
|
+
pm.timer = null;
|
|
14294
|
+
}
|
|
14295
|
+
|
|
14225
14296
|
/* Watchdog turundan çağrılır: uygunSA yönetici turunu arka planda başlatır
|
|
14226
14297
|
(MT5 pozisyon verisi watchdog turundan gelir — ikinci sorgu yok). */
|
|
14227
14298
|
function finPosManagerMaybe(positions, account) {
|
|
@@ -14230,6 +14301,8 @@ function finPosManagerMaybe(positions, account) {
|
|
|
14230
14301
|
let f = {};
|
|
14231
14302
|
try { f = finCfg(); } catch {}
|
|
14232
14303
|
if (f.posManagerEnabled === false) return;
|
|
14304
|
+
const sec = finPosMgrSec();
|
|
14305
|
+
if (pm.lastAt && Date.now() - pm.lastAt < sec * 1000) return; /* ayarlı aralık dolmadı */
|
|
14233
14306
|
const list = Array.isArray(positions) ? positions.filter(Boolean) : [];
|
|
14234
14307
|
pm.lastPosCount = list.length;
|
|
14235
14308
|
if (!list.length) return;
|
|
@@ -14397,7 +14470,7 @@ async function finPosManagerRound(positions, account) {
|
|
|
14397
14470
|
finTsPost(
|
|
14398
14471
|
FIN_POSMGR_ID,
|
|
14399
14472
|
FIN_POSMGR_AGENT,
|
|
14400
|
-
`🛡️ Pozisyon yöneticisi turu #${pm.rounds} (LLM yok —
|
|
14473
|
+
`🛡️ Pozisyon yöneticisi turu #${pm.rounds} (LLM yok — ${finPosMgrSec()} sn):\n` +
|
|
14401
14474
|
(instrTxt ? 'TALİMAT AYARLARI (kod uygular): ' + instrTxt + '\n' : '') +
|
|
14402
14475
|
lines.join('\n'),
|
|
14403
14476
|
'yönetim'
|
|
@@ -14709,7 +14782,7 @@ async function finTypeSafeRound(sid, agent) {
|
|
|
14709
14782
|
if (pos) {
|
|
14710
14783
|
/* POZİSYON YÖNETİCİSİ açık: kapat/kısmi/SL kararları onun turunda */
|
|
14711
14784
|
if (posManagerOn) {
|
|
14712
|
-
lines.push(`- ${sym}: pozisyon açık #${pos.ticket} — yönetim Pozisyon Yöneticisi'nde (
|
|
14785
|
+
lines.push(`- ${sym}: pozisyon açık #${pos.ticket} — yönetim Pozisyon Yöneticisi'nde (${finPosMgrSec()} sn Jev turu)`);
|
|
14713
14786
|
continue;
|
|
14714
14787
|
}
|
|
14715
14788
|
const ex = finTsNoul(ans, 'kapat_' + i);
|
|
@@ -14882,6 +14955,13 @@ async function finTypeSafeRound(sid, agent) {
|
|
|
14882
14955
|
}
|
|
14883
14956
|
/* JEV ARAÇ İSTEĞİ (tur düzeyi): eksik araç varsa TOOL botuna asenkron yazdır */
|
|
14884
14957
|
try { await finTsToolRequest(sidS, agent, ans, lines); } catch {}
|
|
14958
|
+
/* GÖRÜNÜRLÜK: açık pozisyon varken de trade ajanı tur atar ve YENİ
|
|
14959
|
+
girişleri değerlendirir (yönetim ayrı ajanda olsa bile) */
|
|
14960
|
+
if (posManagerOn && posList.length) {
|
|
14961
|
+
lines.unshift(
|
|
14962
|
+
`ℹ️ ${posList.length} açık pozisyon Pozisyon Yöneticisi'nde (${finPosMgrSec()} sn) — bu trade turu yeni girişleri değerlendirdi.`
|
|
14963
|
+
);
|
|
14964
|
+
}
|
|
14885
14965
|
const insTxt = finInstrSummary(ins);
|
|
14886
14966
|
finTsPost(
|
|
14887
14967
|
sidS,
|
|
@@ -15206,6 +15286,7 @@ ipcMain.handle('finance:snapshot', async () => {
|
|
|
15206
15286
|
lastErr: String(financeState.posManager.lastErr || ''),
|
|
15207
15287
|
positions: Number(financeState.posManager.lastPosCount) || 0,
|
|
15208
15288
|
note: String(f.posManagerNote || ''),
|
|
15289
|
+
sec: Number(f.posManagerSec) || 5,
|
|
15209
15290
|
},
|
|
15210
15291
|
};
|
|
15211
15292
|
});
|
|
@@ -15439,6 +15520,7 @@ ipcMain.handle('finance:settings', async (_e, patch) => {
|
|
|
15439
15520
|
/* POZİSYON YÖNETİCİSİ: kendi talimatı + aç/kapa */
|
|
15440
15521
|
if (p.posManagerNote !== undefined) f.posManagerNote = String(p.posManagerNote || '').slice(0, 1500);
|
|
15441
15522
|
if (p.posManagerEnabled !== undefined) f.posManagerEnabled = p.posManagerEnabled !== false;
|
|
15523
|
+
if (p.posManagerSec !== undefined) f.posManagerSec = Math.max(1, Math.min(300, Math.round(Number(p.posManagerSec) || 5)));
|
|
15442
15524
|
if (p.planTime !== undefined) f.planTime = /^([01]?\d|2[0-3]):([0-5]\d)$/.test(String(p.planTime || '').trim()) ? String(p.planTime).trim() : '';
|
|
15443
15525
|
if (p.reviewTime !== undefined) f.reviewTime = /^([01]?\d|2[0-3]):([0-5]\d)$/.test(String(p.reviewTime || '').trim()) ? String(p.reviewTime).trim() : '';
|
|
15444
15526
|
/* TRADE SAATLERİ: {on, start, end} — yerel saat; aralık dışında ajan turları
|
package/src/renderer/index.html
CHANGED
|
@@ -222,10 +222,14 @@
|
|
|
222
222
|
<div class="fin-card" id="finPosCard" data-fin-card="posmgr">
|
|
223
223
|
<div class="fin-card-title">POZİSYON YÖNETİCİSİ <span id="finPosDot" class="fin-dot off" title="Pozisyon yöneticisi durumu"></span><span id="finPosInfo" class="fin-hint"></span></div>
|
|
224
224
|
<div class="fin-field fin-check">
|
|
225
|
-
<label title="Açık pozisyon varken
|
|
226
|
-
<input id="finPosOn" type="checkbox" /> Aktif — açık pozisyonları
|
|
225
|
+
<label title="Açık pozisyon varken ayarlı sıklıkta JEV turu: kapat / kısmi kapat / SL taşı kararları. Trade ajanından bağımsız ayrı bir ajan — kendi talimatıyla çalışır; LLM kullanmaz.">
|
|
226
|
+
<input id="finPosOn" type="checkbox" /> Aktif — açık pozisyonları Jev ile yönet
|
|
227
227
|
</label>
|
|
228
228
|
</div>
|
|
229
|
+
<div class="fin-field">
|
|
230
|
+
<span>Kontrol (sn)</span>
|
|
231
|
+
<input id="finPosSec" type="number" min="1" max="300" step="1" title="Kaç saniyede bir kontrol edilsin — 1-300 (varsayılan 5). Trade ajanından bağımsız kendi zamanlayıcısı vardır." />
|
|
232
|
+
</div>
|
|
229
233
|
<div class="fin-field">
|
|
230
234
|
<span>Yönetici talimatı <i class="fin-hint">— yalnız bu ajanı bağlar</i><button id="finPosHelp" class="fin-help-btn" type="button" title="Neler yazabilirim? Desteklenen talimatlar ve örnekler">?</button></span>
|
|
231
235
|
<textarea id="finPosNote" rows="2" maxlength="1500" placeholder="örn. 1- 1R'de %50 kısmi kapat 2- kâr 2R'ye gelince kalanı kapat 3- zarar -0.5R'yi geçerse kes" title="Bu talimat YALNIZ Pozisyon Yöneticisi Jev ajanına gider (5 sn turu, kapat/kısmi/SL kararları); kaydetmek için alandan çık"></textarea>
|
package/src/renderer/renderer.js
CHANGED
|
@@ -253,6 +253,7 @@ const els = {
|
|
|
253
253
|
finPosDot: $('#finPosDot'),
|
|
254
254
|
finPosInfo: $('#finPosInfo'),
|
|
255
255
|
finPosOn: $('#finPosOn'),
|
|
256
|
+
finPosSec: $('#finPosSec'),
|
|
256
257
|
finPosNote: $('#finPosNote'),
|
|
257
258
|
finPosStatus: $('#finPosStatus'),
|
|
258
259
|
finPosList: $('#finPosList'),
|
|
@@ -9947,6 +9948,7 @@ function finTraderInputsSet(cfg) {
|
|
|
9947
9948
|
if (els.finStrategy && ae !== els.finStrategy && !finStrategyDirty) els.finStrategy.value = cfg.strategy || '';
|
|
9948
9949
|
if (els.finPosNote && ae !== els.finPosNote && !finPosNoteDirty) els.finPosNote.value = cfg.posManagerNote || '';
|
|
9949
9950
|
if (els.finPosOn && ae !== els.finPosOn) els.finPosOn.checked = cfg.posManagerEnabled !== false;
|
|
9951
|
+
if (els.finPosSec && ae !== els.finPosSec) els.finPosSec.value = Number(cfg.posManagerSec) || 5;
|
|
9950
9952
|
if (els.finMaxTradesDay && ae !== els.finMaxTradesDay) els.finMaxTradesDay.value = Number(cfg.maxTradesPerDay) || 0;
|
|
9951
9953
|
if (els.finLossStreak && ae !== els.finLossStreak) els.finLossStreak.value = Number(cfg.lossStreakLimit) || 0;
|
|
9952
9954
|
if (els.finLossStreakPause && ae !== els.finLossStreakPause) els.finLossStreakPause.value = Number(cfg.lossStreakPauseMin) || 0;
|
|
@@ -10113,13 +10115,14 @@ function finRenderPosManager(pm, cfg) {
|
|
|
10113
10115
|
if (!pm) return;
|
|
10114
10116
|
const enabled = cfg ? cfg.posManagerEnabled !== false : pm.enabled !== false;
|
|
10115
10117
|
const pos = Number(pm.positions) || 0;
|
|
10118
|
+
const sec = Number(pm.sec || (cfg && cfg.posManagerSec)) || 5;
|
|
10116
10119
|
if (els.finPosDot) {
|
|
10117
10120
|
els.finPosDot.classList.remove('on', 'off', 'busy');
|
|
10118
10121
|
els.finPosDot.classList.add(!enabled ? 'off' : pm.busy ? 'busy' : pos ? 'on' : 'off');
|
|
10119
10122
|
els.finPosDot.title = !enabled
|
|
10120
10123
|
? 'Pozisyon yöneticisi kapalı'
|
|
10121
10124
|
: pos
|
|
10122
|
-
? 'İzliyor — ' + pos + ' açık pozisyon (
|
|
10125
|
+
? 'İzliyor — ' + pos + ' açık pozisyon (' + sec + ' sn Jev turu)'
|
|
10123
10126
|
: 'Açık pozisyon yok — beklemede';
|
|
10124
10127
|
}
|
|
10125
10128
|
if (els.finPosInfo) els.finPosInfo.textContent = pm.rounds ? '· tur ' + pm.rounds : '';
|
|
@@ -10127,8 +10130,8 @@ function finRenderPosManager(pm, cfg) {
|
|
|
10127
10130
|
let t;
|
|
10128
10131
|
if (!enabled) t = 'Kapalı — kutucuktan aç';
|
|
10129
10132
|
else if (pm.busy) t = 'Tur çalışıyor…';
|
|
10130
|
-
else if (!pos) t = 'Beklemede — açık pozisyon yok';
|
|
10131
|
-
else t = 'İzliyor · ' + pos + ' pozisyon';
|
|
10133
|
+
else if (!pos) t = 'Beklemede — açık pozisyon yok (' + sec + ' sn yoklama)';
|
|
10134
|
+
else t = 'İzliyor · ' + pos + ' pozisyon · ' + sec + ' sn';
|
|
10132
10135
|
if (pm.lastAt) {
|
|
10133
10136
|
const d = new Date(pm.lastAt);
|
|
10134
10137
|
const p = (x) => String(x).padStart(2, '0');
|
|
@@ -10797,6 +10800,7 @@ finAutoNum(els.finMaxTradesDay, 'maxTradesPerDay', 0, 50, 1);
|
|
|
10797
10800
|
finAutoNum(els.finLossStreak, 'lossStreakLimit', 0, 10, 1);
|
|
10798
10801
|
finAutoNum(els.finLossStreakPause, 'lossStreakPauseMin', 0, 1440, 5);
|
|
10799
10802
|
finAutoNum(els.finReentry, 'reentryCooldownMin', 0, 1440, 5);
|
|
10803
|
+
finAutoNum(els.finPosSec, 'posManagerSec', 1, 300, 1);
|
|
10800
10804
|
finAutoNum(els.finMaxPerCurrency, 'maxPerCurrency', 0, 20, 1);
|
|
10801
10805
|
const finTimeSave = (el, key) => {
|
|
10802
10806
|
if (!el) return;
|
|
@@ -10951,7 +10955,7 @@ function finHelpHtml(which) {
|
|
|
10951
10955
|
? `1- 1R'de %50 kısmi kapat\n2- kâr 2R'ye gelince kalanı kapat\n3- zarar -0.5R'yi geçerse kes`
|
|
10952
10956
|
: `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`;
|
|
10953
10957
|
const head = posmgr
|
|
10954
|
-
? 'Pozisyon Yöneticisi (5 sn
|
|
10958
|
+
? 'Pozisyon Yöneticisi (ayarlı sıklık — varsayılan 5 sn) açık pozisyonları yönetir: kapat / kısmi kapat / SL taşı. Trade Ajanı pozisyon açıkken de tur atmaya devam eder ve yeni girişleri değerlendirir.'
|
|
10955
10959
|
: 'Trade Ajanı girişleri yönetir: yön, emir tipi, risk, lot, martingale ve günlük limitler.';
|
|
10956
10960
|
const rows = items
|
|
10957
10961
|
.map((it) => '<div class="fin-help-item"><div class="fin-help-code">' + it[0] + '</div><div class="fin-help-desc">' + it[1] + '</div></div>')
|