Descrição
Como solicitado por muitos de vocês, agora estamos trabalhando arduamente para fornecer exemplos de alguns de nossos códigos e pacotes de aprendizado de máquina.
TensorFlow, PyTorch, Keras, Numpy, Pandas e muitos outros pacotes .NET para começar dentro do cTrader.
Nossa missão é tornar o Aprendizado de Máquina dentro do cTrader mais fácil para todos.
Boa caça!
*** Este código não realiza nenhuma negociação (ele apenas imprime dados etc). É simplesmente um código de exemplo de como você pode começar a criar seus próprios modelos de IA usando nossos pacotes de Aprendizado de Máquina.
.......................................................
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using NumSharp;
using np = NumSharp.np;
using Shape = NumSharp.Shape;
using PandasNet;
using static PandasNet.PandasApi;
namespace cAlgo.Robots
{
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class E7BBKGNumSharpSample : Robot
{
[Parameter("Versão 1.01", DefaultValue = "Versão 1.01")]
public string Version { get; set; }
[Parameter("Fonte")]
public DataSeries Source { get; set; }
[Parameter("Barras Necessárias", DefaultValue = 50, MinValue = 1, MaxValue = 10000, Step = 1)]
public int BarsRequired { get; set; }
[Parameter("Nome do Método", DefaultValue = MethodName.DataSplitPrints)]
public MethodName Mode { get; set; }
public enum MethodName
{
DataSplitPrints,
PandasPrints,
NDArrayPrints
}
protected override void OnStart()
{
// Inicialize quaisquer indicadores
}
protected override void OnBar()
{
try
{
if (Mode == MethodName.DataSplitPrints)
{
DataSplitPrints();
}
else if (Mode == MethodName.PandasPrints)
{
PandasPrints();
}
else if (Mode == MethodName.NDArrayPrints)
{
NDArrayPrints();
}
}
catch (Exception ex)
{
Print($"Erro: {ex.Message}");
if (ex.InnerException != null)
{
Print($"Exceção Interna: {ex.InnerException.Message}");
throw;
}
}
}
private float[,] GetDataSet()
{
int startBar = Bars.ClosePrices.Count - BarsRequired;
float[,] inputSignals = new float[BarsRequired, 5];
for (int i = 0; i < BarsRequired; i++)
{
int barIndex = startBar + i;
inputSignals[i, 0] = (float)Bars.OpenPrices[barIndex];
inputSignals[i, 1] = (float)Bars.HighPrices[barIndex];
inputSignals[i, 2] = (float)Bars.LowPrices[barIndex];
inputSignals[i, 3] = (float)Bars.ClosePrices[barIndex];
inputSignals[i, 4] = (float)Bars.TickVolumes[barIndex];
}
return inputSignals;
}
private float[,] GetTargetDataSet()
{
int startBar = Bars.ClosePrices.Count - BarsRequired;
float[,] inputSignals = new float[BarsRequired, 5];
for (int i = 0; i < BarsRequired; i++)
{
int barIndex = startBar + i;
inputSignals[i, 0] = (float)Bars.OpenPrices[barIndex];
inputSignals[i, 1] = (float)Bars.HighPrices[barIndex];
inputSignals[i, 2] = (float)Bars.LowPrices[barIndex];
inputSignals[i, 3] = (float)Bars.ClosePrices[barIndex];
inputSignals[i, 4] = (float)Bars.TickVolumes[barIndex];
}
return inputSignals;
}
/// Impressões de Divisão de Dados do NumSharp
public void DataSplitPrints()
{
// Reformate os dados de entrada para corresponder à forma esperada pelo modelo
//var inputShape = new Shape(-1, BarsRequired, 5);
NDArray inputData = np.array<float>(GetDataSet());
Print("NDarray de Entrada: " + string.Join(", ", inputData));
// Reformate os dados alvo para corresponder à forma alvo esperada pelo modelo
//var targetShape = new Shape(-1, 5);
NDArray targetData = np.array<float>(GetTargetDataSet());
Print("NDarray Alvo: " + string.Join(", ", targetData));
// Divida os dados em conjuntos de treinamento e teste
int testSize = (int)(0.2 * inputData.shape[0]); // 20% para teste
var (x_train, x_test) = (inputData[$":{inputData.shape[0] - testSize}"], inputData[$"{inputData.shape[0] - testSize}:"]);
var (y_train, y_test) = (targetData[$":{targetData.shape[0] - testSize}"], targetData[$"{targetData.shape[0] - testSize}:"]);
Print("Dados X_train: " + string.Join(", ", x_train));
Print("Dados X_test: " + string.Join(", ", x_test));
Print("Dados Y_train: " + string.Join(", ", y_train));
Print("Dados Y_test: " + string.Join(", ", y_test));
}
/// Impressões do PandasNet
public void PandasPrints()
{
// Converta float[,] para List<Series>
var inputData = GetDataSet();
var targetData = GetTargetDataSet();
var inputSeriesList = new List<Series>();
var targetSeriesList = new List<Series>();
for (int col = 0; col < inputData.GetLength(1); col++)
{
List<float> columnData = new List<float>();
for (int row = 0; row < inputData.GetLength(0); row++)
{
columnData.Add(inputData[row, col]);
}
inputSeriesList.Add(new Series(columnData.ToArray()));
}
for (int col = 0; col < targetData.GetLength(1); col++)
{
List<float> columnData = new List<float>();
for (int row = 0; row < targetData.GetLength(0); row++)
{
columnData.Add(targetData[row, col]);
}
targetSeriesList.Add(new Series(columnData.ToArray()));
}
// Crie DataFrames
DataFrame inputDataFrame = new DataFrame(inputSeriesList);
DataFrame targetDataFrame = new DataFrame(targetSeriesList);
Print("DataFrame de Entrada: " + inputDataFrame);
Print("DataFrame Alvo: " + targetDataFrame);
//Print("DataFrame de Entrada: " + string.Join(", ", inputDataFrame));
//Print("DataFrame Alvo: " + string.Join(", ", targetDataFrame));
}
/// Impressões Simples de NDArrays do NumSharp
public void NDArrayPrints()
{
if (Bars.ClosePrices.Count < BarsRequired)
return;
try
{
// Chamando seus dados de entrada float[,]
float[,] inputData = GetDataSet();
// Converta para NDArray e reformate para (BarsRequired, 5)
NDArray inputNDArray = np.array(inputData); // NumSharp
Print("Dados NDarray NumSharp de Entrada : " + string.Join(", ", inputNDArray));
Print("Forma do NDarray NumSharp de Entrada: " + string.Join(", ", inputNDArray.shape));
int expectedLength = BarsRequired * 5;
Print($"Comprimento Esperado do NDarray NumSharp: {expectedLength}");
Print($"Tamanho do NDarray NumSharp de Entrada: {inputNDArray.size}");
if (inputNDArray.size != expectedLength)
{
Print($"Incompatibilidade de Comprimento: Comprimento Esperado {expectedLength}, mas obteve Tamanho {inputNDArray.size}");
return;
}
}
catch (Exception ex)
{
Print("Exceção: " + ex.Message);
Print("Rastreamento de Pilha: " + ex.StackTrace);
Exception innerException = ex.InnerException;
while (innerException != null)
{
Print("Exceção Interna: " + innerException.Message);
Print("Rastreamento de Pilha da Exceção Interna: " + innerException.StackTrace);
innerException = innerException.InnerException;
}
}
}
}
}
Resumo
Key functionalities include:
- Data extraction from market bars (open, high, low, close prices, and tick volumes) over a configurable number of bars.
- Conversion of this data into formats compatible with machine learning workflows, including NumSharp NDArrays and Pandas DataFrames.
- Methods to split data into training and testing sets, and to print these datasets for inspection.
- Three operational modes selectable via parameters: DataSplitPrints, PandasPrints, and NDArrayPrints, each demonstrating different data handling approaches.
This sample code aims to facilitate machine learning development inside cTrader by providing foundational examples of data preparation and manipulation using popular ML libraries in a .NET context.