作者:Alexander Elder

Trading for a Living — Complete Implementation Specification

Based on Alexander Elder, Trading for a Living: Psychology, Trading Tactics, Money Management (1993)


Table of Contents

  1. Overview
  2. Individual Psychology
  3. Crowd Psychology and Market Dynamics
  4. Classical Chart Analysis
  5. Computerized Technical Analysis — Indicator Suite
  6. Volume and Open Interest
  7. The Triple Screen Trading System — Original Formulation
  8. The Impulse System — Foundational Concept
  9. Money Management — The 2% and 6% Rules
  10. Record Keeping and the Trading Journal
  11. Practical Trading Rules and Common Mistakes
  12. Complete Trade Lifecycle Example — Triple Screen in Action
  13. Implementation Pseudocode
  14. Key Quotes

1. Overview

1.1 Context and Significance

Trading for a Living is Alexander Elder's foundational work, published in 1993. Elder — a psychiatrist who emigrated from the Soviet Union in 1974 and discovered trading through the financial markets of New York — brings an unusual dual expertise: clinical understanding of human behavior and years of practical trading experience. This combination gives the book a dimension absent from purely technical works. It is not just a book about what to trade; it is a book about why traders fail and how to restructure oneself to stop failing.

The book's central argument is that trading success depends on mastering three domains simultaneously — what Elder later formalized as the Three M's: Mind (individual psychology and discipline), Method (technical analysis and trading systems), and Money (risk management and capital preservation). Most traders focus exclusively on method — hunting for the perfect indicator or system — while neglecting the psychology and money management that determine whether any system can be traded profitably.

1.2 The Three M's — Structural Architecture

Domain Core Question Consequence of Neglect
Mind Can I execute my plan without emotional interference? Self-sabotage, overtrading, revenge trading, paralysis
Method Do I have a tested edge in reading market behavior? Random entries, no repeatable process, slow capital drain
Money Can I survive a string of losses and still trade tomorrow? Catastrophic drawdowns, account destruction, forced exit

Elder's thesis: the weakest of the three determines the trader's outcome. A brilliant analyst with poor discipline will overtrade and give back profits. A disciplined trader with no analytical method will slowly lose to commissions and slippage. A methodical, disciplined trader with no risk controls will be destroyed by a single catastrophic event.

1.3 What Distinguishes This Book

Unlike Elder's later Come Into My Trading Room (2002), which refines and extends these ideas into a structured course, Trading for a Living is the original exposition. Its unique contributions include:


2. Individual Psychology

2.1 Why Psychology Comes First

Elder devotes the first major section of the book to psychology — before any discussion of charts or indicators. This ordering is deliberate. His psychiatric experience convinced him that the primary reason traders fail is not lack of knowledge but lack of self-mastery. The market is a uniquely efficient environment for exposing psychological weakness: every flaw in thinking, every emotional vulnerability, every self-destructive tendency is immediately punished with financial loss.

2.2 The Need to Trade

Many people are drawn to trading for reasons that virtually guarantee failure:

Elder's warning: examine your own motivation honestly. If the primary draw is excitement rather than profit, you are a gambler in disguise. Gambling feels identical to trading except for one detail — the gambler has no edge.

2.3 Self-Destructive Behavior in Trading

Drawing on his psychiatric training, Elder identifies several patterns of self-destruction that recur among traders:

Elder's prescription:

  1. Awareness. Keep a trading diary that records emotional states alongside trades. Look for patterns: "Do I always make my worst trades on Mondays? After a big win? When I'm bored?"
  2. Rules as protection from yourself. Written rules — entry criteria, stop placement, position sizing — are not just analytical tools; they are psychological armor. When emotions surge, the rules provide an external structure that the trader can follow mechanically.
  3. Treat trading as a business. A business owner doesn't slam the door in fury when a customer returns a product. Losses are a cost of doing business, not a personal affront.

2.4 Trading Addiction

Elder draws an explicit parallel between trading and addictive behavior:

The test Elder proposes: Can you stop trading for a month without significant psychological distress? If not, the behavior has moved from professional activity to compulsion.

The remedy: Treat it the same way addiction is treated in clinical practice. Acknowledge the problem. Establish strict external controls (money management rules, maximum trade frequency). Seek accountability (a trading partner, a mentor, a trading group that reviews results).

2.5 Emotional Traps During a Trade

Elder catalogs the specific emotional states that distort decision-making at each stage of a trade:

Stage Dangerous Emotion Behavioral Result
Before entry Fear of missing out (FOMO) Chasing price, entering without a setup
At entry Greed, overconfidence Position too large, stop too tight or absent
While holding a winner Greed, euphoria Moving target higher and higher, failing to take partial profits
While holding a loser Hope, denial Moving stop lower, averaging down, ignoring the evidence
At exit Regret regardless of outcome After a win: "I should have held longer." After a loss: "I should have cut sooner." Both lead to worse decisions on the next trade.

The antidote: Pre-commit to the plan. Write down entry, stop, and target before entering. The only decision during the trade is whether conditions have changed enough to invalidate the original analysis — not whether you feel like holding.


3. Crowd Psychology and Market Dynamics

3.1 Why Crowds Matter in Trading

Elder argues that understanding crowd psychology is essential because price is determined by crowd behavior, not by individual analysis. Technical analysis works not because chart patterns have mystical predictive power, but because they reflect the emotional footprints of crowds acting under the influence of fear and greed.

A market price at any given moment represents the consensus of all participants. When that consensus shifts — when the crowd's mood changes — price moves. The trader's job is to detect shifts in crowd sentiment before they are fully reflected in price.

3.2 How Crowds Form in Markets

A crowd forms when individuals surrender their independence and adopt the group's emotional state. In markets, this happens through:

3.3 Characteristics of Market Crowds

Elder identifies several properties of crowds that explain market behavior:

3.4 The Trader vs. the Crowd

Elder's central psychological requirement: the trader must stand apart from the crowd. This does not mean always being contrarian — fighting every trend is as foolish as following every trend. It means maintaining the capacity for independent judgment even when surrounded by emotional consensus.

Practical techniques:


4. Classical Chart Analysis

4.1 Trends — The Foundation

A trend exists when prices move persistently in one direction. Elder defines trends operationally:

Critical principle: Trends exist on every timeframe simultaneously, and they frequently conflict. A stock can be in a daily uptrend within a weekly downtrend. The Triple Screen system resolves these conflicts by assigning different roles to different timeframes.

4.2 Trendlines

A trendline connects two or more significant points:

Elder's rules for trendlines:

  1. A trendline requires at least two points to draw and three to confirm.
  2. A steeper trendline is less reliable than a shallow one. Steep trendlines are easily broken.
  3. The significance of a trendline increases with its length (number of touches) and its slope (shallower is more significant).
  4. Volume should increase when price approaches a trendline and bounces — this confirms the line's validity.
  5. A break of a well-established trendline is a significant event. It does not necessarily mean reversal (it may mean deceleration into a range), but it means the existing trend's character has changed.

4.3 Gaps

Gaps are blank spaces on a bar chart where no trading occurred. Elder classifies them:

Trading rule: Trade in the direction of breakaway and continuation gaps. Be cautious after exhaustion gaps. Do not trade common gaps.

4.4 Chart Patterns

Elder covers the classical chart patterns, emphasizing that they work because they reflect crowd psychology:

Reversal patterns (signal a trend change):

Continuation patterns (signal a pause before the trend resumes):

Elder's overarching rule on patterns: Never trade a pattern in isolation. Patterns are most reliable when confirmed by indicators and when they appear in the direction of the higher-timeframe trend (per Triple Screen).


5. Computerized Technical Analysis — Indicator Suite

5.1 Moving Averages

Moving averages smooth price data to reveal the underlying trend. Elder covers three types:

Key EMA applications:

Period Timeframe Role
13-day EMA Daily Primary trend filter; slope is a key signal
26-day EMA Daily Secondary trend filter; the "value zone" between 13 and 26 EMAs
13-week EMA Weekly Long-term trend context for Triple Screen

Trading rules:

5.2 MACD and MACD Histogram

The Moving Average Convergence-Divergence is a trend-following momentum indicator. Elder considers the MACD histogram — not the MACD lines themselves — to be the more important component.

Calculation:

MACD Line      = EMA(12) - EMA(26)       [the "fast" line]
Signal Line    = EMA(9) of MACD Line     [the "slow" line]
MACD Histogram = MACD Line - Signal Line [the difference between the two]

The MACD Lines — interpretation:

The MACD Histogram — Elder's primary focus:

Critical nuance: The MACD histogram's slope on the weekly chart is the primary filter for Screen 1 of the Triple Screen system. This is the single most important use of any indicator in Elder's framework.

5.3 The Directional System (ADX, +DI, -DI)

The Directional System, developed by J. Welles Wilder, measures both the direction and the strength of a trend.

Components:

Interpretation:

Elder's use of ADX: Primarily as a filter. Before applying trend-following indicators (MACD, moving averages), check ADX. If ADX is low and flat, switch to oscillators. If ADX is high and rising, use trend-following methods. This is not a standalone trading system but a meta-indicator that tells you which type of tool to use.

5.4 Momentum and Rate of Change (ROC)

Momentum = Today's Close - Close N periods ago Rate of Change = (Today's Close / Close N periods ago) x 100

Both measure the velocity of price change. Elder prefers ROC because it normalizes across different price levels.

Interpretation:

Elder's assessment: Momentum/ROC is useful as confirmation but less reliable as a primary signal generator compared to MACD histogram or Stochastic.

5.5 Williams %R

Developed by Larry Williams, %R measures where the current close sits within the recent range.

Calculation:

%R = (Highest High(N) - Close) / (Highest High(N) - Lowest Low(N)) × (-100)

Typical period: 7 or 14 days. The result ranges from 0 to -100.

Interpretation:

Failure swings: When %R reaches overbought territory but fails to reach it on the next rally (in an uptrend), this "failure swing" warns that the trend is weakening.

5.6 Stochastic Oscillator

Developed by George Lane, the Stochastic measures the position of the close relative to the recent range, similar to %R but with smoothing.

Calculation:

%K (fast) = (Close - Lowest Low(N)) / (Highest High(N) - Lowest Low(N)) × 100
%D (slow) = SMA(3) of %K
Slow %K   = %D
Slow %D   = SMA(3) of Slow %K

Elder recommends the slow Stochastic (Slow %K and Slow %D) to reduce noise.

Interpretation:

Elder's application: The Stochastic is one of the recommended oscillators for Screen 2 of the Triple Screen system. When the weekly trend is up and the daily Stochastic drops into oversold territory, this identifies a pullback buying opportunity within the larger uptrend.

5.7 Relative Strength Index (RSI)

Developed by J. Welles Wilder, RSI measures the ratio of average upward price change to average downward price change.

Calculation:

RS  = Average Gain over N periods / Average Loss over N periods
RSI = 100 - (100 / (1 + RS))

Typical period: 14 (Wilder's original) or 7 (for more sensitivity, which Elder sometimes prefers).

Interpretation:

Elder's assessment: RSI is a reliable, well-established oscillator but Elder does not use it as his primary tool for Screen 2. He considers it roughly equivalent to the Stochastic for that purpose, with the Force Index (introduced in Come Into My Trading Room) eventually becoming his preferred Screen 2 tool.


6. Volume and Open Interest

6.1 Volume as Confirmation

Volume measures the intensity of commitment behind a price move. Elder treats volume as the second most important data after price itself.

Core rules:

6.2 Volume Spikes

Extremely high volume days (2x or more above the recent average) signal climactic events:

In both cases, the climactic volume often marks the terminal point of the trend.

6.3 Open Interest (Futures Markets)

Open interest measures the total number of outstanding contracts in a futures market. Elder's rules:

Combined reading: The strongest bullish setup is rising price + rising volume + rising open interest. The strongest bearish setup is falling price + rising volume + rising open interest.


7. The Triple Screen Trading System — Original Formulation

7.1 The Core Insight

The Triple Screen system was first published by Elder in Futures magazine in 1985 and fully elaborated in this book. The system's central insight is that every indicator gives useful information only part of the time, and using a single indicator on a single timeframe produces an unacceptable rate of false signals. By requiring agreement across three screens — each analyzing a different dimension — the system dramatically filters out noise.

The three screens are applied sequentially, as gates: if the market fails any screen, the trade is rejected.

7.2 Timeframe Selection

Elder insists that the trader begin by choosing a favorite timeframe — the one that matches the trader's personality and schedule. This becomes the intermediate timeframe. The other two are derived using a factor-of-five multiplier:

Trader Type Screen 1 (Trend) Screen 2 (Signal) Screen 3 (Entry)
Position trader Monthly Weekly Daily
Swing trader Weekly Daily Intraday (4h/1h)
Day trader Daily Hourly (60-min) 10-15 minute

The most thoroughly discussed combination in the 1993 book is Weekly / Daily / Intraday for swing traders.

7.3 Screen 1 — Identify the Tide (Weekly MACD Histogram Slope)

Purpose: Determine the dominant trend on the timeframe one level above the trader's operating timeframe. Screen 1 is a directional filter — it tells you whether to look for longs, shorts, or neither.

Primary indicator: The slope of the weekly MACD histogram.

Rules:

Why MACD histogram slope, not MACD line crossover? The MACD line crossover is a lagging signal — by the time the fast line crosses the slow line, a significant portion of the move has already occurred. The histogram's slope changes direction before the lines cross, providing an earlier indication of shifting momentum.

The most powerful Screen 1 signal: When the weekly MACD histogram makes a divergence (price makes a new extreme but the histogram does not) and then ticks in the expected direction, this represents the strongest possible identification of a trend change.

7.4 Screen 2 — Identify the Wave (Daily Oscillator Against the Trend)

Purpose: Find a counter-trend move on the daily chart — a wave against the weekly tide — that provides a favorable entry price in the direction of the larger trend.

Core principle: Screen 2 uses oscillators, but it uses them against their usual interpretation. When the weekly trend is up, Screen 2 looks for daily oversold readings (not overbought). When the weekly trend is down, Screen 2 looks for daily overbought readings.

Recommended oscillators for Screen 2 (original 1993 formulation):

  1. Stochastic oscillator — Buy when the daily Stochastic drops below 30 (while the weekly trend is up). Sell short when it rises above 70 (while the weekly trend is down).
  2. Williams %R — Buy when daily %R drops below -80 in a weekly uptrend. Sell when it rises above -20 in a weekly downtrend.
  3. RSI — Buy when RSI drops below 30 in a weekly uptrend. Sell when RSI rises above 70 in a weekly downtrend.
  4. MACD histogram on the daily chart — Buy when the daily histogram ticks up from negative territory in a weekly uptrend. Sell when it ticks down from positive territory in a weekly downtrend.

Key rule: Screen 2 identifies the zone for entry, not the precise price. The precise entry comes from Screen 3.

7.5 Screen 3 — Precision Entry (Trailing Buy/Sell Stop)

Purpose: Pinpoint the exact entry price using a mechanical technique that requires no indicator. Screen 3 uses trailing buy-stops (for longs) and trailing sell-stops (for shorts) to enter only when price confirms the expected direction.

Rules for LONG trades (weekly trend up, daily oscillator oversold):

  1. Place a buy-stop order one tick above the high of the current day's bar.
  2. If the order is triggered the next day, you are long. Place a protective stop below the low of the current day or the previous day, whichever is lower.
  3. If the order is not triggered (price moved lower instead), lower the buy-stop to one tick above the new day's high. Continue trailing the buy-stop lower each day.
  4. If the weekly trend reverses (Screen 1 turns bearish) before the buy-stop is triggered, cancel the order. The setup is invalidated.

Rules for SHORT trades (weekly trend down, daily oscillator overbought):

  1. Place a sell-stop order one tick below the low of the current day's bar.
  2. If triggered, you are short. Place a protective stop above the high of the current day or the previous day, whichever is higher.
  3. If not triggered, raise the sell-stop to one tick below the new day's low. Continue trailing.
  4. If Screen 1 reverses, cancel the order.

Why this works: The trailing stop ensures that you enter only when price begins moving in the expected direction. If the counter-trend move deepens instead of reversing, the stop trails tighter and tighter until either the trend resumes (triggering entry at a better price) or the weekly signal changes (canceling the setup entirely). This eliminates the problem of catching a falling knife.

7.6 Exit Rules

Elder's original exit framework is less formalized than his later work but establishes the essential principles:


8. The Impulse System — Foundational Concept

8.1 Origins

While the Impulse System is more fully developed in Come Into My Trading Room (2002), its conceptual seeds appear in Trading for a Living. Elder observes that trends alternate between impulse phases (when price and momentum move together) and corrective phases (when they diverge). The idea that a trader should distinguish between these phases — and trade aggressively during impulse, cautiously during correction — is present in the 1993 book even though the formal color-coded system came later.

8.2 Core Logic

The Impulse System combines two measurements:

When both agree, an impulse is in force. When they disagree, the market is in a corrective or transitional phase.

EMA Slope MACD-H Slope Impulse State Action
Rising Rising Bullish impulse Buy or hold longs; do NOT short
Falling Falling Bearish impulse Sell short or hold shorts; do NOT buy
Mixed Mixed No impulse (neutral) Either direction permitted; exercise caution

8.3 Practical Application

In the 1993 formulation, Elder uses this logic informally:


9. Money Management — The 2% and 6% Rules

9.1 The Purpose of Money Management

Elder's blunt statement: the goal of money management is survival. A trader who risks too much on any single trade or allows losses to accumulate unchecked will eventually be destroyed, no matter how good the trading method. Money management is not about maximizing returns; it is about ensuring that no series of losses — however improbable — can end the trader's career.

9.2 The 2% Rule — Maximum Risk Per Trade

Rule: Never risk more than 2% of your trading account equity on any single trade.

Calculation:

Maximum Dollar Risk = Account Equity × 0.02
Position Size       = Maximum Dollar Risk / (Entry Price - Stop Price)

Example:

Key principles:

9.3 The 6% Rule — Maximum Monthly Drawdown

Rule: Stop trading for the remainder of the month if total open risk plus closed losses for the month reach 6% of account equity.

Calculation:

Monthly Risk Budget = Account Equity (start of month) × 0.06
Current Usage       = Sum of closed losses this month + Sum of open risk on existing positions
If Current Usage >= Monthly Risk Budget → STOP TRADING until next month

Example:

Key principles:

9.4 The Interaction of the Two Rules

The 2% and 6% rules work as a layered defense:

With a 2% maximum per trade and a 6% monthly limit, the trader can take at most 3 full-risk trades before hitting the monthly cap — assuming all three are losers. This creates natural restraint against overtrading.


10. Record Keeping and the Trading Journal

10.1 Why Records Matter

Elder argues that most traders repeat the same mistakes because they do not systematically study their own behavior. The trading journal is the tool for turning experience into learning.

10.2 What to Record

For every trade:

Field Content
Date and instrument What was traded and when
Setup Which screen/signal triggered the trade (e.g., "Weekly MACD-H rising, daily Stochastic oversold")
Entry price and method Price, whether market/limit/stop, and why
Stop-loss Where and why
Target Where and why
Position size Number of shares/contracts and the 2% calculation
Exit price and reason Was the stop hit? Was the target reached? Did a signal change?
P&L Gross and net (after commissions)
Emotional state How did you feel before, during, and after the trade?
Mistakes Did you deviate from the plan? How?
Grade Rate the quality of the trade (not the outcome). An A-grade trade that lost money is better than a C-grade trade that profited by luck.

10.3 Periodic Review

Elder recommends weekly and monthly reviews:


11. Practical Trading Rules and Common Mistakes

11.1 Elder's Rules for Traders

  1. Decide that you are in the market for the long haul. Trading is a craft that takes years to master. The goal is to be trading well twenty years from now, not to make a killing this month.
  2. Learn as much as you can, but maintain skepticism. Question every guru, every system vendor, every "guaranteed" method.
  3. Do not be greedy. Greed leads to oversized positions and overstayed trades. The market is not going anywhere; there will always be another opportunity.
  4. Develop a trading plan and test it. Trade small while learning.
  5. Do not trade on tips. If someone else's analysis proves right, you will not know when to exit. If it proves wrong, you will not know when to cut.
  6. Do not overtrade. Quality of trades matters far more than quantity. Amateurs look for action; professionals wait for setups.
  7. Keep a journal. If you are not willing to study your own trading, you are not serious.
  8. Never blame others for your losses. Not the market, not your broker, not the news. You made the decision; you own the result.

11.2 Common Mistakes

Mistake Description Remedy
No stop-loss Entering without a predefined exit point for losses Never enter without a stop. Calculate it before the trade.
Moving stops against yourself Widening a stop to avoid being taken out This turns a controlled loss into an uncontrolled one. If the stop is right, let it work.
Averaging down Adding to a losing position hoping it will recover Adding to losers is a recipe for catastrophe. Add only to winners.
Overtrading Taking too many trades, often out of boredom or FOMO Restrict yourself to setups that meet all three screens.
Undercapitalization Trading with too little money, forcing oversized risk per trade Do not trade until you can risk 2% and still have a meaningful position.
Trading without a plan Entering on impulse, news, or tips Write the plan before market hours. Follow it during market hours.
Ignoring the weekly trend Taking daily signals against the weekly tide This is the most common technical error. Screen 1 exists to prevent it.
System hopping Abandoning a system after a few losses, searching for a new one Every system has losing periods. Give your system enough trades to demonstrate its edge.

12. Complete Trade Lifecycle Example — Triple Screen in Action

12.1 Setup — Weekly Analysis (Screen 1)

Instrument: Stock XYZ, closing at $45.00 on Friday.

Weekly MACD histogram: The histogram has been negative but is now ticking up — the current bar is less negative than the previous bar (-0.15 vs -0.28). The slope has turned upward.

Conclusion: The weekly tide is turning bullish. Screen 1 permits only long trades.

12.2 Signal — Daily Analysis (Screen 2)

Daily Stochastic (14, 3, 3): Slow %K = 18, Slow %D = 22. The Stochastic is in oversold territory (below 20-30).

Daily chart context: XYZ has pulled back from $47.50 to $44.80 over five days. The 13-day EMA is at $45.20 and still slightly rising. The pullback has brought the Stochastic into oversold territory while the weekly trend is turning up.

Conclusion: Screen 2 is triggered. A pullback within a nascent weekly uptrend has pushed the daily oscillator to oversold. This is a buying opportunity.

12.3 Entry — Trailing Buy Stop (Screen 3)

Monday: Day's high = $45.10, low = $44.60. Place a buy-stop at $45.15 (one tick above the high).

Tuesday: XYZ trades between $44.40 and $44.90. The buy-stop at $45.15 is not triggered. Lower the buy-stop to $44.95 (one tick above Tuesday's high).

Wednesday: XYZ opens at $44.70, trades up to $45.30. The buy-stop at $44.95 is triggered. We are now long at $44.95.

12.4 Stop-Loss and Position Sizing

Stop placement: Below Tuesday's low of $44.40 minus a buffer = $44.30.

Risk per share: $44.95 - $44.30 = $0.65.

Account equity: $50,000.

2% maximum risk: $50,000 × 0.02 = $1,000.

Position size: $1,000 / $0.65 = 1,538 shares. Round down to 1,500 shares.

Actual dollar risk: 1,500 × $0.65 = $975 (1.95% of equity).

12.5 Management and Exit

Week 1: XYZ rises to $46.50. The daily Stochastic rises to 55 — no longer oversold but not yet overbought. Hold.

Week 2: XYZ reaches $47.80. The daily Stochastic hits 82 — overbought. Move the stop to breakeven ($44.95). Open risk drops to zero, freeing up 6% budget.

Week 3: XYZ pulls back to $47.00, then rallies to $48.50. The weekly MACD histogram is now solidly positive with a rising slope. The daily Stochastic is overbought again at 78 but the weekly trend is strong. Tighten the stop to $47.00 (below the Week 2-3 pullback low).

Week 4: XYZ trades up to $49.20 but the weekly MACD histogram, while still positive, ticks down for the first time (current bar smaller than previous bar). Screen 1 is turning cautious. Exit at the market: $49.00.

Result: Entry $44.95, Exit $49.00. Profit per share = $4.05. Total profit = 1,500 × $4.05 = $6,075 (12.2% return on equity). Risk-reward ratio achieved: 4.05 / 0.65 = 6.2:1.

12.6 Journal Entry

Date:        Week of [trade dates]
Instrument:  XYZ Stock
Direction:   Long
Setup:       Triple Screen — Weekly MACD-H slope up, Daily Stochastic oversold
Entry:       $44.95 via trailing buy-stop (Screen 3)
Stop:        $44.30 (below Tuesday low minus buffer)
Target:      Open (managed by weekly MACD-H slope)
Size:        1,500 shares (1.95% risk)
Exit:        $49.00 — weekly MACD-H ticked down
P&L:         +$6,075 gross
Grade:       A — All three screens confirmed. Entry was patient (waited
             for trailing stop trigger). Stop was chart-based. Exit was
             rule-based (weekly signal change). No emotional deviations.
Emotion:     Felt FOMO on Monday when stop wasn't triggered. Resisted
             the urge to enter at market. Felt greedy at $49.20 wanting
             to hold for $50. Exited anyway per rules.

13. Implementation Pseudocode

13.1 Triple Screen Trading System

============================================================
TRIPLE SCREEN SYSTEM — Original Elder (1993) Formulation
============================================================

PARAMETERS:
  -- MACD settings (standard)
  macd_fast_period      = 12
  macd_slow_period      = 26
  macd_signal_period    = 9

  -- Oscillator settings for Screen 2
  stochastic_k_period   = 14
  stochastic_d_period   = 3
  stochastic_slowing    = 3
  williams_r_period     = 14
  rsi_period            = 14

  -- Overbought/oversold thresholds
  stoch_oversold        = 30
  stoch_overbought      = 70
  williams_oversold     = -80
  williams_overbought   = -20
  rsi_oversold          = 30
  rsi_overbought        = 70

  -- Entry
  entry_buffer_ticks    = 1

------------------------------------------------------------
SCREEN 1: Weekly Trend Filter (MACD Histogram Slope)
------------------------------------------------------------

FUNCTION weekly_trend(weekly_bars):
  macd_line   = EMA(weekly_close, macd_fast_period) -
                EMA(weekly_close, macd_slow_period)
  signal_line = EMA(macd_line, macd_signal_period)
  histogram   = macd_line - signal_line

  current_bar  = histogram[last]
  previous_bar = histogram[last - 1]

  IF current_bar > previous_bar:
    -- Weekly MACD histogram slope is UP
    -- Check for bullish divergence (strongest signal)
    IF price_made_lower_low(weekly_bars) AND
       histogram_made_higher_low(histogram):
      RETURN "STRONG_BULLISH"
    RETURN "BULLISH"

  ELSE IF current_bar < previous_bar:
    -- Weekly MACD histogram slope is DOWN
    IF price_made_higher_high(weekly_bars) AND
       histogram_made_lower_high(histogram):
      RETURN "STRONG_BEARISH"
    RETURN "BEARISH"

  ELSE:
    RETURN "NEUTRAL"

------------------------------------------------------------
SCREEN 2: Daily Oscillator (Counter-Trend Signal)
------------------------------------------------------------

FUNCTION daily_signal(daily_bars, weekly_direction, oscillator_choice):

  IF oscillator_choice == "STOCHASTIC":
    slow_k, slow_d = stochastic(daily_bars,
                                stoch_k_period,
                                stoch_d_period,
                                stochastic_slowing)
    oversold  = slow_k < stoch_oversold
    overbought = slow_k > stoch_overbought

  ELSE IF oscillator_choice == "WILLIAMS_R":
    wr = williams_r(daily_bars, williams_r_period)
    oversold  = wr < williams_oversold     -- below -80
    overbought = wr > williams_overbought  -- above -20

  ELSE IF oscillator_choice == "RSI":
    rsi_val = rsi(daily_bars, rsi_period)
    oversold  = rsi_val < rsi_oversold
    overbought = rsi_val > rsi_overbought

  ELSE IF oscillator_choice == "MACD_HISTOGRAM":
    hist = macd_histogram(daily_bars)
    oversold  = hist[last] < 0 AND hist[last] > hist[last - 1]
    overbought = hist[last] > 0 AND hist[last] < hist[last - 1]

  -- Apply counter-trend logic
  IF weekly_direction IN ("BULLISH", "STRONG_BULLISH"):
    IF oversold:
      RETURN "BUY_SIGNAL"
    RETURN "NO_SIGNAL"

  ELSE IF weekly_direction IN ("BEARISH", "STRONG_BEARISH"):
    IF overbought:
      RETURN "SELL_SIGNAL"
    RETURN "NO_SIGNAL"

  RETURN "NO_SIGNAL"

------------------------------------------------------------
SCREEN 3: Trailing Entry Stop
------------------------------------------------------------

FUNCTION manage_entry_stop(direction, daily_bars, existing_order):

  IF direction == "BUY_SIGNAL":
    new_stop_price = daily_bars[last].high + entry_buffer_ticks

    IF existing_order IS NULL:
      -- Place initial buy-stop
      RETURN create_buy_stop(new_stop_price)

    ELSE IF new_stop_price < existing_order.price:
      -- Trail the buy-stop lower (better price)
      RETURN modify_order(existing_order, new_stop_price)

    ELSE:
      -- Keep existing order (don't move stop higher)
      RETURN existing_order

  ELSE IF direction == "SELL_SIGNAL":
    new_stop_price = daily_bars[last].low - entry_buffer_ticks

    IF existing_order IS NULL:
      RETURN create_sell_stop(new_stop_price)

    ELSE IF new_stop_price > existing_order.price:
      -- Trail the sell-stop higher (better price)
      RETURN modify_order(existing_order, new_stop_price)

    ELSE:
      RETURN existing_order

------------------------------------------------------------
MAIN LOOP: Nightly Processing
------------------------------------------------------------

FUNCTION run_triple_screen(weekly_bars, daily_bars,
                           oscillator_choice, account):

  -- Step 1: Screen 1
  trend = weekly_trend(weekly_bars)

  IF trend == "NEUTRAL":
    cancel_pending_orders()
    RETURN "NO_TRADE — Weekly trend is neutral"

  -- Step 2: Screen 2
  signal = daily_signal(daily_bars, trend, oscillator_choice)

  IF signal == "NO_SIGNAL":
    -- If we had a pending entry order, check if weekly still valid
    IF pending_order EXISTS AND trend has reversed:
      cancel_pending_orders()
      RETURN "SETUP CANCELLED — Weekly trend reversed"
    RETURN "WAITING — No daily counter-trend signal yet"

  -- Step 3: Screen 3
  entry_order = manage_entry_stop(signal, daily_bars, pending_order)

  -- Step 4: Calculate position size if order exists
  IF entry_order IS NOT NULL:
    risk_per_share = calculate_stop_distance(signal, daily_bars)
    position_size  = position_sizer(account, risk_per_share)
    entry_order.quantity = position_size

  RETURN entry_order

13.2 Risk Manager — 2% and 6% Rules

============================================================
RISK MANAGER — Elder 2%/6% System
============================================================

PARAMETERS:
  max_risk_per_trade_pct = 0.02   -- 2% rule
  max_monthly_risk_pct   = 0.06   -- 6% rule

------------------------------------------------------------
2% RULE: Position Sizing
------------------------------------------------------------

FUNCTION position_sizer(account, risk_per_share):
  current_equity    = account.equity
  max_dollar_risk   = current_equity * max_risk_per_trade_pct

  IF risk_per_share <= 0:
    RETURN 0  -- Invalid: stop is at or above entry

  max_shares = FLOOR(max_dollar_risk / risk_per_share)

  -- Sanity checks
  IF max_shares <= 0:
    LOG "Trade rejected: stop too far for 2% rule"
    RETURN 0

  actual_risk = max_shares * risk_per_share
  actual_pct  = actual_risk / current_equity

  LOG "Position: {max_shares} shares, " +
      "Risk: ${actual_risk} ({actual_pct:.2%} of equity)"

  RETURN max_shares

------------------------------------------------------------
6% RULE: Monthly Drawdown Limit
------------------------------------------------------------

FUNCTION check_monthly_limit(account):
  month_start_equity = account.equity_at_month_start
  max_monthly_loss   = month_start_equity * max_monthly_risk_pct

  -- Sum all closed losses this month
  closed_losses = 0
  FOR EACH trade IN account.trades_this_month:
    IF trade.is_closed AND trade.pnl < 0:
      closed_losses += ABS(trade.pnl)

  -- Sum open risk on all current positions
  open_risk = 0
  FOR EACH position IN account.open_positions:
    per_share_risk = ABS(position.entry_price - position.stop_price)
    open_risk += per_share_risk * position.quantity

  total_risk_used = closed_losses + open_risk
  remaining_budget = max_monthly_loss - total_risk_used

  LOG "Monthly risk: ${total_risk_used} of " +
      "${max_monthly_loss} used ({total_risk_used/max_monthly_loss:.0%})"
  LOG "Remaining budget: ${remaining_budget}"

  IF total_risk_used >= max_monthly_loss:
    LOG "*** 6% RULE TRIGGERED — NO NEW TRADES THIS MONTH ***"
    RETURN {
      can_trade: FALSE,
      remaining_budget: 0,
      reason: "Monthly loss limit reached"
    }

  RETURN {
    can_trade: TRUE,
    remaining_budget: remaining_budget,
    max_new_trade_risk: MIN(remaining_budget,
                            account.equity * max_risk_per_trade_pct)
  }

------------------------------------------------------------
COMBINED RISK CHECK: Before Each New Trade
------------------------------------------------------------

FUNCTION approve_trade(account, entry_price, stop_price, direction):

  -- Step 1: 6% monthly check
  monthly = check_monthly_limit(account)
  IF NOT monthly.can_trade:
    RETURN REJECT("6% monthly limit reached. " +
                  "Stand aside until next month.")

  -- Step 2: 2% per-trade sizing
  IF direction == "LONG":
    risk_per_share = entry_price - stop_price
  ELSE:
    risk_per_share = stop_price - entry_price

  IF risk_per_share <= 0:
    RETURN REJECT("Invalid stop placement.")

  max_shares = position_sizer(account, risk_per_share)
  IF max_shares == 0:
    RETURN REJECT("Stop too wide for 2% rule at current equity.")

  -- Step 3: Ensure trade doesn't breach 6% limit
  trade_risk = max_shares * risk_per_share
  IF trade_risk > monthly.max_new_trade_risk:
    adjusted_shares = FLOOR(monthly.max_new_trade_risk / risk_per_share)
    IF adjusted_shares == 0:
      RETURN REJECT("Insufficient monthly budget for this trade.")
    max_shares = adjusted_shares
    trade_risk = max_shares * risk_per_share

  RETURN APPROVE({
    shares: max_shares,
    dollar_risk: trade_risk,
    risk_pct: trade_risk / account.equity,
    entry: entry_price,
    stop: stop_price,
    monthly_budget_after: monthly.remaining_budget - trade_risk
  })

13.3 Indicator Suite — Core Calculations

============================================================
INDICATOR SUITE — Elder's 1993 Toolkit
============================================================

------------------------------------------------------------
Exponential Moving Average
------------------------------------------------------------

FUNCTION ema(data, period):
  multiplier = 2.0 / (period + 1)
  result = [SMA(data[0:period])]  -- seed with SMA

  FOR i = period TO LENGTH(data) - 1:
    val = (data[i] - result[last]) * multiplier + result[last]
    result.APPEND(val)

  RETURN result

------------------------------------------------------------
MACD, Signal, Histogram
------------------------------------------------------------

FUNCTION macd_system(close_data):
  fast_ema   = ema(close_data, 12)
  slow_ema   = ema(close_data, 26)
  macd_line  = fast_ema - slow_ema       -- element-wise
  signal     = ema(macd_line, 9)
  histogram  = macd_line - signal        -- element-wise

  RETURN { macd: macd_line, signal: signal, histogram: histogram }

------------------------------------------------------------
Stochastic Oscillator (Slow)
------------------------------------------------------------

FUNCTION stochastic_slow(high, low, close, k_period, d_period, slowing):
  -- Raw %K
  raw_k = []
  FOR i = k_period - 1 TO LENGTH(close) - 1:
    hh = MAX(high[i - k_period + 1 : i + 1])
    ll = MIN(low[i - k_period + 1 : i + 1])
    IF hh == ll:
      raw_k.APPEND(50)
    ELSE:
      raw_k.APPEND((close[i] - ll) / (hh - ll) * 100)

  -- Slow %K = SMA of raw %K
  slow_k = SMA(raw_k, slowing)

  -- Slow %D = SMA of Slow %K
  slow_d = SMA(slow_k, d_period)

  RETURN { slow_k: slow_k, slow_d: slow_d }

------------------------------------------------------------
Williams %R
------------------------------------------------------------

FUNCTION williams_r(high, low, close, period):
  result = []
  FOR i = period - 1 TO LENGTH(close) - 1:
    hh = MAX(high[i - period + 1 : i + 1])
    ll = MIN(low[i - period + 1 : i + 1])
    IF hh == ll:
      result.APPEND(-50)
    ELSE:
      result.APPEND((hh - close[i]) / (hh - ll) * (-100))

  RETURN result

------------------------------------------------------------
Relative Strength Index
------------------------------------------------------------

FUNCTION rsi(close_data, period):
  gains = []
  losses = []

  FOR i = 1 TO LENGTH(close_data) - 1:
    change = close_data[i] - close_data[i - 1]
    IF change > 0:
      gains.APPEND(change)
      losses.APPEND(0)
    ELSE:
      gains.APPEND(0)
      losses.APPEND(ABS(change))

  -- First average: simple mean
  avg_gain = MEAN(gains[0:period])
  avg_loss = MEAN(losses[0:period])

  result = []
  IF avg_loss == 0:
    result.APPEND(100)
  ELSE:
    rs = avg_gain / avg_loss
    result.APPEND(100 - (100 / (1 + rs)))

  -- Subsequent: smoothed (Wilder's method)
  FOR i = period TO LENGTH(gains) - 1:
    avg_gain = (avg_gain * (period - 1) + gains[i]) / period
    avg_loss = (avg_loss * (period - 1) + losses[i]) / period
    IF avg_loss == 0:
      result.APPEND(100)
    ELSE:
      rs = avg_gain / avg_loss
      result.APPEND(100 - (100 / (1 + rs)))

  RETURN result

------------------------------------------------------------
Rate of Change (ROC)
------------------------------------------------------------

FUNCTION roc(close_data, period):
  result = []
  FOR i = period TO LENGTH(close_data) - 1:
    result.APPEND((close_data[i] / close_data[i - period] - 1) * 100)
  RETURN result

------------------------------------------------------------
Directional System (ADX, +DI, -DI) — Simplified
------------------------------------------------------------

FUNCTION directional_system(high, low, close, period):
  -- True Range
  tr = []
  plus_dm = []
  minus_dm = []

  FOR i = 1 TO LENGTH(close) - 1:
    h_l   = high[i] - low[i]
    h_pc  = ABS(high[i] - close[i-1])
    l_pc  = ABS(low[i] - close[i-1])
    tr.APPEND(MAX(h_l, h_pc, l_pc))

    up_move   = high[i] - high[i-1]
    down_move = low[i-1] - low[i]

    IF up_move > down_move AND up_move > 0:
      plus_dm.APPEND(up_move)
    ELSE:
      plus_dm.APPEND(0)

    IF down_move > up_move AND down_move > 0:
      minus_dm.APPEND(down_move)
    ELSE:
      minus_dm.APPEND(0)

  -- Smooth using Wilder's method (period-day smoothing)
  smoothed_tr       = wilder_smooth(tr, period)
  smoothed_plus_dm  = wilder_smooth(plus_dm, period)
  smoothed_minus_dm = wilder_smooth(minus_dm, period)

  -- +DI and -DI
  plus_di  = (smoothed_plus_dm / smoothed_tr) * 100
  minus_di = (smoothed_minus_dm / smoothed_tr) * 100

  -- DX and ADX
  dx = ABS(plus_di - minus_di) / (plus_di + minus_di) * 100
  adx = wilder_smooth(dx, period)

  RETURN { plus_di: plus_di, minus_di: minus_di, adx: adx }

------------------------------------------------------------
Impulse System (Proto-Version from 1993 Concepts)
------------------------------------------------------------

FUNCTION impulse_check(close_data):
  ema_13     = ema(close_data, 13)
  macd_data  = macd_system(close_data)
  hist       = macd_data.histogram

  ema_rising  = ema_13[last] > ema_13[last - 1]
  ema_falling = ema_13[last] < ema_13[last - 1]
  hist_rising  = hist[last] > hist[last - 1]
  hist_falling = hist[last] < hist[last - 1]

  IF ema_rising AND hist_rising:
    RETURN "BULLISH_IMPULSE"    -- Do not short
  ELSE IF ema_falling AND hist_falling:
    RETURN "BEARISH_IMPULSE"    -- Do not buy
  ELSE:
    RETURN "NEUTRAL"            -- Either direction OK, with caution

14. Key Quotes

"The goal of a successful trader is to make the best trades. Money is secondary."

This encapsulates Elder's process-over-outcome philosophy. Focus on the quality of decisions, and the money follows.

"The markets are set up so that most traders must lose money. The markets are a minus-sum game because of commissions and slippage."

A sobering reminder that trading is not a zero-sum game — it is a negative-sum game. The winners must overcome not only the losers' contributions but also the rake taken by the house.

"When you trade, you are competing against the sharpest minds in the world. The playing field is tilted against you by commissions and slippage. If good enough and work hard enough, you can overcome this handicap."

The standard is not "beating the average" but beating the very best participants, net of costs.

"An amateur looks at the screen and sees millions of dollars flickering. A professional sees a field of probabilities."

The shift from emotional perception (money) to analytical perception (probability) is the psychological transformation that separates winners from losers.

"Successful trading is based on the 3 M's — Mind, Method, and Money. Beginners focus on analysis, but professionals operate in a three-dimensional space."

The three-dimensional framework: most educational material addresses only method, leaving traders equipped with tools but lacking the psychological and financial architecture to use them.

"The amateur who is losing money keeps looking for advice. He asks his broker, reads newsletters, pays for hotlines. He gives one guru after another the power over his money."

Elder's critique of the guru-following mentality: outsourcing trading decisions means outsourcing accountability.

"A losing trader can do little to transform himself into a winning trader. A losing trader is not going to want to change. That is the kind of person he is."

The harshest statement in the book. Elder believes that the psychological patterns causing trading failure are deeply ingrained character traits that most people will not change. The few who do change are those willing to undertake genuine self-examination.

"You can be free. You can live and work anywhere in the world. You can be independent from routine and not answer to anybody. This is the life of a successful trader."

The aspirational vision that draws people to trading — but Elder spends the rest of the book explaining the immense difficulty of reaching this destination.

"The market does not know you exist. You cannot do anything to influence it. You can only control your behavior."

The foundation of Elder's psychological discipline: the only variable under the trader's control is the trader's own actions.

"Risk management is the cornerstone of survival. You can have the best system in the world, but if your risk management is poor, you will lose."

The explicit ranking: money management is not secondary to method — it is primary. A mediocre system with excellent risk management will outperform an excellent system with poor risk management.


This summary covers the original 1993 formulation of Elder's trading framework. For the refined and extended treatment — including the formal Impulse System, Force Index, Elder-ray, the Trader's Spreadsheet grading system, and updated Triple Screen indicator recommendations — see the companion summary of Come Into My Trading Room (2002).