Als trader heb je vast wel eens nagedacht over de effectiviteit van oscillatoren. Vaak heb ik de waarden van deze indicatoren moeten normaliseren, oftewel ze binnen het bereik van [-1;1] brengen. Dit opent nieuwe mogelijkheden, zoals het eenvoudig controleren van de indicatorwaarden op concrete niveaus (bijvoorbeeld 0.5 of 0.8) in plaats van te schatten op basis van de markt. Als een indicator al genormaliseerd is, is het misschien niet nodig deze verder te overwegen, maar als dat niet het geval is... gebruik het dan, en oordeel niet te hard over mijn ruwe code.
Parameters:
string Indicator - de indicator zelf die vervolgens aan de icustom() functie wordt doorgegeven. Helaas zijn de MQL4 automatiseringstools niet voldoende om standaardindicatoren hier aan toe te voegen. Maar wie kan een nieuwsgierige programmeur tegenhouden om een aanpassing in het programma te maken?
int mode - het nummer van de benodigde regel van de oorspronkelijke indicator...
int param1
int param2 - ... en zijn parameters. Jammer genoeg is de verbeeldingskracht van de MQL-ontwikkelaars beperkt tot het schrijven van functies met een variabel aantal parameters (zoals Print) en het ondersteunen van adresarithmetic. Dit lijkt alleen maar bedoeld om gewone gebruikers zich minderwaardig te laten voelen in vergelijking met de 'goden'. Laten we dus handmatig aan de slag gaan.
Afbeelding:

Opmerkingen:
De berekeningen worden in twee fasen uitgevoerd:
1. Tijdens de initialisatie (de init() functie, voor degenen die het niet weten:) wordt het hele array van indicatorgegevens geanalyseerd om de onderscheidende periode te berekenen. Dit is de periode waarin de gemiddelde kwadratische waarde van de indicator inzicht geeft in die waarde over de gehele geschiedenis.
Laat me het uitleggen. Stel dat we een oscillator hebben en we hebben de gemiddelde kwadratische waarde voor verschillende opeenvolgende oscillatieperioden berekend. Laten we afspreken dat er bijvoorbeeld 3 periodes moeten zijn (zoals ik heb ingesteld met #define PERIODS_CHARACTERISTIC 3, ik raad aan niet meer te gebruiken, anders raakt de processor overbelast). De essentie van de berekening is om te bepalen hoeveel balken gemiddeld lang zijn in één periode (d.w.z. 2 * gemiddelde interval tussen twee nullen van de indicator) en deze waarde met 3 te vermenigvuldigen.
2. Vervolgens moeten we de gemiddelde kwadratische waarde (MSV) voor elke bar berekenen (zoals de vierkantswortel van de variantie) over de verkregen drie periodes, de waarde van onze indicator normaliseren en uiteindelijk alles naar het dynamische bereik [-1;1] brengen door het door de compressorfunctie f(x)=tanh(x) (hyperbolische tangens) te laten gaan. Ik heb deze functie zelf moeten schrijven :)
Een puur technisch voorbeeld. De groene lijn in de afbeelding is mijn oude oscillator die de activiteit van de markt kenmerkt (in feite is het hetzelfde als de MACD, maar dan op basis van de volumes). De blauwe lijn is ook een oscillator, maar is al door de -=Normalizator=- gegaan. De +-0.75, +-0.5, +-0.25 niveaus zijn duidelijk zichtbaar, en je kunt zien dat alle maxima en minima, de gebieden van stijging en daling, en de punten waar de nul lijn wordt gekruist hun posities behouden.
Dus, hier heb je het... Ik ben niet verantwoordelijk als iemand het niet leuk vindt.
Gerelateerde berichten
- PCA Synthetics: Automatische Coëfficiëntselectie voor MetaTrader 5
- iExposure Indicator: Beheer je Handelsposities Efficiënt met MetaTrader 5
- Efficiënt Grafische Objecten Kopiëren in MetaTrader 5 met ChartObjectsCopyPaste
- Efficiëntie Ratio (ER) Berekenen met de CEROnRingBuffer voor MetaTrader 5
- Correlatiecoëfficiënt: Een Onmisbare Indicator voor MetaTrader 5