Aide au codage... Comment faire pour que l'indicateur filtre au lieu de l'alerte ? - page 4

 
Aaragorn:
Je l'ai résumé à ceci... mais attendez...

s'il s'agit simplement d'utiliser la moyenne mobile simple de cette barre multipliée par 3,5 pour trouver un point haut. Comment est-il possible que le point puisse atteindre ce point ? La valeur de la ligne n'est-elle pas calculée à partir de la même barre qui devrait la toucher pour donner le signal ? Au fur et à mesure que la barre monte, la ligne de bord monte aussi ???

Lamoyenne mobile est calculée à partir de plus d'une barre donc la ligne peut avoir une valeur et le prix une autre.

 
elihayun:
Si vous voulez savoir si la ligne supérieure est proche du prix, une façon de le savoir est que la différence entre les deux est petite (disons 2 points).

Je ne me soucie pas (ce qui n'est pas une bonne idée) que le prix soit sous la ligne ou au-dessus de la ligne. Pour moi, une distance de 2 points suffit.

upper - High vous donnera la différence mais pas en points (c'est quelque chose comme 0.0004 ou -0.0004). Pour s'assurer que la différence est positive, nous utilisons la fonction MathAbs qui renvoie la valeur absolue (positive). Maintenant, nous devons vérifier si la différence est inférieure à 2 points. Le mot réservé Point renvoie la valeur lorsque le prix augmente de 1 pip. C'est différent pour chaque paire.

Mettez tout cela ensemble

if (MathAbs(upper - High) < 2*Point) signifie que la différence est inférieure à 2 pips, ce qui pour nous est assez proche.

En fait, utiliser High n'est pas bon, parce que le High est peut-être au-dessus, mais le prix actuel est loin. Nous devons utiliser Ask au lieu de High (dans l'indicateur, nous devons utiliser Close[x]).

Pour s'assurer que le prix est au-dessus de la ligne, nous pouvons faire ceci

if ((Ask > upper) && (Ask - upper < 2 * Point))

.....(alert or open a trade)

[/PHP]

vous êtes très bon pour répondre à tant de mes questions j'espère que je ne vous épuise pas je suis avide d'apprendre.

Je comprends la valeur absolue. Je me demande ce que cela changerait d'utiliser le ask au lieu du close ? ne serait-il pas bon d'utiliser le close ? ou cela ferait-il une grande différence ? la seule chose qui me trouble encore est le côté 2 * point de la deuxième condition. Le point ne devrait-il pas être multiplié par 2 ? Est-ce que j'interprète mal le symbole '*' ou est-ce que c'est le symbole de la multiplication ?

Je vois que ask-upper donne la différence entre la ligne supérieure et la valeur actuelle de la demande, mais multiplier le point par 2 ? Je ne suis pas sûr du résultat qui pourrait être utilisé pour la comparaison.

Je pourrais faire cela pour n'autoriser que les achats lorsque le signal se produit en dessous de ma tolérance d'achat filtrée ?

[php]

extern double longrange = 25 ; //-la proximité autorisée pour s'approcher de la ligne supérieure de la bande avant d'interdire les achats

extern double shortrange = 20 ; //- la proximité autorisée pour approcher la ligne de la bande inférieure avant d'interdire les ventes

// ENTREE

if(total < 2 || isNewSumbol(Symbol())) //J'ai également modifié la condition if : c'était total<1 (orBanAway aka cucurucu)

{

double HedgeLots = (HedgePercent/100)*Lots ; //calcul des Lots pour la position couverte

if(isCrossed == 1 && Ask < upper-longrange)

{

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,comment,MAGICMA,0,Green) ;

sinon

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,comment,MAGICMA,0,Green) ;

si(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordre BUY ouvert : ",OrderOpenPrice()) ;

}

else Print("Erreur lors de l'ouverture de l'ordre BUY : ",GetLastError()) ;
 

Vous oubliez une chose. Pour comprendre le point, imaginez ceci

dans USDJPY le prix est 114.95 et dans EURUSD le prix est 1.2773

donc en USDJPY Ask - upper sera comme : 114.95 - 114.93 = 0.02

et en EURUSD le prix sera de 1.2773 - 1.2771 = 0.0002

Les deux sont 2 points mais avec une précision différente donc en USDJPY nous devons multiplier 2 par 0.01 et en EURUSD nous devons le multiplier par 0.0001 et dans chaque paire c'est exactement ce que le point est égal.

 
elihayun:
La moyenne mobile est calculée sur plus d'une barre donc la ligne peut être une valeur et le prix une autre.

Exactement ! Comment peut-il s'agir d'une moyenne sur une seule barre ?

//----------channel filter

int x = 0;

double middle2= iMA(NULL, 0, back, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands

double avg;

avg = findAvg(back, x);

double upper = middle2 + (3.5*avg);

double lower = middle2 - (3.5*avg); [/PHP]

I don't see how this works....also the compiler say, 'findAvg' - function is not defined

it's looking for the shift value x which is zero so that is only going to be the current bar right? So what is it averaging?

ok let me see what might be...if i'm telling it to go 'back' 300 periods that is what it's averaging is 300 periods. ok i get it now i think....

now about the undefined function error? what do I do about that? just get rid of it as unnecessary?

[PHP]//----------channel filter

int x = 0;

double middle2= iMA(NULL, 0, back, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands

double avg;

avg = (back, x);

double upper = middle2 + (3.5*avg);

double lower = middle2 - (3.5*avg);
 
elihayun:
Vous oubliez une chose. Pour comprendre le truc du point, imaginez ceci

en USDJPY le prix est 114.95 et en EURUSD le prix est 1.2773

donc en USDJPY Ask - upper sera comme : 114.95 - 114.93 = 0.02

et en EURUSD le prix sera 1.2773 - 1.2771 = 0.0002

Les deux sont 2 points mais avec une précision différente, donc en USDJPY nous devons multiplier 2 par 0.01 et en EURUSD nous devons le multiplier par 0.0001 et dans chaque paire c'est exactement ce à quoi le Point est égal.

ok je vois le problème... ce que je veux faire c'est créer une barrière basée sur la proximité des lignes supérieure et inférieure au-delà de laquelle les transactions ne seront pas autorisées.

-donc d'abord je récupère la valeur actuelle de la ligne.

-puis j'ajoute ou je soustrais la distance que je veux définir comme intolérable à trader en tant qu'entier que je considère comme 1=1 mouvement de pip.

-Ensuite, je dois obtenir la valeur de l'endroit où se trouve le prix pour chaque tick afin d'établir la condition de comparaison.

donc cette ligne devrait-elle être autre chose que 'price_Typical' ?

double middle2= iMA(NULL, 0, back, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands

Je ne suis pas sûr de savoir comment éviter que les différentes précisions ne causent un problème. Tout ce que je veux faire, c'est comparer le mouvement du prix par rapport au mouvement de la ligne qui va spécifier "ne pas trader en long au-dessus de ce niveau" ou "ne pas trader en short en dessous de ce niveau"...

Je suis prêt à faire une pause, mon cerveau est devenu de la bouillie.

 

PRICE_TYPICAL n'a rien à voir avec cela. Vous pouvez lire à ce sujet dans l'aide de MQL4.

tout ce que vous avez à faire pour trouver la différence entre le prix et la ligne est de soustraire l'un de l'autre. Comme je l'ai dit, le problème est que parfois vous obtenez 0.0006 et parfois vous obtenez 0.06 et c'est ce que le Point résout.

(Je dois fermer maintenant. Nous pouvons continuer demain)

 
elihayun:
Vous oubliez une chose. Pour comprendre le fonctionnement de Point, imaginez ceci

en USDJPY le prix est 114.95 et en EURUSD le prix est 1.2773

donc en USDJPY Ask - upper sera comme : 114.95 - 114.93 = 0.02

et en EURUSD le prix sera 1.2773 - 1.2771 = 0.0002

Les deux sont 2 points mais avec une précision différente, donc en USDJPY nous devons multiplier 2 par 0.01 et en EURUSD nous devons le multiplier par 0.0001 et dans chaque paire c'est exactement ce à quoi le Point est égal.

Donc le point est comme le suivi du mouvement du pip dans chaque paire indépendamment de la précision différente requise ?

 
elihayun:
PRICE_TYPICAL n'a rien à voir avec cela. Vous pouvez lire à ce sujet dans l'aide de MQL4.

Tout ce que vous avez à faire pour trouver la différence entre le prix et la ligne est de soustraire l'un de l'autre. Comme je l'ai dit, le problème est que parfois vous obtenez 0.0006 et parfois vous obtenez 0.06 et c'est ce que le Point résout.

(Je dois fermer maintenant. Nous pouvons continuer demain)

Merci beaucoup pour votre patience et vos encouragements.

 

Voici ce que j'ai fait....

//----------channel filter

double upLevel = iCustom(NULL,TF, "Trend Bands v2", back, 0, 0);

double LowLevel = iCustom(NULL,TF, "Trend Bands v2", back, 2, 0);

// ENTRY

if(total < 2 || isNewSumbol(Symbol())) //I have modified the if condition too: it was total<1 (orBanAway aka cucurucu)

{

double HedgeLots = (HedgePercent/100)*Lots; //calculates the Lots for the hedged position

if(isCrossed == 1 && Ask < upLevel-longrange)

{

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);

else

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

//###################################################################### the added code starts here

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);

else

ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,0,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Error opening SELL order : ",GetLastError());

//###################################################################### ends here

return(0);

}

if(isCrossed == 2 && Ask > LowLevel + shortrange)

{

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);

else

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Error opening SELL order : ",GetLastError());

//###################################################################### the added code starts here

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_BUY,HedgeLots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);

else

ticket=OrderSend(Symbol(),OP_BUY,HedgeLots,Ask,3,0,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

//###################################################################### ends here

return(0);

}

return(0);

}

return(0);

}

