Comment coder ? - page 271

 

Besoin d'aide avec la fonction iCustom pour cet EA peut appeler un indicateur personnalisé.

Bonjour à tous,

Je voudrais ajouter cet indicateur (Entry.mq4) à cet EA (swb grid 4.1.0.3_EA) avec la fonction iCustom.

la fonction iCustom pour que moi et nous puissions utiliser cet indicateur dans la stratégie de l'EA.

L'EA utilise déjà 3 indicateurs MT4 : bandes de Bollinger, stochastique et RSI.

des commutateurs, afin que vous puissiez sélectionner l'un ou l'autre ou tous les indicateurs à utiliser, en sélectionnant VRAI ou FAUX.

et je voudrais ajouter ce 4ème indicateur (Entry.mq4) à l'EA.

J'apprécierais beaucoup si quelqu'un pouvait m'aider.

Merci.

L'EA et l'indicateur sont joints ci-dessous.

Dossiers :
 

Noob MQL4 aide nécessaire pour comprendre ce tableau

Salut, codeurs

Quelqu'un voudrait-il m'instruire sur les tableaux légèrement

Ou peut-être ai-je plus de mal à comprendre cette boucle en rapport avec ce tableau.

int i=Bars ;

#property copyright "Unfinished POS by Agent86"

double v1[] ;

double v2[] ;

double val1 ;

double val2 ;

int start()

{

while(i>=0)

{

val1=iFractals(NULL, 0, MODE_UPPER,i) ;

si (val1 > 0)

{

v1=High ;

}

sinon

{

v1=v1 ;

}

val2=iFractals(NULL, 0, MODE_LOWER,i) ;

si (val2 > 0)

{

v2=Low ;

}

sinon v2=v2 ;

i-- ;

}

return(0) ;

}

Il s'agit d'une fractale de base, mais je ne parviens pas à faire référence à un quelconque élément du tableau.

Je veux pouvoir incrémenter i++ d'une manière ou d'une autre et imprimer (v1) ; ou imprimer la valeur précédente avant le 0 ou EMPTY_VALUE.

Si je suis même dans la bonne direction avec ceci.

J'ai des problèmes.

Print (v1) : toujours == 0 et imprime 0

Je comprends en quelque sorte parce qu'il s'agit en fait d'une boucle jusqu'à -1 qui == 0.

Comment et où puis-je placer les instructions d'impression pour que je puisse voir ce qui se passe ?

J'ai essayé des multitudes de méthodes et j'ai réinitialisé i=0 pour tenter une boucle alternative afin de pouvoir me référer aux éléments v1 mais toutes les tentatives ont échoué.

En fait, je veux voir les fractales précédentes ou les marquer comme A haut, B bas, etc. pour une utilisation future possible dans un schéma ABCD de type EA.

Pour l'instant, je veux surtout imprimer la v1 pour pouvoir voir ce qu'elle fait.

Je pourrais peut-être concevoir quelque chose pour sélectionner une fractale précédente comme A_high et/ou B_low ou un schéma de ce genre.

Suis-je sur la mauvaise voie ?

Merci de me conseiller.

Merci

 

J'opterais plutôt pour une boucle FOR. Les boucles While peuvent conduire à des blocages si vous oubliez d'inclure le i--. Puisque vous connaissez le nombre exact de barres, c'est plus facile à utiliser, de plus le i ne sera jamais < 0. Cela permet d'éviter toute confusion.

For (int i=Bars-1;i>0;i--) {

// code

}

Essayez de définir toutes les valeurs du tableau à 0, puis revenez en arrière et attribuez les valeurs des indicateurs. Essayez également d'utiliser la fonction print() directement après avoir assigné la valeur de votre indicateur. Voyez si elle renvoie quelque chose.

Votre meilleure chance, à mon avis, est d'attribuer une taille au tableau. Disons, 1000 positions. Il est peu probable que vous ayez besoin d'autant, et cela réduira les calculs que vous faites. Tout ce que vous avez à faire est de boucler les 999 dernières barres jusqu'à 0 et d'assigner des valeurs. Je crois me souvenir que MT4 a des problèmes avec les initialisations de tableaux et autres.

 

Questions sur les tableaux

Trader5050-Deployed:
J'opterais plutôt pour une boucle FOR. Les boucles While peuvent entraîner des blocages si vous oubliez d'inclure le i--. Puisque vous connaissez le nombre exact de barres, c'est plus facile à utiliser, de plus le i ne sera jamais < 0. Cela permet d'éviter toute confusion.

