ONMARKET
ONMARKET en ProBacktest y ProOrder devuelve verdadero mientras hay cualquier posición abierta, long o short. Se usa para evitar entradas duplicadas y proteger la gestión de posiciones.
Sintaxis
ONMARKETCómo funciona
ONMARKET no toma argumentos y devuelve verdadero cuando la estrategia mantiene al menos una posición abierta, long o short, y falso cuando está plana. Es el hermano independiente de la dirección de LONGONMARKET y SHORTONMARKET, que comprueban un lado cada uno.
El valor refleja únicamente las órdenes ejecutadas. Una orden limit o stop pendiente que no se ha ejecutado deja ONMARKET en false, y el indicador vuelve a false en el bar siguiente al cierre total de la posición. Con CumulateOrders activado, una pila de entradas sigue leyéndose como un único valor verdadero; COUNTOFPOSITION informa del tamaño real.
Los usos típicos se agrupan en dos categorías. El código de entrada se envuelve en IF NOT OnMarket THEN ... ENDIF de modo que una nueva operación solo se inicia desde plano. El código de gestión, como la lógica de trailing o los reinicios de estado, se envuelve en IF OnMarket THEN ... ENDIF, o su inversa se usa para reinicializar variables entre operaciones.
Ejemplos
Ejemplo 1, Protección de entrada desde posición plana (ProBacktest)
// Open a position only when nothing is currently held
IF NOT ONMARKET THEN
BUY 1 CONTRACT AT MARKET
ENDIFLa estrategia compra un contrato solo cuando está plana, así que las posiciones nunca se acumulan. Este es el ejemplo de la referencia oficial.
Ejemplo 2, Entradas long y short simétricas (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 protección con ONMARKET cubre ambas direcciones, lo que es más sencillo que emparejar comprobaciones separadas de LONGONMARKET y SHORTONMARKET en torno a cada entrada.
Ejemplo 3, Reiniciar las variables de estado de la operación entre posiciones (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 es el disparador natural de reinicio del estado por operación. El flag se borra mientras no hay posición, así que cada nueva posición empieza de cero.
Errores y trampas habituales
- Ciego a la dirección por diseño. ONMARKET no puede distinguir long de short. El código de salida o de stop que solo tiene sentido en un lado debe usar LONGONMARKET o SHORTONMARKET, de lo contrario una posición short puede activar la gestión del lado long.
- Las órdenes pendientes no cuentan. Entre la colocación de una entrada limitada o stop y su ejecución, ONMARKET permanece falso, así que un bloque sin protección puede encolar varias órdenes que se ejecuten todas más tarde. Cancela o cuenta las órdenes pendientes en la lógica de entrada.
- Sin información de tamaño. Con
CumulateOrdersactivado, ONMARKET sigue siendo verdadero tanto si la posición tiene un contrato como veinte. Limita la piramidación con COUNTOFPOSITION, no con el booleano. - Ámbito incorrecto. ONMARKET dentro de un indicador de ProBuilder o de un ProScreener no compila. El estado de posición existe solo en el código de ProBacktest y ProOrder.
Instrucciones relacionadas
LONGONMARKET, verdadero mientras hay una posición long abierta.SHORTONMARKET, verdadero mientras hay una posición short abierta.MARKET, ejecuta las órdenes al precio de mercado actual.BUY, abre una posición long.SELLSHORT, abre una posición short.COUNTOFPOSITION, el tamaño de la posición abierta.POSITIONPERF, el rendimiento de la posición abierta.TRADEPRICE, el precio de ejecución de una operación pasada.