return(0);

}

}

//+------------------------------------------------------------------+[/PHP]

this is what I got from the tester....

[PHP]2006.06.30 11:18:09 2006.06.06 14:00 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:09 2006.06.06 12:14 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:09 2006.06.06 10:26 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:09 2006.06.05 22:47 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:09 2006.06.05 09:00 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 11:18:09 2006.06.05 08:41 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 11:18:09 2006.06.05 07:30 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 11:18:09 2006.06.05 07:29 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 11:18:08 2006.06.02 19:55 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 11:18:08 2006.06.01 11:27 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:08 2006.06.01 06:45 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:08 2006.06.01 04:00 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:08 2006.06.01 02:44 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:08 2006.06.01 00:37 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:00 2006.05.31 04:00 Trend Bands v2 EURUSD,M30: loaded successfully

2006.06.30 11:18:00 EMA_CROSSv5 EURUSD,M5: Tester comment: ----------------------------------------

TakeProfit=10 | TrailingStop=20 | StopLoss=20 | UseStopLoss=False

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

immediate_trade=True | reversal=False

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

Lots=1 | MM=True | Risk=10%

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

2006.06.30 11:18:00 EMA_CROSSv5 inputs: TakeProfit=10; TrailingStop=20; StopLoss=20; ShortEma=1; LongEma=5; Lots=1; HedgePercent=1; StartHour=0; StopHour=23; Risk=10; MAGICMA=20060301; longrange=1; shortrange=1; back=30; TF=30;

2006.06.30 11:17:35 EMA_CROSSv5: loaded successfully

le rapport montre qu'il a obtenu les paramètres mais qu'il est resté vide....

Il est évident qu'il interdit les transactions, mais TOUTES ? J'ai du mal à le croire alors que je n'ai réglé les plages longues et courtes qu'à 1 ! Il y a sûrement eu quelques signaux de transaction dans cette fourchette ? Je ne pense pas que cela fasse ce que je voulais.

Dossiers :
mac5.htm  5 kb
 

J'ai changé l'indicateur des bandes de tendance pour qu'il soit plus flexible.

extern int period = 34;

extern int factor = 8;

avg = findAvg(period, x);

upper[x] = middle2 + (factor*avg);

lower[x] = middle2 - (factor*avg);[/PHP]

then i did this to the EA

//---- Trend Bands v2 and Filter Parameters

extern double back = 300; //--how many periods back for the custom indicator to average

extern double bandwidth = 6; //--how wide the trend bands are

extern double TF = 30; //--which bar period for the custom indicator to use

//----------channel filter

double upLevel = iCustom(NULL,TF, "Trend Bands v3", back, bandwidth, 0, 0);

double LowLevel = iCustom(NULL,TF, "Trend Bands v3", back, bandwidth, 2, 0);

I got this from the tester...(slightly abbreviated report)..

[PHP]2006.06.30 12:10:38 2006.06.29 23:59 Trend Bands v3 EURUSD,M30: removed

2006.06.30 12:10:38 2006.06.29 20:21 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:21 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:20 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:20 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:16 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:16 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:15 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:15 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:12 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:12 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:04 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:04 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:03 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:03 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:00 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:00 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:00 Trend Bands v3 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 12:10:38 2006.06.29 19:59 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:59 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:32 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:32 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:25 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:25 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:21 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:21 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:20 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:20 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:09 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:09 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:08 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:08 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:06 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:06 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 18:35 Trend Bands v3 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 12:10:38 2006.06.29 18:16 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 18:16 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 18:15 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 18:15 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:37 2006.06.29 00:00 Trend Bands v3 EURUSD,M30: loaded successfully

2006.06.30 12:10:37 EMA_CROSSv5 EURUSD,M5: Tester comment: ----------------------------------------

TakeProfit=10 | TrailingStop=20 | StopLoss=20 | UseStopLoss=False

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

immediate_trade=True | reversal=False

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

Lots=1 | MM=True | Risk=10%

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

2006.06.30 12:10:37 EMA_CROSSv5 inputs: TakeProfit=10; TrailingStop=20; StopLoss=20; ShortEma=1; LongEma=5; Lots=1; HedgePercent=1; StartHour=0; StopHour=23; Risk=10; MAGICMA=20060301; back=300; bandwidth=6; TF=30;

Après cela, j'ai déplacé la largeur de bande à 20 pour qu'il ne touche jamais les bandes... il me donne toujours l'erreur "ouverture 131".

ERR_INVALID_TRADE_VOLUME 131 Volume de transaction non valide.

Qu'est-ce qui se passe ?