Hi,
I have an old strategy that has already been converted from WL3 or 4 to WL6.
Can you help me transpose this to WL7?
I have an old strategy that has already been converted from WL3 or 4 to WL6.
Can you help me transpose this to WL7?
CODE:
using System; using System.Collections.Generic; using System.Text; using System.Drawing; using System.Threading; // Sleep() using System.Windows.Forms; using WealthLab; using WealthLab.Indicators; using finantic.TL; // WealthScriptTL namespace WealthLabCompile2 { class Strategy : WealthScriptTL { #region file ChartScript // start of prolog: This is a comment at the top of each file public new void Init(){ base.Init(); //optional settings UseUpdatedEMA(true); SetStdDevCalculation(StdDevCalculation.Population); } // end of prolog: This is a comment at the top of each file /** (*Indicators... I~SMA1~SMA~0~#Close,90~900~#Thick~ *) */ public /** (*Indicators... I~SMA1~SMA~0~#Close,90~900~#Thick~ *) */ int Bar = 0; public bool shortOption = false; public int avg, LastLongPosition, LastShortPosition = 0; public double tolerance, avgValue, avgOverValue, avgUnderValue = 0.0; public double newAvgOverValue, newAvgUnderValue = 0.0; public int avgSeries, avgOverSeries, avgUnderSeries = 0; public int curDay = 0; public bool condition = false; /** This method contains the meat of your script, i.e, any statements that are not inside a user defined class or function/procedure. */ protected override void Execute(){ Init(); // [declaration for class ChartScript used to be here] /** ----------- set variable values ------------------ */ avg = (int)20; /** average in days */ tolerance = (double)0.034; /** ----------- set variable values ------------------ */ avgValue = (double)0.00; avgOverValue = (double)PriceClose(1); avgUnderValue = (double)0.00; newAvgOverValue = (double)0.00; newAvgUnderValue = (double)0.00; avgSeries = (int)SMASeries(WL_CLOSE, avg); avgOverSeries = (int)CreateSeries(); avgUnderSeries = (int)CreateSeries(); for (Bar = 21; Bar <= (Bars.Count - 1); Bar++) { /** calculate new average */ avgValue = (double)SMA(Bar, WL_CLOSE, avg); newAvgOverValue = (double)((avgValue * ((1.00 + tolerance)))); newAvgUnderValue = (double)((avgValue * ((1.00 - tolerance)))); switch (MarketPosition) { /** No position */ case 0: { avgOverValue = (double)Math.Min(avgOverValue, newAvgOverValue); avgUnderValue = (double)Math.Max(avgUnderValue, newAvgUnderValue); /** long buy */ if ((BuyAtStop((Bar + 1), avgOverValue, "Buy"))) { avgUnderValue = (double)newAvgUnderValue; } /** long buy */ } break; /** Current position is long */ case 1: { /** set the background color */ SetBackgroundColor(Bar, WL_BLUEBKG); avgUnderValue = (double)Math.Max(avgUnderValue, newAvgUnderValue); if ((SellAtStop((Bar + 1), avgUnderValue, LastPosition, "Sell"))) { avgOverValue = (double)newAvgOverValue; avgUnderValue = (double)newAvgUnderValue; } } break; default: break; } /** set PriceSeries */ SetSeriesValue(Bar, avgOverSeries, avgOverValue); SetSeriesValue(Bar, avgUnderSeries, avgUnderValue); } /** plot avgs */ PlotSeries(avgSeries, 0, WL_PURPLE, WL_THIN); PlotSeries(avgOverSeries, 0, WL_BLUE, WL_DOTTED); PlotSeries(avgUnderSeries, 0, WL_FUCHSIA, WL_DOTTED); } // start of epilog: This is a comment at the end of each file } // class Strategy } // namespace // end of epilog #endregion file ChartScript
Rename
I'll give it a try - but that finantic translator sure makes it more complicated. Do you still have the WL4 script - that would be easier!
var Bar: integer;
var shortOption: boolean;
var avg, LastLongPosition, LastShortPosition: integer;
var tolerance, avgValue, avgOverValue, avgUnderValue: float;
var newAvgOverValue, newAvgUnderValue: float;
var avgSeries, avgOverSeries, avgUnderSeries: integer;
var curDay: integer;
var condition: boolean;
// ----------- set variable values ------------------
avg :=9; // average in days
tolerance := 0.026; // in percent (e.g. 0.4% = 0.004)
// ----------- set variable values ------------------
avgValue := 0.00;
avgOverValue := PriceClose(1);
avgUnderValue := 0.00;
newAvgOverValue := 0.00;
newAvgUnderValue := 0.00;
avgSeries := WMASeries(#Close,avg);
avgOverSeries := createSeries();
avgUnderSeries := createSeries();
Plotstops ;
// Trading rules
for Bar := 20 to BarCount - 1 do
begin
// calculate new average
avgValue := WMA(Bar, #Close, avg);
newAvgOverValue := (avgValue * (1.00 + tolerance));
newAvgUnderValue := (avgValue * (1.00 - tolerance));
case MarketPosition of
0: { No position }
begin
avgOverValue := Min(avgOverValue, newAvgOverValue);
avgUnderValue := Max(avgUnderValue, newAvgUnderValue);
// long buy
if (buyAtStop(Bar+1, avgOverValue, 'Buy')) then
begin
avgUnderValue := newAvgUnderValue;
end;
end;
1: { Current position is long }
begin
// set the background color
SetBackgroundColor(Bar, #bluebkg);
avgUnderValue := Max(avgUnderValue, newAvgUnderValue);
if (SellAtStop(Bar+1, avgUnderValue, LastPosition, 'Sell')) then
begin
avgOverValue := newAvgOverValue;
avgUnderValue := newAvgUnderValue;
end;
end;
end;
// set PriceSeries
setSeriesValue(Bar, avgOverSeries, avgOverValue);
setSeriesValue(Bar, avgUnderSeries, avgUnderValue);
end;
// plot avgs
plotSeries(avgSeries, 0, #purple, #thin);
plotSeries(avgOverSeries, 0, #blue, #dotted);
plotSeries(avgUnderSeries, 0, #fuchsia, #dotted);
var shortOption: boolean;
var avg, LastLongPosition, LastShortPosition: integer;
var tolerance, avgValue, avgOverValue, avgUnderValue: float;
var newAvgOverValue, newAvgUnderValue: float;
var avgSeries, avgOverSeries, avgUnderSeries: integer;
var curDay: integer;
var condition: boolean;
// ----------- set variable values ------------------
avg :=9; // average in days
tolerance := 0.026; // in percent (e.g. 0.4% = 0.004)
// ----------- set variable values ------------------
avgValue := 0.00;
avgOverValue := PriceClose(1);
avgUnderValue := 0.00;
newAvgOverValue := 0.00;
newAvgUnderValue := 0.00;
avgSeries := WMASeries(#Close,avg);
avgOverSeries := createSeries();
avgUnderSeries := createSeries();
Plotstops ;
// Trading rules
for Bar := 20 to BarCount - 1 do
begin
// calculate new average
avgValue := WMA(Bar, #Close, avg);
newAvgOverValue := (avgValue * (1.00 + tolerance));
newAvgUnderValue := (avgValue * (1.00 - tolerance));
case MarketPosition of
0: { No position }
begin
avgOverValue := Min(avgOverValue, newAvgOverValue);
avgUnderValue := Max(avgUnderValue, newAvgUnderValue);
// long buy
if (buyAtStop(Bar+1, avgOverValue, 'Buy')) then
begin
avgUnderValue := newAvgUnderValue;
end;
end;
1: { Current position is long }
begin
// set the background color
SetBackgroundColor(Bar, #bluebkg);
avgUnderValue := Max(avgUnderValue, newAvgUnderValue);
if (SellAtStop(Bar+1, avgUnderValue, LastPosition, 'Sell')) then
begin
avgOverValue := newAvgOverValue;
avgUnderValue := newAvgUnderValue;
end;
end;
end;
// set PriceSeries
setSeriesValue(Bar, avgOverSeries, avgOverValue);
setSeriesValue(Bar, avgUnderSeries, avgUnderValue);
end;
// plot avgs
plotSeries(avgSeries, 0, #purple, #thin);
plotSeries(avgOverSeries, 0, #blue, #dotted);
plotSeries(avgUnderSeries, 0, #fuchsia, #dotted);
It's actually a lot simpler than previously coded, which actually "peeked" when setting the avgOver/UnderSeries values. However, that didn't affect the trades, only the values displayed. Give this a try, complete with parameter sliders and ready for optimization.
CODE:
using WealthLab.Backtest; using System; using WealthLab.Core; using WealthLab.Indicators; using System.Drawing; using System.Collections.Generic; namespace WealthScript2 { public class Strategy612 : UserStrategyBase { IndicatorBase _avgSeries; TimeSeries _avgOverSeries; TimeSeries _avgUnderSeries; public Strategy612() { AddParameter("Period", ParameterTypes.Int32, 20, 5, 50, 5); AddParameter("Tolerance", ParameterTypes.Double, 0.034, 0.025, 0.045, 0.001); } public override void Initialize(BarHistory bars) { int avg = Parameters[0].AsInt; double tolerance = Parameters[1].AsDouble; _avgSeries = SMA.Series(bars.Close, avg); _avgOverSeries = _avgSeries * (1.00 + tolerance); _avgUnderSeries = _avgSeries * (1.00 - tolerance); PlotIndicatorLine(_avgSeries, Color.Purple, 1); PlotTimeSeriesLine(_avgOverSeries, "AvgOverSeries", "Price", Color.Blue, 1, LineStyles.Dotted); PlotTimeSeriesLine(_avgUnderSeries, "AvgUnderSeries", "Price", Color.Fuchsia, 1, LineStyles.Dotted); } //execute the strategy rules here, this is executed once for each bar in the backtest history public override void Execute(BarHistory bars, int idx) { if (!HasOpenPosition(bars, PositionType.Long)) { PlaceTrade(bars, TransactionType.Buy, OrderType.Stop, _avgOverSeries[idx]); } else { /* position is long */ SetBackgroundColor(bars, idx, Color.FromArgb(40, Color.Blue)); PlaceTrade(bars, TransactionType.Sell, OrderType.Stop, _avgUnderSeries[idx]); } } } }
Great, THX
Can this be accomplished by this Rule?
The Buy at Limit or Stop rule is all this one needs. The Indicator % condition isn't required because it's already part of the main rule.
i found a problem at that what you sent.
There is a crucial point in my script from wl4. Position is flat: the indicator (SMA) must not become larger for a buy can only get smaller. (buy signal always at lowest low of indicator
same for sell: the indicator can only get bigger
There is a crucial point in my script from wl4. Position is flat: the indicator (SMA) must not become larger for a buy can only get smaller. (buy signal always at lowest low of indicator
same for sell: the indicator can only get bigger
Your Response
Post
Edit Post
Login is required