Comment coder ? - page 293

 
lincoln2012:
J'essaie d'apprendre MQ4. Mon premier programme simple est censé déclencher une alerte lorsque 2 MAs se croisent. Je n'arrive pas à comprendre pourquoi

ce code ne fonctionne pas.

Toute aide sera vraiment appréciée ! Merci d'avance.

extern int Period_MA1 = 5 ;

extern int Période_MA2 = 1 ;

double MA1 ;

double MA2 ;

int init()

{

retour(0) ;

}

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

int deinit()

{

return(0) ;

}

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

int start()

{

//--------------------------------------------------------------------

MA1=iMA(NULL,0,Period_MA1,0,MODE_SMA,PRICE_CLOSE,0) ;

MA2=iMA(NULL,0,Period_MA2,0,MODE_SMA,PRICE_CLOSE,0) ;

//--------------------------------------------------------------------

si (MA2 == MA1 )

Alert("Le prix est le même(",Period_MA2,").");// Alerte

retour ;

}

Bonjour Lincoln2012,

Je pourrais vérifier le code de ce Ma Cross.

Dossiers :
macross-1.mq4  7 kb
 
lincoln2012:
J'essaie d'apprendre MQ4. Mon premier programme simple est censé déclencher une alerte lorsque 2 MAs se croisent. Je n'arrive pas à comprendre pourquoi

ce code ne fonctionne pas.

}

La clé pour coder un croisement de 2 lignes d'indicateurs est ce concept :

1. Si la ligne1>ligne2 de la barre actuelle et la ligne1<ligne2 de la barre précédente, alors il y a un croisement vers le haut.

2. Si la ligne de la barre actuelle1<ligne2, alors il y a un croisement à la baisse.

 
mj10:
Bonjour

J'ai fait un peu de programmation dans Mt4, c'est amusant mais je ne suis pas un pro, juste une simple édition d'un ancien indicateur. Ok je veux faire un indicateur simple mais je ne sais pas comment le faire.

Son indicateur simple vérifie simplement la valeur si la valeur de toutes les variables est la même, il dessine le point où la valeur de toutes les variables correspond.

ma solution simple

Supposons que nous ayons des variables

double movingavg1 ;

double movingavg12 ;

double movingavg13 ;

double movingavg14 ;

double movingavg15 ;

double movingavg16 ;

double movingavg17 ;

double movingavg18 ;

double movingavg19 ;

double movingavg10 ;

double movingavgall ;

nous déclarons la variable, je donne juste un exemple, j'utilise iStochastic(1), mais nous pouvons utiliser n'importe quel indicateur.

movingavg12=iStochastic(1)

movingavg13=iStochastic(2)

.

.

.

et ainsi de suite

maintenant

if (movingavg12=movingavg13=movingavg14,....) (mettre la valeur dans la variable "movingavgall") //mettre la valeur qui est égale pour vria

dessinez la variable "movingavgall" sur les barres

Application

Supposons que je veuille vérifier si la moyenne mobile 3 et la moyenne mobile 5 ont la même valeur.

même cet indicateur peut être utilisé avec le RSI où les valeurs RSI 1 et RSI 2 = 80

et bien d'autres encore

Même si nous ajoutons la MTF, ce sera un bonus supplémentaire.

cela semble simple à l'écrit mais je n'ai pas pu trouver la solution, j'espère que quelqu'un pourra m'aider

J'espère que vous comprenez ce que je dis.

merci

Une fois que vous avez des valeurs à comparer, vous pouvez utiliser un code similaire au suivant.

Lavérification de l'égalité des valeurs utilise ==. Un seul = est utilisé pour attribuer une valeur à une variable.

Pour vérifier plus d'un ensemble, il faut utiliser && pour signifier AND.

a = 0 ;

si ((a == b) && (b == c) && (c == d)) movingavgall = a ;

Vous pouvez ensuite vérifier si movingavgall a une valeur avec

if (movingavgall != 0)

{

// faites quelque chose ici

}

Faites une recherche sur la programmation metatrader à l'aide de Google.

Vous devriez trouver plusieurs bons tutoriels pour la programmation dans MT4.

Un bon livre sur la programmation en C vous sera également utile.

Robert Hill alias MrPip

 

simplifier ce code

Bonjour à tous !

J'essaie de simplifier ce code en utilisant la commande stringconcatenate à partir de ceci :

ObjectSetText("uitog1v", StringConcatenate("/\\\ ", uitog1v, "%"),12, hr1v, DodgerBlue ) ;

à ceci :

