[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

 
 
dent:
Comment commander un conseiller
Vous pouvez commander ici : https://www.mql5.com/ru/job
 
NaVolne:


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.

double OpenBar=0; 
 
int start()
   {
    //Проверка на начало нового бара
    if (OpenBar==Time[0]) {return;} else {OpenBar=Time[0];}
    //ваш код
   }
 
dent:
Comment commander un conseiller
 
OlegTs:
double OpenBar=0; 

 

int start()
   {
    //Проверка на начало нового бара
    double CurOpenBar=iOpen(NULL,PERIOD_M15,0);  
    if (OpenBar==CurOpenBar) {return;} else {OpenBar=CurOpenBar;}
    //ваш код
   }


quelque chose comme ça...

Un mauvais exemple. Parce que le prix d'ouverture des chandeliers peut être répété. Mais le timing ne l'est pas.
 
MaxZ:
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 :)))
 
Merci beaucoup les gars, ça commence à marcher :)
 

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 --



 
neisseria:

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.