Agent composition
Open Position
Add new conditions to open a position
Close Position
Add new conditions to close a position
Generate Script
Agent code
var init = function () { }; var onTick = function (tick) { };
Events
Agent execution parameters
symbol
Interval
M1
M15
M30
H1
H4
M8
D1
Start date
End date
Random generators
Initial Price
Seed
Precision
Delta by tick
Average spread
Max volume by tick
Ticks by period
Type of walk
arithmetic
geometric
Speed
Unlimited (backtest)
on tick by 100ms
on tick by second
on tick by 10s
on tick by minute
Logging
Display every
1
10
30
50
100
500
1000
10000
100000
bar(s)
Shown events
order sent
position opened
close sent
Position partially closed
Position closed
Cancel sent
Not relevant for backtest
order cancelled
order received
close received
Execute
Orders
#
symbol
side
amount
status
limit
open price
close price
PNL
Backtest stats
Current PL :
Ticks proceed :
Orders sent :
Orders opened :
Orders closed :
Orders cancelled :
Console
var expressionEvaluator = COMPLEX_EXPR_EVAL(4); // see ComplexExpressionEvaluation.js var orderId = -1; var init = function(){ {{join allIndicators separator="\n "}} {{#each openBlocks as |block blockId|}} {{#each expressions as |expression expressionId|}} expressionEvaluator.addExpressionCondition("open", {{blockId}}, {{expressionId}}, {{condition expression.condition}}); {{/each}} {{/each}} {{#each closeBlocks as |block blockId|}} {{#each expressions as |expression expressionId|}} expressionEvaluator.addExpressionCondition("close", {{blockId}}, {{expressionId}}, {{condition expression.condition}}); {{/each}} {{/each}} }; var onTick = function(tick){ switch (env.marketAdapter.orderStatus(orderId)) { case ORDER_STATUS.UNKNOWN : case ORDER_STATUS.CLOSED : openOrderIfNeeded(tick); break; case ORDER_STATUS.OPENED : closeOrderIfNeeded(tick); } } var openOrderIfNeeded = function(tick){ {{#each openBlocks as |block blockId|}} {{#each expressions as |expression expressionId|}} expressionEvaluator.addToEvaluation("open", {{blockId}}, {{expressionId}}, tick.date, {{expression.value}}); {{/each}} {{/each}} {{#each openBlocks as |block blockId|}} {{#unless @first}}else {{/unless}}if (expressionEvaluator.evaluateGroup("open", {{blockId}})){ orderId = env.marketAdapter.sendOrder({symbol: env.symbol, amount: {{block.order.amount}}, type: "market", side: "{{block.order.side}}"}, tick); } {{/each}} } var closeOrderIfNeeded = function(tick){ var order = env.marketAdapter.getOrder(orderId); {{#each closeBlocks as |block blockId|}} {{#each expressions as |expression expressionId|}} expressionEvaluator.addToEvaluation("close", {{blockId}}, {{expressionId}}, tick.date, {{expression.value}}); {{/each}} {{/each}} {{#each closeBlocks as |block blockId|}} {{#unless @first}}else {{/unless}}if (expressionEvaluator.evaluateGroup("close", {{blockId}})){ env.marketAdapter.closeOrder(orderId, (order.isBuy)?tick.bid:tick.ask, order.amount, tick); } {{/each}} }