Opinione - EA di grande successo - conto da $3000 a $6300 in due settimane (avrebbe potuto essere $9000) - pagina 5

 

1 cosa veloce prima di andare a lavorare, ci sono variabili booleane che possono essere vere o false.

Difficile credere che tu stia seguendo il libro

 
zzuegg:

1 cosa veloce prima di andare a lavorare, ci sono variabili booleane che possono essere vere o false.

Difficile credere che tu stia seguendo il libro

Ci sto provando. Sto imparando a fare trading + programma + MQL allo stesso tempo.

Si impara a guidare una macchina leggendo solo il libro ?

ma grazie

 
MickGlancy:

Sto ricevendo l'errore che le funzioni OpenBuyOrder e OpenSellOrder non restituiscono alcun risultato

Cosa sto facendo di sbagliato?

stai ricevendo questo errore perché le funzioni OpenBuyOrder() e OpenSellOrder() in realtà non restituiscono un risultato... le hai definite come void, cioè non restituiscono alcun argomento, eppure stai cercando di restituire un intero (0).

Ecco il codice con alcuni commenti:

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

in base alla tua funzione GetSignal, sembra che tu voglia usare OpenBuy/SellOrder() per aprire semplicemente un ordine, piuttosto che restituire effettivamente qualche argomento... Ho pulito un po' la tua funzione GetSignal() con alcuni commenti

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:

state ottenendo questo errore perché le funzioni OpenBuyOrder() & OpenSellOrder() in realtà non restituiscono un risultato... le avete definite come void, cioè non restituiscono alcun argomento, ma state cercando di restituire un intero (0).

Ecco il codice con alcuni commenti:

in base alla tua funzione GetSignal, sembra che tu voglia usare OpenBuy/SellOrder() per aprire semplicemente un ordine, piuttosto che restituire effettivamente qualche argomento... Ho ripulito un po' la tua funzione GetSignal() con alcuni commenti

Questo spiega le tonnellate, grazie mille, lo sto provando ora

il mio codice è un po' incasinato perché sto fondamentalmente copiando da altri EA e cercando di farlo funzionare.

 
nessun problema... sentitevi liberi di chiedere se incontrate altri problemi
 
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
:

Nessun problema... sentitevi liberi di chiedere se incontrate altri problemi

Ho raccolto un sacco di esempi di trailing stop, ma ho bisogno di uno che inizia a seguire immediatamente attraverso i valori -ve a 0, e poi si ferma come un break even.

Quindi se il prezzo di entrata nel mercato è preso e lo stop loss è 100, il prezzo si muove a +25, il trailing stop si muove a -75, e poi una volta che il prezzo raggiunge 100, il trailing stop si ferma a 0 e non si muove ulteriormente.

Qualcuno potrebbe aiutarmi con questo? Ho passato tutto il giorno a cercare di farlo funzionare, ma non ci riesco.

Pensavo di averlo fatto ma non l'ho fatto, il mio trailing stop segue attraverso lo 0.

 

Codice Pseudo:

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:

se (Buyorder e stoploss < openrice): dobbiamo tracciare

Lo stop loss non dovrebbe essere sempre inferiore a openprice, e viceversa?

Ho intenzione di usare alla fine una funzione MaxLoss, quindi non metterò uno stop loss con l'OrderSend.

se Op_Buy

if bid <= OpenOrderPrice()+(Trailing stop value) : trail -- una volta bid > TSV non dovrebbe continuare a muoversi?

e

se Op_Sell

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

Poi ad un valore superiore al Trailingstop, il Breakeven può finire il lavoro ?

 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:

se(Buyorder e stoploss < openrice): abbiamo bisogno di trail

Lo stop loss non dovrebbe essere sempre inferiore all'openprice e viceversa? No, solo prima del pareggio

Non credo che il tuo codice funzioni, sembra che cerchi di fare il contrario...
 
zzuegg:
Non credo che il tuo codice funzioni, sembra che cerchi di fare il contrario...

No, funziona perfettamente. Fammi controllare che sia lo stesso ora come in quella risposta.

è il più vicino possibile a un compromesso per chiudere il gap di perdita dietro un trade in movimento, ma dandogli ancora spazio per respirare. Prima di questo, il trade doveva raggiungere i 60 punti prima che il BE accadesse, quindi c'erano un sacco di trade fermi al massimo, il che causava un alto drawdown.

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