Aide au codage - page 157

 
mladen:
Christoff

De cette façon, la variable Décimales devrait être OK

Dans tous les cas, vérifiez quel code d'erreur vous obtenez en cas d'échec de la clôture (partielle) de l'ordre.

Mladen,

Merci pour l'astuce.

Le problème est qu'il n'y a pas de message d'erreur. Lorsque cela ne fonctionne pas, il semble que la fonction PartialTP n'ait même pas été appelée. D'autres fois - généralement aux premiers ordres après le redémarrage de l'EA - elle fonctionne bien.

J'ai pensé que peut-être une des variables ne revient pas à la valeur zéro, ou quelque chose comme ça, mais je n'arrive toujours pas à trouver le bug.

 
chrisstoff:
Mladen,

Merci pour l'astuce.

Le problème est qu'il n'y a pas de message d'erreur. Lorsque cela ne fonctionne pas, il semble que la fonction PartialTP n'ait même pas été appelée. D'autres fois - généralement aux premiers ordres après le redémarrage de l'EA - elle fonctionne bien.

J'ai pensé que peut-être une des variables ne revient pas à la valeur zéro, ou quelque chose comme ça, mais je ne trouve toujours pas le bug.

chrisstoff

Désolé, mais avec un code partiel, je ne peux pas vous aider davantage.

Ce que vous décrivez signifie qu'il est nécessaire de déboguer le code - et cela ne peut être fait qu'en l'exécutant en utilisant une sorte de points de contrôle.

 
mladen:
chrisstoff

Désolé, mais avec un code partiel, je ne peux pas vous aider davantage.

Ce que vous décrivez signifie qu'il est nécessaire de déboguer le code - et cela ne peut être fait qu'en l'exécutant tout en utilisant des points de contrôle.

Merci, Mladen.

Il est rassurant que vous n'ayez pas vu de problèmes dans le code.

Je pense que toutes les parties pertinentes du code ont été postées, je dois donc trouver le bug ailleurs.

 
mladen:
hock87

Veuillez lire le message qui précède le vôtre pour trouver une solution à ce problème.

Le code complet pour cela est le suivant :

int TotalOrders = 0;

for (int i=0; i <= OrdersTotal(); i++)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

if (OrderSymbol() == Symbol())

TotalOrders++;

}

if (TotalOrders<1)

{

ticket=OrderSend(Symbol(), OP_BUY, lots, Ask, 3, 0, 0);

stop=(Ask-stopsize*Point);

prof=(Ask+profsize*Point);

OrderModify( ticket, OrderOpenPrice(), stop, prof, 0, Blue);

}

Malden,

Si je veux ouvrir des tailles de lot à un pourcentage du solde de mon compte, comment le coder ?

Exemple :

Le solde de mon compte est de 500 $,

Je veux ouvrir une taille de lot de 5%, puis il compte automatiquement et ouvre les lots de 0,25 $, TP=10 SL=20.

Comment le coder ?

Merci.

 
hock87:
Malden,

Si je veux ouvrir des tailles de lot à un pourcentage du solde de mon compte, comment le coder ?

Exemple :

Le solde de mon compte est de 500 $,

Je veux ouvrir une taille de lot de 5%, puis il compte automatiquement et ouvre les lots de 0,25$, TP=10 SL=20.

Comment le coder ?

Merci.

Vous pouvez utiliser une fonction comme celle-ci :

double getLots(double stopLoss, double risk)

{

RefreshRates();

double pPoint = MarketInfo(Symbol(),MODE_POINT);

double step = MarketInfo(Symbol(),MODE_LOTSTEP);

double minLot = MarketInfo(Symbol()l,MODE_MINLOT);

double maxLot = MarketInfo(Symbol(),MODE_MAXLOT);

double lots = minLot;

if (risk>0 && stopLoss>0)

{

lots = AccountFreeMargin()*(risk/100.0)/(stopLoss*MarketInfo(s_symbol,MODE_TICKVALUE)/pPoint);

}

}

return(MathMax(MathMin(lots,maxLot),minLot));

}

PS : stopLoss doit être passé à la fonction en pips/points (pas en valeurs entières).

 
mladen:
Vous pouvez utiliser une fonction comme celle-ci pour cela :
double getLots(double stopLoss, double risk)

{

RefreshRates();

double pPoint = MarketInfo(Symbol(),MODE_POINT);

double step = MarketInfo(Symbol(),MODE_LOTSTEP);

double minLot = MarketInfo(Symbol()l,MODE_MINLOT);

double maxLot = MarketInfo(Symbol(),MODE_MAXLOT);

double lots = minLot;

if (risk>0 && stopLoss>0)

{

lots = AccountFreeMargin()*(risk/100.0)/(stopLoss*MarketInfo(s_symbol,MODE_TICKVALUE)/pPoint);

}

}

return(MathMax(MathMin(lots,maxLot),minLot));

}

PS : stopLoss doit être passé à la fonction en pips/points (pas en valeurs entières).

Merci, Mladen.

Mais je ne parviens pas à composer le code de l'ordre d'achat.

Il apparaît beaucoup d'erreurs et d'avertissements.

Comment le composer ?

Merci.

extern double lots = 0.1;extern double stopsize = 20;

extern double profsize = 10;

int err;

int ticket;

double stop;

double prof;

int start()

{

int TotalOrders = 0;

for (int i=0; i <= OrdersTotal(); i++)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

if (OrderSymbol() == Symbol())

TotalOrders++;

}

if (TotalOrders<1)

{

ticket=OrderSend(Symbol(), OP_BUY, lots, Ask, 3, 0, 0, NULL,LimeGreen);

stop=(Ask-stopsize*Point);

prof=(Ask+profsize*Point);

OrderModify( ticket, OrderOpenPrice(), stop, prof, 0, Blue);

}

err=GetLastError();

// Comment("This is a test ", err, " ", stop, " ", prof);

Comment(" ");

}
 
hock87:
Merci, Mladen.

Mais je ne parviens pas à composer le code de l'ordre d'achat.

Il apparaît beaucoup d'erreurs et d'avertissements.

Comment le composer ?

Merci.

extern double lots = 0.1;extern double stopsize = 20;

extern double profsize = 10;

int err;

int ticket;

double stop;

double prof;

int start()

{

int TotalOrders = 0;

for (int i=0; i <= OrdersTotal(); i++)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

if (OrderSymbol() == Symbol())

TotalOrders++;

}

if (TotalOrders<1)

{

ticket=OrderSend(Symbol(), OP_BUY, lots, Ask, 3, 0, 0, NULL,LimeGreen);

stop=(Ask-stopsize*Point);

prof=(Ask+profsize*Point);

OrderModify( ticket, OrderOpenPrice(), stop, prof, 0, Blue);

}

err=GetLastError();

// Comment("This is a test ", err, " ", stop, " ", prof);

Comment(" ");

}

Essayez-le comme ceci (je l'ai testé maintenant et il fonctionne) :

extern double lots = 0.1;extern double stopsize = 20;

extern double profsize = 10;

int err;

int ticket;

double stop;

double prof;

int init() { return(0); }

int deinit() { return(0); }

int start()

{

int TotalOrders = 0;

for (int i=0; i <= OrdersTotal(); i++)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

if (OrderSymbol() == Symbol())

TotalOrders++;

}

if (TotalOrders<1)

{

ticket=OrderSend(Symbol(), OP_BUY, lots, Ask, 3, 0, 0, NULL,LimeGreen);

stop=(Ask-stopsize*Point*MathPow(10,Digits%2));

prof=(Ask+profsize*Point*MathPow(10,Digits%2));

OrderModify( ticket, OrderOpenPrice(), stop, prof, 0, Blue);

}

err=GetLastError();

// Comment("This is a test ", err, " ", stop, " ", prof);

Comment(" ");

}
Dossiers :
_test_1.mq4  1 kb
test_1.gif  78 kb
 

cher mladen et mr. tools svp,

est-il possible de créer une ea qui donne un signal basé sur certaines conditions comme les signaux de 3 ou 4 indicateurs répondant à des conditions prédéfinies.

Par exemple

je veux que l'ea signale un achat en cas de croisement de l'ema 8 et de l'ema 21 :

ema 8 croise ema 21

qqe au-dessus de 0

le ma non lag est vert

et la bougie est au-dessus du nuage ichimoku

l'ea ne doit pas ouvrir de trades mais juste donner le signal lorsque les conditions énoncées sont remplies.

 

Merci, Mladen.

Je l'ai essayé.

mais il ouvre toujours les lots avec 0,1 $.

Je veuxouvrir des lots à un pourcentage du solde de mon compte.

EX : le solde du compte est de 500 $.

J'ouvre une taille de lot de 5%, puis il compte automatiquement et ouvre les lots de 0,25$, TP=10 SL=20.

LotSizeSlot1 = AccountBalance() * (RiskSlot1 / 100)

LotSizeSlot1 = 500 $*(5%/100)

LotSizeSlot1 = 0,25 $.

Ensuite, il ouvre automatiquement des lots de 0,25 $ et TP=10 SL=20.

Comment le créer ?

Merci.

 
hock87:
Merci, Mladen.

Je l'ai essayé.

mais il ouvre toujours les lots avec 0,1 $.

Je veux ouvrir deslots à un pourcentage du solde de mon compte.

EX : le solde du compte est de 500 $.

J'ouvre une taille de lot de 5%, puis il compte automatiquement et ouvre les lots de 0,25$, TP=10 SL=20.

LotSizeSlot1 = AccountBalance() * (RiskSlot1 / 100)

LotSizeSlot1 = 500 $*(5%/100)

LotSizeSlot1 = 0,25 $.

Ensuite, il ouvre automatiquement des lots de 0,25 $ et TP=10 SL=20.

Comment le créer ?

Merci.

Comme dans l'exemple ci-joint

Dossiers :
_test_2.mq4  2 kb