ObjectSetText("uitog1v", StringConcatenate("/\\\ ", uitog1v, "%","/\\\ ", uitog2v, "%","/\\ ", uitog3v, "%"),12, StringConcatenate(hr1v,hr2v,hr3v), DodgerBlue ) ;

J'espère que quelqu'un pourra m'aider.

Meilleures salutations

doc

trend_alexcud_v_2men.mq4

Dossiers :
 

...

Doc

Si vous avez besoin de tous ces éléments, il n'y a pas de manière plus simple de l'écrire

dr.house7:
Bonjour à tous !

J'essaie de simplifier ce code en utilisant la commande stringconcatenate à partir de ceci :

ObjectSetText("uitog1v", StringConcatenate("/\\\ ", uitog1v, "%"),12, hr1v, DodgerBlue ) ;

à ceci :

ObjectSetText("uitog1v", StringConcatenate("/\\\ ", uitog1v, "%","/\\\ ", uitog2v, "%","/\\ ", uitog3v, "%"),12, StringConcatenate(hr1v,hr2v,hr3v), DodgerBlue ) ;

J'espère que quelqu'un pourra m'aider.

Meilleures salutations

doc

trend_alexcud_v_2men.mq4
 

Comment faire : Alerte toutes les 60 secondes

Comment puis-je créer un code qui, par exemple, me donne une alerte toutes les 60 secondes ?

J'ai créé ce code ci-dessous, mais il me donne une alerte toutes les minutes à partir du moment où je l'attache au graphique et je veux qu'il suive le temps du courtier pour qu'il m'alerte par exemple toutes les 60 secondes.

#include

#include

// exported variables

// local variables

double PipValue=1; // this variable is here to support 5-digit brokers

bool Terminated = false;

string LF = "\n"; // use this in custom or utility blocks where you need line feeds

int NDigits = 4; // used mostly for NormalizeDouble in Flex type blocks

int ObjCount = 0; // count of all objects created on the chart, allows creation of objects with unique names

int ExpectedTime2 = 0;

int init()

{

NDigits = Digits;

ObjectsDeleteAll(); // clear the chart

Comment(""); // clear the chart

}

// Expert start

int start()

{

if (Bars < 10)

{

Comment("Not enough bars");

return (0);

}

if (Terminated == true)

{

Comment("EA Terminated.");

return (0);

}

OnEveryTick1();

}

void OnEveryTick1()

{

if (true == false && true) PipValue = 10;

if (true && (NDigits == 3 || NDigits == 5)) PipValue = 10;

OncePerMinutes2();

}

void OncePerMinutes2()

{

int datetime800 = TimeLocal();

if (ExpectedTime2 == 0 || datetime800 > ExpectedTime2 + 60)

{

ExpectedTime2 = datetime800 + 60 * 1; // reset paused time

}

if (datetime800 >= ExpectedTime2 && datetime800 < ExpectedTime2 + 60)

{

ExpectedTime2 = datetime800 + 60 * 1;

Alert3();

}

}

void Alert3()

{

Alert("One minute gone");

}

int deinit()

{

if (true) ObjectsDeleteAll();

}

 
mladen:
Doc Si vous avez besoin de tous ces éléments, il n'y a pas de moyen plus simple de l'écrire

Uhm, pas de chance cette fois, merci quand même.

Meilleures salutations

doc

 

Il y a un problème avec le deuxième appel de StringConcatenate.

Vous additionnez 3 noms de police différents et le résultat ne sera pas valide.

Robert

dr.house7:
Bonjour à tous !

J'essaie de simplifier ce code en utilisant la commande StringConcatenate à partir de ceci :

ObjectSetText("uitog1v", StringConcatenate("/\\\ ", uitog1v, "%"),12, hr1v, DodgerBlue ) ;

à ceci :

ObjectSetText("uitog1v", StringConcatenate("/\\\ ", uitog1v, "%","/\\\ ", uitog2v, "%","/\\ ", uitog3v, "%"),12, StringConcatenate(hr1v,hr2v,hr3v), DodgerBlue ) ;

J'espère que quelqu'un pourra m'aider.

Meilleures salutations

doc

trend_alexcud_v_2men.mq4
 

Besoin d'aide avec l'EA ... les transactions ne sont pas fermées dans le testeur

Je travaille sur un EA, mais quoi que je fasse, je n'arrive pas à le faire fermer les transactions. Il les ouvre bien, mais quand je veux les fermer, il ne le fait pas.

Je vais afficher une partie du code de mon EA afin que l'un de vos codeurs expérimentés puisse comprendre pourquoi j'ai ce problème. Les variables 'buyTrade' et 'sellTrade' sont globales à toute l'EA.

