[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 323

 

Salutations à tous ! Chers gourous, pouvez-vous me dire pourquoi v_s augmente et diminue lorsque le profit augmente et diminue dans la monnaie de dépôt?

value_profit() est un calcul de profit dans la devise du dépôt.

double valeur_stop,valeur_step ;
value_stop=((AccountBalance()/100)*1) ;
value_step=((AccountBalance()/100)*4) ;
double v_s ;
si (valeur_bénéfice()>=(valeur_étape+valeur_arrêt))
pour (int v=1;v<=100;v++)
{
si (value_profit()>=(value_step+(value_stop*v))
{
v_s=valeur_arrêt*v ;
}
sinon
{
si (valeur_profit()<=v_s)
close_all() ;
}
}
 
hoz:

En fait, pas même une ligne n'est imprimée :

1. Pourquoi faire la modularité exactement en même temps ? Bien sûr, chacun a son propre style, mais je commencerais par peaufiner la version compacte, puis, lorsqu'elle fonctionnera comme une horloge, je passerais à la modularité. La variante compacte (sans les fonctions insérées Trade, LastCandlesType, GetStateOfMA, GetGeneralSignal) a été donnée comme variante de start() interne sur la dernière page. Comment cela fonctionne-t-il pour vous ? Si cela fonctionne, alors divisez-le en modules.

2. Le code me semble absolument identique au précédent, puisque le compteur t change absolument parallèlement au compteur i. Pourquoi alors comparer avec t si vous pouvez comparer avec i ? Et, en allant plus loin dans la logique, alors pourquoi comparer avec i si nous avons un code qui n'a pas fonctionné ?

3) Désolé de vous interrompre, mais comment cette variante fonctionnerait-elle en retirant la sortie de la boucle ?

int LastCandlesType(int directionMA){
        int cntUp, cntDn;
        for (int i=i_AnyBarsToHistory; i>=1; i--){
                if (directionMA == CROSS_UP){
                        if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntDn++; else cntDn=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Open[i] - Close[i] = ", Open[i] - Close[i], "; cntDn = ", cntDn);
                }
                if (directionMA == CROSS_DN){
                        if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntUp++; else cntUp=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Close[i] - Open[i] = ", Close[i] - Open[i], "; cntUp = ", cntUp);
                }
        }
        if ((directionMA==CROSS_UP)&&(cntUp>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BEARS_GOT);
        if ((directionMA==CROSS_DN)&&(cntDn>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BULLS_GOT);
        return(REQUIRED_SEQUENTIAL_MISS);
}

Je comprends que cela puisse ne pas fonctionner non plus, peu importe, mais j'ai besoin d'en être sûr pour aller plus loin.

4. Purement mon adaptation personnelle : tapez le code non pas dans l'éditeur meta, mais dans n'importe quel autre éditeur avec des lignes numérotées, et imprimez à chaque changement de variable et à chaque vérification if ou switch, sur la même ligne (après le dernier point-virgule). Imprimer dans le numéro de ligne - valeur(s) à vérifier. Imprimez-le après if(tracing) {Print(StringConcatenate("line_number : variable_name=", variable_name));} et déclarez une variable dans l'en-tête, comme : bool tracing=false;//activation du traçage. Dans ce cas, vous aurez un traçage complet et donc un débogage complet. Mais vous devez nettoyer les journaux plus souvent, bien sûr. Si vous souhaitez utiliser directement l'éditeur de métadonnées, vous pouvez d'abord créer un modèle vide tel que

/*001*/

...

/*999*/

au début des lignes (et ça marche), et ensuite dans une copie de ce modèle pour taper le code. Mais c'est juste ce que je pense, dans la pratique j'ai essayé de cette façon, mais de façon incohérente.

 
rajak:

Salutations à tous ! Chers gourous, pouvez-vous me dire pourquoi v_s augmente et diminue lorsque le profit augmente et diminue dans la monnaie de dépôt ?

value_profit() est un calcul de profit dans la devise du dépôt.

double valeur_stop,valeur_step ;
value_stop=((AccountBalance()/100)*1) ;
value_step=((AccountBalance()/100)*4) ;
double v_s ;
si (valeur_bénéfice()>=(valeur_étape+valeur_arrêt))
pour (int v=1;v<=100;v++)
{
si (value_profit()>=(value_step+(value_stop*v))
{
v_s=valeur_arrêt*v ;
}
sinon
{
si (valeur_profit()<=v_s)
close_all() ;
}
}
Après un rapide coup d'œil, j'ai immédiatement vu un bug avec les guillemets. Apprenez à utiliser l'instruction if.
 
gyfto:

3. excusez-moi d'être indiscret, mais comment cela fonctionnerait-il pour vous de retirer la sortie de la boucle après tout ?

int LastCandlesType(int directionMA){
        int cntUp, cntDn;
        for (int i=i_AnyBarsToHistory; i>=1; i--){
                if (directionMA == CROSS_UP){
                        if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntDn++; else cntDn=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Open[i] - Close[i] = ", Open[i] - Close[i], "; cntDn = ", cntDn);
                }
                if (directionMA == CROSS_DN){
                        if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntUp++; else cntUp=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Close[i] - Open[i] = ", Close[i] - Open[i], "; cntUp = ", cntUp);
                }
        }
        if ((directionMA==CROSS_UP)&&(cntUp>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BEARS_GOT);
        if ((directionMA==CROSS_DN)&&(cntDn>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BULLS_GOT);
        return(REQUIRED_SEQUENTIAL_MISS);
}

Hm. Ça a marché. J'ai lancé plusieurs "écrans" dans le visuel, tout est clair à cet intervalle. J'ai encore besoin de comprendre pourquoi ça n'a pas marché la dernière fois. Ce sera utile, pour ne pas trébucher à l'avenir.
 
hoz:

Hmm, ça marche.


Glad))))

hoz:

Je dois encore comprendre pourquoi ça n'a pas marché la dernière fois. Ce sera utile pour éviter de trébucher dessus à l'avenir.

Parce qu'à l'avenir, ne quittez pas avant d'avoir atteint Close[0] ou la limite de la fenêtre dans tout autre algorithme. Ce n'est pas tout.

 
gyfto:

1. Pourquoi faire de la modularité en une seule fois ? Bien sûr, chacun a son propre style, mais je commencerais par peaufiner la version compacte, puis, lorsqu'elle fonctionne parfaitement, je passerais à la modularité. La variante compacte (sans les fonctions insérées Trade, LastCandlesType, GetStateOfMA, GetGeneralSignal) a été présentée comme une variante des internes de start() à la page précédente. Comment cela fonctionne-t-il pour vous ? Si cela fonctionne, alors divisez-le en modules.

En fait, j'ai l'habitude de l'écrire comme ça. Et il est plus facile de rechercher les erreurs. Car j'ai tout de suite su que l'erreur se trouvait dans la fonctionLastCandlesType(). Mais je n'ai pas encore trouvé la raison, bien que votre méthode ait fonctionné.

gyfto:

2. Le code me semble absolument identique au précédent, puisque le compteur t évolue absolument parallèlement au compteur i. Pourquoi alors comparer avec t si vous pouvez comparer avec i ? Et, en allant plus loin dans la logique, alors pourquoi comparer avec i si nous avons un code qui n'a pas fonctionné ?

Trop tard pour écrire, ... surcharge morale, je suppose.

gyfto:

Je comprends que cela puisse ne pas fonctionner non plus, peu importe, mais j'ai besoin de m'en assurer afin de mieux comprendre.

Ça marche ! Ce qui reste à comprendre, c'est pourquoi ce code n'a pas fonctionné. La première chose qui a attiré mon attention est la sortie de la fonction lorsque le compteur atteint la valeur i_seqqtBarstCounter. Mais, encore une fois, j'ai imprimé et la valeur du compteur n'a montré que 1 tout le temps, lorsque j'ai placé la sortie par défaut de la fonctionreturn(REQUIRED_SEQUENTIAL_MISS);

Avant que je le place, tout était calculé correctement, mais la chouette ne s'échangeait pas correctement. Il ne se passait rien du tout. Bien qu'en théorie, si aucune des conditions au-dessus de la sortie par défaut ne fonctionne, cela signifie qu'aucune des conditions ne s'est déclenchée et que même si nous plaçons la sortie par défaut dans la condition, cela ne devrait pas fonctionner. À l'inverse, si la condition se vérifie, elle doit se vérifier.


gyfto:

4. Purement mon adaptation personnelle : tapez le code non pas dans le méta-éditeur, mais dans n'importe quel autre éditeur avec numérotation des lignes, et imprimez à chaque changement de variable et à chaque vérification de if ou switch, sur la même ligne (après le dernier point-virgule). Imprimer dans le numéro de ligne - valeur(s) à vérifier. Imprimez-le après if(tracing) {Print(StringConcatenate("line_number : variable_name=", variable_name));} et déclarez une variable dans l'en-tête, comme : bool tracing=false;//activation du traçage. Dans ce cas, vous aurez un traçage complet et donc un débogage complet. Mais vous devez nettoyer les journaux plus souvent, bien sûr. Si vous souhaitez utiliser directement l'éditeur de métadonnées, vous pouvez d'abord créer un modèle vide tel que

/*001*/

...

/*999*/

au début des lignes (et ça marche), et ensuite dans une copie de ce modèle pour taper le code. Mais c'est juste ce que je pense, dans la pratique j'ai essayé de cette façon, mais de manière incohérente.


Eh bien, nous imprimons sur la base des données du conseiller expert, pas sur les numéros de ligne. Pourquoi avez-vous besoin de numéros de ligne ? Je l'utilise personnellement pour l'analyse du code car il y a des moments vraiment pratiques. Mais écrire et déboguer le code en se basant sur les numéros de ligne est pour moi un non-sens.
 
hoz:

Il reste à savoir pourquoi ce code n'a pas fonctionné.


La façon dont je l'ai compris moi-même. Nous lisons les croisements des rabats. Plus précisément, trois chandeliers haussiers ou baissiers après le croisement à tout moment. Lorsque la condition est remplie, nous entrons sur le marché. Mais à en juger par la description verbale, ces trois chandeliers ou plus qui se suivent appartiennent au bord droit de la fenêtre. D'après votre code, ils peuvent se référer au milieu de la fenêtre. Par conséquent, le conseiller expert est entré sur le marché lorsque la condition (trois chandeliers) a été atteinte, alors que le dernier chandelier peut ne pas être le dernier.
 
gyfto:

Comme je l'ai compris moi-même. Nous avons lu l'intersection des ours. Pour être plus exact, trois chandeliers haussiers ou baissiers après le croisement à tout moment. Lorsque la condition est remplie, nous entrons sur le marché. Mais à en juger par la description verbale, ces trois chandeliers ou plus qui se suivent appartiennent au bord droit de la fenêtre. D'après votre code, ils peuvent se référer au milieu de la fenêtre. Par conséquent, l'EA entrera sur le marché lorsque la condition (trois bougies) sera atteinte, mais la dernière bougie peut ne pas être la dernière.


La conclusion est la suivante : connaissant la syntaxe, il faut aussi regarder la logique. C'est très important. J'ai juste eu une erreur de logique là.

Cela semble simple, mais je me suis accroché à quelque chose et je n'ai pas compris tout de suite. Oups. Ça arrive... :(

 

Bonjour !

Ma question sera un peu hors sujet.

Pouvez-vous me dire s'il est possible de trouver quelque part le découpage des formes TA en fichiers CSV ? Je peux utiliser des formats txt, xls ou tout autre format pouvant être traité par programme.

Il existe des exemples de figures d'AT dans divers articles et manuels d'AT, mais bien sûr sous forme d'images ordinaires. Quelqu'un a-t-il des ensembles plus ou moins importants de symboles TA enregistrés comme une tranche d'histoire d'une paire de devises sur les périodes H1-H4, par exemple ?

J'ai cherché sur Google, mais je n'ai rien trouvé. Bien sûr, nous pouvons parcourir manuellement l'historique, marquer les formes, exporter ce morceau d'historique en tant que .csv ; répéter le nombre requis de fois, collecter la base de formes à la fin. Mais si quelqu'un l'a déjà fait, j'aimerais gagner du temps.

Merci d'avance :)

 

Bonjour à tous !

J'ai étudié le MQL4 Expert Advisor pendant un mois et j'ai décidé d'écrire un Expert Advisor. Je ne voulais pas en écrire un nouveau par manque d'expérience et j'ai décidé d'utiliser le modèle tradingexpert.mq4 du livre.

L'essence de la stratégie est la suivante : un système à trois barres de hauts et de bas " Larry Williams ", tracer deux EMA à trois jours pour les hauts et les bas, vendre

pour les hauts et achète pour les bas.

Dans le modèle, dans la section des variables globales, j'ai supprimé la ligne extern double Rastvor =28.0 ; (en fait, elle n'est pas nécessaire) et je l'ai également supprimée des critères de négociation.

Changement des valeurs MA à 3 dans les variables globales :

extern int Period_MA_1= 3 ; // Période MA 1
extern int Period_MA_2= 3 ; // Période MA 2

Dans la section des critères commerciaux, c'était :

//--------------------------------------------------------------- 5 --
   // Торговые критерии
   MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,0); // МА_1
   MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,0); // МА_2
 
   if (MA_1_t > MA_2_t + Rastvor*Point)         // Если разница между
     {                                          // ..МА 1 и 2 большая
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
   if (MA_1_t < MA_2_t - Rastvor*Point)         // Если разница между
     {                                          // ..МА 1 и 2 большая
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
//--------------------------------------------------------------- 
est devenu :

//--------------------------------------------------------------- 5 --
// Critères de transaction
MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_EMA,PRICE_HIGH,0) ; // MA_1
MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_EMA,PRICE_LOW,0) ; // MA_2

si (PRICE_HIGH * Point >= MA_1_t * Point)
{
Opn_S=true ;
Cls_B=vrai ;
}

si (PRICE_LOW * Point <= MA_2_t * Point)
{
Opn_B=true ; //critère d'ouverture. Acheter
Cls_S=true ; // Critère de fermeture. Sell
}
//---------------------------------------------------------------

Maintenant, le nœud du problème : le système n'ouvre que les ordres de vente, mais ne veut pas acheter. Quelle peut être l'erreur ?

Il est tout à fait possible qu'il y ait des erreurs ailleurs, s'il vous plaît ne jugez pas sévèrement mais aidez avec des conseils)