For (int i=Bars-1;i>0;i--) {

// code

}

Essayez de définir toutes les valeurs du tableau à 0, puis revenez en arrière et attribuez des valeurs d'indicateur. Essayez également d'utiliser print() directement après avoir assigné votre valeur d'indicateur. Voyez si elle renvoie quelque chose.

Votre meilleure chance, à mon avis, est d'attribuer une taille au tableau. Disons, 1000 positions. Il est peu probable que vous ayez besoin de ce nombre, et cela réduira les calculs que vous faites. Tout ce que vous avez à faire est de boucler les 999 dernières barres jusqu'à 0 et d'assigner des valeurs. Je crois me souvenir que MT4 a des problèmes avec les initialisations de tableaux et autres.

Ok, merci, je vais essayer.

Bien que les instructions while fonctionnent bien, elles ne m'aident pas à obtenir les éléments du tableau que je veux imprimer/afficher, etc.

Je vais travailler sur ce que vous avez dit, faire quelques tests et revenir.

Merci

 
Trader5050-Deployed:
J'utiliserais plutôt une boucle FOR. Les boucles While peuvent conduire à des blocages si vous oubliez d'inclure le i--. Puisque vous connaissez le nombre exact de barres, c'est plus facile à utiliser, de plus le i ne sera jamais < 0. Cela permet d'éviter toute confusion.

For (int i=Bars-1;i>0;i--) {

// code

}

Essayez de définir toutes les valeurs du tableau à 0, puis revenez en arrière et attribuez des valeurs d'indicateur. Essayez également d'utiliser la fonction print() directement après avoir assigné la valeur de votre indicateur. Voyez si elle renvoie quelque chose.

Votre meilleure chance, à mon avis, est d'attribuer une taille au tableau. Disons, 1000 positions. Il est peu probable que vous ayez besoin de ce nombre, et cela réduira les calculs que vous faites. Tout ce que vous avez à faire, c'est de parcourir en boucle les 999 dernières barres jusqu'à 0 et d'assigner des valeurs. Je crois me souvenir que MT4 a des problèmes avec les initialisations de tableaux et autres.

J'imprime toujours le tableau avec toutes les entrées à 0.

Étrange

 

Argent86,

Il y a quelques erreurs dans votre code :

- les tableaux que vous utilisez ne sont pas encore des tableaux (si vous ne spécifiez pas la taille du tableau, comme vous l'avez fait dans le code, alors il s'agit d'un tableau dynamique et la taille du tableau doit être gérée au moment de l'exécution) donc vous avez des tableaux de taille 0 (c'est la première raison pour laquelle il y a toujours 0 - c'est la routine de gestion des erreurs de metatrader qui empêche l'erreur fatale et renvoie 0 comme résultat dans de tels cas - en C/C++, cela provoquerait un crash)

- si vous ne spécifiez pas que le tableau est "en série" (dans "en série", le 0ème élément est le dernier alors que dans les tableaux normaux, le 0ème élément est le premier), l'expression i+1 est l'élément suivant d'un tableau dans ce cas et non le précédent. Vous pouvez utiliser les tableaux de la manière "série", mais vous devez alors faire quelques choses de plus pour que cela fonctionne en cours d'exécution, et même dans ce cas, lorsque les numéros de barre changent, vous allez avoir du code rampant, il est donc préférable d'utiliser les tableaux dans leur mode natif - "C like".

- Assurez-vous également que vous commencez au moins à partir de la 3ème barre sur un nouveau tick (c'est là qu'une nouvelle fractale apparaîtra, pas sur une barre actuelle).


Voici ce que vous essayez de faire sans ces problèmes
#property indicator_chart_window

double v1[];

double v2[];

int start()

{

int i,a,limit,counted_bars=IndicatorCounted();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

limit = MathMin(Bars-counted_bars,Bars-1);

if (ArraySize(v1)!=Bars) ArrayResize(v1,Bars);

if (ArraySize(v2)!=Bars) ArrayResize(v2,Bars);

//

//

//

//

//

for (i=limit, a=Bars-i-1; i>=0; i--,a++)

{

v1[a]=v1[a-1]; if (iFractals(NULL,0,MODE_UPPER,i) > 0) v1[a]=High;

v2[a]=v2[a-1]; if (iFractals(NULL,0,MODE_LOWER,i) > 0) v2[a]=Low;

}

Comment("current upper frctal : "+DoubleToStr(v1,Digits)+"\n"+

"current lower frctal : "+DoubleToStr(v2,Digits));

return(0);

}
 

Accéder depuis MQ4 à une fonction dll avec : des listes d'arguments variables

Bonjour,

Quelqu'un sait si c'est possible : importer une fonction dll qui utilise comme argument une : liste à arguments variables

Par exemple, vprintf - Référence C

int vprintf ( const char * format, va_list arg ) ;

Si oui, comment faire ?

Merci

MJ

 

Comment appeler une fonction sans valeur de retour

Bonjour les gars et les filles.

A un moment donné dans mon programme, j'aimerais appeler une fonction.

Cependant, la fonction n'a pas de valeur de retour (void). Alors comment puis-je appeler la fonction,

pour qu'il exécute le code à l'intérieur de la fonction exactement à l'endroit où je l'appelle,

comme s'il avait été écrit à cet endroit même ?

J'ai fait un exemple de code ci-dessous ... où je vérifie certains paramètres, et si Ok, je veux exécuter la fonction ...

J'espère que quelqu'un pourra m'aider, tx par avance, Jonkie76

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

//| expert start function |

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

int start()

{

//----

if (Price >= PRICE_CLOSE)

call function ; // A ce stade, j'aimerais appeler la fonction, comment faire ?

sinon

Alert("Ne rien faire") ; //

//----

return(0) ;

}

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

//===================================================================+

//FUNCTIONS

//===================================================================+

//----------------------- FONCTION DE FERMETURE DE L'ORDRE ----------------------+

void subCloseOrder()

{

int

i,

total = 0,

ticket = 0,

err = 0,

c = 0 ;

total = OrdersTotal() ;

for(i=total-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES) ;

si(OrderSymbol()==Symbol() &&

OrderMagicNumber()==Magic)

{

switch(OrderType())

{

cas OP_BUY :

for(c=0;c<NumberOfTries;c++)

{

ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet) ;

err=GetLastError() ;

si(err==0)

{

si(ticket>0) break ;

}

sinon

{

if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Erreurs d'occupation

{

Sleep(5000) ;

continuer ;

}

else //erreurs normales

{

if(ticket>0) break ;

}

}

}

pause ;

}

}

}

}

 

