Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 1063

 
mould:
mais comment activer ce mode ?

Cochez la case dans la fenêtre du testeur, en bas à gauche :

 

Bonjour Gourou.

Pouvez-vous me dire si je suis sur la bonne voie ?

Objectif : introduire une taille de lot variable en fonction de la distance par rapport à l'AM.

Dans les paramètres d'entrée :

extern double Lot1 = 0.01 ; // première variante du lot
extern double Lot2 = 0.03 ; // deuxième variante du lot
extern int Distan = 20 ; // distance de SlowMA

Ma a été défini dans le corps du conseiller expert :

double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0) ;

De plus, nous avons besoin d'une condition : si le prix actuel (Bid ou Ask selon la direction) est inférieur ou égal à la taille Distant, nous utilisons la première taille de lot, si elle est supérieure, nous utilisons la seconde.

La première chose qui m'est venue à l'esprit :

si (Ask-SlowMA<Distan) Lot == Lot1 ;
si (SlowMA-Bid<Distan) Lot == Lot1 ;
si (Ask-SlowMA>Distan) Lot == Lot2 ;
si (SlowMA-Bid>Distan) Lot == Lot2 ;

Mais ça ne marche pas. L'erreur se situe soit dans les connexions du Lot, soit dans la logique générale.

Merci d'avance.

 
delf699:

Bonjour Gourou.

Pouvez-vous me dire si je suis sur la bonne voie ?

Objectif : introduire une taille de lot variable en fonction de la distance par rapport à l'AM.

Dans les paramètres d'entrée :

extern double Lot1 = 0.01 ; // première taille de lot
extern double Lot2 = 0.03 ; // variante du deuxième lot.
extern int Distan = 20 ; // distance du SlowMA

Dans le corps du conseiller expert défini Ma :

double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0) ;

De plus, nous avons besoin d'une condition : si le prix actuel (Bid ou Ask selon la direction) est inférieur ou égal à la taille Distant, nous utilisons la première taille de lot, si elle est supérieure, nous utilisons la seconde.

La première chose qui m'est venue à l'esprit :

si (Ask-SlowMA<Distan) Lot == Lot1 ;
si (SlowMA-Bid<Distan) Lot == Lot1; ;
si (Ask-SlowMA>Distan) Lot == Lot2 ;
si (SlowMA-Bid>Distan) Lot == Lot2 ;

Mais ça ne marche pas. C'est soit une erreur en conjonction avec le Lot, soit une erreur de logique générale.

Merci d'avance.

Quelle est l'importance de Ask, Bid et SlowMA quand Ask-SlowMA peut être supérieur à Distan ???
 

Bid et Ask sont les derniers cours acheteur et vendeur connus, c'est-à-dire le prix actuel.

SlowMA est mon renommé Ma

(double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0) ;)

L'écart du prix actuel (Bid ou Ask) par rapport à la Ma (SlowMA) peut être supérieur ou inférieur à Distans. En fonction de cela, vous devez définir soit la première, soit la deuxième taille de lot.

J'ai trouvé des variantes pour changer le lot en fonction du dépôt ou du nombre d'ordres ouverts, mais je n'arrive pas à obtenir de réponse à partir d'un terme aussi linéaire.

Quelque chose me dit que nous avons besoin d'une fonction qui renvoie une valeur absolue. C'est-à-dire que si on l'applique à un nombre négatif, le résultat sera positif.

 
delf699:

Bid et Ask sont les derniers cours acheteur et vendeur connus, c'est-à-dire le prix actuel.

SlowMA est mon renommé Ma

(double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0) ;)

L'écart du prix actuel (Bid ou Ask) par rapport à la Ma (SlowMA) peut être supérieur ou inférieur à Distans. En fonction de cela, vous devez définir soit la première, soit la deuxième taille de lot.

J'ai trouvé des variantes pour modifier le lot en fonction du dépôt ou du nombre d'ordres ouverts, mais je n'arrive pas à obtenir de réponse à partir d'un terme aussi linéaire.

Quelque chose me dit que nous avons besoin d'une fonction qui renvoie une valeur absolue. C'est-à-dire que si on l'applique à un nombre négatif, le résultat sera positif.


La valeur absolue de la différence entre l'offre et la demande peut être nécessaire un peu plus tard ; maintenant, puisque vous n'avez pas compris l'allusion, calculons ensemble

