Comment coder ? - page 296

 

Est-il possible d'ajouter une couleur, un style et un poids aux lignes de niveaux des indicateurs ?

Bonjour,

Je me demande si quelqu'un peut me dire s'il est possible d'ajouter de la couleur, du style et du poids aux lignes de niveaux des indicateurs ?

Pour commencer, j'aimerais spécifier à la fois le style et la couleur des niveaux RSI et je me demande si l'on peut le faire en ajoutant du code supplémentaire à la ligne par exemple : #property indicator_level1 70 ?

Si cela est possible, j'apprécierais beaucoup que quelqu'un me le montre.

Merci,

Laurus

 

...

Oui, vous pouvez

Utiliser les propriétés suivantes :

#property indicator_levelcolor

#property indicator_levelstyle

#property indicator_levelwidth

[/PHP]

If you use indicator_levelwidth greater than 1, only indicator_levelstyle that metatrader will allow is STYLE_SOLID (solid line). Also, you can specify only one color, style and width for all levels (if you need more than one color, style or width for levels, you either have to use buffers or objects - horizontal line, for example)

You can use the SetLevelStyle() function too for that purpose,with same limitations as described above

[PHP]

void SetLevelStyle( int draw_style, int line_width, color clr=CLR_NONE)

Laurus12:
Salut,

Je me demande si quelqu'un peut me dire s'il est possible d'ajouter la couleur, le style et le poids aux lignes de niveaux des indicateurs ?

Pour commencer, j'aimerais spécifier à la fois le style et la couleur des niveaux RSI et je me demande si on peut le faire en ajoutant du code supplémentaire à la ligne par exemple : #property indicator_level1 70 ?

Si cela est possible, j'apprécierais beaucoup que quelqu'un me le montre.

Merci,

Laurus
 

Merci pour votre réponse Mladen, votre aide est toujours très appréciée.

Ce que vous avez écrit est exactement ce que je craignais. Pour ce qui est de la partie fonctionnelle, cela me dépasse encore.

Si vous regardez l'image, vous verrez comment je voudrais que ce soit. Comme compromis, j'ai utilisé des lignes horizontales régulières, mais comme je dessine des lignes de tendance avec l'indicateur lui-même, ce n'est pas une bonne solution.

Merci,

Laurus

Dossiers :
 

...

En regardant votre image, il semble que ce soit la seule solution que vous pouvez appliquer (en utilisant des objets). L'utilisation de tampons de dessin épuiserait simplement vos tampons de dessin et vous ne pourriez pas dessiner toutes les valeurs que vous utilisez sur cet indicateur. Parfois, nous "payons" encore la décision de Metatraders 4 de n'avoir que 8 tampons de dessin.

Laurus12:
Merci pour votre réponse Mladen, votre aide est toujours très appréciée.

Ce que vous avez écrit est exactement ce que je craignais. Quand il s'agit de la partie fonctions, cela me dépasse encore.

Si vous jetez un coup d'oeil à l'image, vous verrez comment je voudrais que ce soit. Comme compromis, j'ai utilisé des lignes horizontales régulières, mais comme je dessine des lignes de tendance avec l'indicateur lui-même, ce n'est pas une bonne solution.

Merci,

Laurus
 

Une DLL externe renvoie des résultats étranges

Bonjour !

Voici un exemple très simple d'un appel à une DLL externe. Le journal de bord devrait montrer des nombres croissants à partir de 0 lorsqu'il est utilisé avec le testeur de stratégie.

Cependant, le résultat est assez étrange. La première ligne du journal affiche un grand nombre (par exemple 18472), puis augmente correctement pendant un certain temps jusqu'à ce qu'il commence à sauter environ 10, parfois plus de 100, étapes à la fois.

Quelqu'un pourrait-il m'expliquer la raison de ce phénomène et comment le corriger ?

Merci !

// MyExpert.mql //

#import "MyDLL.dll"

int Test();

#import

void start(){

Print(Test());

}[/CODE]

// MyDLL.def //

LIBRARY MyDLL

EXPORTS

Test

[CODE]

// MyDLL.dll //

int i= 0;

int __stdcall Test() {

i++;

return i;

}
 

problème de code intéressant pour l'indicateur

Salut les gars,

J'essaie d'apprendre la programmation MT4, et en ce moment même je développe un indicateur de détection PinBar, qui me dit d'acheter ou de vendre. J'ai développé cet indicateur spécialement pour le graphique de 4 heures, à cause des règles spéciales pour l'achat ou la vente. La règle pour les détections est la suivante :

Corps de la bougie <= 35% de la longueur de la bougie.

Au moins une mèche de bougie >= 50 % de la longueur de la bougie.

Jusqu'à présent, je n'ai aucun problème à détecter ces barres avec l'indicateur.

Cependant, la règle suivante me dit d'acheter ou de vendre.

Je fais un zoom avant sur le graphique en 1 heure et je regarde les 4 barres qui ont créé la pinbar sur le graphique en 4 heures.

J'ai utilisé la fonction iClose pour récupérer la valeur de la clôture de la première et de la dernière barre de cette formation sur la barre 1 heure.

Cependant...tel que programmé maintenant, je regarde toujours la première et la dernière bougie sur le graphique d'une heure lui-même. Et ce n'est pas correct. Il faut que ce soit la première et la dernière barre de la formation et non du graphique.

Voici le code que j'ai maintenant avec les mauvaises fonctions iClose.

if ( (((100.0/CandleLength)*BodyLength)=50.0) || (((100.0/CandleLength)*LowerWick)>=50.0) ) && iClose(Symbol(),60,1) > iClose(Symbol(),60,4))

{

Buy = Close;

SetLevel(true,i+1,Close);

}

Je n'ai pas été capable de trouver les bonnes bougies d'une heure en arrière-plan de cette bougie de 4 heures.

Y a-t-il quelqu'un qui puisse me donner la réponse à mon problème ?

Je l'ai corrigé :

datetime H4BarTime ;

int H1BarNumber;

H4BarTime = Time ;

H1BarNumber = iBarShift(NULL, PERIOD_H1, H4BarTime) ;

Merci beaucoup !

Jacob

 
mladen:
En regardant votre image, il semble que ce soit la seule solution que vous pouvez appliquer (en utilisant des objets). L'utilisation de tampons de dessin épuiserait simplement vos tampons de dessin et vous ne pourriez pas dessiner toutes les valeurs que vous utilisez sur cet indicateur. Parfois, nous "payons" encore la décision de Metatraders 4 de n'avoir que 8 tampons de dessin.

Désolé pour ma réponse tardive Mladen et merci d'avoir clarifié la question. En ce qui concerne ce que vous avez écrit, au moins maintenant je suis sûr.

Je vous remercie,

Laurus

 

Aide sur les critères d'entrée

Bonjour à tous,

J'essaie d'établir un critère d'entrée en utilisant la MA. Mon critère d'entrée est simple, je veux entrer une transaction longue lorsque la MA rapide croise la MA lente à la hausse à la clôture de la bougie au lieu de la bougie actuelle et vice versa.

Ma situation actuelle est que mon EA déclenchera une transaction longue lorsque la Fast MA croise la Slow MA à la hausse et vice versa, cependant cette bougie n'a pas encore été fermée, et parfois lorsque la bougie se ferme, la MA finale peut ne pas croiser à la hausse donc, je n'aurais pas dû déclencher cette transaction particulière, et pourtant le système l'a déclenchée parce qu'elle a croisé à la hausse une fois et retour. C'est la même chose pour les transactions courtes.

Cela fait déjà quelques jours que j'essaie de résoudre ce problème, sans résultat. Quelqu'un peut-il m'éclairer sur la façon de procéder ? Merci.

//--- paramètres d'entrée

extern double TakeProfit=2700.0 ;

extern double Lots=0.1 ;

extern double StopLoss=2500.0 ;

//+------------------------------------------------------------------+

//| fonction d'initialisation de l'expert

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0) ;

}

//+------------------------------------------------------------------+

//| fonction de désinitialisation experte |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0) ;

}

int Crossed (double ligne1 , double ligne2)

{

static int last_direction = 0 ;

static int current_dirction = 0 ;

if(line1>line2)current_dirction = 1 ; //haut

if(line1<line2)current_dirction = 2 ; //down

if(current_dirction != last_direction) //changé

{

last_direction = current_dirction ;

return (last_direction) ;

}

else

{

return (0) ;

}

}

//+------------------------------------------------------------------+

//| fonction de démarrage expert |

//+------------------------------------------------------------------+

int start()

