A test EA using perceptrons(neural networks) to calculate XOR

This EA is a test EA using Perceptrons(neural networks) to calculate XOR.

This neural network model includes 2 layers, the hidden layer includes 2 neurons, the output layer includes 1 neuron.

We use setoptimization Result API to set the value for the fitness function built-in inside of Fintechee. The fitness function will monitor the parameters of the neural network to know when to stop training.

We will set the "step" between the start value and the end value for the optimization. If you leave this value by null, then the system will make the difference between the start value and the end value as the step value.

var error = 0

error += nn(1, 1)
error += 1 - nn(1, 0)
error += 1 - nn(0, 1)
error += nn(0, 0)

We made a training set combinated by (1,1), (1,0), (0,1), (0,0).

After thousands of iterations, the neural network will be trained. You can open the inspector of the WEB browser to investigate the output.

Please read the tutorials to know more details:

A test EA using perceptrons(neural networks) to calculate XOR

// Please check this post to know how to use this EA: https://www.fintecher.org/2020/03/17/added-genetic-algorithm-for-trading/
registerEA(
"nn_example",
"A test EA to run neuron model for XOR(v1.0)",
[
// hidden layer(1st neuron)
{name: "h11", value: 20, required: true, type: "Number", range: [-100, 100], step: 10},
{name: "h12", value: 20, required: true, type: "Number", range: [-100, 100], step: 10},
{name: "b1", value: -10, required: true, type: "Number", range: [-100, 100], step: 10},
// hidden layer(2nd neuron)
{name: "h21", value: -20, required: true, type: "Number", range: [-100, 100], step: 10},
{name: "h22", value: -20, required: true, type: "Number", range: [-100, 100], step: 10},
{name: "b2", value: 30, required: true, type: "Number", range: [-100, 100], step: 10},
// output layer
{name: "o1", value: 20, required: true, type: "Number", range: [-100, 100], step: 10},
{name: "o2", value: 20, required: true, type: "Number", range: [-100, 100], step: 10},
{name: "b", value: -30, required: true, type: "Number", range: [-100, 100], step: 10},
],
function (context) { // Init()
    // Please don;t remove the source codes below, they are required to make an EA get boosted
	var account = getAccount(context, 0)
	var brokerName = getBrokerNameOfAccount(account)
	var accountId = getAccountIdOfAccount(account)
	var symbolName = "EUR/USD"

	getQuotes (context, brokerName, accountId, symbolName)

},
function (context) { // Deinit()
	var h11 = getEAParameter(context, "h11") // weight
	var h12 = getEAParameter(context, "h12") // weight
	var b1 = getEAParameter(context, "b1") // bias
	var h21 = getEAParameter(context, "h21")
	var h22 = getEAParameter(context, "h22")
	var b2 = getEAParameter(context, "b2")
	var o1 = getEAParameter(context, "o1") // weight
	var o2 = getEAParameter(context, "o2") // weight
	var b = getEAParameter(context, "b") // bias

	var sigmoid = function (t) {
		return 1 / (1 + Math.pow(Math.E, -t))
	}

	var nn = function (p1, p2) {
		return sigmoid(o1 * sigmoid(h11 * p1 + h12 * p2 + b1) + o2 * sigmoid(h21 * p1 + h22 * p2 + b2) + b)
	}

	var error = 0

	error += nn(1, 1)
	error += 1 - nn(1, 0)
	error += 1 - nn(0, 1)
	error += nn(0, 0)

	setOptimizationResult(context, -error)

	printMessage("error: " + error + ", " + Math.round(nn(1, 1)) + " " + Math.round(nn(1, 0)) + " " + Math.round(nn(0, 1)) + " " + Math.round(nn(0, 0)))
},
function (context) { // OnTick()
})