/* 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); } }; } })();

1,140 products

Expert Advisors

Expert Advisors for MT4 and MT5

The largest collection of discounted trading robots online. 1,140+ official products at up to 80% below the MQL5 price. MT4 and MT5 EAs download instantly, straight to your account.

  • Official versions, no cracks or DLL launchers
  • Instant download, plus a free remote install on EAs over $300
  • Future updates included free
  • 7-day refund policy, terms in the FAQ
Every EA and indicator is a download. MT4 and MT5 EAs arrive in the Downloads section of your account the moment you pay, with an installation guide. EAs over $300 also include a free remote install over AnyDesk.
Not sure where to start? Message us on Telegram with your platform, broker and account size and we will point you to the right EA.

Showing 1–24 of 1140 results

Why buy Expert Advisors here?

Trusted by 28,000+ traders since 2019. The original discounted EA reseller.

Save up to 80%

Why pay $500 or more on MQL5 for the same product? We buy licenses in bulk so you do not pay retail.

Official versions

No cracks, no DLLs, no launchers that stop working. Every EA is the genuine product, so it does not stop working or get blacklisted.

Future updates included

New versions are added to your account as we receive them. Never a second charge.

Instant delivery

Your files are in the Downloads section of your account the moment you pay, and download instructions arrive by email.

7-day refund policy

A full refund if there is an error we can replicate and cannot fix.

Real people on support

Stuck on an install or a setting? Message us on Telegram. EAs over $300 also include a free remote install over AnyDesk.

How it works

1. Browse and buy

Find your EA and check out by card, Apple Pay, Google Pay or crypto. Crypto gets 20% off.

2. Delivery

Your files arrive in your account instantly, with download instructions by email.

3. Install

Follow the included guide. EAs over $300 also include a free remote install over AnyDesk.

4. Trade

Run it on your account with future updates included, and Telegram support when you need it.

What is an Expert Advisor?

An Expert Advisor is a program that runs inside MetaTrader 4 or 5. It reads the market, opens and manages trades to its strategy, and runs 24 hours a day, five days a week, without you at the screen. Scalping, grid, hedging and trend following are all here, and each product page says which method it uses.

Why buy here instead of on MQL5?

MQL5 is the official source for MetaTrader EAs, but a single EA there is often $300 to $1,500. We buy licenses in bulk directly from developers and pass the saving on, so you get the same official product at up to 80% off, with the same updates, exactly as if you had paid full price.

Since 2019 we have served over 28,000 customers and are rated Excellent, 4.6 out of 5, on Trustpilot.

MT4 or MT5?

MetaTrader 4 has been the standard since 2005. Simple, reliable, and supported by almost every broker. If you trade forex pairs and want the widest broker choice, MT4 is a safe pick.

MetaTrader 5 is newer, with more timeframes, better backtesting and support for stocks and futures. Most new EAs are built for MT5 first. If your broker offers it, we would choose MT5.

Ready to automate your trading?

Not sure which of the 1,140+ to pick? Start with DowGold, the #1 recommended EA: +16.35% with 3.93% max drawdown on a real $50,000 account, with every result public on MyFXBook.