Chiusura di mezzi lotti. - pagina 13

 
Scusate, ma non capisco come questo possa aiutarmi. Non importa cosa succede nel ciclo for e il vuoto che viene chiamato. Si tratta di ciò che sto chiamando per primo nell'"int start()" sicuramente?

Come ho incollato sopra, se io dimezzo l'ordine, irrilevante quale sia l'OrderTicket(), QUALSIASI apertura "OP_BUY" sarà chiamata ancora e ancora?

Ho bisogno di un modo per scrivere il codice in modo che all'interno di "in start()" e quel codice sopra, NON continuerà a chiamare il "OP_BUY" ogni volta DOPO aver già chiuso una metà?
 
DomGilberto:
Scusa, ma non capisco come questo possa aiutarmi. Non importa cosa succede nel ciclo for e il vuoto che viene chiamato. Si tratta di ciò che sto chiamando per primo nel "int start()" sicuramente?

Come ho incollato sopra, se io dimezzo l'ordine, irrilevante quale sia l'OrderTicket(), QUALSIASI apertura "OP_BUY" sarà chiamata ancora e ancora?

Ho bisogno di un modo per scrivere il codice in modo che all'interno di "in start()" e quel codice sopra, NON continuerà a chiamare il "OP_BUY" ogni volta DOPO aver già chiuso una metà?

Il void che viene chiamato è solo una funzione che viene chiamata dall'interno di start() ... è proprio come se il codice fosse direttamente in start().

pseudo codice:

cerca OP_BUYs

se trovato - il TP è a BE?

se il TP non è a BE e Bid >= primo target spostare il TP a BE e chiudere metà dell'ordine

se il TP è a BE non fare nulla

 

SI!!! Grazie RaptorUK!

Mi dispiace, non sono così stupido come quello che faccio sembrare, lo sai ;) - Solo che a volte le cose devono essere un po' ripetute quando sono nuovo a qualcosa...

Mi sono reso conto che tutti me lo hanno detto pagine fa - mi scuso per non averlo colto o capito!


GIUSTO! Siamo finalmente riusciti a chiudere la metà, andare in pareggio e fermare la continua chiusura delle metà allo stesso prezzo :D! Quindi è praticamente perfetto!!!

Tutto quello che devo fare ora, è essenzialmente copiare e incollare questo per le mie altre uscite e cambiare alcune regole e hay presto! Bobs your uncle = è risolto :)

Pubblicherò tutto qui per renderlo giusto per gli altri, se lo desiderano - Dopo tutto, un sacco di pazienza da parte degli altri mi ha permesso non solo di codificarlo, ma anche di capirlo :)

 
Questo è strano - a volte quando faccio un backtest la mezza chiusura @ 1:1 non funziona, ma poi quando faccio un backtest più breve funziona? Strano... è perché strategy tester è una merda, o ho un difetto nel codice?
 
Oh e cosa suggerirebbe di fare se il prezzo non raggiunge il primo obiettivo di 1:1 MA lo stoploss è MAGGIORE dell'entrata....? Come potrei creare una regola intorno a questo allora....
 
DomGilberto:
Oh e cosa suggerirebbe di fare se il prezzo non raggiunge il primo obiettivo di 1:1 MA lo stoploss è PIÙ GRANDE dell'entrata....? Come potrei creare una regola intorno a questo allora....


quando si modifica per raggiungere il pareggio?

se il target non viene raggiunto, il trade verrà chiuso a OrderStopLoss()

 
deVries:


quando si modifica a pareggio?

se l'obiettivo non viene raggiunto, il trade verrà chiuso a OrderStopLoss()


Chiudo la metà usando OrderClose() e se questo restituisce true, allora chiamo il breakeven void per spostare lo stoploss al break even? In questo modo il resto della posizione aperta in lotti non sarà continuamente chiuso perché se la posizione è stata spostata a break even, allora ho scritto che non ci sarà più chiusura di quella posizione fino a quando non raggiunge il suo prezzo di take profit fisso di 1:2.

Tuttavia, alcuni trade andranno uguali all'entrata o oltre il break even PRIMA che il trade abbia raggiunto il primo obiettivo, NON facendo scattare la mezza chiusura...

Inoltre, in alcuni trade l'uscita a metà e poi il passaggio al break even funziona perfettamente.... alcuni trade su cui dovrebbe funzionare, non fa nulla? Potrebbe essere dovuto a dati scadenti e a un difetto di strategy tester, o c'è un'incongruenza nel mio codice?

Oh e sto ancora ottenendo OrderModify 1 - fottutamente irritante...

 

Come fai a identificare l'ordine dopo che l'hai chiuso in parte per poi modificare lo SL per andare in pari? Sai che non puoi usare il numero di ticket originale, vero? Quando chiudi un ordine, il numero di ticket originale viene chiuso. Alla parte rimanente viene dato un nuovo numero di ticket. Un modo per identificarlo è ottenere il OrderOpenTime() prima della chiusura parziale. Dopo la chiusura parziale di un ordine, la parte rimanente otterrà un nuovo numero di ticket ma il OrderOpenTime() sarà lo stesso di prima.

Potresti anche usare OrderOpenTime() per identificarlo ed evitare che venga chiuso più volte.

In alternativa potresti modificarlo prima di chiuderlo parzialmente. La parte rimanente del tuo ordine manterrà lo SL o il TP modificato.

Ecco un test. Aperto a 0.09 chiusura parziale a 0.07 lasciando 0.02

Notate come il numero del biglietto cambia ma il tempo di apertura rimane lo stesso:

23:42:48 2013.08.01 11:28 SDCMegaTrend EURUSD,M1: aperto #14 compra 0,09 EURUSD a 1,3240 sl: 1,3037 tp: 1,3737 ok
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: chiudere #14 comprare 0,07 EURUSD a 1,3240 sl: 1,3037 tp: 1,3737 al prezzo 1,3253
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: Allarme: Ticket 14 OrderOpenTime prima della chiusura della parte: 1375356521
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: Allarme: Ticket 15 OrderOpenTime: 1375356521
23:42:48 2013.08.01 12:45 SDCMegaTrend EURUSD,M1: chiudere #15 comprare 0,02 EURUSD a 1,3240 sl: 1,3037 tp: 1,3737 al prezzo 1,3242

 
SDC:

Come fai a identificare l'ordine dopo che l'hai chiuso in parte per poi modificare lo SL per andare in pari? Sai che non puoi usare il numero di ticket originale, vero? Quando chiudi un ordine, il numero di ticket originale viene chiuso. Alla parte rimanente viene dato un nuovo numero di ticket. Un modo per identificarlo è ottenere il OrderOpenTime() prima della chiusura parziale. Dopo la chiusura parziale di un ordine, la parte rimanente otterrà un nuovo numero di ticket ma il OrderOpenTime() sarà lo stesso di prima.

Potresti anche usare OrderOpenTime() per identificarlo ed evitare che venga chiuso più volte.

In alternativa potresti modificarlo prima di chiuderlo parzialmente. La parte rimanente del tuo ordine manterrà lo SL o il TP modificato.

Ecco un test. Aperto a 0.09 chiusura parziale a 0.07 lasciando 0.02

Notate come il numero del biglietto cambia ma il tempo di apertura rimane lo stesso:

23:42:48 2013.08.01 11:28 SDCMegaTrend EURUSD,M1: open #14 buy 0.09 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 ok
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: close #14 buy 0.07 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 at price 1.3253
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: Allarme: Ticket 14 OrderOpenTime prima della chiusura della parte: 1375356521
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: Alert: Ticket 15 OrderOpenTime: 1375356521
23:42:48 2013.08.01 12:45 SDCMegaTrend EURUSD,M1: close #15 buy 0.02 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 at price 1.3242


Ah - Fantastico, grazie. Mi ero completamente dimenticato di OrderOpenTime() - è un ottimo modo per farlo! Grazie per il suggerimento - ora lo sperimenterò.

Seguendo il mio post precedente, sono riuscito a farlo funzionare molto più agevolmente ora - l'errore 1 di OrderModify si presenta solo raramente ora. Ora sembra funzionare in modo più fluido.

L'unico problema è che se ho un trade in cui lo stop loss è >= di OrderEntry() - (supponendo che stiamo parlando di un long), allora non chiuderà la metà dell'ordine perché il criterio principale per chiudere la metà non è stato soddisfatto.

Questo codice solitario qui è ciò che avvia la chiusura di metà dei lotti, e l'arresto della chiusura continua delle metà allo stesso prezzo - (non è l'unica cosa in "in start()", l'ho solo reso più facile da vedere):



   

int start()
{

   if(OpenOrdersThisPair(Symbol())>0) //If there is a trade open = do below, which ever is applicable.
      {
      if(OrderType()==OP_BUY && OrderOpenPrice() > OrderStopLoss())
         {
         CloseHalfOrder(); // Closes half at 1:1 - then calls another void to break even on the trade +3.
         }
      
      if(OrderType()==OP_SELL && OrderOpenPrice() < OrderStopLoss())
         {
         CloseHalfOrder1(); // Closes half at 1:1 - then calls another void to break even on the trade +3.
         }   
      } 
}
Come potrei incorporare la funzione OrderOpenTime() per avere un miglior controllo nell'assicurarmi che ogni trade chiuda i mezzi lotti a 1:1 SENZA perderne nessuno dove lo stop è >= OrderOpen()?
 

Ci sono diversi modi per assicurarsi che ogni ordine sia chiuso parzialmente, il mio modo preferito di farlo è quello di modificare il TP di un pip quando lo chiudo parzialmente.

Così, per esempio, ho bisogno di un TP di 100 pip, quindi apro l'ordine con un TP di 99 pip. So che prima che il take profit venga raggiunto il mio ordine verrà chiuso parzialmente a 40 pip. Quando ciò accade, modifico il TP a 100 pip. Quindi qualsiasi ordine che ha un profitto >= 40 pip e un TP < 100 pip deve essere chiuso parzialmente. Qualsiasi ordine con un TP > 99 pips è già stato chiuso parzialmente. Se lo fai in questo modo non fa differenza quale sia lo SL. Assicurati solo di normalizzare tutti i doppi prezzi degli ordini prima di fare i calcoli su di essi.

Motivazione: