Chiusura di mezzi lotti. - pagina 18

 


Ok (AGGIORNAMENTO!) quindi fondamentalmente, mi sono sbarazzato della continua chiusura di "metà di una metà di una metà ecc." sui lotti quando viene chiamata la seconda OrderClose() (dove c'è la dichiarazione if tutta blu - apparentemente questo funziona bene!) - TUTTAVIA, non voglio che questo venga chiamato a meno che la PRIMA funzione OrderClose() sia "True" e abbia avuto successo. "Close_Half_Order_Buy==True" non funziona nemmeno...

Mi piacerebbe che qualcuno mi aiutasse a finire questo :)

( Ho rimosso molte delle "Stampe", per amore di chiarezza sulla carne del codice).

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+
void CloseHalfOrder()
{   
   
   static datetime partclosedonce;
   static datetime partclosedtwice; 
   
   double minLot=MarketInfo(Symbol(),MODE_MINLOT);

   double lotStep=MarketInfo(Symbol(),MODE_LOTSTEP);

   double half=MathFloor(OrderLots()/2/lotStep)*lotStep;
   
   double EMA_Bar = iClose(NULL, PERIOD_H1, 1);
   double EMA_MA = iMA(Symbol(),60,21,0,1,0,0);

   
for(int c=OrdersTotal()-1; c>=0; c--)
      {
      if(OrderSelect(c,SELECT_BY_POS,MODE_TRADES)==true)

      double FirstTarget_Buy = OrderOpenPrice()+(( OrderTakeProfit()-OrderOpenPrice())/2);
      	Print("FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
      
      if(OrderMagicNumber()==MagicNumber)
         if(OrderSymbol()==Symbol())
            if(OrderLots()>minLot)
               if(OrderOpenTime() != partclosedonce)
            {
            
            if(OrderType()==OP_BUY && Bid >= FirstTarget_Buy+(Point/2)) 
               {
               bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,5,Blue);
               if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
               }
            }
         
      if(Close_Half_Order_Buy==True && OrderOpenPrice() > OrderStopLoss())
         {
         MoveToBreakEven(); 
         }
          if(Close_Half_Order_Buy==True)
               {
               partclosedonce = OrderOpenTime();
               } 
      
      if(partclosedonce != partclosedtwice && OrderOpenTime() != partclosedtwice) // I dont want this to run UNLESS the first OrderClose() is successful.
         {
          if(OrderType()==OP_BUY && EMA_Bar < EMA_MA)
               {
               bool EMA_Buy_Close=OrderClose(OrderTicket(),half,Bid,5,CLR_NONE);
               if(EMA_Buy_Close!=TRUE)Print("EMA_Buy_Close Last Error = ",GetLastError());
               if(EMA_Buy_Close==True)partclosedtwice = OrderOpenTime();
               }     
          }        
     }
}


	          
 
Nessuno?
 
DomGilberto:


Ok (AGGIORNAMENTO!) quindi fondamentalmente, mi sono sbarazzato della continua chiusura di "metà di una metà di una metà ecc." sui lotti quando viene chiamata la seconda OrderClose() (dove c'è la dichiarazione if tutta blu - apparentemente questo funziona bene!) - TUTTAVIA, non voglio che questo venga chiamato a meno che la PRIMA funzione OrderClose() sia "True" e abbia avuto successo. "Close_Half_Order_Buy==True" non funziona nemmeno...

Mi piacerebbe avere l'aiuto di qualcuno per finire questo :)

Il seguente codice si compila (dichiarando la variabile MagicNumber e commentando la funzione MoveToBreakEven()) ma non era testato.

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+
void CloseHalfOrder() {
   static bool FirstBuyTarget_hit = false, SecondBuyTarget_hit = false;
   int ct = 0;
   double minLot = MarketInfo(Symbol(),MODE_MINLOT);
   double lotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
   double EMA_Bar = iClose(NULL, PERIOD_H1, 1);
   double EMA_MA = iMA(Symbol(),60,21,0,1,0,0);
        
   for(int c = OrdersTotal() - 1; c >= 0; c--)
      if (OrderSelect(c,SELECT_BY_POS))
         if (OrderSymbol() == Symbol() && OrderType() <= OP_SELL)
            if (OrderMagicNumber() == MagicNumber) {
               double half=MathFloor(OrderLots()/2/lotStep)*lotStep;
               double FirstTarget_Buy = OrderOpenPrice() + ((OrderTakeProfit() - OrderOpenPrice()) / 2);
               Print ("FirstTarget_Buy: ", DoubleToStr(FirstTarget_Buy,Digits));
                                        
               ct++;
                                        
               if (!FirstBuyTarget_hit)
                  if (OrderType() == OP_BUY && Bid >= FirstTarget_Buy + (Point/2)) {
                     if (OrderClose(OrderTicket(),half,Bid,5,Blue)) {
                        MoveToBreakEven();
                        FirstBuyTarget_hit = true;
                        break;
                     }
                     else
                        Print("Close_Half_Order_Buy Last Error = ", GetLastError());
                  }
                                        
               if (FirstBuyTarget_hit && !SecondBuyTarget_hit) 
                  if (OrderType() == OP_BUY && EMA_Bar < EMA_MA) {
                     if (OrderClose(OrderTicket(),half,Bid,5,CLR_NONE))
                        SecondBuyTarget_hit = true;
                     else
                        Print("EMA_Buy_Close Last Error = ",GetLastError());                    
                  }

               break;
            }
   if (ct == 0) {
      FirstBuyTarget_hit = false;
      SecondBuyTarget_hit = false;
   }
}

Il codice di cui sopra presuppone che venga piazzato un solo ordine per coppia di valute.

 

Omg grazie mille per il tuo aiuto! Lo apprezzo davvero :)

Ti dispiacerebbe aiutarmi con un'ultima cosa; al momento ho un obiettivo di take profit FISSO 1:2 (hard TP). In realtà voglio rimuovere questo dall'ordine. Tuttavia, come potete vedere sopra, le relative funzioni OrderClose() stanno usando OrderTakeProfit() per calcolare dove le funzioni OrderClose() dovrebbero chiudere.

La mia domanda è: c'è un modo per memorizzare il prezzo di OrderTakeProfit(), ma invece di averlo fisso nell'ordine, voglio chiudere un certo numero di lotti usando OrderClose() al prezzo di OrderTakeProfit()? Il motivo è che a volte avrò un'operazione che avrà enormi guadagni, ma poiché ho OrderTakeProfit() fissato con l'ordine aperto, tutti i lotti si chiuderanno lì e io voglio solo chiudere parzialmente alcuni lotti a quel prezzo di uscita. Uso un trailing stop per i grandi corridori... Spero che abbia senso?

Questo è tutto! Allora ho finito e spolverato! Finalmente!

AGGIORNAMENTO: Il codice di cui sopra è un bel modo di scrivere. Ho giocato un po', ma non si chiude nell'ordine corretto. Si chiude ancora a metà su quello che viene prima. È più o meno lo stesso di quello che avevo prima di usare datetime statico? Qualche pensiero?

 
(sensazione di aver esaurito questo thread)

Ho letteralmente queste ultime 2 domande sopra e questo è fatto? Tutto quello che ho bisogno di sapere è come posso memorizzare il prezzo di OrderTakeProfit(), in modo che quando lo modifico, posso ancora usare quel prezzo esatto per fare un OrderClose()? Un Double statico funzionerà?
 
DomGilberto:

AGGIORNAMENTO: Il codice sopra è un bel modo di scriverlo. Ho giocato un po', ma non si chiude nell'ordine corretto. Si chiude ancora a metà su quello che viene prima. È più o meno lo stesso di quello che avevo prima di usare datetime statico? Qualche idea?

Pubblica qualsiasi modifica che hai fatto al codice di cui sopra e pubblica voci di log/diario (o screenshot).

 
DomGilberto:

Omg grazie mille per il tuo aiuto! Lo apprezzo davvero :)

Ti dispiacerebbe aiutarmi con un'ultima cosa; al momento ho un obiettivo di take profit FISSO 1:2 (hard TP). In realtà voglio rimuovere questo dall'ordine. Tuttavia, come potete vedere sopra, le relative funzioni OrderClose() stanno usando OrderTakeProfit() per calcolare dove le funzioni OrderClose() dovrebbero chiudere.

La mia domanda è: c'è un modo per memorizzare il prezzo di OrderTakeProfit(), ma invece di averlo fisso nell'ordine, voglio chiudere un certo numero di lotti usando OrderClose() al prezzo di OrderTakeProfit()? Il motivo è che a volte avrò un'operazione che avrà enormi guadagni, ma poiché ho OrderTakeProfit() fissato con l'ordine aperto, tutti i lotti si chiuderanno lì e io voglio solo chiudere parzialmente alcuni lotti a quel prezzo di uscita. Uso un trailing stop per i grandi corridori... Spero che abbia senso?

Questo è tutto! Allora ho finito e spolverato! Finalmente!

AGGIORNAMENTO: Il codice di cui sopra è un bel modo di scrivere. Ho giocato un po', ma non si chiude nell'ordine corretto. Si chiude ancora a metà su quello che viene prima. È più o meno lo stesso di quello che avevo prima di usare datetime statico? Qualche pensiero?


imposta il tuo takeprofit a un livello enorme e puoi ancora usare le tue funzioni OrderClose() che usano OrderTakeProfit() per calcolare a quale punto le funzioni OrderClose() dovrebbero chiudere. fai solo un cambiamento nel calcoloa cui le funzioni OrderClose() dovrebbero chiudere
 
deVries - letteralmente l'ho capito stamattina... Ho iniziato a mettere un'altra modifica... poi mi sono reso conto che dovrei cambiarla subito dopo il primo ordine...

Tredici - Non ho apportato alcuna modifica. Funziona più o meno come il codice che ho postato, ma stai usando un bool statico invece di un datetime statico? Questa è l'unica vera differenza che ho potuto vedere quando ho eseguito il back-test? A parte questo, la seconda funzione OrderClose() con la media mobile e la chiusura sotto di essa; si chiude ancora se questa viene prima dell'altra orderclose()?
 
DomGilberto:

Tredici - Non ho apportato alcuna modifica. Ha più o meno funzionato allo stesso modo del codice che ho postato, ma stai usando un bool statico invece di un datetime statico? Questa è l'unica vera differenza che ho potuto vedere quando ho eseguito il back-test? A parte questo, la seconda funzione OrderClose() con la media mobile e la chiusura sotto di essa; si chiude ancora se questa viene prima dell'altra orderclose()?
Con il tuo uso del punto interrogativo, non sono sicuro se mi stai chiedendo o mi stai dicendo la parte evidenziata. Se il tester mostra che la seconda chiusura parziale è avvenuta prima della prima, ti prego di postare i tuoi risultati di trading dal log/giornale che sono stati generati dal tester della strategia che mostrano che la seconda chiusura parziale (la media mobile) è avvenuta prima della prima chiusura parziale.
 
Thirteen:
Con il tuo uso del punto interrogativo, non sono sicuro se mi stai chiedendo o mi stai dicendo la parte evidenziata. Se il tester mostra che la seconda chiusura parziale si è verificata prima della prima, ti prego di postare i tuoi risultati di trading dal log/giornale che sono stati generati dal tester della strategia che mostra che la seconda chiusura parziale (la media mobile) si è verificata prima della prima chiusura parziale.

Grazie per avermi risposto Tredici - posterò il registro più tardi in giornata :)

Motivazione: