Indicator Script

// The reference files (found in Haasbot installation folder):
// - TradeServer.ScriptingDriver.dll
// - TradeServer.Interfaces.dll
// - TA-Lib-Core.dll
using TradeServer.ScriptingDriver.DataObjects;
using TradeServer.ScriptingDriver.Interfaces;
using TicTacTec.TA.Library;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System;
public class ExampleScript : IIndicatorScript
{
//Data to be shown in the indicator-chart:
private double buyPrice;
private double emaShort;
private double emaLong;
//Parameters:
private int emaShortLength = 7;
private int emaLongLength = 30;
public string Name
{
get{ return string.Format("Script: EMA {0}-{1}", emaShortLength, emaLongLength); }
}
public int TicksBack
{
get { return Core.EmaLookback(emaLongLength) + 1; }
}
public List<ScriptParameter> GetParameters()
{
return new List<ScriptParameter>(){
new ScriptParameter(){Name = "EMA short length",
Type = ScriptParameterType.Integer,
Value = emaShortLength.ToString(),
Info = "The length of the shorter/faster EMA."},
new ScriptParameter(){Name = "EMA long length", Type = ScriptParameterType.Integer, Value = emaLongLength.ToString()}
};
}
public void SetParameters(Dictionary<string, object> parameters)
{
emaShortLength = Convert.ToInt32(parameters["EMA short length"]);
emaLongLength = Convert.ToInt32(parameters["EMA long length"]);
}
public IndicatorResult GetResult(IndicatorContext context)
{
PriceInstrument instrument = context.PriceInstrument;
int dataCount = instrument.Close.Length;
int beginIndexShort, outNBElementsShort;
int beginIndexLong, outNBElementsLong;
double[] emaShortValues = new double[dataCount];
double[] emaLongValues = new double[dataCount];
var emaShortReturnCode = Core.Ema(0, dataCount - 1, instrument.Close, emaShortLength, out beginIndexShort, out outNBElementsShort, emaShortValues);
var emaLongReturnCode = Core.Ema(0, dataCount - 1, instrument.Close, emaLongLength, out beginIndexLong, out outNBElementsLong, emaLongValues);
if (emaShortReturnCode == Core.RetCode.Success && emaLongReturnCode == Core.RetCode.Success){
buyPrice = instrument.Close[dataCount - 1]; //Take current (last) value
if(outNBElementsShort == 0 || outNBElementsLong == 0){
// Something went wrong
emaShort = buyPrice;
emaLong = buyPrice;
return IndicatorResult.Stay;
}else{
emaShort = emaShortValues[outNBElementsShort - 1]; //Take current EMA (last one of the valid values)
emaLong = emaLongValues[outNBElementsLong - 1]; //Take current EMA (last one of the valid values)
context.Logger.LogToFile("EMA Short: " + emaShort + "\tEMA Long:" + emaLong); //Log to file
//Determine indicator signal
if(emaShort > emaLong)
return IndicatorResult.Buy;
else if(emaLong > emaShort)
return IndicatorResult.Sell;
else
return IndicatorResult.Stay;
}
}else{
context.Logger.LogToFile("EMA calculation failed."); //Log to file
return IndicatorResult.Stay;
}
}
public List<ChartRecord> GetChartLines()
{
return new List<ChartRecord>()
{
new ChartRecord(ChartIndex = 1, Name = "Buy Price", HexLineColor = "#00FF00"),
new DataSerie(Name = "EMA Short", ChartIndex = 1, HexLineColor = "#FF0000"),
new DataSerie(Name = "EMA Long", ChartIndex = 1, HexLineColor = "#FFFF00")
};
}
public List<double> GetChartData()
{
return new List<double>()
{
buyPrice,
emaShort,
emaLong
};
}
}