{

//----

int cnt, ticket, total ;

double shortEma, longEma ;

if(Bars<100)

{

Print("barres inférieures à 100") ;

return(0) ;

}

if(TakeProfit<10)

{

Print("TakeProfit inférieur à 10") ;

return(0) ; // vérifier TakeProfit

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0) ;

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0) ;

int isCrossed = Crossed (shortEma,longEma) ;

total = OrdersTotal() ;

si(total < 1)

{

si(isCrossed == 1)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"My EA",12345,0,Green) ;

if(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()) ;

return(0) ;

}

if(isCrossed == 2)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point, "My EA",12345,0,Red) ;

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordre VENTE ouvert : ",OrderOpenPrice()) ;

}

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

return(0) ;

}

return(0) ;

}

return(0) ;

}

//+------------------------------------------------------------------+

Merci et salutations

Terrance

 

...

Terrance

Essayez de modifier ces lignes :

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);[/PHP]

to something like this :

[PHP] int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

De cette façon, vous n'avez même pas besoin de la fonction croisée et il vérifiera les croisements sur une barre fermée.

tkuan77:
Salut les gars,

J'essaie d'établir un critère d'entrée en utilisant la MA. Mon critère d'entrée est simple, je veux entrer dans une transaction longue lorsque la MA rapide croise la MA lente vers le haut sur la fermeture de la bougie au lieu de la bougie actuelle et vice versa.

Ma situation actuelle est que mon EA déclenchera une transaction longue lorsque la Fast MA croise la Slow MA à la hausse et vice versa, cependant cette bougie n'a pas encore été fermée, et parfois lorsque la bougie se ferme, la MA finale peut ne pas croiser à la hausse donc, je n'aurais pas dû déclencher cette transaction particulière, et pourtant le système l'a déclenchée parce qu'elle a croisé à la hausse une fois et retour. C'est la même chose pour les transactions courtes.

Cela fait déjà quelques jours que j'essaie de résoudre ce problème, sans résultat. Quelqu'un peut-il m'éclairer sur la façon de procéder ? Merci.

//--- paramètres d'entrée

extern double TakeProfit=2700.0 ;

extern double Lots=0.1 ;

extern double StopLoss=2500.0 ;

//+------------------------------------------------------------------+

//| fonction d'initialisation de l'expert

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0) ;

}

//+------------------------------------------------------------------+

//| fonction de désinitialisation experte |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0) ;

}

int Crossed (double ligne1 , double ligne2)

{

static int last_direction = 0 ;

static int current_dirction = 0 ;

if(line1>line2)current_dirction = 1 ; //haut

if(line1<line2)current_dirction = 2 ; //down

if(current_dirction != last_direction) //changé

{

last_direction = current_dirction ;

return (last_direction) ;

}

else

{

return (0) ;

}

}

//+------------------------------------------------------------------+

//| fonction de démarrage expert |

//+------------------------------------------------------------------+

int start()

{

//----

int cnt, ticket, total ;

double shortEma, longEma ;

if(Bars<100)

{

Print("barres inférieures à 100") ;

return(0) ;

}

if(TakeProfit<10)

{

Print("TakeProfit inférieur à 10") ;

return(0) ; // vérifier TakeProfit

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0) ;

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0) ;

int isCrossed = Crossed (shortEma,longEma) ;

total = OrdersTotal() ;

si(total < 1)

{

si(isCrossed == 1)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"My EA",12345,0,Green) ;

if(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()) ;

return(0) ;

}

if(isCrossed == 2)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point, "My EA",12345,0,Red) ;

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordre VENTE ouvert : ",OrderOpenPrice()) ;

}

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

return(0) ;

}

return(0) ;

}

return(0) ;

}

//+------------------------------------------------------------------+

Merci et salutations

Terrance
 
mladen:
Terrance

Essayez de changer ces lignes :

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);[/PHP]

to something like this :

[PHP] int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

De cette façon, vous n'avez même pas besoin de la fonction croisée et il vérifiera les croisements sur une barre fermée.

Bonjour Mladen, j'ai essayé ce que vous m'avez dit et cela fonctionne à merveille. Cependant, je ne comprends pas bien la logique derrière les codes. Pourquoi définissez-vous le décalage de iMA à 1 et 2 et pourquoi codez-vous ceci : (diff1*diff2)<0) également ? Désolé mais je suis actuellement encore sur la phrase d'apprentissage.

Merci et salutations

Terrance