NOTE : Je ne veux qu'UNE seule transaction ouverte à tout moment, qu'elle soit longue ou courte. Les transactions sont "toujours ouvertes", donc lorsqu'un signal de position longue est émis, la position courte existante doit être fermée et vice versa.

Ce n'est PAS ce qu'il fait. Ce qu'il fait, c'est ouvrir des positions, puis en ouvrir d'autres... et en ouvrir d'autres encore... et les garder ouvertes jusqu'à ce qu'elles atteignent toutes leurs stops.

Merci d'avance

//---- Is there a new signal?

// Buy signal ---------------------------------------

//if(buyTrade==false || sellTrade==false) {

if (STC_VIDYAprev = 10.00) {

if (sellTrade==true) {

for (int i = OrdersTotal() - 1; i >= 0; i--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_BUY )

{ int OldTicket=OrderTicket(); double lots=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symAsk = NormalizeDouble( MarketInfo( Sym, MODE_ASK ), SymDigits );

bool closeSellOrder = OrderClose( OldTicket, lots, symAsk, 0, CLR_NONE );

}

sellTrade = false;

}

if(buyTrade==false) {

EnterLong(Sym, Lots, "");

buyTrade = true;

}

}

//else

//return(0);

// Sell signal ---------------------------------------

if (STC_VIDYAprev > 90.00 && STC_VIDYAcur <= 90.00 ) {

if (buyTrade==true) {

for (int j = OrdersTotal() - 1; j >= 0; j--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_SELL )

{ int oldTicket=OrderTicket(); double lotts=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symBid = NormalizeDouble( MarketInfo( Sym, MODE_BID ), SymDigits );

bool closeBuyOrder = OrderClose( oldTicket, lotts, symBid, 0, CLR_NONE );

}

buyTrade = false;

}

if(sellTrade==false) {

EnterShrt( Sym, Lots, "");

sellTrade = true;

}

}

//else

//return(0);
 

...

Puisqu'il s'agit d'un code partiel, essayez de remplacer symBid par symAsk lors de la clôture d'un ordre de vente et symAsk par symBid lors de la clôture d'un ordre d'achat (inversez les prix de clôture, vous ne pouvez pas clôturer une vente au prix d'achat et vous ne pouvez pas clôturer un achat au prix de vente).

outofdebt:
Je travaille sur un EA, mais quoi que je fasse, je n'arrive pas à le faire fermer des transactions. Il les ouvre très bien, mais lorsque je veux les fermer, l'EA ne le fait pas.

Je vais poster une partie du code de mon EA afin que l'un de vos codeurs expérimentés puisse comprendre pourquoi j'ai ce problème. Les variables 'buyTrade' et 'sellTrade' sont globales pour toute l'EA.

NOTE : Je ne veux qu'UNE seule transaction ouverte à tout moment, qu'elle soit longue ou courte. Les transactions sont "toujours ouvertes", donc lorsqu'un signal de position longue est émis, la position courte existante doit être fermée et vice versa.

Ce n'est PAS ce qu'il fait. Ce qu'il fait, c'est ouvrir des positions, puis en ouvrir d'autres... et en ouvrir d'autres encore... et les garder ouvertes jusqu'à ce qu'elles atteignent toutes leurs stops.

Merci d'avance

//---- Is there a new signal?

// Buy signal ---------------------------------------

//if(buyTrade==false || sellTrade==false) {

if (STC_VIDYAprev = 10.00) {

if (sellTrade==true) {

for (int i = OrdersTotal() - 1; i >= 0; i--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_BUY )

{ int OldTicket=OrderTicket(); double lots=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symAsk = NormalizeDouble( MarketInfo( Sym, MODE_ASK ), SymDigits );

bool closeSellOrder = OrderClose( OldTicket, lots, symAsk, 0, CLR_NONE );

}

sellTrade = false;

}

if(buyTrade==false) {

EnterLong(Sym, Lots, "");

buyTrade = true;

}

}

//else

//return(0);

// Sell signal ---------------------------------------

if (STC_VIDYAprev > 90.00 && STC_VIDYAcur <= 90.00 ) {

if (buyTrade==true) {

for (int j = OrdersTotal() - 1; j >= 0; j--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_SELL )

{ int oldTicket=OrderTicket(); double lotts=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symBid = NormalizeDouble( MarketInfo( Sym, MODE_BID ), SymDigits );

bool closeBuyOrder = OrderClose( oldTicket, lotts, symBid, 0, CLR_NONE );

}

buyTrade = false;

}

if(sellTrade==false) {

EnterShrt( Sym, Lots, "");

sellTrade = true;

}

}

//else

//return(0);