Flash Crash Trade Bot

General

The following example shows how to make a simple FCB bot. It shows the usage of technologies like having many open orders.

Installation

  • Open the My documents\HTS\ScriptBots folder.

  • Create a new text file, name it simplefcb.cs

  • Open the file and paste the source code inside it

  • Save the file and start the HaasBot

  • Create a new custom scripted bot and you should be able to select an item called simplefcb

Source code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TradeServer.ScriptingDriver.DataObjects;
using TradeServer.ScriptingDriver.Interfaces;
namespace BotScripts
{
public class SimpleFCBBot : IScriptBot
{
public string slot_buy_1 = "";
public string slot_buy_2 = "";
public string slot_buy_3 = "";
public string slot_sell_1 = "";
public string slot_sell_2 = "";
public string slot_sell_3 = "";
public string Name
{
get { return "Simple FCB-bot"; }
}
public ScriptBotType BotType
{
get { return ScriptBotType.SpotBot; }
}
private decimal _spread = 10.0M;
public List<ScriptParameter> GetParameters()
{
List<ScriptParameter> res = new List<ScriptParameter>();
res.Add(new ScriptParameter("Spread", ScriptParameterType.Double, _spread.ToString()));
return res;
}
public void SetParameters(Dictionary<string, object> parameters)
{
foreach (var item in parameters) // lets just loop them all
{
if (item.Key == "Spread") { _spread = Convert.ToDecimal(item.Value); }
}
}
public void Init()
{
}
public void DoUpdate(ScriptBotContext context)
{
// Check for open orders
if (context.OpenOrders.Count == 6)
{
context.Logger.Log("Perfect, all orders are set.");
return;
}
if (slot_buy_1 == "" || !context.OpenOrders.Contains(slot_buy_1))
{
context.Logger.Log("Filling buy slot 1");
var price = (decimal)context.PriceTick.Ask - _spread;
slot_buy_1 = context.API.PlaceBuyOrder(context.TradeAmount, price);
}
if (slot_buy_2 == "" || !context.OpenOrders.Contains(slot_buy_2))
{
context.Logger.Log("Filling buy slot 2");
var price = (decimal)context.PriceTick.Ask - (_spread * 2.0M);
slot_buy_2 = context.API.PlaceBuyOrder(context.TradeAmount, price);
}
if (slot_buy_3 == "" || !context.OpenOrders.Contains(slot_buy_3))
{
context.Logger.Log("Filling buy slot 3");
var price = (decimal)context.PriceTick.Ask - (_spread * 3.0M);
slot_buy_3 = context.API.PlaceBuyOrder(context.TradeAmount, price);
}
if (slot_sell_1 == "" || !context.OpenOrders.Contains(slot_sell_1))
{
context.Logger.Log("Filling sell slot 1");
var price = (decimal)context.PriceTick.Bid + _spread;
slot_sell_1 = context.API.PlaceSellOrder(context.TradeAmount, price);
}
if (slot_sell_2 == "" || !context.OpenOrders.Contains(slot_sell_2))
{
context.Logger.Log("Filling sell slot 2");
var price = (decimal)context.PriceTick.Bid + (_spread * 2.0M);
slot_sell_2 = context.API.PlaceSellOrder(context.TradeAmount, price);
}
if (slot_sell_3 == "" || !context.OpenOrders.Contains(slot_sell_3))
{
context.Logger.Log("Filling sell slot 3");
var price = (decimal)context.PriceTick.Bid + (_spread * 3.0M);
slot_sell_3 = context.API.PlaceSellOrder(context.TradeAmount, price);
}
}
}
}