Meinung - sehr erfolgreicher EA - $3000 Konto zu $6300 in zwei Wochen (hätte $9000 sein können) - Seite 5

 

1 schnelle Sache, bevor ich zur Arbeit gehe, es gibt boolesche Variablen, die wahr oder falsch sein können. man muss dafür keinen String verwenden.

Kaum zu glauben, dass du dich an das Buch hältst

 
zzuegg:

1 schnelle Sache, bevor ich zur Arbeit gehe, es gibt boolesche Variablen, die wahr oder falsch sein können. man muss dafür keinen String verwenden.

Kaum zu glauben, dass Sie dem Buch folgen

Ich versuche es. Ich lerne gleichzeitig handeln + programmieren + MQL.

Lernt man Autofahren, indem man nur das Buch liest?

aber danke

 
MickGlancy:

Ich erhalte den Fehler, dass die Funktionen OpenBuyOrder und OpenSellOrder kein Ergebnis liefern.

Was mache ich falsch?

Sie erhalten diese Fehlermeldung, weil die Funktionen OpenBuyOrder() und OpenSellOrder() kein Ergebnis zurückgeben. Sie haben sie als void definiert , was bedeutet, dass sie kein Argument zurückgeben, aber Sie versuchen, eine ganze Zahl (0) zurückzugeben.

Hier ist der Code mit einigen Kommentaren:

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

Basierend auf Ihrer GetSignal-Funktion scheint es so, als ob Sie OpenBuy/SellOrder() verwenden wollen, um einfach eine Order zu öffnen, anstatt ein Argument zurückzugeben ... Ich habe Ihre GetSignal()-Funktion mit einigen Kommentaren etwas aufgeräumt

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:

Sie erhalten diesen Fehler, weil die Funktionen OpenBuyOrder() & OpenSellOrder() tatsächlich kein Ergebnis zurückgeben. Sie haben sie als void definiert , was bedeutet, dass sie kein Argument zurückgeben, aber Sie versuchen, eine ganze Zahl (0) zurückzugeben.

Hier ist der Code mit einigen Kommentaren:

Basierend auf Ihrer GetSignal-Funktion scheint es so, als ob Sie OpenBuy/SellOrder() benutzen wollen, um einfach eine Order zu öffnen, anstatt tatsächlich ein Argument zurückzugeben ... Ich habe Ihre GetSignal()-Funktion mit einigen Kommentaren ein wenig bereinigt

Das erklärt einiges, vielen Dank, ich werde es jetzt ausprobieren

mein eigener Code ist ein bisschen durcheinander, weil ich im Grunde von anderen EAs kopiert und versucht, es funktionieren.

 
Kein Problem. Fragen Sie ruhig, wenn Sie auf andere Probleme stoßen.
 
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
:

Kein Problem. Fragen Sie ruhig, wenn Sie auf andere Probleme stoßen.

ive gesammelt viele Beispiele für Trailing-Stops, aber ich brauche eine, die sofort durch die -ve Werte auf 0 zu verfolgen beginnt, und dann wie ein Break-Even zu stoppen.

Also, wenn der Markt Eintrag Preis genommen wird und der Stop-Loss ist 100, id der Preis bewegt sich auf +25, die Trailing-Stop bewegt sich auf -75, und dann, sobald der Preis 100 erreicht, die Trailing-Stop stoppt bei 0 und bewegt sich nicht weiter.

Kann mir jemand bei diesem Problem helfen? Ich habe den ganzen Tag damit verbracht, es zum Laufen zu bringen, aber ich kann es einfach nicht.

Ich dachte, ich hätte es geschafft, aber ich habe es nicht, mein Trailing-Stop folgt durch 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:

wenn(Buyorder und stoploss < openrice) : wir müssen nachziehen

Sollte der Stop Loss nicht immer niedriger sein als der Openprice und umgekehrt?

Ich habe vor, eventuell eine MaxLoss-Funktion zu verwenden, so dass ich keinen Stop Loss mit der OrderSend einfüge.

wenn Op_Buy

if bid <= OpenOrderPrice()+(Trailing stop value) : trail -- sobald bid > TSV sollte es sich nicht weiter bewegen ?

und

wenn Op_Sell

wenn ask >= OpenOrderPrice()-(Trailing-Stop-Wert): trail ?

Bei einem Wert, der höher ist als der Trailingstop-Wert, kann der Breakeven den Auftrag beenden ?

 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:

wenn(Buyorder und stoploss < openrice) : wir müssen nachziehen

Wäre der Stop Loss nicht immer niedriger als der Eröffnungskurs und vice versa? Nein, nur vor dem Breakeven

Ich glaube nicht, dass Ihr Code funktioniert, es scheint, Sie versuchen das Gegenteil zu tun...
 
zzuegg:
Ich glaube nicht, dass Ihr Code funktioniert, scheint Sie versuchen, das Gegenteil zu tun...

Nein, es funktioniert perfekt. Lassen Sie mich überprüfen, es ist das gleiche jetzt wie in dieser Antwort.

Es ist so nah wie möglich an einem Kompromiss, die Verlustlücke hinter einem sich bewegenden Handel zu schließen, aber ihm immer noch Raum zum Atmen zu geben. Zuvor musste der Handel 60 Punkte erreichen, bevor BE eintrat, so dass es eine Menge von maximal gestoppten Geschäften gab, was dazu führte, dass mein Drawdown hoch war. hoffentlich ändert sich das.

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();
               }
            }
      }
Grund der Beschwerde: