Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
vraiment merci mladen !
Je l'ai vu maintenant.
J'ai fait la même chose. Regardez :
for_a_new_life-1.ex4
for_a_new_life-1_1.mq4
Je testais la version mine et je testerai la vôtre aussi.
Si cet indicateur est correct, nous avons fait quelques grands pour attraper les points de retournement.
C'est parce que la différence entre les deux moyennes mobiles divisée par la force 2times, peut montrer quand le prix se retourne dans une tendance avec plus de sensibilité. Testez-le avec un autre indicateur de frontière et je pense que vous aimerez.
quelques photos :
Je suis trop content car c'est ma première contribution au forum. Et je n'aurais pas pu le faire sans votre aide.
Merci beaucoup Mladen !Kelch
J'ai fait un seul changement : changer la direction de l'indicateur. Il semble que de cette façon il montre des valeurs un peu plus logiques. Essayez aussi de cette façon
for_a_new_life-1.01.mq4
Salut Mladen,
J'ai créé une EA à partir d'icustom après l'avoir compilé, il n'y a pas eu d'erreur ni d'avertissement mais j'ai fait un Backtest sans OP.
Je peux poster mon EA dans ce fil de discussion, je voudrais que vous m'aidiez à le réparer.
Merci,
Meilleure considération
Bonjour Mladen,
J'ai créé une EA à partir d'icustom après l'avoir compilé, il n'y a pas eu d'erreur ni d'avertissement mais j'ai fait un Backtest sans OP.
Puis-je poster mon EA dans ce fil de discussion ? J'aimerais que vous m'aidiez à le réparer.
Merci,
meilleures salutationsDova
Postez-le pour que quelqu'un y jette un coup d'oeil.
Kelch
Je n'ai fait qu'un seul changement : changer la direction de l'appareil. Il semble que de cette façon, il affiche des valeurs un peu plus logiques. Essayez aussi de cette façon
for_a_new_life-1.01.mq4Merci mladen !
Voici mon ea d'essai...
Cette ea lors de la compilation est ok pas d'erreur ou d'avertissement mais pas d'OP quand BT.
Je voudrais que cette ea puisse inverser la position de l'OP avant,
Si la position est déjà BUY, la flèche SELL de la prochaine bougie apparaîtra et inversera automatiquement la position de BUY à SELL et vice versa.
J'aimerais aussi ajouter le Trailling Stop.
Désolé pour mon mauvais anglais
pfi.ex4ea_pfi.mq4
Je vous remercie
Voici mon essai ea...
Cette ea lors de la compilation est ok pas d'erreur ou d'avertissement mais pas d'OP lorsque BT.
J'aimerais que cette application puisse inverser la position de l'OP avant,
Par exemple, si la position est déjà BUY, la flèche SELL de la prochaine bougie apparaîtra et inversera automatiquement la position de BUY à SELL et vice versa.
J'aimerais aussi ajouter un Trailling Stop.
Désolé pour mon mauvais anglais
pfi.ex4ea_pfi.mq4
Merci.Pour la clarté de quiconque lit ce post : que signifie exactement "inverser à partir de OP" ou "pas d'OP quand BT" ?
Pour la clarté de tous ceux qui lisent ce post : que signifie exactement "reverse from OP" ou "no OP when BT" ?
Je veux dire OP= Position ouverte, BT= Backtest.
Après le backtest, aucune position ouverte.
Lorsqu'il y a déjà une position ouverte à l'achat, les flèches/signaux de vente de la prochaine bougie apparaissent et ferment automatiquement les positions longues et ouvrent les positions courtes et vice versa (inversion automatique de la position).
J'espère que mes explications sont claires.
Merci.
Salutations à tous ....
pardonner si mauvais endroit, en raison de mes nouveaux membres .
s'il vous plaît son soutien de la codification de maître ,
pour coder cet indicateur dans EA.
avec l'intention de EA sera en mesure de travailler comme je le voulais, à savoir :
1.ouvrir l'achat automatique lorsque le prix touche la ligne TL1 .
2.ouvrir une vente automatique lorsque le prix touche la ligne TL2.
3.ouvrir un achat automatique lorsque le prix est au-dessus de la ligne TL2
4.ouvrir la vente automatique lorsque le prix dépasse la ligne TL1.
5.fermé achat automatique lorsque le prix touche la ligne TL2 procéder directement à la vente ouverte.
6.fermé, vente automatique lorsque le prix touche la ligne TL1, achat direct ouvert.
7.nomor 3 et 4 fermé manuellement ( sans TrailingStop ) .
8.SL 50 pips et put sur lot 0.1
9.time frame H4 pour toutes les paires.
merci beaucoup
/ / + ----------------------------------------------- ------------------- +
/ / | SHI_Channel_true.mq4 |
/ / | Copyright © 2004 , Shurka & Kevin |
/ / | |
/ / + ----------------------------------------------- ------------------- +
# propriété copyright " Copyright © 2004 , Shurka & Kevin "
# propriété link " "
/ / ----
# propriété indicator_chart_window
# propriété indicator_buffers 1
# propriété indicator_color1 Red
ExtMapBuffer1 double [ ] ;
/ / ---- Paramètres d'entrée
extern int AllBars = 240 ;
BarsForFract extern int = 0 ;
CurrentBar int = 0 ;
double Step = 0 ;
int B1 = -1 , B2 = -1 ;
UpDown int = 0 ;
double P1 = 0 , P2 = 0 , PP = 0 ;
int i = 0 , AB = 300 , BFF = 0 ;
ishift int = 0 ;
double iprice = 0 ;
datetime T1 , T2 ;
/ / + ----------------------------------------------- ------------------- +
/ / | Fonction d'initialisation de l'indicateur personnalisé |
/ / + ----------------------------------------------- ------------------- +
int init ( )
{
/ / ---- Indicateurs
SetIndexStyle ( 0 , DRAW_ARROW ) ;
SetIndexArrow ( 0 , 164 ) ;
SetIndexBuffer ( 0 , ExtMapBuffer1 ) ;
SetIndexEmptyValue ( 0 , 0.0 ) ;
/ / ----
return ( 0 ) ;
}
/ / + ----------------------------------------------- ------------------- +
/ / | Désinitialisation de la fonction de l'indicateur de garde | / / +.
/ / + ----------------------------------------------- ------------------- +
deinit int ( )
{
ObjectDelete ( " TL1 " ) ;
ObjectDelete (" TL2 ") ;
ObjectDelete ( " MIDL " ) ;
Commentaire ( " " ) ;
/ / ----
return ( 0 ) ;
}
/ / + ----------------------------------------------- ------------------- +
/ / | |
/ / + ----------------------------------------------- ------------------- +
DelObj void ( )
{
ObjectDelete ( " TL1 " ) ;
ObjectDelete (" TL2 ") ;
ObjectDelete (" MIDL ") ;
}
/ / + ----------------------------------------------- ------------------- +
/ / | Fonction d'itération de l'indicateur personnalisé |
/ / + ----------------------------------------------- ------------------- +
int start ( )
{
IndicatorCounted counted_bars = int ( ) ;
/ / ----
si ( ( AllBars == 0 ) | | ( Bars < AllBars ) )
AB = Bars ;
else AB = AllBars ; / / AB - êîëè ÷ ÷ åñòâî Ian èòûâàåìûõ áàðîâ
si ( BarsForFract > 0 )
BFF = BarsForFract ;
sinon
switch ( Période ( ) )
{
cas 1 : BFF = 12 ; break ;
cas 5 : BFF = 48 ; pause ;
cas 15 : BFF = 24 ; pause ;
cas 30 : BFF = 24 ; pause ;
cas 60 : BFF = 12 ; pause ;
cas 240 : BFF = 15 ; pause ;
cas 1440 : BFF = 10 ; pause ;
cas 10080 : BFF = 6 ; pause ;
default : DelObj ( ), return ( -1 ) ; break ;
}
CurrentBar = 2 ; / / ñ ÷ ñ òðåòüåãî Suspected èòàåì , ÷ òîáû ôðàêòàë " çàêðåïèëñÿ
B1 = -1 ;
B2 = -1 ;
UpDown = 0 ;
while ( ( ( B1 == -1 ) | | ( B2 == -1 ) ) && ( CurrentBar < AB ) )
{
/ / UpDown = 1 ÷ eo CIA ïåðâûé ôðàêòàë íàéäåí ñâåðõó , UpDown = -1 ÷ eo CIA ïåðâûé ôðàêòàë
/ / íàéäåí ñíèçó , CIA UpDown = 0 ÷ ¸ AU EO ôðàêòàë he íàéäåí .
/ / A1 a2 è - ÿ áàðîâ íîìåðà ôðàêòàëàìè , ÷ ADAC IEO ñòðîèì îïîðíóþ ëèíèþ .
/ / È D1 D2 - ÷ öåíû ñîîòâåòñòâåííî ADAC êîòîðûå áóäåì ëèíèþ ïðîâîäèòü
if ( ( UpDown < 1 ) && ( CurrentBar == Lowest ( Symbol ( ) , Period ( ) , MODE_LOW , BFF * 2 + 1 ,
CurrentBar - BFF ) ) )
{
si ( UpDown == 0 )
{
UpDown = -1 ;
B1 = CurrentBar ;
P1 = Low [ B1 ] ;
}
else
{
B2 = CurrentBar ;
P2 = Bas [ B2 ] ;
}
}
if ( ( UpDown > -1 ) && ( CurrentBar == Highest ( Symbol ( ) , Period ( ) , MODE_HIGH , BFF * 2 + 1 ,
CurrentBar - BFF ) ) )
{
si ( UpDown == 0 )
{
UpDown = 1 ;
B1 = CurrentBar ;
P1 = Haut [ B1 ] ;
}
else
{
B2 = CurrentBar ;
P2 = Haut [ B2 ] ;
}
}
CurrentBar + + ;
}
si ( ( B1 == -1 ) | | ( B2 == -1 ) )
{
DelObj ( ) ;
retour ( -1 ) ;
} / / Eo ÷ CIA he íàøëè ôðàêòàëîâ ñðåäè 300 áàðîâ 8-)
Étape = ( P2 - P1 ) / ( B2 - B1 ) / / Au ÷ èñëèëè OAA , åñëè ïîëîæèòåëüíûé II , OI êàíàë íèñõîäÿùèé
P1 = P1 - B1 * Étape ;
B1 = 0 ; / / ïåðåñòàâëÿåì öåíó ïåðâûé AAD è ê íóëþ
/ / À ÷ eo Oi òåïåðü îïîðíóþ ïðîòèâîïîëîæíîé ëèíèè êàíàëà .
ishift = 0 ;
iprice = 0 ;
si ( UpDown == 1 )
{
PP = Low [ 2 ] - 2 * Step ;
pour (i = 3 ; i < = B2 ; i + + )
{
si ( Low [ i ] < PP + Step * i )
PP = Low [ i ] - i * Step ;
}
si ( Low [ 0 ] < PP )
{
ishift = 0 ;
iprice = PP ;
}
si ( Low [ 1 ] < PP + Step )
{
ishift = 1 ;
iprice = PP + Step ;
}
si ( High [ 0 ] > P1 )
{
ishift = 0 ;
iprice = P1 ;
}
si ( Haut [ 1 ] > P1 + Step )
{
ishift = 1 ;
iprice = P1 + Step ;
}
}
else
{
PP = Haut [ 2 ] - 2 * Étape ;
pour (i = 3 ; i < = B2 ; i + + )
{
si ( Haut [ i ] > PP + Step * i )
PP = Haut [ i ] - i * Étape ;
}
si ( Low [ 0 ] < P1 )
{
ishift = 0 ;
iprice = P1 ;
}
si ( Low [ 1 ] < P1 + Step )
{
ishift = 1 ;
iprice = P1 + Step ;
}
si ( High [ 0 ] > PP )
{
ishift = 0 ;
iprice = PP ;
}
si ( High [ 1 ] > PP + Step )
{
ishift = 1 ;
iprice = PP + Step ;
}
}
/ / Òåïåðü ïåðåñòàâèì êîíå ÷ è íóþ öåíó he AAD AA , ÷ òîáû ëèíèè êàíàëà ðèñîâàëèñü ïîäëèíååå
P2 = P1 + AB * Pas ;
T1 = Temps [ B1 ] ;
T2 = Temps [ AB ] ;
/ / Åñëè he áûëî ïåðåñå ÷ åíèÿ êàíàëà , oi 0 , EIA ÷ å ñòàâèì Ineno .
si ( iprice ! = 0 )
ExtMapBuffer1 [ ishift ] = iprice ;
DelObj ( ) ;
ObjectCreate ( " TL1 " , OBJ_TREND , 0 , T2 , PP + Step * AB , T1 , PP ) ;
ObjectSet ( " TL1 " , OBJPROP_COLOR , Lime ) ;
ObjectSet ( " TL1 " , OBJPROP_WIDTH , 2 ) ;
ObjectSet ( " TL1 " , OBJPROP_STYLE , STYLE_SOLID ) ;
ObjectCreate ( " TL2 " , OBJ_TREND , 0 , T2 , P2 , T1 , P1 ) ;
ObjectSet ( " TL2 " , OBJPROP_COLOR , White ) ;
ObjectSet ( " TL2 " , OBJPROP_WIDTH , 2 ) ;
ObjectSet ( " TL2 " , OBJPROP_STYLE , STYLE_SOLID ) ;
ObjectCreate ( " MIDL " , OBJ_TREND , 0 , T2 , ( P2 + PP + Step * AB ) / 2 , T1 , ( P1 + PP ) / 2 ) ;
ObjectSet ( " MIDL " , OBJPROP_COLOR , Yellow ) ;
ObjectSet ( " MIDL " , OBJPROP_WIDTH , 1 ) ;
ObjectSet ( " MIDL " , OBJPROP_STYLE , STYLE_DOT ) ;
Comment ( " Channel size = " , DoubleToStr ( MathAbs ( PP - P1 ) / Point , 0 ) , " Slope = " ,
DoubleToStr ( - Step / Point , 2 ) ) ;
/ / ----
return ( 0 ) ;
}
/ / + ----------------------------------------------- ------------------- +
Salutations à tous ....
pardonner si mauvais endroit, en raison de mes nouveaux membres .
s'il vous plaît son soutien de la codification de maître ,
pour coder cet indicateur dans EA.
avec l'intention d'EA sera en mesure de travailler comme je le voulais, à savoir :
1.ouvrir l'achat automatique lorsque le prix touche la ligne TL1 .
2.ouvrir une vente automatique lorsque le prix touche la ligne TL2.
3.ouvrir un achat automatique lorsque le prix est au-dessus de la ligne TL2
4.ouvrir la vente automatique lorsque le prix dépasse la ligne TL1.
5.fermé achat automatique lorsque le prix touche la ligne TL2 procéder directement à la vente ouverte.
6.fermé, vente automatique lorsque le prix touche la ligne TL1, achat direct ouvert.
7.nomor 3 et 4 fermé manuellement ( sans TrailingStop ) .
8.SL 50 pips et put sur lot 0.1
9.time frame H4 pour toutes les paires.
merci beaucoup
/ / + ----------------------------------------------- ------------------- +
/ / | SHI_Channel_true.mq4 |
/ / | Copyright © 2004 , Shurka & Kevin |
/ / | |
/ / + ----------------------------------------------- ------------------- +
# propriété copyright " Copyright © 2004 , Shurka & Kevin "
# propriété link " "
/ / ----
# propriété indicator_chart_window
# propriété indicator_buffers 1
# propriété indicator_color1 Red
ExtMapBuffer1 double [ ] ;
/ / ---- Paramètres d'entrée
extern int AllBars = 240 ;
BarsForFract extern int = 0 ;
CurrentBar int = 0 ;
double Step = 0 ;
int B1 = -1 , B2 = -1 ;
UpDown int = 0 ;
double P1 = 0 , P2 = 0 , PP = 0 ;
int i = 0 , AB = 300 , BFF = 0 ;
ishift int = 0 ;
double iprice = 0 ;
datetime T1 , T2 ;
/ / + ----------------------------------------------- ------------------- +
/ / | Fonction d'initialisation de l'indicateur personnalisé |
/ / + ----------------------------------------------- ------------------- +
int init ( )
{
/ / ---- Indicateurs
SetIndexStyle ( 0 , DRAW_ARROW ) ;
SetIndexArrow ( 0 , 164 ) ;
SetIndexBuffer ( 0 , ExtMapBuffer1 ) ;
SetIndexEmptyValue ( 0 , 0.0 ) ;
/ / ----
return ( 0 ) ;
}
/ / + ----------------------------------------------- ------------------- +
/ / | Désinitialisation de la fonction de l'indicateur de garde | / / +.
/ / + ----------------------------------------------- ------------------- +
deinit int ( )
{
ObjectDelete ( " TL1 " ) ;
ObjectDelete (" TL2 ") ;
ObjectDelete ( " MIDL " ) ;
Commentaire ( " " ) ;
/ / ----
return ( 0 ) ;
}
/ / + ----------------------------------------------- ------------------- +
/ / | |
/ / + ----------------------------------------------- ------------------- +
DelObj void ( )
{
ObjectDelete ( " TL1 " ) ;
ObjectDelete (" TL2 ") ;
ObjectDelete (" MIDL ") ;
}
/ / + ----------------------------------------------- ------------------- +
/ / | Fonction d'itération de l'indicateur personnalisé |
/ / + ----------------------------------------------- ------------------- +
int start ( )
{
IndicatorCounted counted_bars = int ( ) ;
/ / ----
si ( ( AllBars == 0 ) | | ( Bars < AllBars ) )
AB = Bars ;
else AB = AllBars ; / / AB - êîëè ÷ ÷ åñòâî Ian èòûâàåìûõ áàðîâ
si ( BarsForFract > 0 )
BFF = BarsForFract ;
sinon
switch ( Période ( ) )
{
cas 1 : BFF = 12 ; break ;
cas 5 : BFF = 48 ; pause ;
cas 15 : BFF = 24 ; pause ;
cas 30 : BFF = 24 ; pause ;
cas 60 : BFF = 12 ; pause ;
cas 240 : BFF = 15 ; pause ;
cas 1440 : BFF = 10 ; pause ;
cas 10080 : BFF = 6 ; pause ;
default : DelObj ( ), return ( -1 ) ; break ;
}
CurrentBar = 2 ; / / ñ ÷ ñ òðåòüåãî Suspected èòàåì , ÷ òîáû ôðàêòàë " çàêðåïèëñÿ
B1 = -1 ;
B2 = -1 ;
UpDown = 0 ;
while ( ( ( B1 == -1 ) | | ( B2 == -1 ) ) && ( CurrentBar < AB ) )
{
/ / UpDown = 1 ÷ eo CIA ïåðâûé ôðàêòàë íàéäåí ñâåðõó , UpDown = -1 ÷ eo CIA ïåðâûé ôðàêòàë
/ / íàéäåí ñíèçó , CIA UpDown = 0 ÷ ¸ AU EO ôðàêòàë he íàéäåí .
/ / A1 a2 è - ÿ áàðîâ íîìåðà ôðàêòàëàìè , ÷ ADAC IEO ñòðîèì îïîðíóþ ëèíèþ .
/ / È D1 D2 - ÷ öåíû ñîîòâåòñòâåííî ADAC êîòîðûå áóäåì ëèíèþ ïðîâîäèòü
if ( ( UpDown < 1 ) && ( CurrentBar == Lowest ( Symbol ( ) , Period ( ) , MODE_LOW , BFF * 2 + 1 ,
CurrentBar - BFF ) ) )
{
si ( UpDown == 0 )
{
UpDown = -1 ;
B1 = CurrentBar ;
P1 = Low [ B1 ] ;
}
else
{
B2 = CurrentBar ;
P2 = Bas [ B2 ] ;
}
}
if ( ( UpDown > -1 ) && ( CurrentBar == Highest ( Symbol ( ) , Period ( ) , MODE_HIGH , BFF * 2 + 1 ,
CurrentBar - BFF ) ) )
{
si ( UpDown == 0 )
{
UpDown = 1 ;
B1 = CurrentBar ;
P1 = Haut [ B1 ] ;
}
else
{
B2 = CurrentBar ;
P2 = Haut [ B2 ] ;
}
}
CurrentBar + + ;
}
si ( ( B1 == -1 ) | | ( B2 == -1 ) )
{
DelObj ( ) ;
retour ( -1 ) ;
} / / Eo ÷ CIA he íàøëè ôðàêòàëîâ ñðåäè 300 áàðîâ 8-)
Étape = ( P2 - P1 ) / ( B2 - B1 ) / / Au ÷ èñëèëè OAA , åñëè ïîëîæèòåëüíûé II , OI êàíàë íèñõîäÿùèé
P1 = P1 - B1 * Étape ;
B1 = 0 ; / / ïåðåñòàâëÿåì öåíó ïåðâûé AAD è ê íóëþ
/ / À ÷ eo Oi òåïåðü îïîðíóþ ïðîòèâîïîëîæíîé ëèíèè êàíàëà .
ishift = 0 ;
iprice = 0 ;
si ( UpDown == 1 )
{
PP = Low [ 2 ] - 2 * Step ;
pour (i = 3 ; i < = B2 ; i + + )
{
si ( Low [ i ] < PP + Step * i )
PP = Low [ i ] - i * Step ;
}
si ( Low [ 0 ] < PP )
{
ishift = 0 ;
iprice = PP ;
}
si ( Low [ 1 ] < PP + Step )
{
ishift = 1 ;
iprice = PP + Step ;
}
si ( High [ 0 ] > P1 )
{
ishift = 0 ;
iprice = P1 ;
}
si ( Haut [ 1 ] > P1 + Step )
{
ishift = 1 ;
iprice = P1 + Step ;
}
}
else
{
PP = Haut [ 2 ] - 2 * Étape ;
pour (i = 3 ; i < = B2 ; i + + )
{
si ( Haut [ i ] > PP + Step * i )
PP = Haut [ i ] - i * Étape ;
}
si ( Low [ 0 ] < P1 )
{
ishift = 0 ;
iprice = P1 ;
}
si ( Low [ 1 ] < P1 + Step )
{
ishift = 1 ;
iprice = P1 + Step ;
}
si ( High [ 0 ] > PP )
{
ishift = 0 ;
iprice = PP ;
}
si ( High [ 1 ] > PP + Step )
{
ishift = 1 ;
iprice = PP + Step ;
}
}
/ / Òåïåðü ïåðåñòàâèì êîíå ÷ è íóþ öåíó he AAD AA , ÷ òîáû ëèíèè êàíàëà ðèñîâàëèñü ïîäëèíååå
P2 = P1 + AB * Pas ;
T1 = Temps [ B1 ] ;
T2 = Temps [ AB ] ;
/ / Åñëè he áûëî ïåðåñå ÷ åíèÿ êàíàëà , oi 0 , EIA ÷ å ñòàâèì Ineno .
si ( iprice ! = 0 )
ExtMapBuffer1 [ ishift ] = iprice ;
DelObj ( ) ;
ObjectCreate ( " TL1 " , OBJ_TREND , 0 , T2 , PP + Step * AB , T1 , PP ) ;
ObjectSet ( " TL1 " , OBJPROP_COLOR , Lime ) ;
ObjectSet ( " TL1 " , OBJPROP_WIDTH , 2 ) ;
ObjectSet ( " TL1 " , OBJPROP_STYLE , STYLE_SOLID ) ;
ObjectCreate ( " TL2 " , OBJ_TREND , 0 , T2 , P2 , T1 , P1 ) ;
ObjectSet ( " TL2 " , OBJPROP_COLOR , White ) ;
ObjectSet ( " TL2 " , OBJPROP_WIDTH , 2 ) ;
ObjectSet ( " TL2 " , OBJPROP_STYLE , STYLE_SOLID ) ;
ObjectCreate ( " MIDL " , OBJ_TREND , 0 , T2 , ( P2 + PP + Step * AB ) / 2 , T1 , ( P1 + PP ) / 2 ) ;
ObjectSet ( " MIDL " , OBJPROP_COLOR , Yellow ) ;
ObjectSet ( " MIDL " , OBJPROP_WIDTH , 1 ) ;
ObjectSet ( " MIDL " , OBJPROP_STYLE , STYLE_DOT ) ;
Comment ( " Channel size = " , DoubleToStr ( MathAbs ( PP - P1 ) / Point , 0 ) , " Slope = " ,
DoubleToStr ( - Step / Point , 2 ) ) ;
/ / ----
return ( 0 ) ;
}
/ / + ----------------------------------------------- ------------------- +djiwenk
Vous savez que le canal shi change tout le temps (comme le prix actuel change, le canal shi changera aussi) ?
livre de création d'ea
créer votre propre ea