Qui veut une stratégie ? Lots et gratuitement) - page 61

 
Stellarator >> :

Mes amis m'ont appelé pour tricher sur la voiture...

>> Eh bien...

Et ils disent la crise ;)

 

Il semble que nous devions commencer à comparer un par un jusqu'à ce que tous les problèmes soient résolus.

Ici, j'ai comparé l'oscillateur accélérateur FSB à MT iAC(...) :



Comment faire :

1. mettez à jour les taux de change de FSB avec les taux actuels utilisés dans MT (à partir de MT, faites Ctrl+S et enregistrez le fichier xxxxxx.csv dans le répertoire FSB ./Data). Si vos données se trouvent dans un autre dossier - utilisez Marché -> Répertoire de données à partir de FSB pour le pointer).

2) Créez le script Indicator_Values.mq4 en imprimant l'indicateur souhaité. (Le script se trouve sur la page du forum précédent).

3. régler cet indicateur en FSB. (Assurez-vous d'utiliser les mêmes paramètres.) Exportez l'indicateur FSB par la fonction Export -> Indicateurs.

4. si vous constatez une différence, veuillez la signaler.


Bonne chance !


------------

Edit :

Veuillez utiliser la dernière version de FSB v2.8.3.5 Beta.

 
Miroslav_Popov >> :

La formule classique est : Momentum(n) = Close - Close(n)

C'est la formule utilisée par la FSB.

MT utilise : Momentum(n) = 100 * Close / Close(n)

Je le sais. Je faisais référence aux paramètres de l'indicateur. Période de lissage. Méthode de lissage. Nous ne le fixons pas. Quels paramètres sont pris par défaut : 0,0 ?

 

Salut zfs,


Vous pouvez voir les paramètres par défaut dans la fenêtre de dialogue Paramètres de l'indicateur. ( Défaut de presse)



Notez que la période de "lissage supplémentaire" = 0. Cela signifie qu'aucun lissage n'est appliqué.


Le deuxième endroit où vous pouvez voir les valeurs par défaut est dans le code source :


        /// <summary>
        /// Sets the default parameters for the designated slot type
        /// </summary>
        public Momentum( SlotTypes slotType)
        {
            sIndicatorName  = "Momentum";
            parameters      = new IndicatorParam();
            component       = new IndicatorComp[] { };
            bSeparatedChart = true;
            bIsCalculated   = false;

            // The indicator name
            parameters. IndicatorName = sIndicatorName;

            // The slot type
            parameters. SlotType = slotType;

            // The ComboBox parameters
            parameters. ListParam[0]. Caption  = "Logic";
            parameters. ListParam[0]. ItemList = new string[]
            {
                "The Momentum rises",
                "The Momentum falls",
                "The Momentum is higher than the Level line",
                "The Momentum is lower than the Level line",
                "The Momentum crosses the Level line upward",
                "The Momentum crosses the Level line downward",
                "The Momentum changes its direction upward",
                "The Momentum changes its direction downward"
            };
            parameters. ListParam[0]. Index    = 0;
            parameters. ListParam[0]. Text     = parameters. ListParam[0]. ItemList[ parameters. ListParam[0]. Index];
            parameters. ListParam[0]. Enabled  = true;
            parameters. ListParam[0]. ToolTip  = "Logic of application of the indicator.";

            parameters. ListParam[1]. Caption  = "Smoothing method";
            parameters. ListParam[1]. ItemList = Enum. GetNames( typeof( MAMethod));
            parameters. ListParam[1]. Index    = 0;
            parameters. ListParam[1]. Text     = parameters. ListParam[1]. ItemList[ parameters. ListParam[1]. Index];
            parameters. ListParam[1]. Enabled  = true;
            parameters. ListParam[1]. ToolTip  = "The Moving Average method used for smoothing the Momentum value.";

            parameters. ListParam[2]. Caption  = "Base price";
            parameters. ListParam[2]. ItemList = Enum. GetNames( typeof( BasePrice));
            parameters. ListParam[2]. Index    = 3;
            parameters. ListParam[2]. Text     = parameters. ListParam[2]. ItemList[ parameters. ListParam[2]. Index];
            parameters. ListParam[2]. Enabled  = true;
            parameters. ListParam[2]. ToolTip  = "The price the Momentum is based on.";

            // The NumericUpDown parameters
            parameters. NumParam[0]. Caption = "Period";  <----- Parameter Name
            parameters. NumParam[0]. Value   = 10;        <----- Default Value
            parameters. NumParam[0]. Min     = 1;
            parameters. NumParam[0]. Max     = 200;
            parameters. NumParam[0]. Enabled = true;
            parameters. NumParam[0]. ToolTip = "The period of Momentum.";
 
            parameters. NumParam[1]. Caption = "Additional smoothing"; <----- Parameter Name 
            parameters. NumParam[1]. Value   = 0;        <----- Default Value
            parameters. NumParam[1]. Min     = 0;
            parameters. NumParam[1]. Max     = 200;
            parameters. NumParam[1]. Enabled = true;
            parameters. NumParam[1]. ToolTip = "The period of additional smoothing.";

            parameters. NumParam[2]. Caption = "Level";  <----- Parameter Name
            parameters. NumParam[2]. Value   = 0;        <----- Default Value
            parameters. NumParam[2]. Min     = -100;
            parameters. NumParam[2]. Max     = 100;
            parameters. NumParam[2].Point   = 4;
            parameters. NumParam[2]. Enabled = true;
            parameters. NumParam[2]. ToolTip = "A critical level (for the appropriate logic).";

            // The CheckBox parameters
            parameters. CheckParam[0]. Caption = "Use previous bar value";
            parameters. CheckParam[0]. Checked = Data. Strategy. PrepareUsePrevBarValueCheckBox( slotType);
            parameters. CheckParam[0]. Enabled = true;
            parameters. CheckParam[0]. ToolTip = "Use the indicator value from the previous bar.";
        }
 
Miroslav_Popov >> :

Salut zfs,

Je ne doutais pas que vous étiez irréprochable sur le principe. Le problème est que, malgré tout cela, les valeurs finales des indicateurs ne correspondent pas à mes yeux. Ou pas ? Je n'ai pas le temps de le vérifier maintenant, malheureusement.

 

Zfs,

Avec l'aide de Stellarator, j'ai résolu de nombreux problèmes dans FSB. J'ai également modifié les paramètres par défaut de FSB pour qu'ils soient comme ceci dans MT. J'espère que la plupart des différences sont déjà corrigées.


N'hésitez pas à signaler tout bogue éventuel. Tous les commentaires et critiques sont appréciés.

 
Stellarator >> :

Je dois vous dissuader ! La nuance essentielle est la "limite d'une itération de l'EA". Ainsi, dans ces limites, l'indicateur est calculé UNE fois (à son premier appel) ! Je le déclare avec une confiance absolue. Tous les appels ultérieurs ne le lancent pas du tout, mais prennent seulement les valeurs nécessaires dans les tampons nécessaires. La condition est de 100% lorsque les paramètres d'entrée restent inchangés (à l'exception du tampon et du décalage). La règle fonctionne lorsque les calculs sont effectués dans un seul instrument. Mais je pense que le principe est valable même lorsque iCustom fait référence à d'autres TF et outils.


Je suis intéressé par l'écriture d'un Expert Advisor qui applique à l'indicateur la valeur de l'indicateur dans la minute courante sur la 0ème barre 240 fois. C'est-à-dire qu'il s'avère que la sortie a toujours la première valeur ? Confirmez s'il vous plaît, car c'est une nouvelle pour moi.

 
zfs >> :

Question hors sujet, je viens de m'impliquer dans l'écriture d'un Expert Advisor, qui à la 0ème barre accède 240 fois à l'indicateur pour la valeur de l'indicateur dans la minute courante. C'est-à-dire qu'il s'avère que la sortie est toujours la première valeur ? Confirmez s'il vous plaît, car c'est une nouvelle pour moi.

>>Le Conseiller Expert redémarre à chaque nouveau tick et il s'agit d'une itération différente, et donc les valeurs de l'indicateur seront différentes.

 
rider >> :

L'EA redémarre à chaque nouveau tick, et il s'agit d'une itération différente, et donc les valeurs des indicateurs seront différentes.

Si vous utilisez correctement le paramètre "Utiliser la valeur de la barre précédente", vous n'avez pas besoin de la valeur de la barre actuelle de l'indicateur.

Disons que vous utilisez MA(simple, 12, close) sur un graphique quotidien. Pour calculer correctement cette MA, vous avez besoin des prix de clôture de 12 barres.

S'il est 15 heures, le prix de clôture actuel n'est pas le prix de clôture réel de la barre. Il va être modifié jusqu'à 12 heures. Ainsi, l'utilisation de la MA pour la barre actuelle n'inclut pas le prix de clôture réel mais un prix temporaire. Dans le même temps, le back test utilise le prix de clôture réel (déjà fixé) des barres historiques. Cette pratique entraînera des différences entre le backtest et la transaction réelle.


Encore pire :

Voyons la règle logique "Une FastMA va au-dessus d'une SlowMA" où les deux MAs sont basées sur le prix de clôture.

Si au cours de la journée le marché augmente rapidement, la FastMa peut croiser au-dessus de la SlowMA, ce qui fera monter un signal d'achat. Vous achèterez en suivant le signal. Si, après la transaction, le marché baisse et ferme si bas, cela fera passer le FastMA en dessous du Slow. Vous voyez le problème ? Vous avez déjà acheté avant la fermeture du bar. Si vous effectuez un backtest de cette stratégie plus tard, vous verrez qu'il n'y a pas de signal d'achat pour cette barre. Et quoi ? Vous allez blâmer le backtester, mais le problème réside dans la mauvaise logique de la stratégie.


Forex Strategy Builder vous protège de telles erreurs logiques en réglant de manière automatique le paramètre "Utiliser la valeur de la barre précédente". FSB n'utilise jamais d'indicateurs changeants (non encore fixés) pour le backtesting. Et dans cette logique pourquoi un EA doit calculer un indicateur pour chaque tick si la stratégie ne l'utilise pas. Un calcul par barre est suffisant :

- si l'indicateur utilise le prix Open - le calcul doit être fait à l'ouverture de la barre ;

- si l'indicateur utilise les prix Close, High, Low ou toute combinaison de ces prix - le calcul doit être effectué à la clôture de la barre.






 

Bonsoir à tous !


Je suis sans ordinateur pour le week-end :(. Aujourd'hui, je n'avais rien à faire à cause du travail, donc... en quelque sorte...

J'ai eu le temps de réfléchir, cependant. Et (espérons-le) décidés de manière stratégique (en termes de cadre d'indicateurs).

En général, la structure interne des indicateurs sera désormais similaire (je la décrirai plus tard, peut-être demain). Ce qui "dépasse" vers l'extérieur (paramètres) - aussi proche de FSB que possible. C'est-à-dire leur nombre, leurs valeurs (et leurs limites) et la fonctionnalité qu'ils définissent - eh bien... presque un contre un :). Des micro nuances subsistent, mais nous en déciderons au fur et à mesure.


Très brièvement pour le moment (je vais me coucher maintenant, je ne serai pas là demain ou après-demain, probablement, j'ai beaucoup de choses à faire au travail) (à l'exemple de "notre beau" RSI :D) :

1. Paramètres :

// -------- Indicator parameters
extern int     slotType = SLOT_TYPE_OPENFILTER; // SLOT_TYPE_LC
extern int     indLogic = INDICATOR_RISES;      // INDICATOR_RISES <= indLogic <= INDICATOR_CHANGES_DIR_DOWNWARD
extern int     maMethod = MA_METHOD_SMOOTHED;   // MA_METHOD_SIMPLE <= maMethod <= MA_METHOD_SMOOTHED
extern int     basePrice= BASE_PRICE_CLOSE;     // BASE_PRICE_OPEN <= basePrice <= BASE_PRICE_WEIGHTED
extern int     iPeriod  = 14;                   // 1 <= iPeriod <= 200
extern int     dLevel   = 30;                   // 0 <= dLevel <= 100
extern bool    iPrvs    = True;                 // True / False




Je pense que c'est plus ou moins clair sur la photo telle qu'elle est. La seule chose qui peut poser problème : slotType, ses valeurs respectives (qui diffèrent peut-être de FSB, mais dans ce cas, ce n'est pas un point crucial) :

// Slot Types
#define  SLOT_TYPE_OPEN                   0  // Point of the Position
#define  SLOT_TYPE_CLOSE                  1  // Point of the Position
#define  SLOT_TYPE_OPENFILTER             2  // Logic Condition
#define  SLOT_TYPE_CLOSEFILTER            3  // Logic Condition

Le reste est simple. Les valeurs numériques sont fixées telles quelles. Les valeurs des ComboBox sont numérotées à partir de 0 (comme les tableaux).

Les valeurs numériques des méthodes de lissage et des constantes de prix sont DIFFÉRENTES de celles de MT (j'y ai longuement réfléchi, mais j'ai décidé d'éviter les stéréotypes pour des raisons de compatibilité avec FSB :) ). Tout ceci, en fait, est fait pour qu'à l'avenir les Expert Advisors (ou ce que les utilisateurs écriront eux-mêmes) puissent "twitcher" les indicateurs facilement et sans contrainte :) (ce qu'ils ont vu dans FSB est ce qu'ils ont fixé ("what I see is what I sing")). En gros :

double dRSI = iCustom(NULL, 0, "-FSB- RSI", 2, 0, 3, 3, 3, 14, 30, 1, 0, 0) ;

pour l'exemple ci-dessus.


2. Valeurs retournées :

Les deux premiers tampons de chaque indicateur sont réservés aux prix d'ouverture des positions (respectivement long/short), ou aux conditions logiques (1.0 - oui / toute autre valeur - non). De plus, nous avons les valeurs de l'indicateur elles-mêmes (au cas où elles seraient intéressantes pour quelqu'un) :


Le contenu des deux premiers buffers est déterminé par la logique de l'indicateur(slotType et indLogic) (c'est-à-dire qu'une fois de plus - il y a soit des prix soit 1 / 0 (je recommande de le vérifier avec "1", parce que les autres valeurs peuvent être non seulement zéro (en général - comme l'indicateur n'a pas de valeur il peut être EMPTY_VALUE)).


Tous les indicateurs ont été optimisés en tenant compte de IndicatorCounted() (c'est la principale modification du code original, dans l'ensemble) (Miroslav, dans le cas général - a raison sur le fait qu'il est vraiment nécessaire de recalculer les valeurs des indicateurs une fois par barre (encore une fois - dans le cas général... ;)). Mais pour une visualisation correcte, et en général (bon ton)... En général, il ne devrait pas ralentir beaucoup.


Pour le rendu des indicateurs colorés et similaires ("particulièrement doués" :)), des objets graphiques sont utilisés (pour ne pas occuper de tampons supplémentaires). Je l'ai testé moi-même et il fonctionne bien (lors de l'affichage visuel, il est plus lent que les tampons d'indicateurs, mais pas trop critique, et lorsque iCustom est appelé, les fonctions graphiques ne sont pas appelées du tout, donc les "excès" n'affecteront pas la vitesse).


C'est tout pour l'instant, j'ai quelques questions à poser à Miroslav, mais je suis déjà épuisé :), j'essaierai de les poser demain (mais je le ferai, comme je l'ai déjà dit - à la hâte)...


p.s. Avant de déplacer les fichiers de l'archive - supprimez les fichiers fsb*.mq4 du dossier Experts\Indicators\. Les autres ont juste besoin d'être écrasés par-dessus l'ancien. A partir de maintenant, les conventions de dénomination des fichiers ne changeront pas (tous les indicateurs auront le préfixe "-FSB- " ).

Dossiers :
experts_1.rar  148 kb