C'est très simple. Il suffit de l'appeler comme il renverrait quelque chose, mais vous n'avez pas besoin de sauvegarder le résultat car il n'y a pas de résultat du tout avec le type void. (ne renvoie rien) Comme ceci :

int start()

{

//----

if (Price >= PRICE_CLOSE)

subCloseOrder(); // At this point I'd like to call the function.How do I do that?

else

Alert("Do nothing"); //

//----

return(0);

}

 

Utilisez "void" à la place. Comme ceci :

void someFunction(someParameters)

{

...

//

//

// no need to place return at the end, but if you want then use "just" return, like this

//

//

return;

}

Void signifie que la fonction ne va pas renvoyer de valeur et qu'elle devient ainsi une procédure et non une fonction.

Jonkie76:
Bonjour les gars et les filles.

À un moment donné dans mon programme, j'aimerais faire appel à une fonction.

Cependant, la fonction n'a pas de valeur de retour (void). Alors comment puis-je appeler la fonction,

pour qu'il exécute le code à l'intérieur de la fonction exactement à l'endroit où je l'appelle,

comme s'il avait été écrit à cet endroit même ?

J'ai fait un exemple de code ci-dessous ... où je vérifie certains paramètres, et si Ok, je veux exécuter la fonction ...

J'espère que quelqu'un pourra m'aider, tx par avance, Jonkie76

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

//| expert start function |

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

int start()

{

//----

if (Price >= PRICE_CLOSE)

call function ; // A ce stade, j'aimerais appeler la fonction, comment faire ?

else

Alert("Ne rien faire") ; //

//----

return(0) ;

}

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

//===================================================================+

//FUNCTIONS

//===================================================================+

//----------------------- FONCTION DE FERMETURE DE L'ORDRE ----------------------+

void subCloseOrder()

{

int

i,

total = 0,

ticket = 0,

err = 0,

c = 0 ;

total = OrdersTotal() ;

for(i=total-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES) ;

si(OrderSymbol()==Symbol() &&

OrderMagicNumber()==Magic)

{

switch(OrderType())

{

cas OP_BUY :

for(c=0;c<NumberOfTries;c++)

{

ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet) ;

err=GetLastError() ;

si(err==0)

{

si(ticket>0) break ;

}

sinon

{

if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Erreurs d'occupation

{

Sleep(5000) ;

continuer ;

}

else //erreurs normales

{

if(ticket>0) break ;

}

}

}

pause ;

}

}

}

}
Raison: