Opinion - EA très réussie - compte de $3000 à $6300 en deux semaines (aurait pu être $9000). - page 5

 

1 petite chose avant d'aller travailler, il existe des variables booléennes qui peuvent être vraies ou fausses. Vous n'avez pas besoin d'utiliser une chaîne de caractères pour cela.

J'ai du mal à croire que vous suivez le livre.

 
zzuegg:

1 petite chose avant d'aller travailler, il existe des variables booléennes qui peuvent être vraies ou fausses. Vous n'avez pas besoin d'utiliser une chaîne de caractères pour cela.

J'ai du mal à croire que vous suivez le livre.

J'essaie. J'apprends à trader + programmer + MQL en même temps.

Apprend-on à conduire une voiture en lisant seulement le livre ?

mais merci

 
MickGlancy:

J'obtiens l'erreur suivante : la fonction OpenBuyOrder et OpenSellOrder ne renvoie aucun résultat.

Qu'est-ce que je fais de mal ?

Vous obtenez cette erreur parce que les fonctions OpenBuyOrder() et OpenSellOrder() ne renvoient pas de résultat. Vous les avez définies comme void, ce qui signifie qu'elles ne renvoient aucun argument, mais vous essayez de renvoyer un nombre entier (0).

Voici le code avec quelques commentaires :

void OpenBuyOrder( double StopLoss, double TakeProfit )
{
         int Ticket;			
         double SL,TP,SLP,TPP,OPP;
         
         if(HideSL==false && StopLoss>0){SL=Ask-StopLoss*Point;}
         else {SL=0;}
         
         if(SL>0 && SL>(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)){SL=Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;}
         
         if(HideTP==false && TakeProfit>0){TP=Ask+TakeProfit*Point;}
         else {TP=0;}
         
         Ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP,EAName,Magic,0,Blue);	//-- this stores the value for Ticket, but it never gets used.. 
                                                                                        //-- you can simply call OrderSend() without storing the result 

   return;    //--- void means the function returns no argument.. thus, no parentheses for return
}

void OpenSellOrder( double StopLoss, double TakeProfit)
{
         int Ticket;
         double SL,TP,SLP,TPP,OPP;
         
         if(HideSL==false && StopLoss>0){SL=Bid+StopLoss*Point;}
         else {SL=0;}
         
         if(SL>0 && SL<(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)){SL=Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;}
         
         if(HideTP==false && TakeProfit>0){TP=Bid-TakeProfit*Point;}
         else {TP=0;/*TPP=0;*/}
         
         Ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP,EAName,Magic,0,Red);
         
    return; 
}

sur la base de votre fonction GetSignal, il semble que vous voulez utiliser OpenBuy/SellOrder() pour simplement ouvrir un ordre, plutôt que de retourner un argument ... J'ai nettoyé votre fonction GetSignal() un peu avec quelques commentaires

void GetSignal(int MaxBuyOrders, double StopLoss, double TakeProfit) 		//--- Why make this function a bool??
{
   int Op_Buy,Op_Sell,Op_BuyStop,Op_SellStop,Op_BuyLimit,Op_SellLimit;
        
   int total = OrdersTotal();
  
   for(int x=total-1; x>=0; x--)
   {
      OrderSelect(x, SELECT_BY_POS, MODE_TRADES);
      int type   = OrderType();
      bool result = false;    //-- not used anywhere??
      
      if (type==OP_BUY)       Op_Buy++;
      if (type==OP_SELL)      Op_Sell++;
      if (type==OP_BUYSTOP)   Op_BuyStop++;
      if (type==OP_SELLSTOP)  Op_SellStop++;         
   }
  
   int limit=1;		        //--- why define limit to 1 
   for(int i=1;i<=limit;i++)    //--- your for-loop will always run once, in which case why even have a for-loop?
   {
      double MA1=iMA(NULL,0,100,0,1,0,0);
      double MA2=iMA(NULL,0,100,0,1,0,1);
      double MA3=iMA(NULL,0,40,0,1,0,0);
      double MA4=iMA(NULL,0,40,0,1,0,1);
      
      bool BUY=false;   //-- as one guy mentioned better to go with booleans here
      bool SELL=false;

      if(MA1 < MA3 && MA2 > MA4) BUY=true;  
      if(MA1 > MA3 && MA2 < MA4) SELL=true;
      // missed out  && total == 0 for now
      bool SignalBUY=false;
      bool SignalSELL=false;
      
      if(BUY) //-- dont need to write == for bool's ..BUY is same as BUY==true, !BUY same as BUY==false
      if(ReverseSystem) SignalSELL=true;
      else SignalBUY=true;
      
      if(SELL)
      if(ReverseSystem) SignalBUY=true;
      else SignalSELL=true;
      
      if (SignalBUY && Op_Buy < MaxBuyOrders )   OpenBuyOrder(StopLoss,TakeProfit); 	//--- no need to return the return of OpenBuyOrder().. simply calling it will run the code
      if (SignalSELL && Op_Sell < MaxSellOrders) OpenSellOrder(StopLoss,TakeProfit);	//-- same
   }
   return;
}
 
supertrade:

vous obtenez cette erreur parce que les fonctions OpenBuyOrder() et OpenSellOrder() ne renvoient pas de résultat. vous les avez définies comme void, ce qui signifie qu'elles ne renvoient pas d'argument, mais vous essayez de renvoyer un nombre entier (0).

Voici le code avec quelques commentaires :

Sur la base de votre fonction GetSignal, il semble que vous voulez utiliser OpenBuy/SellOrder() pour simplement ouvrir un ordre, plutôt que de retourner un argument ... J'ai nettoyé votre fonction GetSignal() un peu avec quelques commentaires.

Cela explique des tonnes, merci beaucoup, je l'essaie maintenant.

mon propre code est un peu en désordre parce que je copie essentiellement d'autres EAs et j'essaie de le faire fonctionner.

 
Pas de problème. N'hésitez pas à demander si vous rencontrez d'autres problèmes.
 
void MoveTrailingStop()
{
   int cnt,total=OrdersTotal();
   for(cnt=0;cnt<total;cnt++)
   {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()<=OP_SELL  &&  OrderSymbol()==Symbol() ) //&&  OrderMagicNumber()==Magic
      {
         if(OrderType()==OP_BUY)
         {
            if(TrailingStop>0)  
            {                 
               if((NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-Point*(TrailingStop+TrailingStep),Digits)) || (OrderStopLoss()==0))
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
                  return(0);
               }
            }
         }
         else 
         {
            if(TrailingStop>0)  
            {                 
               if((NormalizeDouble(OrderStopLoss(),Digits)>(NormalizeDouble(Ask+Point*(TrailingStop+TrailingStep),Digits)))||(OrderStopLoss()==0))
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+Point*TrailingStop,Digits),OrderTakeProfit(),0,Red);
                  return(0);
               }
            }
         }
      }
   }
}
supertrade
:

Pas de problème... N'hésitez pas à demander si vous rencontrez d'autres problèmes.

J'ai collecté beaucoup d'exemples de trailing stops, mais j'ai besoin d'un qui commence à traîner immédiatement à travers les valeurs négatives jusqu'à 0, et qui s'arrête ensuite comme un break even.

Donc, si le prix d'entrée sur le marché est pris et que le stop loss est de 100, si le prix se déplace vers +25, le trailing stop se déplace vers -75, et une fois que le prix atteint 100, le trailing stop s'arrête à 0 et ne bouge plus.

Quelqu'un peut-il m'aider ? J'ai passé toute la journée à essayer de le faire fonctionner et je n'y arrive pas.

Je pensais l'avoir fait mais ce n'est pas le cas, mon trailing stop s'arrête à 0.

 

Pseudo Code :

OrderSelect()

if (Buyorder and stoploss < openrice) : we need to trail
if (Sellorder and stoploss > openprice): we need to trail
if (we need to trail):
Modify Stoploss to Currentprice (+ or -) original stoploss
 

zzuegg :

si(Buyorder et stoploss < openrice) : il faut faire un trail

Le stop loss ne devrait-il pas toujours être inférieur au prix ouvert, et vice versa ?

J'ai l'intention d'utiliser éventuellement une fonction MaxLoss, donc je ne mettrai pas de stop loss avec l'OrderSend.

if Op_Buy

if bid <= OpenOrderPrice()+(Trailing stop value) : trail -- une fois que bid > TSV, il ne devrait pas continuer à bouger ?

et

if Op_Sell

si ask >= OpenOrderPrice()-(Trailing stop value) : trail ?

Ensuite, à une valeur supérieure au Trailingstop, le Breakeven peut terminer le travail ?

 OrderSelect(SELECT_BY_POS,MODE_TRADES);
   if(TrailingStop>0)
      {
      if(OrderType()==OP_BUY)
            {
            if ( Bid <= (OrderOpenPrice()+Point*TrailingStop)  )
               {
                  MoveTrailingStop();
               }
            }
      if(OrderType()==OP_SELL)
            {   
            if ( Ask >= (OrderOpenPrice()-Point*TrailingStop) )
               {
                  MoveTrailingStop();
               }
            }
      }
BTW thanks zzuegg, thats another order management milestone achieved. What can happen with a little help. I am gratefull.
 
MickGlancy:

zzuegg :

si(Buyorder et stoploss < openrice) : il faut faire un trail

Le stop loss ne serait-il pas toujours inférieur au prix ouvert, et vice versa ? Non, seulement avant le breakeven

Je ne pense pas que votre code fonctionne, on dirait que vous essayez de faire l'inverse...
 
zzuegg:
Je ne pense pas que votre code fonctionne, il semble que vous essayez de faire le contraire...

Non, il fonctionne parfaitement. Laissez-moi vérifier que c'est la même chose maintenant que dans cette réponse.

C'est le meilleur compromis que je puisse trouver pour combler l'écart de perte derrière une transaction en mouvement, tout en lui laissant de l'espace pour respirer. Avant cela, le trade devait atteindre 60 points avant que BE ne se produise, donc il y a eu beaucoup de trades arrêtés au maximum, ce qui a causé un drawdown élevé.

OrderSelect(SELECT_BY_POS,MODE_TRADES);
   if(TrailingStop>0)
      {
      if(OrderType()==OP_BUY)
            {
            if ( Bid <= (OrderOpenPrice()+Point*TrailingStop)  )
               {
                  MoveTrailingStop();
               }
            }
      if(OrderType()==OP_SELL)
            {   
            if ( Ask >= (OrderOpenPrice()-Point*TrailingStop) )
               {
                  MoveTrailingStop();
               }
            }
      }