[ARCHIVE] Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 3. - page 182
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
Comment commander un conseiller
Pourquoi en est-il ainsi ?
L'EA traite chaque tick, et à chaque tick il y a une vérification et l'ouverture d'un ordre..... Vous devez vous souvenir de l'heure de la dernière position ouverte et faire une pause de 15 minutes, ou vous pouvez travailler selon l'ouverture ou la fermeture d'une barre. Il est préférable d'être lié à l'heure de la barre dans le code.
Comment commander un conseiller
quelque chose comme ça...
Mauvais exemple. Parce que le prix d'ouverture des chandeliers peut être répété. Mais le timing ne l'est pas.
Je suis d'accord :)))
J'essaie d'apprendre mcl4 et d'écrire un EA pour les tests. Certaines questions ont été soulevées.
1) Existe-t-il une procédure pour vérifier dans l'historique analysé s'il manque des bougies minutes pour telle ou telle paire ? Peut-être la procédure est-elle déjà écrite et disponible sur le net ?
2) S'il y a des lacunes ou seulement une petite quantité d'historique, comment l'EA peut-il télécharger les chandeliers entiers en minutes pour telle ou telle paire à partir de la date nécessaire ou combler les lacunes ?
L'idée est que l'EA vérifie l'exactitude de l'historique pendant le travail et corrige les écarts ou le petit nombre de barres si nécessaire.J'apprends un langage de programmation et j'ai du mal à comprendre le comportement du programme. J'ai écrit un EA basé sur le manuel, mais je l'ai déformé selon un principe de fonctionnement légèrement différent.
L'Expert Advisor est basé sur une moyenne de 2 muwings. L'idée est simple, les moyennes mobiles se croisent, l'ordre est fermé et l'ordre opposé est ouvert. J'ai écrit un EA et il fonctionne bien. Bien sûr, il est légèrement désavantagé, mais en accord avec l'idée. Le problème entier est le suivant (en gras) :
A=iMA(NULL,0,Period_MA_1,0,MODE_SMA, PRICE_CLOSE,1) ; // A
B=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,1) ; // B
C=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,2) ; // C
D=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,2) ; // D
Si je change la façon de calculer les moyennes mobiles (le signe plus peut apparaître) et que je mets la méthode exponentielle( MODE_SMA) au lieu de la méthode simple(MODE_EEMA ) et une autre(MODE_SMMA), appelée méthode lissée, tout va mal. Le principe de fonctionnement devient encore plus amusant (dans le testeur de stratégie) car l'EA ouvre un ordre au tout début de la période fixée et le ferme à la fin. C'est-à-dire que pendant une année, il ouvre une seule transaction au début de la période et la ferme à la fin. En conséquence, le conseiller expert m'a montré un plus, mais je n'ai pas besoin d'un tel plus. Je peux tirer à pile ou face moi-même et ouvrir un ordre d'achat ou de vente et voir si je gagne ou perds en un an. À propos, si je règle MODE_SMA sur MODE_LWMA (Linear Weighted Moving Average), le programme fonctionne bien.
S'il vous plaît, conseillez-moi, qu'est-ce qui ne va pas ? Le principe est le même ; seule la façon dont les moyennes mobiles sont calculées a été légèrement modifiée.
Voici le code complet du programme :
//+------------------------------------------------------------------+
//| Basé sur deux moyennes mobiles.mq4
//| Copyright © 2011, MetaQuotes Software Corp.
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp.
#lien de propriété "http://www.metaquotes.net"
//--------------------------------------------------------------- 1 --
// Valeurs numériques pour M15
extern int Période_MA_1=6 ; // Période MA1
extern int Period_MA_2=15 ; // Période MA 2
extern double Lots =0.1 ; // Nombre fixe de lots
bool Work=true ; // Le conseiller expert fonctionnera.
string Symb ; // Nom de l'instrument financier
//--------------------------------------------------------------- 2 --
int start()
{
int
Total, // Nombre de commandes dans la fenêtre
Tip=-1, // Type de commande sélectionné (B=0,S=1)
Ticket ; // Numéro de commande
double
A, //Valeur. Valeur MA_1 pour la première mesure depuis la fin.
Valeur MA_2 pour la première mesure depuis la fin.
Prix, // Prix de la commande sélectionnée
C, //Valeur. MA_1 pour la deuxième barre à partir de la fin
D, // Signification. Valeur MA_2 pour la deuxième barre à partir de la fin.
Lot ; // Nombre de lots dans l'ordre sélectionné
bool
Ans =false, // Réponse du serveur après la fermeture
Cls_B=false, // Critère de fermeture de l'achat
Cls_S=false, // Critère de fermeture Vendre
Opn_B=false, // Critère d'ouverture d'Achat
Opn__S=false ; // critère d'ouverture de Sell
//--------------------------------------------------------------- 3 --
//Prétraitement
if(Bars < Period_MA_2) // Pas assez de barres
{
Alert("Pas assez de barres dans la fenêtre, le conseiller expert ne fonctionne pas") ;
return ; // Quitter start()
}
if(Work==false) // Erreur critique.
{
Alert("Erreur critique. Le conseiller expert ne fonctionne pas.") ;
return ; // Sortie de start()
}
//--------------------------------------------------------------- 4 --
// Comptage des commandes
Symb=Symbol() ; // Nom de l'instrument financier.
Total=0 ; // Nombre de commandes
for(int i=1 ; i<=OrdersTotal() ; i++) // Boucle de commande
{
if(OrderSelect(i-1,SELECT_BY_POS)==true) // Si ce qui suit se produit
{ // Analyse de l'ordre :
if (OrderSymbol()!=Symb)continue ; // Pas notre instrument financier
if (OrderType()>1) // Nous avons un ordre en suspens
{
Alert("Ordre en attente détecté. Le conseiller expert ne fonctionne pas ;)
return ; // Exit()
}
Total++ ; // Compteur d'ordres de marché
if (Total>1) // Pas plus d'une commande
{
Alert("Plusieurs ordres de marché. Le conseiller expert ne fonctionne pas ;)
return ; // Exit()
}
Ticket=OrderTicket() ; // Numéro de commande sélectionné.
Tip =OrderType() ; // Type de la commande sélectionnée.
Prix =OrderOpenPrice() ; // Prix de l'ordre sélectionné.
Lot =OrderLots() ; // Nombre de lots
}
}
//--------------------------------------------------------------- 5 --
// Critères commerciaux
A=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,1) ; // A
B=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,1) ; // B
C=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,2) ; // C
D=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,2) ; // D
si (A<C&C>D&B>=A) // МА1 ligne va vers le bas,
{ // MA1 croise MA2
Opn_B=true ; // du haut vers le bas
Cls_S=true ; //
}
si (B<D&D>C&&A>=B) // la ligne MA2 va vers le bas
{ // MA2 croise MA1
Opn_S=true ; // de haut en bas
Cls_B=true ; //
}
//--------------------------------------------------------------- 6 --
// Fermer les commandes
while(true) //Ordre de fermer la boucle.
{
if (Tip==0 && Cls_B==true) //Ouvrir un ordre d'achat.
{ //il y a un critère de fermeture
Alert("Essayer de fermer l'achat ",Ticket," ;)
RefreshRates() ; // Rafraîchir les données
Ans=OrderClose(Ticket,Lot,Bid,2) ; // Fermer l'achat
if (Ans==true) // Cela a marché :)
{
Alerte ("Ordre d'achat fermé",Ticket ;)
break ; // Sortie de la boucle fermée
}
if (Fun_Error(GetLastError())==1) // Traitement des erreurs
continue ; // réessayer
return ; // Sortie de start()
}
if (Tip==1 && Cls_S==true) // Ordre de vente ouvert.
{ // il existe un critère proche
Alert("Tentative de fermeture de la vente ",Ticket," ;)
RefreshRates() ; // Rafraîchir les données
Ans=OrderClose(Ticket,Lot,Ask,2) ; // Fermer la vente
if (Ans==true) // Cela a marché :)
{
Alert ("Sell order closed ",Ticket ;)
break ; // Sortie de la boucle fermée
}
if (Fun_Error(GetLastError())==1) // Traitement des erreurs
continue ; // réessayer
return ; // Sortie de start()
}
break ; // Quitter le while
}
//--------------------------------------------------------------- 7 --
//--------------------------------------------------------------- 8 --
//Ouverture des commandes
while(true) //Ordre de fermer la boucle.
{
if (Total==0 && Opn_B==true) // Aucun ordre ouvert
{ //open Buy criterion.
RefreshRates() ; // Mise à jour des données
Alert("Essayer d'ouvrir un achat. Attendre la réponse...") ;
Ticket=OrderSend(Symb,OP_BUY,Lots,Ask,20,0,0, "EA 2xMA");//Open Buy
if (Ticket > 0) // ça a marché :)
{
Alerte ("Ordre d'achat ouvert ",Ticket ;)
return ; //Exit la commande
}
if (Fun_Error(GetLastError())==1) // Traitement des erreurs
continue ; // réessayer
return ; // Sortie de start()
}
if (Total==0 && Opn_S==true) // aucun ordre ouvert
{ //ouverture du critère de vente.
RefreshRates() ; // Mise à jour des données
Alert("Tentative d'ouverture de la vente. En attente de réponse...") ;
Ticket=OrderSend(Symb,OP_SELL,Lots,Bid,20,0,0, "EA 2xMA");//Open Sel.
if (Ticket > 0) // ça a marché :)
{
Alerte ("Ordre de vente ouvert ",Ticket ;)
return ; // Sortir de la fonction start()
}
if (Fun_Error(GetLastError())==1) // Traitement des erreurs
continue ; // réessayer
return ; // Sortie de start()
}
break ; // Quitter le while
}
//--------------------------------------------------------------- 9 --
return ; //sortir de start()
}
//-------------------------------------------------------------- 10 --
int Fun_Error(int Error) // Fie de gestion des erreurs
{
switch(Erreur)
{ // Erreurs insurmontables.
cas 4 : Alert("Le serveur commercial est occupé. Essayez à nouveau...") ;
Sleep(3000) ; // Solution simple.
return(1) ; // Sortie de la fonction.
cas 135:Alert("Le prix a changé. Essayez à nouveau...") ;
RefreshRates() ; // Rafraîchit les données.
return(1) ; // Sortie de la fonction.
cas 136:Alert("Pas de prix. En attente d'un nouveau tick...") ;
while(RefreshRates()==false) // Till a new tick
Sleep(1) ; // Délai dans la boucle
return(1) ; // Sortie de la fonction
cas 137:Alert("Broker is busy. Try again...") ;
Sleep(3000) ; // Solution simple.
return(1) ; // Sortie de la fonction.
cas 146:Alert("Le sous-système de négociation est occupé. Essayez à nouveau...") ;
Sleep(500) ; // Décision simple
return(1) ; // Sortie de la fonction
// Erreurs critiques
cas 2 : Alert("Erreur générale ;)
return(0) ; // Sortie de la fonction.
cas 5 : Alert("Ancienne version du terminal.") ;
Work=false ; // Ne plus travailler
return(0) ; // Sortie de la fonction
cas 64 : Alert("Compte bloqué.") ;
Work=false ; // Ne plus travailler
return(0) ; // Sortie de la fonction
cas 133:Alert("Trading interdit.") ;
return(0) ; // Sortie de la fonction
cas 134:Alert("Pas assez d'argent pour exécuter la transaction.") ;
return(0) ; // Sortie de la fonction
default : Alert("An error has occurred ",Error) ; // Autres options
return(0) ; // Sortie de la fonction
}
}
//-------------------------------------------------------------- 11 --
J'apprends un langage de programmation et j'ai du mal à comprendre le comportement du programme. J'ai écrit un EA basé sur le tutoriel, mais je l'ai modifié selon un principe légèrement différent.
Lors de la clôture de l'ordre, il serait bon de diminuer le total ou, mieux encore, de ne pas s'en préoccuper et de créer une fonction qui renvoie le nombre d'ordres ouverts pour le symbole et le numéro magique.
Quatre moyennes mobiles, c'est trop et il est préférable de les présenter sur deux périodes et à des décalages différents. Il est recommandé de les afficher à l'écran et de voir comment ils se comportent.