/* Only complements native navigation; native search and Woo actions stay unchanged. */ (()=>{ const key='cfHeaderDraft40435'; window[key]?.dispose?.(); const abort=new AbortController(),media=matchMedia('(max-width:1024px)'); const header=()=>document.querySelector('.elementor-40435.elementor-location-header'); const toggle=()=>header()?.querySelector('.cf-header-nav .elementor-menu-toggle'); const expanded=t=>t&&(t.getAttribute('aria-expanded')==='true'||t.classList.contains('elementor-active')); const close=focus=>{const t=toggle();if(expanded(t)){t.click();if(focus)t.focus();}}; document.addEventListener('keydown',event=>{ if(event.key==='Escape'&&expanded(toggle())){close(true);event.preventDefault();} },{signal:abort.signal}); document.addEventListener('pointerdown',event=>{ const nav=header()?.querySelector('.cf-header-nav'); if(media.matches&&expanded(toggle())&&nav&&!nav.contains(event.target))close(false); },{signal:abort.signal}); const change=()=>close(false);media.addEventListener('change',change); const disposeCart=cfEnhanceDraftCart(header()); window[key]={dispose(){abort.abort();media.removeEventListener('change',change);disposeCart();}}; /* Proposal only. Call inside the draft header's existing behaviour IIFE: * const disposeCart = cfEnhanceDraftCart(header()); * Include disposeCart() in that IIFE's existing dispose method. * Native cart toggling, fragments and checkout links remain untouched. */ function cfEnhanceDraftCart(header) { if (!header || header.getAttribute('data-elementor-id') === '353') return () => {}; const abort = new AbortController(), owned = new Map(); let wasOpen = false, closing = false, frame = 0; const refs = () => { const widget = header.querySelector('.cf-header-cart'); return {widget, pane:widget?.querySelector('.elementor-menu-cart__main'), trigger:widget?.querySelector('.elementor-menu-cart__toggle_button'), close:widget?.querySelector('.elementor-menu-cart__close-button, .elementor-menu-cart__close-button-custom')}; }; const open = r => !!r.widget?.classList.contains('elementor-menu-cart--shown'); const attribute = (el, name, value) => { if (!el || el.getAttribute(name) === value) return; if (!owned.has(el)) owned.set(el, new Map()); const values = owned.get(el), old = values.has(name) ? values.get(name).old : el.getAttribute(name); values.set(name, {old, value}); el.setAttribute(name, value); }; const prepare = r => { if (!r.pane) return; if (!r.pane.id) attribute(r.pane, 'id', 'cf-cart-dialog-' + header.getAttribute('data-elementor-id')); attribute(r.pane, 'role', 'dialog'); attribute(r.pane, 'aria-modal', 'true'); if (!r.pane.hasAttribute('aria-label') && !r.pane.hasAttribute('aria-labelledby')) attribute(r.pane, 'aria-label', 'Shopping cart'); attribute(r.pane, 'tabindex', '-1'); attribute(r.trigger, 'aria-haspopup', 'dialog'); attribute(r.trigger, 'aria-controls', r.pane.id); if (r.close) { if (!r.close.matches('button, input[type="button"]')) attribute(r.close, 'role', 'button'); attribute(r.close, 'tabindex', '0'); if (!r.close.hasAttribute('aria-label') && !r.close.hasAttribute('aria-labelledby')) attribute(r.close, 'aria-label', 'Close shopping cart'); } }; const focusable = pane => [...pane.querySelectorAll('a[href],button,input,select,textarea,summary,[tabindex],[contenteditable="true"]')] .filter(el => el.tabIndex >= 0 && !el.matches(':disabled') && !el.closest('[hidden],[inert],[aria-hidden="true"]') && el.getClientRects().length && getComputedStyle(el).visibility === 'visible'); const focusInside = () => { const r = refs(); if (!open(r) || closing || !r.pane) return; (focusable(r.pane)[0] || r.pane).focus({preventScroll:true}); }; const returnFocus = () => { const t = refs().trigger; if (t?.isConnected) t.focus(); }; const sync = () => { const r = refs(); prepare(r); const now = open(r); if (now && !wasOpen) { closing = false; cancelAnimationFrame(frame); frame = requestAnimationFrame(focusInside); } else if (!now && wasOpen) { closing = true; cancelAnimationFrame(frame); returnFocus(); closing = false; } else if (now && r.pane && !r.pane.contains(document.activeElement) && !closing) { cancelAnimationFrame(frame); frame = requestAnimationFrame(focusInside); } wasOpen = now; }; const closeNative = () => { const r = refs(); if (!open(r)) return; closing = true; returnFocus(); // Invoke the existing handler; never change its internal isCartOpen state. (r.close || r.trigger)?.click(); if (open(refs())) { closing = false; focusInside(); } }; document.addEventListener('keydown', event => { const r = refs(); if (!open(r) || !r.pane) return; if (event.key === 'Escape') { event.preventDefault(); event.stopPropagation(); closeNative(); return; } if ((event.key === 'Enter' || event.key === ' ') && r.close?.contains(event.target) && !r.close.matches('button, input[type="button"]')) { event.preventDefault(); closeNative(); return; } if (event.key !== 'Tab') return; const list = focusable(r.pane), first = list[0], last = list[list.length - 1], current = document.activeElement; if (!first) { event.preventDefault(); r.pane.focus({preventScroll:true}); } else if (!r.pane.contains(current) || (event.shiftKey && (current === first || current === r.pane))) { event.preventDefault(); (event.shiftKey ? last : first).focus({preventScroll:true}); } else if (!event.shiftKey && current === last) { event.preventDefault(); first.focus({preventScroll:true}); } }, {capture:true, signal:abort.signal}); // Move focus before native click handlers apply aria-hidden to the pane. document.addEventListener('click', event => { const r = refs(); if (!open(r) || !r.pane) return; if (r.close?.contains(event.target) || !r.pane.contains(event.target)) { closing = true; returnFocus(); queueMicrotask(() => { if (open(refs())) { closing = false; focusInside(); } }); } }, {capture:true, signal:abort.signal}); document.addEventListener('focusin', event => { const r = refs(); if (!closing && open(r) && r.pane && !r.pane.contains(event.target)) focusInside(); }, {capture:true, signal:abort.signal}); const observer = new MutationObserver(sync); observer.observe(header, {subtree:true, childList:true, attributes:true, attributeFilter:['class','aria-hidden']}); sync(); return () => { observer.disconnect(); abort.abort(); cancelAnimationFrame(frame); for (const [el, attrs] of owned) for (const [name, {old, value}] of attrs) { if (el.getAttribute(name) !== value) continue; if (old === null) el.removeAttribute(name); else el.setAttribute(name, old); } }; } })();

Indicators

Indicators and trading tools for MetaTrader

About 70 chart tools for manual traders. Trend and reversal indicators, supply and demand zones, Gann and Fibonacci tools, currency strength meters, smart money structure, plus utilities like trade panels, Telegram copiers and a position size calculator. Nearly all MT4, a few MT5. Most cost $15 to $40, with a handful of premium dashboards up to $300.

  • Official files, no cracks or DLL launchers
  • Instant download after checkout, with an install guide
  • Future updates included free when we receive them
  • 7-day refund if it fails to install or run, terms in the FAQ
An indicator does not trade for you. It draws signals, zones or alerts on the chart and you place the trades. If you want the terminal to trade on its own, you need an Expert Advisor. Each product page says which it is.
Not sure which tool fits how you trade? Message us on Telegram with the pair and timeframe you trade and we will point you to one.

Showing 1–24 of 69 resultsSorted by popularity

What is in this category

Indicators do one job each. Here are the main types you will find here and what each is for.

Trend and reversal

Show the current direction and flag when it is likely to turn. Ribbon, laser and trend sniper tools sit here. Good for deciding which way to trade, not when.

Supply, demand and structure

Draw zones, order blocks and breaks of structure on the chart. Smart money and supply and demand dashboards are the most popular tools we sell.

Gann and Fibonacci

Time and price levels from Gann angles, swings and Fibonacci ratios. These reward study. Expect to spend a weekend learning one before it earns its place.

Currency strength

Rank the majors by momentum so you pair a strong currency against a weak one. Forex28 and Currency Strength28 are the known names here.

Utilities

Trade panels, a position size calculator, Telegram signal copiers and trade managers. Not signals, just tools that make placing and managing trades faster.

Support on Telegram

Install problems, a missing template, alerts not firing. Message us and we will sort it. Included with every purchase.

Before you buy an indicator

Check MT4 or MT5

Almost everything here is MT4. An MT4 indicator will not load in MT5. The product title says which.

Know your timeframe

Scalping tools built for M1 and M5 behave differently on H4. Read the description for the timeframes the developer tested.

Test on demo first

Load it on a demo chart and watch a week of signals before you trade them. Every indicator repaints a little, some repaint a lot.

What you get, and what you don’t

You get the official file, emailed the moment you pay, with an installation guide and any templates or presets the developer shipped. New versions land in your account when we receive them, and help on Telegram is included. Refunds within 7 days if there is an error we can replicate and cannot fix.

You don’t get a guarantee the signals win. No indicator does, whatever the sales page says. A good one gives you a clearer chart and a repeatable process. The trading decisions, and the results, stay yours.

Indicator or Expert Advisor?

An indicator shows you where a setup might be and leaves the entry, stop and exit to you. An Expert Advisor does all of that on its own while your terminal is running. Indicators suit people who want to trade themselves and want better information. EAs suit people who want the trading done for them.

Rather have it automated?

DowGold, our own EA, runs on a real $50K account with results published live on MyFXBook. No chart watching, no manual entries.