es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede llamar a ‘strategy.close’ con el argumento ‘when’ = ‘long’.

Déjame empezar diciendo que soy muy nuevo en “Pine Script” y creo que mi problema es trivial, pero no encontré mucha información al respecto.

Digamos, por ejemplo, que quiero crear una estrategia que compre cuando “EMA25” cruza por encima de “EMA200” y venda cuando cae por debajo sin necesidad de “límite”, “stop” o “pérdida”.

//@version=5
strategy("Pine Script EMA Strategy", overlay = true, initial_capital = 100, default_qty_value = 100, default_qty_type = strategy.percent_of_equity)

EMA25 = ta.ema(close, 25)
EMA200 = ta.ema(close, 200)

plot(EMA25, color=color.red, title="EMA25")
plot(EMA200, color=color.yellow, title="EMA200")

bool longPositionCondition = ta.crossover(EMA25, EMA200)
bool exitLong = ta.crossover(EMA200, EMA25)

if (exitLong)
    bool exitWorkAround = true
else
    bool exitWorkAround = false

if (longPositionCondition)
    strategy.entry("long", strategy.long)
    strategy.close("exit", "long", when = exitLong)

Cada vez que intento ejecutar este código, obtengo el siguiente error:

Error en la operación de "Añadir al gráfico", motivo: línea 20: No se puede llamar a 'strategy.close' con el argumento 'when'='long'. Se utilizó un argumento de tipo 'cadena literal', pero se espera un 'booleano en serie'.

He estado investigando este problema durante un tiempo, pero todavía no sé exactamente qué estoy haciendo mal. Parece que pide una variable booleana en when =, pero dice que es when='long', que según entiendo es el ID para strategy.entry, por lo que no tiene sentido para mí.

Tags:  

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que la función strategy.close espera un tipo series bool para el argumento when, pero en su lugar está recibiendo una cadena literal. En este caso, el argumento when está establecido como long, que es el identificador para la función strategy.entry.

    Para solucionar este problema, puedes crear una variable booleana separada para usarla como argumento when, de la siguiente manera:

    bool longPositionCondition = ta.crossover(EMA25, EMA200);
    bool exitLong = ta.crossover(EMA200, EMA25);
    
    bool shouldCloseLong = exitLong;
    
    if (longPositionCondition) {
        strategy.entry("long", strategy.long);
        strategy.close("exit", "long", when = shouldCloseLong);
    }
    

    Al hacer esto, estás estableciendo la variable shouldCloseLong como true cuando se cumple la condición exitLong, y utilizando esa variable como valor del argumento when en la función strategy.close. Esto debería eliminar el error que estabas viendo.

Comments are closed.