/* eslint-disable max-len */ /* eslint-disable complexity */ import { useEffect, useState } from 'react'; import MetaApi, { PeriodStatisticsListener, RiskManagement } from 'metaapi.cloud-sdk'; import { PrintLog, // for log Sections, Section, // Layout Form, Field // Form } from '../../shared'; interface IRiskManagementPeriodStatisticsStreamProps { accountId?: string token?: string domain?: string } export function RiskManagementPeriodStatisticsStream({ accountId: defaultAccountId, domain: defaultDomain, token: defaultToken, }: IRiskManagementPeriodStatisticsStreamProps) { /* UI control */ const [areResourcesNarrowedDown, setAreResourcesNarrowedDown] = useState(true); const [trakerName, setTrackerName] = useState('example-tracker'); 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 PeriodStatisticsListenerLogged extends PeriodStatisticsListener { async onPeriodStatisticsCompleted() { log('period completed event received'); } async onTrackerCompleted() { log('tracker completed event received'); } async onConnected() { log('on connected event received'); } async onDisconnected() { log('on disconnected event received'); } async onError() { logErr('error event received'); } } 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 { // creating a tracker const trackerId = await riskManagementApi.createTracker(accountId, { name: trakerName || 'example-tracker', absoluteDrawdownThreshold: 5, period: 'day' }); log('Created an event tracker ', trackerId.id); const periodStatisticsListener = new PeriodStatisticsListenerLogged(accountId, trackerId.id); const listenerId = await riskManagementApi.addPeriodStatisticsListener( periodStatisticsListener, accountId, trackerId.id); log('Streaming period statistics events for 1 minute...'); await new Promise(res => setTimeout(res, 1000 * 60)); riskManagementApi.removePeriodStatisticsListener(listenerId); const equityChart = await riskManagementApi.getEquityChart(accountId); await riskManagementApi.deleteTracker(accountId, trackerId.id); log('Equity chart', equityChart); } 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. Period statistics stream 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

}
); }