beast-agent 2.53.0 → 2.54.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
|
@@ -78,20 +78,25 @@ function call(requests) {
|
|
|
78
78
|
const type = String(args.type || '').trim().toLowerCase();
|
|
79
79
|
const volume = Number(args.volume || 0);
|
|
80
80
|
const price = Number(args.price || 0);
|
|
81
|
-
|
|
81
|
+
/* 6 TİP: 4 bekleyen (limit/stop) + 2 ANLIK piyasa (buy_market/sell_market) */
|
|
82
|
+
const izin = ['buy_limit', 'sell_limit', 'buy_stop', 'sell_stop', 'buy_market', 'sell_market'];
|
|
82
83
|
if (!symbol) return console.log(JSON.stringify({ ok: false, error: 'symbol zorunlu' }));
|
|
83
|
-
if (!izin.includes(type)) return console.log(JSON.stringify({ ok: false, error: 'type: buy_limit|sell_limit|buy_stop|sell_stop' }));
|
|
84
|
+
if (!izin.includes(type)) return console.log(JSON.stringify({ ok: false, error: 'type: buy_limit|sell_limit|buy_stop|sell_stop|buy_market|sell_market' }));
|
|
84
85
|
if (!(volume > 0)) return console.log(JSON.stringify({ ok: false, error: 'volume (lot) zorunlu ve 0 dan buyuk' }));
|
|
85
|
-
|
|
86
|
-
|
|
86
|
+
const isMarket = type === 'buy_market' || type === 'sell_market';
|
|
87
|
+
if (!isMarket && !(price > 0)) return console.log(JSON.stringify({ ok: false, error: 'price limit/stop emri icin zorunlu ve 0 dan buyuk' }));
|
|
88
|
+
const method = isMarket ? 'market' : 'pending';
|
|
89
|
+
const params = isMarket
|
|
90
|
+
? { symbol: symbol, side: type.startsWith('buy') ? 'buy' : 'sell', volume: volume }
|
|
91
|
+
: { symbol: symbol, type: type, volume: volume, price: price };
|
|
87
92
|
if (args.sl) params.sl = Number(args.sl);
|
|
88
93
|
if (args.tp) params.tp = Number(args.tp);
|
|
89
|
-
const r = await call([{ method:
|
|
94
|
+
const r = await call([{ method: method, params: params }]);
|
|
90
95
|
if (r.ok && r.data && r.data.result) {
|
|
91
96
|
const res = r.data.result;
|
|
92
97
|
console.log(JSON.stringify({ ok: true, ticket: res.order, retcode: res.retcode, comment: res.comment, detay: r.data }));
|
|
93
98
|
} else {
|
|
94
|
-
console.log(JSON.stringify({ ok: false, error: r.error || 'bekleyen emir reddedildi' }));
|
|
99
|
+
console.log(JSON.stringify({ ok: false, error: r.error || (isMarket ? 'piyasa emri reddedildi' : 'bekleyen emir reddedildi') }));
|
|
95
100
|
}
|
|
96
101
|
})();
|
|
97
102
|
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mt5_bekleyen",
|
|
3
|
-
"description": "
|
|
3
|
+
"description": "MT5 EMİR açar (6 tip): buy_limit, sell_limit, buy_stop, sell_stop (bekleyen; price zorunlu) ve buy_market, sell_market (ANLIK piyasa emri; price gerekmez). symbol, type, volume zorunlu; sl/tp opsiyonel. Başarıda emir ticket'ı döner.",
|
|
4
4
|
"parameters": {
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
7
|
"symbol": { "type": "string", "description": "Broker sembol adi: GOLD veya BITCOIN (XAUUSD degil)" },
|
|
8
|
-
"type": { "type": "string", "description": "buy_limit | sell_limit | buy_stop | sell_stop" },
|
|
8
|
+
"type": { "type": "string", "description": "buy_limit | sell_limit | buy_stop | sell_stop | buy_market | sell_market" },
|
|
9
9
|
"volume": { "type": "number", "description": "Lot (0.01-0.1)" },
|
|
10
|
-
"price": { "type": "number", "description": "Tetiklenme/limit fiyati" },
|
|
10
|
+
"price": { "type": "number", "description": "Tetiklenme/limit fiyati (limit/stop icin zorunlu; market tiplerinde yok sayilir)" },
|
|
11
11
|
"sl": { "type": "number", "description": "Stop loss (opsiyonel)" },
|
|
12
12
|
"tp": { "type": "number", "description": "Take profit (opsiyonel)" }
|
|
13
13
|
},
|
|
14
|
-
"required": ["symbol", "type", "volume"
|
|
14
|
+
"required": ["symbol", "type", "volume"]
|
|
15
15
|
},
|
|
16
|
-
"
|
|
16
|
+
"defaultsVersion": 2,
|
|
17
|
+
"updatedAt": "2026-09-15T14:00:00.000Z"
|
|
17
18
|
}
|
package/src/agent/engine.js
CHANGED
|
@@ -2009,7 +2009,8 @@ class Engine {
|
|
|
2009
2009
|
modeBlock2 + '\n' +
|
|
2010
2010
|
(roleBlockFull ? roleBlockFull + '\n' : '') +
|
|
2011
2011
|
(teamLine || '') +
|
|
2012
|
-
'MT5 ARAÇLARI: mt5_status (bağlantı), mt5_account (hesap), mt5_market (canlı fiyat), mt5_positions (açık pozisyonlar), mt5_orders (bekleyen emirler), mt5_history (kapanan işlemler), mt5_ea (BeastFinance grafik panosu: status/ping/chart/note), mt5_trade (
|
|
2012
|
+
'MT5 ARAÇLARI: mt5_status (bağlantı), mt5_account (hesap), mt5_market (canlı fiyat), mt5_positions (açık pozisyonlar), mt5_orders (bekleyen emirler), mt5_history (kapanan işlemler), mt5_ea (BeastFinance grafik panosu: status/ping/chart/note), mt5_trade (TÜM TİPLER: buy/sell market + buy/sell limit/stop), mt5_close (kapat), mt5_modify (SL/TP), mt5_pending (TÜM TİPLER: buy_limit/sell_limit/buy_stop/sell_stop bekleyen + buy_market/sell_market anlık), mt5_cancel (emir iptal).\n' +
|
|
2013
|
+
'EMİR TİPLERİ (6 tip — HEPSİ AÇIK): buy_market/sell_market = anlık piyasa emri (fiyat beklenmez), buy_limit/sell_limit = bekleyen limit (price zorunlu), buy_stop/sell_stop = bekleyen stop (price zorunlu). mt5_trade ve mt5_pending İKİSİ DE 6 tipi kabul eder; emir tipini net söyle (ör. type:"sell_limit").\n' +
|
|
2013
2014
|
'KİŞİSEL MT5 ARAÇLARI (VARSAYILAN KURULU — tool__* tüm oturumlarda çağrılabilir): tool__mt5_shot (grafikten GERÇEK PNG + görsel ajana enjekte — grafik işlerinde BİRİNCİL; timeframes:["M1","M15"] ile çoklu periyot, symbols:["GOLD","EURUSD","BTCUSD"] ile çoklu sembol TEK karede), tool__mt5_barlar2 (OHLC mumlar, köprüsüz), tool__mt5_m15_m5 (GOLD M15+M5 hazır paket), tool__mt5_fiyat, tool__mt5_durum (hesap+pozisyon+emir tek çağrı), tool__mt5_gecmis, tool__mt5_pozisyon_gecmis, tool__mt5_sltp, tool__mt5_kapat, tool__mt5_bekleyen, tool__mt5_emir, tool__mt5_emir_iptal.\n' +
|
|
2014
2015
|
'BEASTFINANCE EA (OTOMATİK GRAFİK UZMANI — ENTEGRASYON KANALI): MT5 terminaline bağlanıldığında BeastFinance uzman danışmanı İLK GRAFİĞE OTOMATİK yüklenir, AutoTrading izni açılır (kurulum sistem tarafından yapılır; elle ekleme gerekmez). Grafik panosu + seviye çizgileri + dosya köprüsü (beast_ea.json / beast_cmd.json / beast_note.json) bu EA üzerinden yürür: entegrasyon işlerinde (status/ping/chart/note) mt5_ea kullan; ekran görüntüsü işlerinde tool__mt5_shot ("shot" komutu — gerçek PNG + ajan görseli) birincildir. Yazdığın not ve çizgiler tool__mt5_shot ve computer_look screenshot\'ında GÖRÜNÜR.\n' +
|
|
2015
2016
|
'YETKİLERİN (AÇIK — çekinmeden kullan):\n' +
|
|
@@ -9,6 +9,7 @@ const mt5 = require('../mt5bridge');
|
|
|
9
9
|
const finindicators = require('./finindicators');
|
|
10
10
|
const finstats = require('./finstats');
|
|
11
11
|
const finrisk = require('./finrisk');
|
|
12
|
+
const finwatch = require('./finwatch');
|
|
12
13
|
|
|
13
14
|
const NAMES = [
|
|
14
15
|
'mt5_status',
|
|
@@ -252,19 +253,25 @@ const definitions = NAMES.map((name) => {
|
|
|
252
253
|
},
|
|
253
254
|
mt5_trade: {
|
|
254
255
|
description:
|
|
255
|
-
'
|
|
256
|
+
'EMİR AÇAR — TÜM TİPLER: mt5_trade {symbol, side:"buy"|"sell", volume, type?, sl?, tp?, comment?, reason?}. type: "buy"|"sell" (piyasa/anlık) ya da "buy_market"|"sell_market"|"buy_limit"|"sell_limit"|"buy_stop"|"sell_stop" — limit/stop tipleri otomatik bekleyen emre (mt5_pending) yönlenir ve price gerekir. Lot limiti ve max pozisyon sayısı sistem tarafından zorlanır. Otomatik işlem anahtarı kapalıysa reddedilir. SL/TP vermek ŞİDDETLİ önerilir. reason: kararın tek cümlelik tezi (günlüğe yazılır, performans değerlendirmesinde kullanılır).',
|
|
256
257
|
parameters: {
|
|
257
258
|
type: 'object',
|
|
258
259
|
properties: {
|
|
259
260
|
symbol: { type: 'string', description: 'Örn: EURUSD' },
|
|
260
|
-
side: { type: 'string', enum: ['buy', 'sell'] },
|
|
261
|
+
side: { type: 'string', enum: ['buy', 'sell'], description: 'Yön (type ile birlikte ya da tek başına: piyasa emri)' },
|
|
262
|
+
type: {
|
|
263
|
+
type: 'string',
|
|
264
|
+
enum: ['market', 'buy_market', 'sell_market', 'buy_limit', 'sell_limit', 'buy_stop', 'sell_stop'],
|
|
265
|
+
description: 'Emir tipi. Boş/side verilirse piyasa emri; limit/stop verilirse bekleyen emir (price zorunlu olur).',
|
|
266
|
+
},
|
|
261
267
|
volume: { type: 'number', description: 'Lot (max lot sınırına tabi)' },
|
|
268
|
+
price: { type: 'number', description: 'Limit/stop emirlerinde tetik fiyatı (piyasa emrinde gerekmez)' },
|
|
262
269
|
sl: { type: 'number', description: 'Stop loss fiyatı (0 = yok)' },
|
|
263
270
|
tp: { type: 'number', description: 'Take profit fiyatı (0 = yok)' },
|
|
264
271
|
comment: { type: 'string', description: 'Kısa işlem notu' },
|
|
265
272
|
reason: { type: 'string', description: 'Kararın tezi/gerekçesi (tek cümle)' },
|
|
266
273
|
},
|
|
267
|
-
required: ['symbol', '
|
|
274
|
+
required: ['symbol', 'volume'],
|
|
268
275
|
},
|
|
269
276
|
},
|
|
270
277
|
mt5_close: {
|
|
@@ -292,19 +299,22 @@ const definitions = NAMES.map((name) => {
|
|
|
292
299
|
},
|
|
293
300
|
mt5_pending: {
|
|
294
301
|
description:
|
|
295
|
-
'
|
|
302
|
+
'EMİR AÇAR (6 tip): mt5_pending {symbol, type:"buy_limit"|"sell_limit"|"buy_stop"|"sell_stop"|"buy_market"|"sell_market", volume, price?, sl?, tp?, reason?}. Limit/stop = bekleyen emir (price zorunlu); buy_market/sell_market = ANLIK piyasa emri. Otomatik işlem anahtarına tabidir. reason: kararın tezi (günlüğe yazılır).',
|
|
296
303
|
parameters: {
|
|
297
304
|
type: 'object',
|
|
298
305
|
properties: {
|
|
299
306
|
symbol: { type: 'string' },
|
|
300
|
-
type: {
|
|
307
|
+
type: {
|
|
308
|
+
type: 'string',
|
|
309
|
+
enum: ['buy_limit', 'sell_limit', 'buy_stop', 'sell_stop', 'buy_market', 'sell_market'],
|
|
310
|
+
},
|
|
301
311
|
volume: { type: 'number' },
|
|
302
|
-
price: { type: 'number' },
|
|
312
|
+
price: { type: 'number', description: 'Tetik fiyatı — limit/stop için zorunlu, market tiplerinde gerekmez' },
|
|
303
313
|
sl: { type: 'number' },
|
|
304
314
|
tp: { type: 'number' },
|
|
305
315
|
reason: { type: 'string', description: 'Kararın tezi/gerekçesi (tek cümle)' },
|
|
306
316
|
},
|
|
307
|
-
required: ['symbol', 'type', 'volume'
|
|
317
|
+
required: ['symbol', 'type', 'volume'],
|
|
308
318
|
},
|
|
309
319
|
},
|
|
310
320
|
mt5_cancel: {
|
|
@@ -523,13 +533,20 @@ const handlers = {
|
|
|
523
533
|
};
|
|
524
534
|
},
|
|
525
535
|
async mt5_trade(args, ctx) {
|
|
536
|
+
/* TÜM EMİR TİPLERİ: piyasa (buy/sell, buy_market/sell_market) ve
|
|
537
|
+
bekleyen (buy_limit/sell_limit/buy_stop/sell_stop) — bekleyen tip
|
|
538
|
+
verilirse mt5_pending'e devredilir (tek tutarlı risk hattı). */
|
|
539
|
+
const t = finwatch.parseOrderType(args.type || args.orderType || args.side, args.side);
|
|
540
|
+
if (!t.ok) {
|
|
541
|
+
return { ok: false, error: "side 'buy'|'sell' ya da type: buy_market|sell_market|buy_limit|sell_limit|buy_stop|sell_stop" };
|
|
542
|
+
}
|
|
543
|
+
if (t.kind === 'pending') return handlers.mt5_pending({ ...args, type: t.type }, ctx);
|
|
526
544
|
const cfg = getCfg();
|
|
527
545
|
if (!cfg.allowTrading) {
|
|
528
546
|
return { ok: false, error: 'Otomatik işlem KAPALI — analiz/öneri modundasın. İşlem önerisini yaz, açma.' };
|
|
529
547
|
}
|
|
530
548
|
if (!mt5.running) return notConnected();
|
|
531
|
-
const side =
|
|
532
|
-
if (side !== 'buy' && side !== 'sell') return { ok: false, error: "side 'buy' veya 'sell' olmalı" };
|
|
549
|
+
const side = t.side;
|
|
533
550
|
const symbol = String(args.symbol || '').trim().toUpperCase();
|
|
534
551
|
if (!symbol) return { ok: false, error: 'symbol gerekli' };
|
|
535
552
|
const maxLot = Number(cfg.maxLot) || 0.1;
|
|
@@ -626,6 +643,13 @@ const handlers = {
|
|
|
626
643
|
return { ok: true, result: data && data.result };
|
|
627
644
|
},
|
|
628
645
|
async mt5_pending(args, ctx) {
|
|
646
|
+
/* 6 TİP: buy_limit/sell_limit/buy_stop/sell_stop BEKLEYEN emir;
|
|
647
|
+
buy_market/sell_market ANLIK piyasa emri — mt5_trade'e devredilir. */
|
|
648
|
+
const t = finwatch.parseOrderType(args.type || args.orderType, args.side);
|
|
649
|
+
if (!t.ok) {
|
|
650
|
+
return { ok: false, error: 'type: buy_limit|sell_limit|buy_stop|sell_stop|buy_market|sell_market' };
|
|
651
|
+
}
|
|
652
|
+
if (t.kind === 'market') return handlers.mt5_trade({ ...args, type: 'market', orderType: '', side: t.side }, ctx);
|
|
629
653
|
const cfg = getCfg();
|
|
630
654
|
if (!cfg.allowTrading) {
|
|
631
655
|
return { ok: false, error: 'Otomatik işlem KAPALI — bekleyen emir de açılamaz. Öneriyi yaz.' };
|
|
@@ -638,8 +662,11 @@ const handlers = {
|
|
|
638
662
|
const norm = finrisk.normalizeVolume(info, args.volume, Number(cfg.maxLot) || 0.1);
|
|
639
663
|
if (norm.error) return { ok: false, error: norm.error };
|
|
640
664
|
const vol = norm.volume;
|
|
641
|
-
const ptype =
|
|
642
|
-
const pside =
|
|
665
|
+
const ptype = t.type;
|
|
666
|
+
const pside = t.side;
|
|
667
|
+
if (!(Number(args.price) > 0)) {
|
|
668
|
+
return { ok: false, error: 'price gerekli — limit/stop bekleyen emirleri için tetik fiyatı ver (market tipleri anlıktır, price istemez)' };
|
|
669
|
+
}
|
|
643
670
|
/* KODLA DİSİPLİN: bekleyen emir de işlem sayılır */
|
|
644
671
|
let discErr = null;
|
|
645
672
|
try { discErr = discipline(pside, symbol, []); } catch {}
|
|
@@ -658,7 +685,7 @@ const handlers = {
|
|
|
658
685
|
tp: Number(args.tp) || 0,
|
|
659
686
|
comment: String(args.comment || 'Beast').slice(0, 26),
|
|
660
687
|
}, 20000);
|
|
661
|
-
noteTrade('pending', { symbol, type:
|
|
688
|
+
noteTrade('pending', { symbol, type: ptype, volume: vol, reason: String(args.reason || '').slice(0, 500) }, ctx);
|
|
662
689
|
return { ok: true, result: data && data.result };
|
|
663
690
|
},
|
|
664
691
|
async mt5_cancel(args, ctx) {
|
package/src/agent/finwatch.js
CHANGED
|
@@ -119,6 +119,34 @@ function closeKind(reason) {
|
|
|
119
119
|
return '';
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
+
/* ---- emir tipi çözümleme (6 tip) ----
|
|
123
|
+
"buy"/"sell" → piyasa (market); buy_market/sell_market → piyasa;
|
|
124
|
+
buy_limit/sell_limit/buy_stop/sell_stop → bekleyen (pending).
|
|
125
|
+
Esnek yazım: "sell limit", "limit_buy", "MARKET BUY", "anlık" aynı sonuca iner.
|
|
126
|
+
fallbackSide: tip yön taşımıyorsa (ör. yalnız "market"/"limit") kullanılır.
|
|
127
|
+
Dönüş: { ok, side:'buy'|'sell', kind:'market'|'pending', type:'buy_market'|... } */
|
|
128
|
+
function parseOrderType(raw, fallbackSide) {
|
|
129
|
+
const s = String(raw || '').toLowerCase().replace(/[\s-]+/g, '_');
|
|
130
|
+
const fb = String(fallbackSide || '').toLowerCase().trim();
|
|
131
|
+
const side = /(^|_)sell(_|$)/.test(s)
|
|
132
|
+
? 'sell'
|
|
133
|
+
: /(^|_)buy(_|$)/.test(s)
|
|
134
|
+
? 'buy'
|
|
135
|
+
: fb === 'sell'
|
|
136
|
+
? 'sell'
|
|
137
|
+
: fb === 'buy'
|
|
138
|
+
? 'buy'
|
|
139
|
+
: '';
|
|
140
|
+
if (!side) return { ok: false };
|
|
141
|
+
const hasLimit = /limit/.test(s);
|
|
142
|
+
const hasStop = /stop/.test(s);
|
|
143
|
+
const hasMarket = /market|instant|piyasa|anl[ıi]k/.test(s);
|
|
144
|
+
if ((hasLimit || hasStop) && !hasMarket) {
|
|
145
|
+
return { ok: true, side, kind: 'pending', type: side + '_' + (hasLimit ? 'limit' : 'stop') };
|
|
146
|
+
}
|
|
147
|
+
return { ok: true, side, kind: 'market', type: side + '_market' };
|
|
148
|
+
}
|
|
149
|
+
|
|
122
150
|
/* ---- bekleyen emir (pending) → pozisyon eşleştirme ----
|
|
123
151
|
Watchdog turu emir listesini karşılaştırır: listeden DÜŞEN emir için aynı
|
|
124
152
|
turda YENİ açılan (ya da netting hesapta hacmi artan) eşleşen bir pozisyon
|
|
@@ -188,4 +216,4 @@ function matchPendingDelta(goneOrders, freshPositions) {
|
|
|
188
216
|
return out;
|
|
189
217
|
}
|
|
190
218
|
|
|
191
|
-
module.exports = { plan, roundTo, stepRound, closeKind, orderSide, orderTypeLabel, orderVolume, matchPendingDelta };
|
|
219
|
+
module.exports = { plan, roundTo, stepRound, closeKind, parseOrderType, orderSide, orderTypeLabel, orderVolume, matchPendingDelta };
|
package/src/main.js
CHANGED
|
@@ -10516,17 +10516,20 @@ try {
|
|
|
10516
10516
|
girmez) — başarılı emir/SL-TP/bekleyen/iptal olayları aynı hatta düşer */
|
|
10517
10517
|
customtools.setTradeHook((id, args, res, sid) => {
|
|
10518
10518
|
if (!res || res.ok !== true) return;
|
|
10519
|
+
const a = args || {};
|
|
10520
|
+
/* mt5_bekleyen 6 tip kabul eder: market tipleri ANLIK işlem sayılır */
|
|
10519
10521
|
const kind = {
|
|
10520
10522
|
mt5_emir: 'trade',
|
|
10521
10523
|
mt5_sltp: 'modify',
|
|
10522
|
-
mt5_bekleyen: 'pending',
|
|
10524
|
+
mt5_bekleyen: /_market$/i.test(String(a.type || '')) ? 'trade' : 'pending',
|
|
10523
10525
|
mt5_emir_iptal: 'cancel',
|
|
10524
10526
|
mt5_kapat: 'close',
|
|
10525
10527
|
}[String(id || '')];
|
|
10526
10528
|
if (!kind) return;
|
|
10527
|
-
|
|
10528
|
-
|
|
10529
|
-
|
|
10529
|
+
if (kind === 'trade') {
|
|
10530
|
+
const side = a.side || (/^buy/i.test(String(a.type || '')) ? 'buy' : /^sell/i.test(String(a.type || '')) ? 'sell' : '');
|
|
10531
|
+
finTradeEvent('trade', { symbol: a.symbol, side, volume: a.volume, sl: a.sl, tp: a.tp, reason: a.reason || a.comment || '', result: res }, sid);
|
|
10532
|
+
} else if (kind === 'modify') finTradeEvent('modify', { ticket: a.ticket, sl: a.sl, tp: a.tp }, sid);
|
|
10530
10533
|
else if (kind === 'pending') finTradeEvent('pending', { symbol: a.symbol, type: a.type, volume: a.volume, reason: a.reason || '' }, sid);
|
|
10531
10534
|
else if (kind === 'cancel') finTradeEvent('cancel', { ticket: a.ticket }, sid);
|
|
10532
10535
|
else if (kind === 'close') finTradeEvent('close', { ticket: a.ticket, volume: a.volume || 'all' }, sid);
|
|
@@ -10985,7 +10988,7 @@ function finTraderBrief(agent) {
|
|
|
10985
10988
|
`Tur aralığı: ${f.intervalSec} sn · Max lot: ${f.maxLot} · Max eşzamanlı pozisyon: ${f.maxPositions}`,
|
|
10986
10989
|
roleDef
|
|
10987
10990
|
? `UZMANLIK: ${roleDef.desc} — raporlarını bu çerçevede yaz; İŞLEM AÇMA, yalnız analiz + net öneri üret.`
|
|
10988
|
-
: 'Otomatik işlem AÇIK (daima): mt5_trade
|
|
10991
|
+
: 'Otomatik işlem AÇIK (daima): 6 emir tipinin HEPSİ açık — buy_market/sell_market (anlık piyasa), buy_limit/sell_limit ve buy_stop/sell_stop (bekleyen; price zorunlu). mt5_trade ya da mt5_pending İKİSİ de tüm tipleri kabul eder; ayrıca mt5_close/mt5_modify/mt5_cancel açık (limitler sistemce zorlanır). Lot için mt5_risksize hesapla ya da mt5_trade’e riskPct ver; SL/TP broker stops_level mesafesine uymalı.',
|
|
10989
10992
|
roleDef
|
|
10990
10993
|
? 'Bulgularını agent_dm ile ANA TRADER\u2019a bildir (to: "Trader" ya da ajan başlığı anahtarı); teknik/öneri çelişkisi varsa gerekçenle yaz.'
|
|
10991
10994
|
: f.strategy ? `Sahibinin strateji notu: ${f.strategy}` : 'Strateji notu yok: trend + destek/direnç + momentum ile temel okuma yap.',
|