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

 
Maji:
Désolé, je n'ai pas le temps d'examiner l'ensemble du code, mais examinons simplement cet extrait.

if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())

Disons que l'OrderOpenPrice = 1.2100

et que le profit est de 0.0010

Donc, vous voulez fermer la transaction courte si l'offre est inférieure ou égale à 1,2100-0,0010 = 1,2090.

Supposons qu'il y ait eu un gap vers le bas et que les prix aient sauté 1,2090 et que le prix d'achat soit maintenant de 1,2088. Selon votre formule,

Bid + Profit = 1.2088 + 0.0010 = 1.2098. Il n'est PAS supérieur à OrderOpenPrice même si votre système a dépassé le seuil de profit. Ainsi, l'ordre ne sera pas fermé. La logique de la condition de clôture doit être réexaminée et rescrite, à mon avis. De plus, vous devriez traiter les prix Ask lorsque vous traitez des transactions courtes, car vous ne pouvez clôturer la transaction qu'au prix Ask.

Un autre conseil,

La boucle de comptage de for (int cnt = 0 ; cnt = 0 ; cnt--) ou quelque chose de similaire.

Bonne chance.

J'apprécie d'avoir appris cela, merci Maji ! Ce n'est pas la logique de fermeture que je voulais de toute façon... la logique que je voulais était de le faire fermer SI il n'avait pas déclenché le trailing stop loss. Puisque je ne comprends pas exactement comment détecter si cela est déclenché ou non, je ne peux pas utiliser cette stratégie de fermeture de temps à temps jusqu'à ce que j'apprenne comment la programmer pour faire ce que je voulais.

 

Nouveau critère de clôture... aidez-moi à placer le bon code s'il vous plaît...

J'ai besoin d'aide pour mettre un autre critère de clôture dans ce cas, qui est que la longEMA passe en dessous du minortrendsetter (si long) et vice versa si court. Je ne sais pas exactement comment isoler les positions ouvertes longues et courtes pour les fermer avec ce nouveau critère.

#property copyright "Copyright 2006, Aaragorn"

//+--------- settings may vary use at your own risk-----------------+

//+--------------user inputs--------------------+

extern double Trendsetter = 250;

extern double Minortrendsetter = 150;

extern double LongEMA = 20;

extern double ShortEMA = 5;

extern double TrailingStop = 15;

extern double TrailingStopTrigger = 1;

extern double StopLoss = 186;

extern double TakeProfit = 250;

extern double Lots = 0.1;

extern double EquityStop = 9;

//---- Custom "Channel-1" Indicator and Filter Parameters

extern int Hours=36;

extern color col=SkyBlue;

extern double TF = 60; //--which bar period for the custom indicator to use

extern double upperproximity = 30; //---disallows long orders within this proximity to resistance line

extern double lowerproximity = 30; //---disallows short orders within this proximity to the support line

//+-----------close based on not triggering trailing stop in allotted time----------------+

extern int MonitorInMinutes = 60; // minutes after open to check state of trade

extern int ThresholdMove = 11; // if after that time we don't have +'x' pips we will exit

extern int MinsMultiplier = 600; // multiplies the MonitorInMinutes to make minutes (if 'x'=60) into hours

//+----------------------end of allotted time user inputs-----------------------------+

//+-----------------------------end of user inputs----------------------------------+

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

//| expert start function

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

