Expert Advisor Tutorial ~ Neural Network EA
Sat Feb 15 2020
5 min read
Shanghai
# Expert Advisor Tutorial ~ This Neural Network EA is used to analyze the markets.
This expert advisor tutorial talks about how to use the expert advisor studio that Fintechee provides to create an Expert Advisor based on Neural Network.
# Artificial Neural Networks
Artificial Neural Networks "learn" to perform tasks by considering examples, generally without being programmed with task-specific rules. In Fintechee WEB trader , they have integrated with some promising third-party neural-network library, such as Synaptic.
# This Neural Network EA is used by the blogger(Mark Sea) to analyze the market movements.
The parameters and the indicator s may be reset, but the algorithms will NOT be modified.
We will start trading since Feb 17th, 2020(next Monday). Please feel free to track our trading records.
- Fintechee WEB Trader
- Account ID: 585150
- Investor Password: 1
# Fintechee is the most promising Forex trading platform. Please access Fintechee's website to know more details. Fintechee provides cryptocurrency price on their website. Here is the link: https://www.brokerless.cc, the frontend is based on Fintechee WEB Trader. AngelInvestmentNetwork.org has some cases. You can find news at PlaygroundFX and LetplayFX
# Neural Network (SDK Trading)
registerEA(
"sample_training_neuron_model",
"A test EA to train neuron model",
[{ // parameters
name: "period",
value: 20,
required: true,
type: PARAMETER_TYPE.INTEGER,
range: [1, 100]
},{
name: "inputNum",
value: 20,
required: true,
type: PARAMETER_TYPE.INTEGER,
range: [1, 100]
},{
name: "hiddenNum",
value: 50,
required: true,
type: PARAMETER_TYPE.INTEGER,
range: [1, 100]
},{
name: "diffPrice",
value: 0.0001,
required: true,
type: PARAMETER_TYPE.NUMBER,
range: [0, 10]
}],
function (context) { // Init()
var account = getAccount(context, 0)
var brokerName = getBrokerNameOfAccount(account)
var accountId = getAccountIdOfAccount(account)
var symbolName = "EUR/USD"
window.chartHandle = getChartHandle(context, brokerName, accountId, symbolName, TIME_FRAME.M1)
var period = getEAParameter(context, "period")
window.indiHandle = getIndicatorHandle(context, brokerName, accountId, symbolName, TIME_FRAME.M1, "rsi", [{
name: "period",
value: period
}])
},
function (context) { // Deinit()
var period = getEAParameter(context, "period")
var inputNum = getEAParameter(context, "inputNum")
var hiddenNum = getEAParameter(context, "hiddenNum")
var arrOpen = getData(context, window.chartHandle, DATA_NAME.OPEN)
var arrClose = getData(context, window.chartHandle, DATA_NAME.CLOSE)
var arrRsi = getData(context, window.indiHandle, "rsi")
if (arrRsi.length <= period + 1) return
if (inputNum + period - 1 > arrRsi.length) throw new Error("No enough data.")
// extend the prototype chain
Perceptron.prototype = new synaptic.Network()
Perceptron.prototype.constructor = Perceptron
var myPerceptron = new Perceptron(inputNum, hiddenNum, 1)
var myTrainer = new synaptic.Trainer(myPerceptron)
var diffPrice = getEAParameter(context, "diffPrice")
var trainingSet = []
var longCount = 0
var shortCount = 0
for (var i = period - 1; i < arrRsi.length - inputNum; i++) {
if (arrClose[i * inputNum + inputNum] - arrOpen[i * inputNum + inputNum] > diffPrice) {
var input = []
for (var j = 0; j < inputNum; j++) {
input.push(arrRsi[i * inputNum + j] / 100)
}
trainingSet.push({
input: input,
output: [0]
})
longCount++
} else if (arrOpen[i * inputNum + inputNum] - arrClose[i * inputNum + inputNum] > diffPrice) {
var input = []
for (var j = 0; j < inputNum; j++) {
input.push(arrRsi[i * inputNum + j] / 100)
}
trainingSet.push({
input: input,
output: [1]
})
shortCount++
}
}
myTrainer.train(trainingSet)
localStorage.sample_training_neuron_model = JSON.stringify(myPerceptron.toJSON())
printMessage(longCount + ", " + shortCount)
printMessage(JSON.stringify(trainingSet))
printMessage(JSON.stringify(myPerceptron.toJSON()))
},
function (context) { // OnTick()
})
registerEA(
"sample_run_neuron_model",
"A test EA to run neuron model",
[{ // parameters
name: "period",
value: 20,
required: true,
type: PARAMETER_TYPE.INTEGER,
range: [1, 100]
},{
name: "inputNum",
value: 20,
required: true,
type: PARAMETER_TYPE.INTEGER,
range: [1, 100]
},{
name: "threshold",
value: 0.3,
required: true,
type: PARAMETER_TYPE.NUMBER,
range: [0, 1]
},{
name: "takeProfit",
value: 0.0001,
required: true,
type: PARAMETER_TYPE.NUMBER,
range: [0, 100]
}],
function (context) { // Init()
if (typeof localStorage.sample_training_neuron_model == "undefined") return
window.myPerceptron = synaptic.Network.fromJSON(JSON.parse(localStorage.sample_training_neuron_model))
var account = getAccount(context, 0)
var brokerName = getBrokerNameOfAccount(account)
var accountId = getAccountIdOfAccount(account)
var symbolName = "EUR/USD"
getQuotes (context, brokerName, accountId, symbolName)
window.chartHandle = getChartHandle(context, brokerName, accountId, symbolName, TIME_FRAME.M1)
var period = getEAParameter(context, "period")
window.indiHandle = getIndicatorHandle(context, brokerName, accountId, symbolName, TIME_FRAME.M1, "rsi", [{
name: "period",
value: period
}])
},
function (context) { // Deinit()
delete window.currTime
},
function (context) { // OnTick()
var arrTime = getData(context, window.chartHandle, DATA_NAME.TIME)
if (typeof window.currTime == "undefined") {
window.currTime = arrTime[arrTime.length - 1]
} else if (window.currTime != arrTime[arrTime.length - 1]) {
window.currTime = arrTime[arrTime.length - 1]
} else {
return
}
var account = getAccount(context, 0)
var brokerName = getBrokerNameOfAccount(account)
var accountId = getAccountIdOfAccount(account)
var symbolName = "EUR/USD"
var period = getEAParameter(context, "period")
var inputNum = getEAParameter(context, "inputNum")
var threshold = getEAParameter(context, "threshold")
var takeProfit = getEAParameter(context, "takeProfit")
var arrRsi = getData(context, window.indiHandle, "rsi")
if (inputNum + period - 1 > arrRsi.length) throw new Error("No enough data.")
var input = []
for (var i = arrRsi.length - inputNum - 1; i < arrRsi.length - 1; i++) {
input.push(arrRsi[i] / 100)
}
var result = window.myPerceptron.activate(input)[0]
printMessage(result)
var ask = getAsk(context, brokerName, accountId, symbolName)
var bid = getBid(context, brokerName, accountId, symbolName)
var volume = 0.01
if (result < 0.5 - threshold) {
sendOrder(brokerName, accountId, symbolName, ORDER_TYPE.OP_BUY, 0, 0, volume, ask+takeProfit, bid-3*takeProfit, "")
} else if (result > 0.5 + threshold) {
sendOrder(brokerName, accountId, symbolName, ORDER_TYPE.OP_SELL, 0, 0, volume, bid-takeProfit, ask+3*takeProfit, "")
}
})