PyP
CommunityPricingMarketplaceFor Quant TradersPCE (VPS)DocsLoginGet Started
Documentation
Getting Started
  • Introduction

  • Quick Start

Functions
PyPScript

Variables & Data

Variables are how you turn raw market inputs into readable strategy logic.

In practice, good PyPScript code is mostly:

  • clear variable names
  • reusable conditions
  • simple pattern rules built from those variables

Built-In Data

These values are available automatically:

  • open
  • high
  • low
  • close
  • volume
  • pair
  • timeframe

These are the base inputs for indicators and conditions.

Example:

fast_ma = sma.evaluate(close, 10) range_size = atr.evaluate(high, low, close, 14)

Basic Assignment

The assignment form is:

name = expression

Examples:

fast_ma = sma.evaluate(close, 10) slow_ma = sma.evaluate(close, 20) momentum = rsi.evaluate(close, 14)

What Variables Usually Hold

In PyPScript, variables commonly hold:

  • indicator outputs
  • literal thresholds
  • reusable boolean conditions

Indicator Values

trend_ma = sma.evaluate(close, 50) entry_ma = sma.evaluate(close, 20) rsi_value = rsi.evaluate(close, 14) atr_value = atr.evaluate(high, low, close, 14)

Reusable Conditions

trend_up = above(close, trend_ma) momentum_up = above(rsi_value, 55) pullback_zone = below(close, entry_ma) volatility_ok = above(atr_value, 0.0)

This is one of the cleanest habits in PyPScript:

  • calculate once
  • name the meaning
  • reuse the named condition in patterns

Build Conditions In Layers

Instead of writing one giant expression, build named layers.

Less readable:

patterns { above(close, sma.evaluate(close, 50)) and above(rsi.evaluate(close, 14), 55) and cross(close, sma.evaluate(close, 20)) -> UP(confidence: 0.85) default -> HOLD(confidence: 0.95) }

Better:

trend_ma = sma.evaluate(close, 50) entry_ma = sma.evaluate(close, 20) rsi_value = rsi.evaluate(close, 14) trend_up = above(close, trend_ma) momentum_up = above(rsi_value, 55) entry_reclaim = cross(close, entry_ma) patterns { trend_up and momentum_up and entry_reclaim -> UP(confidence: 0.85) default -> HOLD(confidence: 0.95) }

Naming Conventions

Prefer names that explain meaning, not implementation noise.

Good:

trend_ma fast_ma slow_ma trend_up trend_down momentum_up breakout_ready volatility_ok

Weak:

x1 calc2 signal_thing my_var temp

Distinguish Measurements From Conditions

A useful pattern is to name numeric series and boolean conditions differently.

Numeric series:

rsi_value = rsi.evaluate(close, 14) atr_value = atr.evaluate(high, low, close, 14) trend_ma = sma.evaluate(close, 50)

Boolean conditions:

rsi_bullish = above(rsi_value, 55) volatility_ok = above(atr_value, 0.0) price_above_trend = above(close, trend_ma)

That keeps the script mentally clean.

Use Variables To Express Market Logic

This:

price_above_trend = above(close, trend_ma) momentum_confirmed = above(rsi_value, 55)

is much easier to review than:

above(close, trend_ma) and above(rsi_value, 55)

both in code review and later when you revisit the strategy.

Reusing Variables Across Multiple Outcomes

Variables help when long and short logic share common pieces.

fast_ma = sma.evaluate(close, 20) slow_ma = sma.evaluate(close, 50) rsi_value = rsi.evaluate(close, 14) trend_up = above(fast_ma, slow_ma) trend_down = below(fast_ma, slow_ma) momentum_up = above(rsi_value, 55) momentum_down = below(rsi_value, 45) patterns { trend_up and momentum_up -> UP(confidence: 0.82) trend_down and momentum_down -> DOWN(confidence: 0.82) default -> HOLD(confidence: 0.95) }

Variables In Config Context

Pair and timeframe are part of the environment, and config sets what the strategy targets.

config { pairs: ["XAUUSD"] timeframes: ["1m"] }

Keep the script consistent with the markets it is written for. Do not call a script gold_scalper and then leave the config vague.

Common Mistakes

1. Recomputing The Same Thing Repeatedly

Avoid:

patterns { above(close, sma.evaluate(close, 50)) -> UP(confidence: 0.70) below(close, sma.evaluate(close, 50)) -> DOWN(confidence: 0.70) default -> HOLD(confidence: 0.95) }

Better:

trend_ma = sma.evaluate(close, 50) patterns { above(close, trend_ma) -> UP(confidence: 0.70) below(close, trend_ma) -> DOWN(confidence: 0.70) default -> HOLD(confidence: 0.95) }

2. Naming A Condition Like A Number

Avoid:

rsi_55 = above(rsi_value, 55)

Better:

momentum_up = above(rsi_value, 55)

3. Stuffing Everything Into patterns

Avoid building unreadable one-liners when named variables would make intent obvious.

A Clean Example

#!pyp/1.0 engine: pyp-1.0 import indicators.sma import indicators.rsi import indicators.atr import functions.above import functions.below import functions.cross strategy "clear_variables" { fast_ma = sma.evaluate(close, 20) slow_ma = sma.evaluate(close, 50) rsi_value = rsi.evaluate(close, 14) atr_value = atr.evaluate(high, low, close, 14) trend_up = above(fast_ma, slow_ma) trend_down = below(fast_ma, slow_ma) long_momentum = above(rsi_value, 55) short_momentum = below(rsi_value, 45) volatility_ok = above(atr_value, 0.0) long_trigger = cross(close, fast_ma) short_trigger = cross(fast_ma, close) patterns { trend_up and long_momentum and long_trigger and volatility_ok -> UP(confidence: 0.84) trend_down and short_momentum and short_trigger and volatility_ok -> DOWN(confidence: 0.84) default -> HOLD(confidence: 0.96) } }

Rule Of Thumb

If a non-programmer trader can read your variable names and roughly explain what the script is doing, your naming is good.

If not, simplify it.


PREVIOUS
← Syntax Reference
NEXT
Pattern Matching →

Last updated: February 2026

Edit this page on GitHub