ATR based exit strategy
Author: hsidhu88
Creation Date: 3/4/2011 9:38 AM

#### hsidhu88

#1
Could someone help me write the following ATR based Exit strategy?

Exit Strategy

If EntryPrice + ATR*3 then sell with a trailing stop of 0.5%
For example, Entry Price = 50; ATR = \$.25 then input a sell order at \$50.75 and sell at \$50.49 or higher (depending on how the price moves up)

If EntryPrice - ATR*3 then sell
For example, Entry Price = 50; ATR = \$.25 then input a sell order at \$40.25 and sell at \$40.75

#2
CODE:

#### hsidhu88

#3
Thank you for a prompt response.

Could you please explain # 5 in the following:
DataSeries atr = ATR.Series(Bars, 5);

PlotStops();

Could you please explain # 20 in the following:
for(int bar = 20; bar < Bars.Count; bar++

#### hsidhu88

#4
Also,

How can we adjust scale in the code?
For example, when backtesting, I can select a scale of daily, weekly, 60 minutes, 30 minutes etc. When backtesting, say at 60 min scale, I would like to calculate ATR at a daily scale, how can I do that.
Moreover, I would like to exit my positions while checking for exit conditions on a "tick" scale.

#### Eugene

#5
QUOTE:
Could you please explain # 5 in the following:

Welcome to the Wealth-Lab Wiki > Standard Indicators > ATR. There you'll see each indicator with their parameters documented.
QUOTE:
Could you please explain # 20 in the following:

* Wiki Knowledge Base > Bars, Loops, and Bar + 1

QUOTE:
How can we adjust scale in the code?

* WealthScript Guide > Multi-Time Frame Analysis
* QuickRef (hit F11) > Time Frames.
QUOTE:
Moreover, I would like to exit my positions while checking for exit conditions on a "tick" scale.

Neither Fidelity provides tick-based static data, nor it makes great sense to exit on a tick/second scale:

Wiki FAQ > Is it necessary to have access to intra-bar tick data to daytrade with Wealth-Lab?

#### hsidhu88

#6
I will run the strategy at a 60 min scale. But I would like to exit by checking "forming bars"... not check prices at the end of 60 min but check it as frequently as I can. You earlier suggested, I can't do it at every tick (is that right?). If not every tick, could I check it every 1 min.

#### Eugene

#7
Use 1-minute data as the basis scale, make the necessary calculations after SetScaleCompressed( 60 ), then trade on the basis time scale after RestoreScale(). See more code examples in the WealthScript Programming Guide > Multi-Time Frame Analysis.

#### hsidhu88

#8
I have the following code. I cut and pasted from different strategies..so I am sure there are some inconsistencies. Please help.
Strategy is:
*************
Entry:
If MACD and Bollinger and Stoch conditions are true then
Exit:
If EntryPrice + ATR*3 then sell with a trailing stop of 0.5%
else if EntryPrice - ATR*3 then sell
else if the price goes up by 3% then sell with a trailing stop of 0.25%
else if the price goes down by 2.75% then sell if price goes down another 0.25%
*************

I think I have most of the code in place but few things are missing. Could you also explain the items that are underlined? I also want to check my exit conditions every 1 min but entry is based on 60 min. You have given me some information previously..but I am not sure how to integrate that.
Please review the code below... Thanks a million.

CODE:

#### Eugene

#9
QUOTE:
You have given me some information previously..but I am not sure how to integrate that.

Yes I did but have you experimented with the code examples there? I couldn't see a single attempt to integrate them in your code. If you "also want to check my exit conditions every 1 min but entry is based on 60 min", then I also couldn't find it in your exit rules. As you understand, clear and unambiguous rules are required before coding anything. Please review your rules and expand them; for example, does it mean that the ATR is from 60-minute scale but the indicators are calculated on 1-min scale?
QUOTE:

You could find the answer in the QuickRef, the function is documented there.
QUOTE:
Group2

This is a FAQ: After generating strategy code with "View Strategy Code", there are strings like "Group1" and "Group1|". What do they mean?
QUOTE:
>>>>>>>>>>>>>>>>>>>>>

Hint: Just use the CODE button to wrap your code blocks in between a pair of CODE tags (next to Bold,Italic... CODE,IMG).

#### hsidhu88

#10
I would like to
- check entry conditions BB, Stoch, MACD at 60 min bar;
- check ATR at daily interval and
- exit at 1 min bar or every tick.

I ran the back-test at 1 min bar.

CODE:

#### Eugene

#11
Good attempt. A few notes:

1. The compressed DataSeries have to be synchronized before e.g. plotting.
2. Move the Daily ATR code block out of the trading loop.
3. Same for PlotStops.
4. Placement of AtMarket orders above AtStop orders is suggested.
5. No need to use AtClose orders with 1-min intraday data.

CODE:

#### hsidhu88

#12
Thanks.

When I ran this strategy, I see only "ATR Stop" show up under Exit Name under Trades tab. There are other trades with Exit Name blank, although I have put in a description for every exit.

Moreover, when I changed aATR and bATR values to 100, a scenario a position is EXTREMELY unlikely to hit, I still see a lot of "ATR Stop" trades.

#### Eugene

#13
Just a couple of hints to aid in your debugging:

1. the compressed daily ATR is OK (not to blame)
2. I see other exits e.g. "Sell Trailing Stop" (try other DataSets)

#### hsidhu88

#14
How do I debug? Insert PrintDebug statements??? I tried that... I ended up having no trades

CODE:

#### Eugene

#15
PrintDebug statements can't affect trade generation per se (unless your code flow got broken).

If you prefer, there's more ways to skin a cat: How can I debug my trading strategies in Wealth-Lab? and Debugging a Strategy with Visual Studio Express or SharpDevelop.

#### hsidhu88

#16
I have been getting these errors when I run the strategy.

CODE:

#### Eugene

#17
See: KB > Errors | Strategy > Index was out of range in the Wealth-Lab Wiki

#### hsidhu88

#18
I read through the Wiki... what am I doing wrong in the code?

I am currently using the strategy to back-test. But once I finalize a strategy I would like to turn on Auto-Trading. I am already set up for that. Would I need to make any changes at that time? Ex. would the following for loop still valid?
CODE:

Is Index was out of range error caused by this for loop statement?

#### Eugene

#19
QUOTE:
Ex. would the following for loop still valid?

Of course.
QUOTE:
I read through the Wiki... what am I doing wrong in the code?

Firstly, I do not know what you are doing in the code.

Regarding my code (see above # 3/10/2011 4:57 AM), then suggestion #2 may apply:
QUOTE:
* accessing the data that does not exist. Example: your DataSet contains the price data for a symbol that stopped trading, and you select the data range that goes beyond that date, and do not account for this fact in your Strategy.

I think this is your next step at debugging.

#### hsidhu88

#20
I am running back-test on 1 min bar.

CODE:

In the if statement above, in atr[bar], I think the barInterval is 1 min..but I want to check the condition against daily ATR.

-------

Also I would write a function that I can call from any strategy? Could I create my own class MyClass and incorporate that into WealthLab code?

#### Eugene

#21
QUOTE:
In the if statement above, in atr[bar], I think the barInterval is 1 min..

No, this is Daily ATR. See my comment above from 3/10/2011 11:25 AM.
QUOTE:
Also I would write a function that I can call from any strategy? Could I create my own class MyClass and incorporate that into WealthLab code?

This is a FAQ: Is there a way to reuse a function in Strategies? Is it possible to create a library of reusable functions?

#### hsidhu88

#22
I want to use earnings date in my strategy.

The write up suggests the following:
...With a "using" reference to Community.Components, access EarningsDate methods (below) by direct calls as showing in the Example...

But when I include the reference ..
Using Community.Components
the program doesn't recognize Community and doesn't compile.

#### Eugene

#23
Install the Community Components library (Extensions section of this site) and restart WL6.

#### hsidhu88

#24
How can I check Ask and Bid before taking a position?

#25

#### hsidhu88

#26
How do you cancel an order?
Is there any way you can change (cancel and place) a live (cover) order?

#### hsidhu88

#27
More specifically, is it possible to change setTrailingStop parameters (like pullback etc) after a cover order is placed?

#### Cone

#28
QUOTE:
How do you cancel an order?

Don't execute it on the next bar.

QUOTE:
Is there any way you can change (cancel and place) a live (cover) order?
If the strategy changes the stop or limit price on a subsequent bar, then the previous order is canceled and replaced with the new order.

Manually, you can select the order and click "Cancel/Replace Seleted" in the toolbar.

#### hsidhu88

#29
If a setTrailingStop is placed with a pullback of 5%
then price moves up or down and now we want to change the pullback to 6%.
All we have to do is place the order again...Right?

#### hsidhu88

#30
How do you "Don't execute it on the next bar"?

#### Cone

#31
CODE:

Just see almost any strategy ever published. You execute a signal (BuyAt, ExitAt, etc.) based on conditional logic. If the condition is false, the signal is not executed.

Look, just like you stated, "If a setTrailingStop is placed with... then price moves up or down and now we want...". That's exactly how code operates - if (check something) [then] do something [else] do something else.

#### hsidhu88

#32
After I run a back test, in the Trades report... can I add/delete more columns...specifically some "comments" or "description" columns

#33
No.

#### hsidhu88

#34
how do you capture unrealized gains/loss in an active position?

#### Cone

#35
See QuickRef (F11) > Position Object
> MAEAsOfBarPercent
> MFEAsOfBarPercent
> NetProfitAsOfBarPercent

Don't use "non" Percent measures in the trading script since dollar amounts will be based on a 1-share Position there. Those dollar-based properties are there to be used by Visualizers, PosSizers, etc.

That said, an exception is using the "WealthScript Override (SetShareSize)" option. By performing the sizing operation in the script itself, the dollar-based MAE/MFE/NetProfit values should be accurate in the trading script - though I don't think it includes commission costs.

#### hsidhu88

#36
How do I determine number of shares in my position? I think position.shares also always returns 1.

#### hsidhu88

#37
how do you use WealthScript Override (SetShareSize) in the code?

#### Eugene

#38
The thread has got too far away from "Trading Strategies" (i.e. discussing trading techniques) with these various questions on WL6 features, daytrading and WealthScript. Please consider posting them in a new thread (or if you come up with non-related questions, in new threads) that we would then move to a proper subforum. Thanks.