Usa sempre il pulsante “Insert PRT code” quando inserisci il codice nei tuoi post per facilitare la lettura degli altri.
Grazie 🙂
Il tuo codice mi sembra vada bene, l’hai provato?
Sulla stessa barra puoi entrare se hai piazzato più ordini pendenti, se ne hai piazzato solo uno no, perché una volta entrato viene cancellato.
Alla chiusura della barra vengono comunque cancellati tutti gli ordini pendenti non entrati a mercato.
Il codice lo ho provato e funziona. Volevo solo accertarmi che non ci fosse il pericolo di più entrate sulla stessa barra, come dicevi:
“Addirittura gli ordini pendenti, se non stai attento a come li metti, possono accumulare posizioni anche se hai messo DEFPARAM CumulateOrders = FALSE”
Non capisco cosa significa che sulla barra posso entrare se ho piazzato più ordini pendenti. Nel caso sopra ne piazzo uno ed il TS entra.
Sembrerebbe anche che il pericolo non c’è di entrare più volte sulla stessa barra con il codice sopra riportato. Corretto?
Intendi dire che il pericolo c’è (di più entrate sulla stessa barra) solo se piazzo più ordini pendenti sulla stessa barra?
Se c’è il pericolo puoi saperlo solo tu, se piazzi due ordini pendenti a distanza di 500 pips l’uno dall’altro… di pericolo ce n’è poco, a meno che tu non stia lavorando con grafici settimanali o mensili.
Se li piazzi a distanze ravvicinate potrebbero entrare entrambi; se sono nella stessa direzione accumulando più posizioni, se sono in direzioni opposte il secondo che entra chiude il primo.
DEFPARAM CumulateOrders = FALSE NON ha nessun effetto con gli ordini pendenti, nel senso che se tu l’hai messo all’inizio, ma piazzi due ordini poendenti che potrebbero entrare entrambi, puoi trovarti con due ordini eseguiti.
Basta fare un pò d’attenzione nel creare una strategia, non dovrebbero essertci problemi, basta esserne consapevoli.
Controllerò bene empiricamente tutti i casi, ma non mi sembra a prima vista che si possano avere POTENZIALMENTE due entrate long nella stessa barra (che era la mia semplice domanda iniziale), con la formula :
IF cLongEntry THEN
BUY 1 CONTRACTS at close-0.2*pointSize LIMIT
endif
In ogni caso ho appena scoperto che la condizione per cui si esclude correttamente un entrata se in conflitto con le condizioni di uscita, non vale per gli ordini pendenti.
Questo lo avevamo chiarito se l’ordine pendente era nella condizione di entrata (che come hai scritto, scavalca le altre condizioni), ma non pensavo che potesse accadere anche se l’ordine pendente era per l’uscita!
In pratica, il TS entra in un long conflittuale anche con la seguente formula:
IF cLongEntry THEN
BUY 1 CONTRACTS at market
ENDIF
IF cLongExit then
SELL 1 CONTRACTS at close+0.2*pointSize limit
endif
Nel primo esempio non possono esserci doppie entrate perché c’è un solo ordine ed una volta eseguito viene cancellato.
Nel secondo può esserci un conflitto, ma non succede gran che… la posizione aperta viene chiusa ed è quello che deve fare se c’è la condizione di uscita. Se non vuoi il conflitto puoi aggiungere come condizione, alla riga 4:
AND LongOnMarket
in questo caso all’entrata questo ordine non viene eseguito, ma solo dalla seconda barra in poi. Attenzione però… se fai così è consigliabile, subito dopo il BUY della riga 2 aggiungere almeno uno SL o anche il TP, altrimenti resti senza paracadute per la prima barra!
Ciao Roberto, vorrei far durare un ordine limite, nel codice sotto riportato, per la durata di tre barre. Vorrei usare un flag, ma non trattandosi di una condizione, ma di un ordine pendente non so come scriverlo. Riesci a scriverlo? (ho inserito in ogni caso uno stop loss aggiuntivo, come consigliavi, per l’ordine limite in uscita!)
[Lo scopo di usare ordini limite con il close della barra precedente è quello, rischiando in rarissimi casi (ho controllato) di non essere eseguito, di eliminare la differenza tra proBackTest e proOrder, quindi lo spread]
IF cLongEntry and tradeAllowed=1 and nLoss<6 THEN
BUY 1 CONTRACTS AT close limit
ENDIF
Prova così:
Once Conto = 0
If OnMarket then
Conto = 0
Endif
IF cLongEntry and tradeAllowed=1 and nLoss<6 and Conto < 3 THEN
BUY 1 CONTRACTS AT close limit
Conto = Conto + 1
ENDIF
Ho provato ma non funziona: ci sono casi in cui mantenendo l’ordine limite per due barre dovrebbe chiaramente entrare, invece non entra. Possibile che dipenda dal fatto che il TS non è ancora a mercato quando piazza l’ordine pendente? Hai altre prove ?
Tu hai chiesto di potere reimmettere per 3 volte l’ordine. Questo è quello che fa.
Da me non mantiene le condizioni, non ha alcun effetto. Mi puoi controllare questo che ho scritto che non funziona e non capisco il motivo?
nBarsLimit=5
countBars=countBars+1
if onMarket then
limitOk=1
countBars=0
endif
if countBars>=nBarsLimit then
limitOk=0
endif
// -------------------------------------------------------------------
IF cLongEntry and tradeAllowed=1 and nLoss<6 and limitOk=1 THEN
BUY 1 CONTRACTS AT close limit
limitOk=0
ENDIF
IF cLongExit and not shortonmarket then
SELL 1 contracts at close limit
endif
Nel caso che ho postato è induicato un limite MASSIMO di barre,nel caso in cui le condizioni durino più di 3 barre. Questo è quanto avevi chiesto (o almeno io l’ho capito così).
Tu, invece,vuoi che siano le condizioni ad essere mantenute valide per 3 barre?
Se è così, allora il codice è:
Cond = cLongEntry and tradeAllowed=1 and nLoss<6
IF summation[3](Cond) THEN
BUY 1 CONTRACTS AT close limit
ENDIF
in questo caso piazza l’ordine pendente fino a 3 volte, anche se le condizioni non sono mantenute la seconda e la terza volta.
Ho provato, ma il TS funziona malissimo: si vanno a confondere troppe condizioni.
La condizione deve scattare in una barra, non posso mantenere le condizioni valide ulteriormente. Quindi l’unica soluzione, se possibile, è far si che solo l’ordine limite venga mantenuto per x barre dopo la prima barra (nel mio esempio 5 barre).
Se è possibile correggere il codice che ho postato sopra lo provo, altrimenti mantengo l’ordine limite solo per una barra (come fa naturalmente il programma). Grazie
Nel mio esempio sostituisci il 3 col 5 e funziona!
Non vedo perché complicare le cose semplici, ad ogni modo credo che nel tuo codice l’errore sia nel non avere inserito la riga 2 tra Not OnMarket:
IF Not OnMarket THEN
countBars=countBars+1
ENDIF
ma non è chiaro se anche facendo così funzionerà, è l’impostazione logica che non torna.
Tu vuoi che una condizione, una volta verificata, sia valutata per 3 o 5 barre anche se non è più verificata. Basta usare SUMMATION!