Skip to content

Instantly share code, notes, and snippets.

@cTraderGURU
Created November 2, 2018 10:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cTraderGURU/a49857b95b2c7d778e664bae6d4f73a3 to your computer and use it in GitHub Desktop.
Save cTraderGURU/a49857b95b2c7d778e664bae6d4f73a3 to your computer and use it in GitHub Desktop.
Libera la spazzatura dalla memoria quando necessario in cTrader
using System;
using System.Diagnostics;
using System.Linq;
using cAlgo.API;
namespace cAlgo.Robots
{
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]
public class FreeMemory : Robot
{
// --> Meglio non intervenire se non richiesto, 500MB è il minimo richiesto
[Parameter("Memory Limit MB", DefaultValue = 500, MinValue = 500)]
public double MemoryLimit { get; set; }
// --> Appena il cBot viene avviato controllo la memoria
protected override void OnStart()
{
_checkMemory();
}
// --> In seguito il controllo viene eseguito a ogni nuova candela, l'utente con il timeframe decide la cadenza
protected override void OnBar()
{
_checkMemory();
}
protected override void OnTick()
{
// --> Debug : _checkMemory();
}
private void _checkMemory()
{
double memoryToMB = _getProcMemoryUsedInMB();
// --> Debug : ChartObjects.DrawText("BoxMemory", string.Format("Free Memory up to {0} MB : current used memory {1} MB", MemoryLimit, _getProcMemoryUsedInMB()), StaticPosition.TopLeft, Colors.Red);
// --> Se la memoria è nei limiti evito di fare pulizia, usare GC.Collect() con attenzione e quando necessario
if (memoryToMB < MemoryLimit)
return;
GC.Collect();
GC.WaitForPendingFinalizers();
}
static double _convertBytesToMegabytes(long bytes)
{
return (bytes / 1024f) / 1024f;
}
static double _getProcMemoryUsedInMB()
{
long memory;
Process myProcess;
myProcess = Process.GetCurrentProcess();
memory = myProcess.PrivateMemorySize64;
double memoryToMB = Math.Round(_convertBytesToMegabytes(memory));
return memoryToMB;
}
static double _getProcMemoryUsedInMB(string procname)
{
long memory;
Process[] myProcess;
myProcess = Process.GetProcessesByName(procname);
memory = myProcess[0].PrivateMemorySize64;
double memoryToMB = Math.Round(_convertBytesToMegabytes(memory));
return memoryToMB;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment