116 lines
2.4 KiB
C#
116 lines
2.4 KiB
C#
using System;
|
|
using sharp.trading;
|
|
using System.IO;
|
|
using System.Timers;
|
|
using System.Threading;
|
|
using System.Collections.Generic;
|
|
|
|
namespace sharp.tradebot
|
|
{
|
|
public delegate void PeriodicWorker();
|
|
|
|
public class TradingBotEnvironment : MarshalByRefObject
|
|
{
|
|
public string BaseDataDirectory { get; private set; }
|
|
public TradingConnection TradingConnection { get; private set; }
|
|
|
|
Thread periodicsThread;
|
|
bool contPeriodics = true;
|
|
|
|
List<PeriodicTask> periodicTasks = new List<PeriodicTask>();
|
|
|
|
|
|
public TradingBotEnvironment(TradingConnection connection,string baseDataDirectory){
|
|
BaseDataDirectory = baseDataDirectory;
|
|
TradingConnection = connection;
|
|
periodicsThread = new Thread(periodics);
|
|
periodicsThread.Start();
|
|
}
|
|
|
|
public void RegisterPeriodic(PeriodicWorker worker,int timeout){
|
|
lock (periodicTasks){
|
|
periodicTasks.Add(new PeriodicTask(timeout,worker));
|
|
}
|
|
}
|
|
|
|
public void UnregisterPeriodic(PeriodicWorker worker)
|
|
{
|
|
lock (periodicTasks)
|
|
{
|
|
foreach (PeriodicTask ptask in periodicTasks.ToArray()){
|
|
if (ptask.worker == worker){
|
|
periodicTasks.Remove(ptask);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void Stop(){
|
|
lock (this){
|
|
this.contPeriodics = false;
|
|
}
|
|
this.periodicsThread.Join();
|
|
}
|
|
|
|
private void periodics(){
|
|
|
|
Thread.Sleep(1000);
|
|
|
|
while (true){
|
|
|
|
lock (this){
|
|
if (!contPeriodics)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
lock (periodicTasks){
|
|
foreach (PeriodicTask ptask in periodicTasks){
|
|
ptask.Check();
|
|
}
|
|
}
|
|
|
|
Thread.Sleep(250);
|
|
}
|
|
}
|
|
|
|
class PeriodicTask {
|
|
public DateTime lastRun;
|
|
public Int64 interval;
|
|
public PeriodicWorker worker;
|
|
|
|
public PeriodicTask(Int64 interval,PeriodicWorker worker){
|
|
this.worker = worker;
|
|
this.interval = interval;
|
|
this.lastRun = DateTime.Now;
|
|
}
|
|
|
|
public void Check()
|
|
{
|
|
if ((this.lastRun == null) || ((DateTime.Now - this.lastRun).TotalSeconds >= this.interval))
|
|
{
|
|
this.lastRun = DateTime.Now;
|
|
try
|
|
{
|
|
lock (this.worker.Target){
|
|
if (!typeof(TradingBot).IsInstanceOfType(this.worker.Target) || ((TradingBot)this.worker.Target).IsPrepared){
|
|
try {
|
|
this.worker();
|
|
} catch (Exception e){
|
|
Console.WriteLine("Exception: {0}",e);
|
|
}
|
|
}
|
|
}
|
|
} catch (Exception e){
|
|
Console.WriteLine("Exception: {0}",e.ToString());
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
}
|
|
}
|