Il est possible de construire des stratégies de type tendance simple en utilisant un modèle de cadre de stratégie avec très peu de code et d’écrire des stratégies de type couverture si vous avez une base de programmation.

2/ Faire référence à la barre d’outils du modèle du cadre de stratégie, comme indiqué ci-dessous:

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; // 平仓命令
Ces états doivent être définis dans la stratégie, sinon le modèle ne peut pas être identifié.
1、 $.Relation_Exchange_onTick(p1, p2); Paramètre p1: Objets d’échanges, tels que les exchanges[0] est le premier objet d’échange ajouté à la page de configuration du robot. Paramètre p2 : les fonctions de logique de transaction personnalisées, telles que la fonction onTick1 dans l’exemple, peuvent être transmises dans le nom de la fonction.
2、 \(.TaskCmd(p1, p2); Paramètre p1 : commandes envoyées au modèle pour l'exécution, par exemple: TASK_OPEN_LONG // construire des commandes multi-entrepôts Paramètre p2: Les commandes TASK_IDLE, TASK_COVER peuvent être envoyées sans paramètre. Les autres commandes doivent être accompagnées d'un paramètre de nombre, p2, qui indique le nombre d'opérations à effectuer. L'appel nécessite return \).TaskCmd(p1, p2); il est renvoyé dans la fonction onTick.
3、 $.Trend(); Aucun paramètre
4 \(.AddData (p1, p2, p3); // Ajouter du contenu à la fin du tableau dans la barre d'état Paramètre p1 : indice de la table à ajouter, 0 pour la première et 1 pour la seconde (à condition que le second échange ait déjà été associé à \).Relation_Exchange_onTick) Paramètre p2: Nom de l’attribut de contenu ajouté. Dans cet exemple, les données de l’indicateur ajouté sont affichées dans le tableau de bord de l’état.
Paramètre p3: String, transforme les données que vous voulez afficher en une chaîne de caractères et passez-la à la position p3 du paramètre.
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); // 没有任何 触发,发送等待命令。
}


Comme les modèles n’ont pas la fonction d’ajouter des contrôles interactifs, les contrôles interactifs ne peuvent être ajoutés qu’en référence à la stratégie de la barre de modèle du cadre de stratégie de la barre de stratégie, ce qui est relativement simple.
Les étapes:
1. Si vous ajoutez un contrôle de type chaîne à une interaction stratégique, le nom du contrôle s’écrit JS_code comme suit:

2 et cliquez sur le bouton vert +, cliquez sur “Sauver”.

3/ Toutes les commandes sont affichées pendant l’exécution de la stratégie et peuvent être directement copiées pour émettre des commandes à la stratégie.

Le format de commande est CMD ((index, CMD_STR, amount) Le premier paramètre: index indique la bourse sur laquelle l’opération est effectuée, la position de l’index est écrite 0, c’est-à-dire qu’elle représente la première bourse sur laquelle l’opération est effectuée, et ainsi de suite. Deuxième paramètre: les commandes affichées en haut du tableau. Troisième paramètre: le nombre d’opérations à effectuer.
Par exemple:

Les autres commandes sont utilisées de la même manière.
La logique de transaction est écrite de manière aléatoire, ne la déchiffrez pas !. Si BUG suggère quelque chose, bienvenue !