Prix d'achat = 1,12730 ;

MA = 1.12530 ;

Distans = 20 ;

Question :

Quand et si 1.1273 à 1.1253 sera supérieur à 20 ???

Pour une raison quelconque, ma calculatrice affiche 0,002 seulement. Mais c'est loin d'être 20...

 

Merci, je vois. Ou vous pouvez le faire comme ça :

dist=Distan*Point ;

si (Ask-SlowMA<dist) Lot == Lot1 ;
si (SlowMA-Bid<dist) Lot == Lot1 ;
si (Ask-SlowMA>dist) Lot == Lot2 ;
si (SlowMA-Bid>dist) Lot == Lot2 ;

Alors comment faire correctement ?

 
delf699:

Merci, je vois. Ou vous pouvez le faire comme ça :

dist=Distan*Point ;

si (Ask-SlowMA<dist) Lot == Lot1 ;
si (SlowMA-Bid<dist) Lot == Lot1 ;
si (Ask-SlowMA>dist) Lot == Lot2 ;
si (SlowMA-Bid>dist) Lot == Lot2 ;

Alors comment faire correctement ?

Et maintenant, nous pouvons utiliser MathAbs() pour ne pas nous prendre la tête en gardant la trace de ce qui est soustrait de quoi. Et il existe un autre opérateur conditionnel intéressant

Lot = MathAbs(Ask-SlowMA) < dist ? Lot1 : Lot2;


Ce qui signifie : La variable Lot se verra attribuer la valeur de Lot1 si Ask- SlowMA est inférieur à dist, sinon, la valeur de Lot2 sera attribuée.

Une autre recommandation : oubliez la variable Point. Utilisez _Point ou la fonction Point()

 
Merci, une belle solution.
 
Je me suis déjà cassé les yeux, je n'arrive pas à trouver où il manque des parenthèses, j'obtiens des erreurs comme '(' - parenthèse gauche non équilibrée test.mq4 31 8 (à partir de la ligne où TrendDetection() est appelé)

J'ai besoin d'aide, je suis encore en train d'apprendre...


#define BULL 1 ;
#define BEAR 2 ;

//--------------------------------------------------------------------
extern int SL = 200 ;
extern int TP = 200 ;
extern double Lots = 0.01 ;
extern double SarStep = 0.02 ;
extern double SarMaximum = 0.2 ;
extern int slippage = 5 ;
extern int Magic = 1 ;
extern int MaxOrder = 1 ;
string OrderComments = "Bargain 1.0 ;
int Cnt=0 ;
datetime PreviousBar ;

int start()
{
Cnt=OrdersTotal() ;
{
si (Cnt<MaxOrder)
{
si(NewBar() == true)
{
si(TrendDetection() == BULL){
OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),slippage,NormalizeDouble(Ask,Digits)-(SL*Point),NormalizeDouble(Ask,Digits)+(TP*Point),OrderComments,Magic,0,CLR_NONE);}
si(TrendDetection() == BEAR){
OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),slippage,NormalizeDouble(Bid,Digits)+(SL*Point),NormalizeDouble(Bid,Digits)-(TP*Point),OrderComments,Magic,0,CLR_NONE);}
}
}
sinon
{return(0);}
}
retour(0) ;
}

int TrendDetection()
{
double Sar = iSAR(NULL,0,SarStep,SarMaximum,1) ;
if(Close[1] > Sar) {return(BULL);}
if(Close[1] < Sar) {return(BEAR);}
return(0);}
bool NewBar()
{
si(PreviousBar<Time[0])
{
PreviousBar = Time[0] ;
retour (vrai) ;
}
sinon
{
retour (faux) ;
}
retour (faux) ;
}
 
AlexeyVik:

Et maintenant, vous pouvez appliquer MathAbs() afin de ne pas avoir à garder la trace de ce qu'il faut soustraire de ce qu'il faut. Et un autre opérateur conditionnel intéressant


Ce qui signifie que la variable Lot se verra attribuer la valeur de Lot1 dans le cas où Ask- SlowMA est inférieur à dist, sinon, la valeur de Lot2 sera attribuée.

Une autre recommandation : oubliez la variable Point. Utilisez _Point ou la fonction Point()

Et Point, tout semble fonctionner ?