Aide au codage... Comment faire pour que l'indicateur filtre au lieu de l'alerte ? - page 8

 

Tu es un homme !

donc.... voyons si je comprends bien...

si je voulais fermer des positions basées sur le back cross d'une moyenne mobile, tout ce que j'aurais à coder est ceci....

if(currentlong>minorts) {CloseOrder(OP_SELL) ; // Fermer tous les ordres de vente}

où currentlong est la 20ema et minorts est la 150ema donc la position ouverte aurait été ou EST une position courte qui a suivi son cours et maintenant la 20ema se déplace au-dessus de la 150ema ce qui est le signal de fermeture pour la transaction courte.

et...

if (currentlong<minorts) {CloseOrder(OP_BUY) ; // Fermer tous les ordres d'achat}

où currentlong est la 20ema et minorts est la 150ema donc la position ouverte aurait été ou EST une position longue qui a suivi son cours et maintenant la 20ema se déplace en dessous de la 150ema qui est le signal de fermeture pour la transaction longue.

Je pourrais donc simplement mettre ces deux lignes

if (currentlong<minorts) {CloseOrder(OP_BUY) ; // Fermer tous les ordres d'achat}

if(currentlong>minorts) {CloseOrder(OP_SELL) ; // Fermer tous les ordres de vente}

juste après le code d'entrée et avant tous les autres trucs de fermeture et de trailing stop comme ceci ? et ça va marcher ?

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES )) Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Error opening SELL order : ",GetLastError());

return(0);

}

}

//+---------end of order entry-------------------------+

//+------close on moving average cross-----------------+

if(currentlong<minorts) {CloseOrder(OP_BUY);} // Close all buy orders}

if(currentlong>minorts) {CloseOrder(OP_SELL);} // Close all sell orders}

//+--------end of close on moving average cross--------+

//+-------------------------Trailing Stop Code------------------------------------+

for(cnt=0;cnt<total;cnt++) {

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) {

if(OrderType()==OP_BUY){

le compilateur dit ceci :

')' - mauvais nombre de paramètres C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (85, 43)

')' - nombre de paramètres erronés C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (86, 44)

il n'aime pas ces lignes. Je n'ai pas l'impression de très bien communiquer.

 

c'est intéressant soudainement ma fonction de recherche sur le métaéditeur fonctionne ? ??

bool OrderCloseBy( int ticket, int opposite, color Color=CLR_NONE)

Ferme un ordre ouvert par un autre ordre ouvert opposé. Si la fonction réussit, la valeur de retour est true. Si la fonction échoue, la valeur de retour est false. Pour obtenir des informations détaillées sur les erreurs, appelez GetLastError().

Paramètres :

ticket - Numéro unique du ticket de commande.

opposite - Numéro unique du ticket de commande opposé.

Color - Couleur de la flèche de fermeture sur le graphique. Si le paramètre est absent ou a la valeur CLR_NONE, la flèche de fermeture ne sera pas dessinée sur le graphique.

Exemple :

if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)

{

OrderCloseBy(order_id,opposite_id) ;

retour(0) ;

}

donc je visualise quelque chose comme ça...

if(currentlong<minorts)

{

OrderCloseBy(order_id,opposite_id);

return(0);

}[/PHP]

thing is this doesn't distinguish what kind of position I'm into first, long or short. So if I put the opposite side of this with it...like this...

[PHP] if(currentlong>minorts)

{

OrderCloseBy(order_id,opposite_id);

return(0);

}

Je me sens aussi frustré qu'un enfant qui ne peut pas encore vraiment parler pour communiquer des phrases complètes, alors que j'AI des idées complètes en moi que je ne peux pas faire sortir.

 
elihayun:
J'ai oublié celui-ci
void CloseOrder(int ticket,double numLots,double close_price)

{

int CloseCnt, err;

// try to close 3 Times

CloseCnt = 0;

color clr = Violet;

if (OrderType() == OP_SELL)

clr = Orange;

while (CloseCnt < 3)

{

if (OrderClose(ticket,numLots,close_price,Slippage,clr))

{

CloseCnt = 3;

}

else

{

err=GetLastError();

Print(CloseCnt," Error closing order : (", err , ") " + ErrorDescription(err));

if (err > 0) CloseCnt++;

}

}

}

[/PHP]

and dont forget to add this line after #property link

[PHP]#property link "http://www.elihayun.com"

#include

Qu'est-ce que cela fait ? Est-ce qu'il y a quelque chose d'autre que je dois télécharger pour qu'il soit disponible pour être appelé ? Je veux comprendre comment cela fait ce qu'il fait, comment il distingue les positions longues des positions courtes. Je veux apprendre.

 
Aaragorn:
Vous êtes le meilleur !

alors.... voyons si je comprends bien...

Donc je pourrais simplement mettre ces deux lignes

if (currentlong<minorts) {CloseOrder(OP_BUY) ; // Ferme tous les ordres d'achat}

if(currentlong>minorts) {CloseOrder(OP_SELL) ; // Fermer tous les ordres de vente}

//+------clôture sur le croisement de la moyenne mobile-----------------+

si(currentlong<minorts) {CloseOrder(OP_BUY);} //Fermeture de tous les ordres d'achat}

si(currentlong>minorts) {CloseOrder(OP_SELL);} // Fermeture de tous les ordres de vente}

if(OrderType()==OP_BUY){[/PHP]

le compilateur dit ceci :

')' - mauvais nombre de paramètres C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (85, 43)

')' - nombre de paramètres erronés C:\Program Files\Interbank FX Trader 4-live miniexperts\whatever.mq4 (86, 44)

il n'aime pas ces lignes. Je n'ai pas l'impression de très bien communiquer.

Vous devez appeler CloseOrders avec un s à la fin et non CloseOrder (qui ferme un seul ordre).

 
Aaragorn:
Qu'est-ce que cela fait ? Est-ce que je dois télécharger quelque chose d'autre pour que cette fonction soit disponible et puisse être appelée ? Je veux comprendre comment elle fait ce qu'elle fait, comment elle distingue les positions longues des positions courtes. Je veux apprendre.

Il fait partie de MQL4 et contient la fonction ErrorDescription.

 
elihayun:
Il fait partie de MQL4 et contient la fonction ErrorDescription.

Ok, j'ai encore besoin d'un code qui me permette de fermer en fonction du croisement des moyennes mobiles.

 

Ce morceau de code devrait vous permettre de démarrer...

Bien sûr, vous devrez le modifier pour l'adapter à vos propres besoins. Cependant, il devrait vous fournir un point de départ. Cette routine utilise la ligne SMA1 comme trailing stop. Prenez donc cette idée et voyez ce que vous pouvez en faire.

//these two lines within start()

SMA1 = iMA(NULL,TimePeriod,SlowPeriod,0,SlowMode,SlowPrice,1);

TrailingAlls(TrailStart, SMA1);

// trailing routine using the value of SMA1

void TrailingAlls(int start, double currvalue)

{

int profit;

double stoptrade;

double stopcal;

// if(stop==0) return;

int trade;

for(trade=OrdersTotal()-1;trade>=0;trade--)

{

if(!OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))

continue;

if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)

continue;

if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)

{

if(OrderType()==OP_BUY)

{

profit=NormalizeDouble((Bid-OrderOpenPrice())/Point,0);

if(profit<start)

continue;

stoptrade=OrderStopLoss();

// stopcal=Bid-(stop*Point);

stopcal=NormalizeDouble(currvalue, Digits);

if(stoptrade==0||(stoptrade!=0&&stopcal>stoptrade))

OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Blue);

}//Long

if(OrderType()==OP_SELL)

{

profit=NormalizeDouble((OrderOpenPrice()-Ask)/Point,0);

if(profit<start)

continue;

stoptrade=OrderStopLoss();

// stopcal=Ask+(stop*Point);

stopcal=NormalizeDouble(currvalue, Digits);

if(stoptrade==0||(stoptrade!=0&&stopcal<stoptrade))

OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Red);

}//Shrt

}

}//for

}

 

un stop suiveur de clôture pourrait être utile si j'arrive à le comprendre avant.....

Ce snippet qu'elihayun m'a donné pourrait fonctionner si quelqu'un peut trouver comment le faire réagir au ma backcross et dans la bonne direction. Je suis confus avec l'op_buy et l'op_sell qui est lequel. et lequel utiliser pour fermer les positions longues et lequel utiliser pour fermer les positions courtes.

//+------close on moving average cross-----------------+

void CloseOrders(int op)

{

int tik[30], t = 0;

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

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){

if(OrderSymbol()==Symbol() && MagicNum==OrderMagicNumber() && OrderType() == op){

tik[t] = OrderTicket(); t++;

}

}

}

for (i = 0; i<t; i++)

{

if(OrderSelect(tik,SELECT_BY_TICKET)){

double prc = Bid;

if (op == OP_SELL) prc = Ask;

CloseOrder(tik, OrderLots(), prc);

}

}

}

//+--------end of close on moving average cross--------+[/PHP]

I think I see that at this point in the code it has selected the orders by ticket and it's figuring out to set the close price based on the bid or the ask. So I'm not sure which is which for long or short positions. If the ticket is a long position that means it was opened at the ask price right? so it should close on the bid price? so this snippet is saying use the bid price to close so I assume that's for a long position. THEN it asks the

if (op == OP_SELL) prc = Ask;

so I assume this is the first place in this code where we now know if we are looking at a long or a short position ticket.

Then it moves immediately to close. But if I can put my closing criteria in here BEFORE it does that???

here it is as I received it...

for (i = 0; i<t; i++)

{

if(OrderSelect(tik,SELECT_BY_TICKET)){

double prc = Bid;

if (op == OP_SELL) prc = Ask;

CloseOrder(tik, OrderLots(), prc);

}[/PHP]

so what I'm thinking is that this is the place in the code where I should insert the moving average criteria to trigger the close for long or short positions. Something like this...

[PHP]for (i = 0; i<t; i++)

{

if(OrderSelect(tik,SELECT_BY_TICKET)){

double prc = Bid;

if (op == OP_SELL) prc = Ask;

if (prc == Bid && currentlong minorts);

CloseOrder(tik, OrderLots(), prc);

}

Will this do it? I think it might if I understand correctly..

Please tell me coders if this is correct??

I think this connects the direction of the moving average cross to the type of position that the ticket is identifed as being.

if the bid is to close long positions so we know the ticket is for a long position then it can close long positions if the currentlongema < minortsEMA because it knows that the ticket is for a long position and the 20ema has moved below the 150ema.

If the ask is for closing short positions and the ticket is identified as a short position because it wants to close at the ask price and the currentlongEMA has moved above the minortsEMA because it knows the ticket is for a short position and the 20ema has moved above the 150ema.

if that is correct will adding this line to the code,

if (prc == Bid && currentlong minorts)

stop it from closing UNLESS each ticket fits this criteria?

...that for the long position the 20ema150ema?

if that is ok then the logic for deciding to close long or short based on the emacrossback is ok and it's worth fixing these errors

I get these errors from the compiler...

[PHP]Compiling 'whatever.mq4'...

'(' - function definition unexpected C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (85, 17)

'MagicNum' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (90, 40)

'op' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (90, 87)

'tik' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (91, 13)

't' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (91, 17)

't' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (91, 37)

't' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (96, 18)

'tik' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (98, 22)

'op' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (100, 14)

'tik' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (102, 21)

'cnt' - expression on global scope not allowed C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (108, 5)

'cnt' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (108, 5)

'cnt' - expression on global scope not allowed C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (108, 11)

'cnt' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (108, 11)

'total' - expression on global scope not allowed C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (108, 15)

'total' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (108, 15)

'cnt' - expression on global scope not allowed C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (108, 21)

'cnt' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (108, 21)

'{' - expression on global scope not allowed C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (108, 28)

'i' - variable is already defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (135, 11)

'}' - unbalanced parentheses C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (165, 1)

16 error(s), 5 warning(s)

 

Une suggestion à tous les membres, n'utilisez pas de routines de "décompte" pour clôturer des transactions. Par exemple, n'utilisez pas quelque chose comme ceci :

for (i = 0 ; i<t ; i++)

{

if(OrderSelect(tik,SELECT_BY_TICKET)){

double prc = Bid ;

si (op == OP_SELL) prc = Ask ;

CloseOrder(tik, OrderLots(), prc) ;

}

Si vous utilisez plusieurs ordres, il ne fermera pas le dernier ordre. Utilisez une routine de "compte à rebours". Voici ma discussion avec les développeurs de Metaquotes lorsque je suis tombé sur ce "bug" irritant.

http://www.metaquotes.net/forum/2018/

 
Maji:
Ce morceau de code devrait vous permettre de commencer...

Bien entendu, vous devrez le modifier pour l'adapter à vos propres besoins. Cependant, cela devrait vous fournir un point de départ. Cette routine utilise la ligne SMA1 comme trailing stop. Prenez donc cette idée et voyez ce que vous pouvez en faire.

//these two lines within start()

SMA1 = iMA(NULL,TimePeriod,SlowPeriod,0,SlowMode,SlowPrice,1);

TrailingAlls(TrailStart, SMA1);

// trailing routine using the value of SMA1

void TrailingAlls(int start, double currvalue)

{

int profit;

double stoptrade;

double stopcal;

// if(stop==0) return;

int trade;

for(trade=OrdersTotal()-1;trade>=0;trade--)

{

if(!OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))

continue;

if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)

continue;

if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)

{

if(OrderType()==OP_BUY)

{

profit=NormalizeDouble((Bid-OrderOpenPrice())/Point,0);

if(profit<start)

continue;

stoptrade=OrderStopLoss();

// stopcal=Bid-(stop*Point);

stopcal=NormalizeDouble(currvalue, Digits);

if(stoptrade==0||(stoptrade!=0&&stopcal>stoptrade))

OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Blue);

}//Long

if(OrderType()==OP_SELL)

{

profit=NormalizeDouble((OrderOpenPrice()-Ask)/Point,0);

if(profit<start)

continue;

stoptrade=OrderStopLoss();

// stopcal=Ask+(stop*Point);

stopcal=NormalizeDouble(currvalue, Digits);

if(stoptrade==0||(stoptrade!=0&&stopcal<stoptrade))

OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Red);

}//Shrt

}

}//for

}

Merci beaucoup. J'ai hâte de disséquer tout cela et de voir ce que je peux en faire...

La raison pour laquelle je veux d'abord faire fonctionner l'emacrossback est qu'il sera mon stoploss et ma stratégie de sortie par défaut.

Une fois que cela fonctionnera, j'ajouterai des éléments comme celui-ci pour augmenter la rentabilité. Mais comme je ne peux pas avoir un stop loss sans le perturber et que je ne suis pas prêt à autoriser des paramètres de stop loss énormes, je veux d'abord faire fonctionner la fermeture de la moyenne mobile crossback. Si vous avez l'occasion de vérifier ce que j'ai fait jusqu'à présent avec la fermeture crossback, je vous en serais reconnaissant.