ONMARKET
ONMARKET in ProBacktest e ProOrder restituisce vero mentre è aperta una qualsiasi posizione, long o short. Usato per impedire ingressi duplicati e per proteggere la gestione delle posizioni.
Sintassi
ONMARKETCome funziona
ONMARKET non accetta argomenti e restituisce vero quando la strategia detiene almeno una posizione aperta, long o short, e falso quando è fuori mercato. È la variante indipendente dalla direzione di LONGONMARKET e SHORTONMARKET, che verificano un lato ciascuno.
Il valore riflette solo gli ordini eseguiti. Un ordine limit o stop pendente non eseguito lascia ONMARKET false, e il flag torna a false sul bar successivo alla chiusura completa della posizione. Con CumulateOrders abilitato, una pila di ingressi viene comunque letta come un singolo valore vero; COUNTOFPOSITION riporta la dimensione reale.
Gli usi tipici si dividono in due gruppi. Il codice di ingresso è racchiuso in IF NOT OnMarket THEN ... ENDIF così una nuova operazione parte solo da posizione piatta. Il codice di gestione, come la logica di trailing o i reset di stato, è racchiuso in IF OnMarket THEN ... ENDIF, o la sua inversa si usa per reinizializzare le variabili tra le operazioni.
Esempi
Esempio 1, Protezione dell'ingresso da fuori mercato (ProBacktest)
// Open a position only when nothing is currently held
IF NOT ONMARKET THEN
BUY 1 CONTRACT AT MARKET
ENDIFLa strategia acquista un contratto solo quando è fuori mercato, quindi le posizioni non si accumulano mai. Questo è l'esempio tratto dalla documentazione ufficiale.
Esempio 2, Ingressi long e short simmetrici (ProOrder)
DEFPARAM CumulateOrders = false
fastMA = Average[20](close)
slowMA = Average[50](close)
// Take either direction, but only from flat
IF NOT onmarket THEN
IF fastMA CROSSES OVER slowMA THEN
BUY 1 CONTRACT AT MARKET
ELSIF fastMA CROSSES UNDER slowMA THEN
SELLSHORT 1 CONTRACT AT MARKET
ENDIF
ENDIFUna sola protezione ONMARKET copre entrambe le direzioni, il che è più semplice che abbinare controlli separati LONGONMARKET e SHORTONMARKET attorno a ogni ingresso.
Esempio 3, Azzeramento delle variabili di stato dell'operazione tra le posizioni (ProOrder)
// Clear the breakeven flag whenever the strategy is flat
IF NOT onmarket THEN
beArmed = 0
ENDIF
// Arm breakeven once the long shows 10 points of profit
IF longonmarket AND close - tradeprice >= 10 * pointsize THEN
beArmed = 1
ENDIF
IF beArmed = 1 THEN
SET STOP BREAKEVEN
ENDIFONMARKET è l'innesco naturale per azzerare lo stato relativo a ogni operazione. Il flag viene cancellato mentre si è fuori mercato, quindi ogni nuova posizione parte da zero.
Errori e insidie comuni
- Cieco alla direzione per progettazione. ONMARKET non può distinguere long da short. Il codice di uscita o di stop che ha senso solo su un lato deve usare LONGONMARKET o SHORTONMARKET, altrimenti una posizione short può attivare la gestione del lato long.
- Gli ordini pendenti non contano. Tra l'invio di un ingresso limit o stop e la sua esecuzione, ONMARKET resta falso, quindi un blocco non protetto può accodare più ordini che vengono tutti eseguiti in seguito. Annulla o conta gli ordini pendenti nella logica di ingresso.
- Nessuna informazione sulla dimensione. Con
CumulateOrdersabilitato, ONMARKET resta vero sia che la posizione tenga un contratto sia che ne tenga venti. Limita il piramidaggio con COUNTOFPOSITION invece che con il booleano. - Ambito errato. ONMARKET all'interno di un indicatore ProBuilder o di un ProScreener non compila. Lo stato di posizione esiste solo nel codice ProBacktest e ProOrder.
Istruzioni correlate
LONGONMARKET, vero mentre una posizione long è aperta.SHORTONMARKET, vero mentre una posizione short è aperta.MARKET, esegue gli ordini al prezzo di mercato corrente.BUY, apre una posizione long.SELLSHORT, apre una posizione short.COUNTOFPOSITION, la dimensione della posizione aperta.POSITIONPERF, la performance della posizione aperta.TRADEPRICE, il prezzo di esecuzione di un'operazione passata.