int start(){

CloseOrder();

int cnt, ticket;

if(Bars<100){

Print("bars less than 100");

return(0);

}

//+----------------------Get Moving Average(s) Data----------------------------------------+

double currentlong=iMA(NULL,0,LongEMA,0,MODE_EMA,PRICE_CLOSE,0);//--current period longEMA

double currentshort=iMA(NULL,0,ShortEMA,0,MODE_EMA,PRICE_CLOSE,0);//--current period shortEMA

double trendsetter=iMA(NULL,0,Trendsetter,0,MODE_EMA,PRICE_CLOSE,0);//--current period TrendsetterEMA

double minorts=iMA(NULL,0,Minortrendsetter,0,MODE_EMA,PRICE_CLOSE,0);//--current period MinortrendsetterEMA

double prevlong=iMA(NULL,0,LongEMA,0,MODE_EMA,PRICE_CLOSE,1);//--previous period longEMA

double prevshort=iMA(NULL,0,ShortEMA,0,MODE_EMA,PRICE_CLOSE,1);//--previous period shortEMA

double prevtrendsetter=iMA(NULL,0,Trendsetter,0,MODE_EMA,PRICE_CLOSE,1);//--previous period TrendsetterEMA

double prevminorts=iMA(NULL,0,Minortrendsetter,0,MODE_EMA,PRICE_CLOSE,1);//--previous period MinortrendsetterEMA

//+----------------------------end of Get Moving Average(s) Data-----------------------------+

//+--------------------channel filter---------------------------+

double resistance = iCustom(NULL,TF,"Channel-1",Hours,col,0,0);

double support = iCustom(NULL,TF,"Channel-1",Hours,col,2,0);

//+------------------- end channel filter------------------------+

//+---------Obnoxious money management code needs revision----------------+

int total=OrdersTotal();

if(total<1){

if(AccountFreeMargin()<(1000*Lots)){

Print("We have no money. Free Margin = ", AccountFreeMargin());

return(0);

}

//+---------end of Obnoxious money management code-----------------+

//+---------------------------------------Order Entry--------------------------------------------+

//+---------enter long positions----------+

if (prevshortcurrentlong && currentshort>currentlong>Trendsetter && Ask > resistance - upperproximity*Point){ //---conditions to open long positions change as desired

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point, NULL,16384,0,Green);

if(ticket>0){

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

}

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

return(0);

}

//+---------enter short positions----------+

if (prevshort>prevlong && currentshort<currentlong && currentshort<currentlong<Trendsetter && Ask < support + lowerproximity*Point){ //---conditions to open short positions change as desired

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point, NULL,16384,0,Red);

if(ticket>0) {

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-------------------------+

//+-------------------------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){

if(TrailingStop>0) {

if(Bid-OrderOpenPrice()>Point*TrailingStopTrigger) {

if(OrderStopLoss()<Bid-Point*TrailingStop) {

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);

return(0);

}

}

}

}else{

if(TrailingStop>0) {

if((OrderOpenPrice()-Ask)>(Point*TrailingStopTrigger)) {

if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) {

OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);

return(0);

}

}

}

}

//+-------------------------End of Trailing Stop Code----------------------------+

//+---------------------Equity Stop Code---------------------------+

if((AccountEquity()+ EquityStop)<AccountBalance()) {

{

int ttotal = OrdersTotal();

for(int i=ttotal-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS);

int type = OrderType();

bool result = false;

switch(type)

{

//Close opened long positions

case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );

break;

//Close opened short positions

case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );

}

if(result == false)

{

Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );

Sleep(3000);

}

}

return(0);

}

}

}

}

}

//+---------------------End of Equity Stop Code---------------------------+

//|

//+---------------------Close Based on Time-------------------------------+

//+--------------needs revision, not working as desired---------------------+

//+------------I want it to close IF and ONLY IF trailing stop is NOT triggered-------------+

void CloseOrder()

{

double Profit=ThresholdMove*Point;

int total = OrdersTotal();

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

{

OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);

if ((CurTime()-OrderOpenTime())>MonitorInMinutes*60*MinsMultiplier)

{

if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && Bid-Profit<OrderOpenPrice() )

{

OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);

}

if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())

{

OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);

}

}

}

}

//+---------------------------end of close on time code---------------+
 

ok j'ai besoin de comprendre cette partie du code maintenant....

la première ligne compte

la deuxième ligne sélectionne les ordres comptés

La troisième ligne... c'est un piège... Je pense qu'elle veut savoir si l'ordre sélectionné est une vente... mais qu'est-ce qui se passe avec le "0" ? Je veux dire qu'il y a CINQ lignes 'si' ici...

Je suppose que si l'une d'entre elles est vraie, alors l'ordre sera modifié, sinon... je suppose qu'il passe à la ligne ... 'else' et ... eh bien, cela doit permettre de traiter les positions longues et courtes, mais je ne le comprends pas encore.

Puisque je veux ajouter des critères pour fermer une position longue ou courte basée sur le croisement de la longEMA avec la minortrendsetterEMA... je ne suis pas sûr de savoir où le faire dans tout cela.

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

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

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

if(OrderType()==OP_BUY){

if(TrailingStop>0) {

if(Bid-OrderOpenPrice()>Point*TrailingStopTrigger) {

if(OrderStopLoss()<Bid-Point*TrailingStop) {

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);

return(0);

}

}

}

}else{

if(TrailingStop>0) {

if((OrderOpenPrice()-Ask)>(Point*TrailingStopTrigger)) {

if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) {

OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);

return(0);

}

}

}

}

Ok, je comprends que tous les "si" et les "autres" mènent à ces lignes. Voici celles que je dois comprendre...

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green) ;

OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red) ;

J'ai besoin d'en savoir plus sur la façon dont ces lignes de modification d'ordre sont construites... est-ce que ce sont celles qui ferment et modifient les ordres ? ou est-ce qu'elles modifient seulement les ordres et quelque chose d'autre ferme les ordres ?

 

Regardez l'aide dans MetaEditor

OP_BUY 0 Buying position.

OP_SELL 1 Selling position.

OP_BUYLIMIT 2 Buy limit pending position.

OP_SELLLIMIT 3 Sell limit pending position.

OP_BUYSTOP 4 Buy stop pending position.

OP_SELLSTOP 5 Sell stop pending position.

[/PHP]

so, <= OP_SELL is OP_BUY or OP_SELL. Just instead of using

[PHP]if((OrderType()==OP_SELL) || (OrderType()==OP_BUY) ...

Il suffit de moins taper

 

C'est parti

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

}

}

}

Appelez-le : CloseOrder(OP_BUY) ; // Fermez tous les ordres d'achat

ou

CloseOrder(OP_SELL) ; // Ferme tous les ordres de vente

La raison pour laquelle je garde tous les tickets d'ordres dans un tableau et que je les supprime ensuite est que lorsque je ferme l'ordre en position 1, le suivant redevient 1 et nous avons un problème.

 

J'ai oublié celui-là.

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

 

Je suis toujours confus...

Comprenez que je n'ai pas créé ce code à l'origine. Je m'efforce de comprendre ce que quelqu'un d'autre a fait et de le modifier. Je n'ai mis mon nom sur la ligne de propriété que maintenant que je l'ai tellement modifié qu'il ne ressemble plus guère à l'original. J'en ai modifié plus que je n'en ai laissé intact. Il y a encore certains aspects que je ne comprends pas et que je n'ai donc pas pu modifier.

Ce que je cherche, c'est le code qui ferme les ordres... il semble que tout ceci ne soit qu'une modification pour mettre à jour le trailing stop.

Il y a plus d'une façon de fermer.

Actuellement, cet EA a la possibilité de fermer avec un stop loss.

de clôturer avec un stop suiveur.

de clôturer avec un objectif de prise de profit.

ou de clôturer en fonction de l'écoulement d'un certain temps après l'ouverture.

Ce qu'il n'a pas et que je voudrais qu'il ait, c'est la possibilité de fermer si la longEMA revient sur la minortrendsetterEMA. Il pourrait faire cela en traversant vers le haut pour fermer une position courte ou vers le bas pour fermer une position longue. Comment puis-je lui faire faire ça ? Je veux dire avec toutes ces autres options de clôture, où dois-je mettre le nouveau code pour qu'il surpasse toutes ces autres options de clôture ?

Dans mon expirementation, quand je ne veux pas utiliser un aspect de ceci, je fais simplement en sorte que les critères de ce paramètre soient si extrêmes qu'ils ne vont jamais le déclencher, ce qui revient à désactiver ce critère. Cela permet aux autres critères de jouer et de montrer ce qu'ils pourraient donner.

 
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

ok super merci !

Donc, il s'agit uniquement d'un code de clôture ?

Est-ce que cela fermera les positions ouvertes longues et courtes ?

Comment pourrais-je l'utiliser pour clôturer si le longema croise le minortrendsetterema ? en croisant vers le haut s'il avait ouvert en short et vers le bas s'il avait ouvert en long ?

p.s. Je ne serai pas de retour à l'ordinateur avant plus tard cet après-midi. Je vérifierai à ce moment-là.

 

une autre question...

que signifie "échange" ?

 

Chaque fois que vous décidez d'ouvrir une position LONG, appelez : CloseOrders(OP_SELL) ;

et vice versa.

Regardez votre code où vous ouvrez les ordres.

Vous n'avez pas besoin de vérifier s'il y a un ordre à fermer. La routine le fera pour vous.

BTW, j'ai posté un code pour convertir 2006.07.02 kinda cell en date dans excel. Regardez votre post là