Un tutoriel pour écrire un robot quantifié en utilisant JS:https://www.fmz.com/bbs-topic/705Je ne peux pas vous dire pourquoi.
Qu'est-ce que les données de la ligne K:
Le K-Line a été inventé par les commerçants japonais à l'époque du shogunat de Tokugawa et utilisé pour enregistrer les mouvements et les fluctuations des prix du riz. Il a ensuite été introduit sur les marchés boursiers et les marchés à terme en raison de sa méthode d'étiquetage unique. Actuellement, cette méthode d'analyse graphique est particulièrement populaire dans notre pays et dans toute l'Asie du Sud-Est. (Cherchée depuis Baidoa)
Les graphiques n'expliquent pas, mais voyons la structure de données de la ligne K définie en langage JS:
{
Time : 1487034000000, // 一个时间戳, 精确到毫秒,与Javascript的 new Date().getTime() 得到的结果格式一样
Open : 3425, // 开盘价
High : 3446, // 最高价
Low : 3423, // 最低价
Close : 3438, // 收盘价
Volume : 177657.99, // 交易量
}
Voyons maintenant les données obtenues en appelant la fonction GetRecords: (n'oubliez pas d'appeler exchange.SetContractType ((
[
{"Time":1487034000000,"Open":3425,"High":3446,"Low":3423,"Close":3438,"Volume":177657.9999999999},
{"Time":1487035800000,"Open":3438,"High":3448,"Low":3382,"Close":3385,"Volume":494882},
{"Time":1487037600000,"Open":3385,"High":3398,"Low":3383,"Close":3394,"Volume":83656.00000000015}
]
Les données de la ligne K sont une matrice d'objets, chaque objet étant une barre de la ligne K, qui contient le prix le plus élevé, le prix le plus bas, le prix d'ouverture (le prix au début de la période de la ligne K), le prix de fermeture (le prix à la fin de la période de la ligne K), le nombre de transactions (le nombre de transactions au cours de la période de la ligne K) dans le cycle de la ligne Bar. Par exemple, comment les données de l'arithmétique ci-dessus peuvent-elles déterminer quelle est la longueur de la ligne K de cycle? On obtient: 1800000, dont la valeur numérique est en millisecondes, donc en échange: 1800000 / 1000 / 60 = 30 (minutes), ce cycle de ligne K est de 30 minutes.
La première question qui se pose facilement est:
La longueur d'une matrice est négligée lorsque vous utilisez des données de ligne K. Cela entraîne un débordement d'accès à l'arithmétique (un bug de ce type était fréquent lors de l'écriture de programmes C précédents). Nous devons donc en juger avant d'utiliser la ligne K.
Pour obtenir une ligne K:
exchange.SetContractType ((
if(records.length < n){ // n 就是我们限定的 n线数量。
return; // 当前函数返回。
}
Le deuxième problème qui se pose facilement: Les données de la dernière barre de la ligne K sont susceptibles d'être modifiées en temps réel, à l'exception des propriétés Time et Open. Les débutants peuvent être très confus en ne comprenant pas ce point lorsqu'ils traitent des lignes K. Par exemple, dans le chapitre précédent, nous avons parlé de l'intersection de la ligne moyenne.
La troisième question: La période de la ligne K, la fuseau horaire est l'heure du début de cette période, la fuseau horaire est un millisecondes, la valeur de la fuseau horaire est de 0, la date de référence est le 1er janvier 1970 (le fuseau horaire doit être pris en compte lors de l'écriture du programme spécifique). Vous pouvez utiliser la phrase suivanteJe suis à l'école.Vous pouvez également tester le système BotVS Sandbox:
var arr = new Date(0);
Il s'agit de:
Thu Jan 01 1970 08:00:00 GMT+0800 (CST) // affichée dans le fuseau horaire 8 est Cette valeur est cumulée depuis 1970 (en ajoutant 1000 toutes les 1 seconde, car 1 seconde est 1000 millisecondes), donc cette valeur est déjà assez grande. Voici une petite astuce: comme le timestamp est unique pour chaque Bar de la ligne K déterminée par le cycle de la ligne K, une fois que le timestamp est modifié, vous pouvez être sûr de recevoir les dernières données de la ligne K. Ceci est également utile dans le traitement réel des données de la ligne K.
Il existe de nombreuses fonctions d'indicateur utilisées pour programmer ou quantifier des stratégies.
Il y a aussi eu beaucoup d'erreurs lors de la première utilisation des fonctions de la bibliothèque d'indicateurs:
Premièrement, le paramètre de cycle (paramètre d'indicateur, différent du cycle de ligne K, combien de cycle de ligne K, combien d'indicateur de cycle de ligne K est calculé, par exemple, 30 minutes de ligne K calculée est l'indicateur MACD de 30 minutes de cycle, paramètre pour cycle de paramètre) est trop grand, la longueur des données de ligne K est insuffisante: L'indicateur MACD, par exemple, décrit:
MACD(Records[Close],Fast Period = 12,Slow Period = 26,Signal Period = 9) = [Array(outMACD),Array(outMACDSignal),Array(outMACDHist)]
Si le paramètre de la période est défini sur 12, 26, 9 lors de l'utilisation, nous introduisons des enregistrements de données en ligne K utilisés pour calculer les indicateurs, et le code s'écrit comme suit:
var macd = talib.MACD(records, 12, 26, 9);
Si les enregistrements sont trop petits à ce moment-là, le calcul se fait comme suit:
[
[null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null]
]
C'est à cause de l'insuffisance de données de ligne K, les indicateurs calculés provoquent un BUG s'ils sont utilisés, alors nous ajoutons une condition limitante avant le programme:
while(!records || records.length < 50){
records = exchange.GetRecords();
Sleep(1000);
}
Sautez de la boucle jusqu'à ce que vous ayez obtenu assez de lignes K pour 50 lignes.
Un lecteur attentif peut voir pourquoi les données calculées par l'indicateur sont un ensemble bidimensionnel (c'est-à-dire que chaque élément d'un ensemble est un autre ensemble), car l'indicateur MACD est calculé non pas comme une ligne, mais comme trois lignes: diff, dea, macd colonne de volume.
[
[null,null,null,null,null,null,null,null,数据...],
[null,null,null,null,null,null,null,null,数据...],
[null,null,null,null,null,null,null,null,数据...]
]
Il y a aussi eu plusieurs cas de BUG qui ont été causés par le fait que la structure de retour de l'indicateur n'a pas été prise en compte.
Deuxièmement, les moyennes utilisées pour calculer les fonctions d'indicateurs sont différentes ou les algorithmes d'indicateurs donnent des résultats différents.
L'indicateur STOCH RSI est plus évident:
STOCHRSI(Records[Close],Time Period = 14,Fast-K Period = 5,Fast-D Period = 3,Fast-D MA = 0) = [Array(outFastK),Array(outFastD)]
Cette valeur calculée est nettement différente des autres algorithmes, dont j'ai donné le code dans le premier chapitre de cette série. Les lecteurs intéressés peuvent comparer ci-dessous. La raison peut être due à l'incohérence des systèmes homogènes utilisés, certains algorithmes de bibliothèque sont habitués à utiliser MA, d'autres sont habitués à utiliser EMA. Certains indicateurs sont calculés quotidiennement, et si le nombre de données de ligne K est différent, il peut y avoir une différence de valeur.
Cannot read property
La raison en est que les API peuvent parfois avoir des erreurs ou ne pas obtenir de données pour diverses raisons. Dans certains cas, les API qui obtiennent des données obtiennent une valeur nulle. Ces données sont généralement de structure arithmétique et nécessitent souvent un accès à la longueur de l'arithme.
Pour tous les appels d'API, il est nécessaire de traiter les erreurs, et parfois même de vérifier si les données sont correctes (parfois, des données anormales apparaissent). Nos programmes ne peuvent garantir l'exactitude que dans leur propre code, mais pour les informations de données qui circulent sur le réseau, il n'est pas possible de garantir leur exactitude à 100% (ce qui est inévitable), il est donc nécessaire de traiter les données obtenues de manière incorrecte et de filtrer toutes les données anormales.
Il n'y a pas de débogage en une seule étape, pas de débogage en interruption, pas de surveillance des valeurs de variables, etc. La méthode de DEBUG que j'utilise habituellement est la méthode Log la plus simple! Pour un usage raisonnable des journaux pour l'exportation d'informations textuelles, des journaux d'analyse des programmes. Il est possible de comprendre le fonctionnement du programme, ou de combiner les captures d'exception de try, catch, throw JS pour traiter les bugs, mais je recommande de ne pas les utiliser tant qu'il est nécessaire d'utiliser des captures d'exception. Pour le DEBUG, il est vrai que l'utilisation de la méthode Log la plus primitive est une expérience, ce qui est très efficace du point de vue de la culture des capacités DEBUG.
https://www.fmz.com/bbs-topic/728