Usando um modelo de estrutura de estratégia, é possível construir uma estratégia de tendência simples com apenas um pouco de código e, se houver uma base de programação, escrever uma estratégia de tipo de hedge.

1 - Procure o modelo na Praça da Estratégia, como mostrado acima, e copie-o no Centro de Controle da sua conta.
2 - Escreva uma política com referência à barra de modelos do quadro de políticas, como mostrado abaixo:

var TASK_IDLE = 0; // 空闲状态命令
var TASK_OPEN_LONG = 1; // 建多仓命令
var TASK_OPEN_SHORT = 2; // 建空仓命令
var TASK_ADD = 3; // 加仓命令
var TASK_ST = 4; // 止损命令
var TASK_COVER = 5; // 平仓命令
function onTick1() { // 趋势系统1: 均线 具体买卖逻辑实现
// MA
var records = _C(exchanges[0].GetRecords);
if(records.length < 11){
return $.TaskCmd(TASK_IDLE);
}
var ema_fast = TA.MA(records, 7);
var ema_slow = TA.MA(records, 10);
var data = "fast[-2]:" + ema_fast[ema_fast.length - 2] + " slow[-2]" + ema_slow[ema_slow.length - 2] + " fast[-1]:" + ema_fast[ema_fast.length - 1] + " slow[-1]:" + ema_slow[ema_slow.length - 1];
$.AddData(0, "MA", data);
if (ema_fast[ema_fast.length - 1] < ema_slow[ema_slow.length - 1] && ema_fast[ema_fast.length - 2] > ema_slow[ema_slow.length - 2]) {
return $.TaskCmd(TASK_COVER);
}else if(ema_fast[ema_fast.length - 1] > ema_slow[ema_slow.length - 1] && ema_fast[ema_fast.length - 2] < ema_slow[ema_slow.length - 2]){
return $.TaskCmd(TASK_OPEN_LONG, 0.5);
}
return $.TaskCmd(TASK_IDLE);
}
function onTick2() { // 趋势系统2:MACD 具体买卖逻辑实现
// MACD
var records = _C(exchanges[1].GetRecords);
if(records.length < 15){
return $.TaskCmd(TASK_IDLE);
}
var macd = TA.MACD(records);
var dif = macd[0];
var dea = macd[1];
var data = "dif[-2]:" + dif[dif.length - 2] + " dea[-2]" + dea[dea.length - 2] + " dif[-1]:" + dif[dif.length - 1] + " dea[-1]:" + dea[dea.length - 1];
$.AddData(1, "MACD", data);
if (dif[dif.length - 1] > dea[dea.length - 1] && dif[dif.length - 2] < dea[dea.length - 2]) {
return $.TaskCmd(TASK_COVER);
}else if(dif[dif.length - 1] < dea[dea.length - 1] && dif[dif.length - 2] > dea[dea.length - 2]){
return $.TaskCmd(TASK_OPEN_LONG, 0.8);
}
return $.TaskCmd(TASK_IDLE);
}
function main() {
$.Relation_Exchange_onTick(exchanges[0], onTick1); // 把 添加的第一个交易所 关联 趋势系统1 即 均线MA
$.Relation_Exchange_onTick(exchanges[1], onTick2); // 把 添加的第二个交易所 关联 趋势系统2 即 MACD
$.Trend(); // 不用传参数。 // 启动模板
}
TASK_IDLE = 0; // 空闲状态命令
TASK_OPEN_LONG = 1; // 建多仓命令
TASK_OPEN_SHORT = 2; // 建空仓命令
TASK_ADD = 3; // 加仓命令
TASK_ST = 4; // 止损命令
TASK_COVER = 5; // 平仓命令
Esses estados devem ser definidos dentro da política, caso contrário, o modelo não será reconhecido.
1、 $.Relation_Exchange_onTick(p1, p2); Parâmetro p1: Objetos de câmbio, como exchanges[0] é o primeiro objeto de câmbio adicionado na página de configuração do robô. Parâmetro p2: Funções de lógica de transação personalizadas, como a função onTick1 do exemplo, podem ser passadas para o nome da função.
2、 \(.TaskCmd(p1, p2); Parâmetro p1 : instruções enviadas ao modelo para serem executadas, como: TASK_OPEN_LONG // construção de instruções de armazenamento múltiplo Parâmetro p2: O comando TASK_IDLE e o comando TASK_COVER podem ser enviados sem parâmetros. Os outros comandos precisam ser acompanhados por um parâmetro numérico, p2, que indica o número de operações a serem executadas. A chamada requer return \).TaskCmd(p1, p2); é retornada na função onTick.
3、 $.Trend(); Sem parâmetros
4 \(.AddData(p1, p2, p3); // Adicionar conteúdo ao final da tabela na barra de status. Parâmetro p1: o índice da tabela a ser adicionada, 0 é o primeiro, 1 é o segundo (assumindo que a segunda bolsa já foi associada com \).Relation_Exchange_onTick) Parâmetro p2: Nome do atributo do conteúdo adicionado, neste caso, os dados do indicador adicionado são exibidos na tabela de colunas de estado.
Parâmetro p3: String, transfere os dados que você deseja exibir para String em p3.
function onTick1() { // 趋势系统1: 均线 具体买卖逻辑实现
// MA
var records = _C(exchanges[0].GetRecords); // 用跟 onTick1 函数 绑定的交易所 exchanges[0] 对象 获取该交易所的K线数据。
if(records.length < 11){ // 判断K线数据是否足够长度
return $.TaskCmd(TASK_IDLE); // K线数据长度不足时,发送等待命令。程序则不执行下面的代码。
}
var ema_fast = TA.MA(records, 7); // 根据长度足够的K线数据计算 周期为7 的均线数据 即: 快线
var ema_slow = TA.MA(records, 10); // 计算 慢线
var data = "fast[-2]:" + ema_fast[ema_fast.length - 2] + " slow[-2]" + ema_slow[ema_slow.length - 2] + " fast[-1]:" + ema_fast[ema_fast.length - 1] + " slow[-1]:" + ema_slow[ema_slow.length - 1];
// 处理数据 组合为 字符串 data
$.AddData(0, "MA", data); // 向状态栏表格 添加数据显示
if (ema_fast[ema_fast.length - 1] < ema_slow[ema_slow.length - 1] && ema_fast[ema_fast.length - 2] > ema_slow[ema_slow.length - 2]) { // 平仓触发判断
return $.TaskCmd(TASK_COVER); // 发送平仓命令
}else if(ema_fast[ema_fast.length - 1] > ema_slow[ema_slow.length - 1] && ema_fast[ema_fast.length - 2] < ema_slow[ema_slow.length - 2]){ // 开仓触发判断
return $.TaskCmd(TASK_OPEN_LONG, 0.5); // 发送开多仓命令
}
return $.TaskCmd(TASK_IDLE); // 没有任何 触发,发送等待命令。
}


Como o modelo não tem a função de adicionar controles interativos, os controles interativos só podem ser adicionados em uma política que faz referência à barra de políticas do framework de templates de barra de políticas, e é mais fácil de adicionar.
Passos:
1 - Adicionar um controle de tipo string na interação de estratégia, o nome do controle será JS_code, como mostrado abaixo:

2 e clique no sinal de adição verde, clique em Salvar.


4 O formato do comando é CMD ((index, CMD_STR, amount) O primeiro parâmetro: o index indica qual a bolsa a ser operada, a posição do index é escrita como 0, ou seja, representa a primeira bolsa a ser operada, e assim por diante. Segundo parâmetro: a ordem que aparece no cabeçalho da tabela. Terceiro parâmetro: o número de operações a serem realizadas.
Por exemplo:

Os outros comandos são usados da mesma forma.
A lógica de negociação é casual, não é realista! ☺ Se o BUG sugerir, aplauda!