/* eslint-disable max-len */ /* eslint-disable complexity */ import { useEffect, useState } from 'react'; import MetaApi, { TrackerEventListener, RiskManagement } from 'metaapi.cloud-sdk'; import { PrintLog, // for log Sections, Section, // Layout Form, Field // Form } from '../../shared'; interface IRiskManagementEquityTrackingProps { accountId?: string token?: string domain?: string } export function RiskManagementEquityTracking({ accountId: defaultAccountId, token: defaultToken, domain: defaultDomain }: IRiskManagementEquityTrackingProps) { const [trakerName, setTrackerName] = useState('example-tracker'); /* UI control */ const [areResourcesNarrowedDown, setAreResourcesNarrowedDown] = useState(true); const [isConnecting, setIsConnecting] = useState(false); const [isConnected, setIsConnected] = useState(false); /* Logging */ const [resultLog, setResultLog] = useState([]); const [errorLog, setErrorLog] = useState([]); const logErr = (...args: unknown[]) => setErrorLog(logs => { console.log(...args); return [...logs, ...args.map((arg: any) => arg.message || arg)]; }); const log = (...args: unknown[]) => setResultLog(logs => { console.log(...args); return [...logs, ...args]; }); /*! STORE MAIN VARIABLE */ const [accountId, setAccountId] = useState(defaultAccountId || ''); const [token, setToken] = useState(defaultToken || ''); const [domain, setDomain] = useState(defaultDomain || ''); class TrackerEventListenerLogged extends TrackerEventListener { async onTrackerEvent(trackerEvent: unknown) { log('tracker event received', JSON.stringify(trackerEvent)); } async onError(error: unknown) { log('error event received', error); } } const fetchData = async () => { const metaApi = new MetaApi(token, { domain }); const areTokenResourcesNarrowedDown = metaApi.tokenManagementApi.areTokenResourcesNarrowedDown(token); setAreResourcesNarrowedDown(areTokenResourcesNarrowedDown); const riskManagement = new RiskManagement(token, { domain }); const riskManagementApi = riskManagement.riskManagementApi; try { const trackerId = await riskManagementApi.createTracker(accountId, { name: trakerName || 'example-tracker', absoluteDrawdownThreshold: 5, period: 'day' }); log('Created an event tracker ', trackerId.id); const trackerEventListener = new TrackerEventListenerLogged(accountId, trackerId.id); const listenerId = await riskManagementApi.addTrackerEventListener(trackerEventListener, accountId, trackerId.id); log('Streaming tracking events for 1 minute...'); await new Promise(res => setTimeout(res, 1000 * 60)); riskManagementApi.removeTrackerEventListener(listenerId); log('Receiving statistics with REST API' ); const events = await riskManagementApi.getTrackerEvents( undefined, undefined, accountId, trackerId.id); log('tracking events', events ); const statistics = await riskManagementApi.getTrackingStatistics(accountId, trackerId.id); log('tracking statistics', statistics); const equityChart = await riskManagementApi.getEquityChart(accountId); log('equity chart', equityChart); // removing the tracker await riskManagementApi.deleteTracker(accountId, trackerId.id); log('Removed the tracker'); } catch (err) { logErr(err); throw err; } }; /* Control */ const reset = () => { setIsConnecting(false); setIsConnected(false); setResultLog([]); setErrorLog([]); setAccountId(defaultAccountId || ''); setToken(defaultToken ||''); setDomain(defaultDomain || ''); }; const triggerToFetchData = () => { if (isConnected || !accountId || !token) {return;} setIsConnecting(true); }; /* Use one for control request and rerender */ useEffect(() => { if (isConnected || !isConnecting) { return; } fetchData() .then(() => setIsConnected(true)) // If success .catch(err => console.log('failed', err)) // If failed .finally(() => setIsConnecting(false)); // Enable an interaction with UI }, [isConnecting]); // if change isConnecting run useEffect return (

Risk management. Equity tracking example

Connect to your account

{!areResourcesNarrowedDown &&

Warning

It seems like you are using a admin API token.

Since the token can be retrieven from the browser or mobile apps by end user this can lead to your application being compromised, unless you understand what are you doing.

Please use Token Management API in your backend application to produce secure tokens which you can then use in web UI or mobile apps.

} {resultLog && resultLog.length > 0 &&

Logs

} {errorLog && errorLog.length > 0 &&

Errors

}
); }