In einem früheren Artikel haben wir uns die vereinfachten Quantitationsstrategien für 30 Zeilen Code gezeigt, und in diesem Artikel führen wir die Anfänger Schritt für Schritt näher an die Freude am Entwerfen von Quantitationsstrategien. Der Autor, der in der Vergangenheit in den Bereichen Finanzen, Investitionen, Wertpapiere usw. völlig unwissend war, wird in diesem Fall immer noch mit BTC-Kontaktgeschäften verhandelt. Es ist eine schwierige Aufgabe, die Menschen zu verstehen und zu verstehen, aber es ist auch eine schwierige Aufgabe, die Menschen zu verstehen und zu verstehen, und es ist eine schwierige Aufgabe, die Menschen zu verstehen und zu verstehen. Nach dem Lesen der entsprechenden Inhalte hatte ich die grundlegenden Konzepte im Kopf und schrieb einfach eine Kombination aus meiner kleinen Kenntnis von JS-Sprache. Die K-Linie ist eine einfache Anzeige der Markttrends in einem bestimmten Zeitraum, um die Dynamik des Marktes zu beobachten. Die Durchschnittslinie ist ein Indikator, der in dem vorherigen Artikel verwendet wurde, und spiegelt wie der MACD-Indikator die Markttrends wider. Die Konzepte, Algorithmen, Formeln und andere Induktionen dieser beiden Indikatoren sind nicht gleich beschrieben.
Variablennamen | Anfangswert | Erläuterung |
---|---|---|
Intervall | 2000 | Diese Variable ist die Umlaufzeit, also die Zeit, in der ein Programm aufhält zu warten. Die Einheit ist Millisekunde, 1000 Millisekunden sind 1 Sekunde, also hat die Variable einen Anfangswert von 2 Sekunden. |
Zustand_frei | 0 | Dies ist eine Status-Variable, die für Leerzeichen verwendet wird. |
Zinssatz | 1 | Dies ist eine Statusvariable, die für mehrere Positionen steht. |
Zulassung | 2 | Statusvariablen, die für eine leere Position stehen. |
- Das ist nicht wahr. | 3 | Eine Variante des Lagerstands, die nicht in Lager steht. |
- Das ist nicht möglich. | 4 | Das bedeutet, dass... |
Zustand | Zustand_frei | Statusvariablen, die mit dem leeren Zustand initialiert werden. |
SignalDelay (Verzögerung) | 0 | Das Signal ist verzögert und ist vorübergehend nutzlos. |
StopProfit | 0.002 | Diese Variable ist wichtiger als die Stop-Loss-Rate, z. B. Kapital * Stop-Loss-Rate ((0.002)), die eine maximale Verlustmenge von 0,002 Mal des Kapitals und eine Verlustobergrenze darstellt. |
Schritt | 0.5 | Schrittlänge für die gleitende Stop-Loss. |
OpBetrag | 1 | Es gibt eine bestimmte Anzahl von Operationen. |
Gewinn | 0 | Das ist eine schlechte Sache. |
var holdOrder = {//持仓信息对象
orderState: ORDER_INVALID,// 持仓状态
price: 0, //持仓均价
amount: 0, //持仓量
time: null, // 操作时间
stopPrice: 0, // 止损价
level: 1, //止损等级
updateCurrentProfit: function(lastPrice,amount){//更新当前盈亏
if(state === STATE_SELL){//当前 空头持仓
return (lastPrice - this.price) * amount;
}
if(state === STATE_BUY){//当前 多头持仓
return - (lastPrice - this.price) * amount;
}
},
SetStopPrice: function(ticker,stopState){//更新止损价
if(stopState === STATE_FREE){ //更新止损时状态 为空闲
return this.stopPrice;
}
if(stopState === STATE_BUY){ //更新止损时状态 为多仓
if(this.orderState === ORDER_INVALID){
return this.stopPrice;
}
if(this.stopPrice === 0){//初始 止损价为0 时
this.stopPrice = this.price * ( 1 - stopProfit );
}
if( ticker.Last <= this.price ){ //最后成交价 小于等于 持仓均价时
this.stopPrice = this.price * ( 1 - stopProfit );
this.level = 1;
}else{//其它情况
if( ticker.Last - this.price > this.level * step ){//超出当前等级 设置滑动止损
this.stopPrice = this.price * (1 - stopProfit) + (ticker.Last - this.price );
//更新止损价为滑动后的止损价
this.level++;//上调止损等级
}else{//其它
this.stopPrice = this.stopPrice;//保持当前止损价不变
}
}
}else if( stopState === STATE_SELL){//空头持仓类似
if(this.orderState === ORDER_INVALID){
return this.stopPrice;
}
if(this.stopPrice === 0){
this.stopPrice = this.price * ( 1 + stopProfit );
}
if( ticker.Last >= this.price ){
this.stopPrice = this.price * ( 1 + stopProfit );
this.level = 1;
}else{
if( this.price - ticker.Last > this.level * step ){
this.stopPrice = this.price * (1 + stopProfit) - ( this.price - ticker.Last );
this.level++;
}else{
this.stopPrice = this.stopPrice;
}
}
}
return this.stopPrice;//返回止损价
},
initHoldOrder: function(){//平仓后 用于 初始化持仓信息的 函数
this.orderState = ORDER_INVALID;
this.price = 0;
this.amount = 0;
this.time = null;
this.stopPrice = 0;
this.level = 1;
}
};
Der Code wurde auf Github hochgeladen: Klicken SieGithubEintritt.
Wenn Sie noch nicht in die offizielle QQ-Gruppe eingetreten sind, können Sie sich bitte anmelden.
Funktion MACD_Cross (() {// Funktion, die MACD-Indikatoren und den Kreuzzustand ermittelt
Var records = exchange.GetRecords (();// Erhält Daten aus K-Linien
while ((!records の の records.length < 45) { // K-Strangdaten können nicht Null sein, größer als 45 Spalten, nicht konform
records = exchange.GetRecords (();
Schlaf (Intervall);
Wir sind hier.
var macd = TA.MACD ((records,12,26,9);// Aufruf einer Indikatorfunktion, die als MACD-Default-Parameter verwendet wird.
var dif = macd[0]; //dif-Zeile
var dea = macd[1]; //dea-Linie
var column = macd[2]; // MACD-Säulen
var len = records.length; // K ist die Länge der Zeilen
wenn (dif[len-1] > 0 && dea[len-1] > 0) && dif[len-1] > dea[len-1] && dif[len-2] < dea[len-2] && column[len-1] > 0.2) {
// Richten Sie die Goldfork-Bedingungen aus: Dif und dea sind momentan beide größer als 0, Dif durchdringt die dea von unten nach oben, und der MACD-Wert ist größer als 0.2
return 1; // zurückkehrt 1 für Goldfork-Signal.
Wir sind hier.
wenn (dif[len-1] < 0 && dea[len-1] < 0) && dif[len-1] < dea[len-1] && dif[len-2] > dea[len-2] && column[len-1] < -0.2) {
// Beurteilen Sie die Todesstange Bedingungen:
return 2; / return 2 steht für den Todesvorhang-Signal.
Wir sind hier.
return 0; // Goldvierk, Totenvierk, für Wartezeichen 0.
Wir sind hier.
Funktion getTimeByNormal ((time) {// Funktion, die Zeit erhält, die Zeit in Millisekunden umwandelt in Standardzeit
var timeByNormal = neues Datum (();
timeByNormal.setTime ((zeit);
var strTime = timeByNormal.toString ();
Var showTimeArr = strTime.split (siehe unten);
var showTime = showTimeArr[3]+
Hauptfunktion
VAR initAccount =\(.GetAccount(exchange);// Zuerst werden wir die Kontoinformationen bei der Eröffnung aufzeichnen und hier die Export-Funktion der Template-Klasse-Datei aufrufen.
var nowAccount = initAccount;// Wieder eine Variable deklarieren
Var diffMoney = 0; // Geld Differenz
Var diffStocks = 0;// Münze Differenz
var repair = 0; // Berechnung der Menge, die bei Verlusten korrigiert wird
Var ticker = exchange.GetTicker ((); // Erhalten Sie die aktuelle Marktlage
Log (("Initial Account:",initAccount); // Ausgabe zeigt die Informationen für das initiale Konto an。
while ((true) {// Haupteffektionsschleife
scan ((); // Scan-Funktion, später erläutert, hauptsächlich zu beurteilen, welche Positionen zu öffnen, zu platzieren und welche Operationen zu betreiben sind.
Tick = exchange.GetTicker (();// in der While-Zyklus Marktzüge erhalten
if(!ticker) {// wenn es nicht zu (null) gelangt ist, springt die folgende Wiederholung durch
Weiter;
Wir sind hier.
if ((holdOrder.orderState == ORDER_VALID) {// Beurteilt, ob es zur Zeit in Lager steht
Log (("aktuelle Aufbewahrung:",holdOrder); // wenn aktuelle Aufbewahrung Ausgabe Aufbewahrung Informationen
Wir sind hier.
if ((holdOrder.orderState == ORDER_INVALID) {// wenn nicht gehalten (behalten) wurde)
Jetzt Account = \).GetAccount ((exchange); // Erhält aktuelle Kontoinformationen
diffMoney = nowAccount.Balance - initAccount.Balance; // Berechnung der Differenz von Geld zwischen dem aktuellen und dem ursprünglichen Konto
diffStocks = nowAccount.Stocks - initAccount.Stocks; // Berechnet die Währungsdifferenz zwischen dem aktuellen und dem ursprünglichen Konto
repair = diffStocks * ticker.Last; // Konvertiert die Differenz der Münze * zum letzten Transaktionspreis in gleichwertiges Geld, um Gewinn und Verlust zu berechnen
LogProfit ((diffMoney + repair,
Funktion scan (() { var sellInfo = null; // Erklärung Variablen für die Speicherung von Placement-Informationen, initializen null var buyInfo = null; // erklärung var op Fun = null;// Die Funktion "Halle zu öffnen", zwei Zustände, "Halle zu öffnen", "Halle zu öffnen". War singal = 0; // Signal while ((true) {// Detektion und Bedienung Var ticker = exchange.GetTicker ((); // Erhalten Sie Marktmärkte if ((!ticker) { // Beurteilung Erhalt fehlgeschlagen Überspringen weiter und weiterlaufen Weiter; Wir sind hier. HoldOrder.SetStopPrice ((ticker,state); // Festlegen Halten Stop-Loss Preis if ((state === STATE_FREE && (singal = MACD_Cross)))!== 0) { // Beurteilt, ob die Strategie im Leerlauf ist, ob das MACD-Indikatorsignal im Moment leer ist, entspricht der Strategie im Leerlauf und mit einem Goldenen oder Toten Gabel HoldOrder.initHoldOrder (();// Initiieren von Lagerinformationen OpFun = singal === 1?Ich kaufe:.Sell ;// entscheidet, ob es sich um mehr oder weniger Positionen handelt, basierend auf dem Ergebnis, das von der MACD_Cross-Funktion zurückgegeben wird. buyInfo = opFun ((opAmount);// Öffnung von Geschäften HoldOrder.orderState = ORDER_VALID;// Setzen Sie die Aufbewahrungsinformationen, wobei der Status aufbewahrt wird HoldOrder.price = buyInfo.price; // Setzen Sie den Bestandswert auf den gleichen Preis. HoldOrder.amount = buyInfo.amount; // Festlegen der Anzahl der Bestände getTimeByNormal (((new Date ()) getTime ()));// Setzen Sie die Zeit, zu der das Halten beginnt state = singal === 1? STATE_BUY : STATE_SELL; // Aktualisieren Sie den Status der Politik für mehrere oder leere Lager War Account =\(.GetAccount ((exchange); // Erhalten von Kontoinformationen if ((singal === 1) {// Ausgabe der Position Richtung und aktuelle Kontoinformationen Log (("mehrere Positionen machen。","Account:",account); Das ist alles. Log ((("offene Positionen。"," Konto:"account"); Wir sind hier. Ich bin nicht derjenige. Das ist alles. Var lastPrice = holdOrder.price;// Geben Sie den Wert des Bestands an lastPrice if( state === STATE_BUY && holdOrder.orderState === ORDER_VALID && ticker.Last < holdOrder.stopPrice ) { // Wenn mehrere Positionen und Halte-Informationen als Halte-Informationen verwendet werden und der Endhandelspreis kleiner als der Stop-Loss-Preis ist, wird Folgendes ausgeführt: Log (("Mehrfach-Stopp-Prämien"," Anfangs-Stopp-Preise:"holdOrder.price * (1 - stopProfit), "-- gleitender Stop-Prämien: "holdOrder.stopPrice", "Endhandelspreise:" ticker.Last, "Stopp-Prämien: "holdOrder.level);// Mehrfach-Stopp-Prämien-Informationen Das ist nicht das Problem..Sell ((holdOrder.amount);//Bilanz HoldOrder.orderState = ORDER_INVALID;// Bilanzinformationen Objekt aktualisieren Sie können auch die Informationen über die Bestellung anfordern, die Sie erhalten. Sie können auch die Daten von einem anderen Benutzer verwenden. Das ist ein sehr schwieriges Problem, aber es ist nicht einfach. Profit = holdOrder.updateCurrentProfit ((lastPrice,sellInfo.amount);// Aktualisierung von Floating Gewinn und Verlust state = STATE_FREE;// Aktualisierung des Status Break; / springen aus Wir sind hier. if(state === STATE_SELL && holdOrder.orderState === ORDER_VALID && ticker.Last > holdOrder.stopPrice) {// außerdem ist dies ein Nullhalt. Log ((Blank-Head-Stop-Loss-Bilanz-Log, Start-Stop-Loss-Log: um, HoldOrder.price * (1 + stopProfit), Gleit-Stop-Loss-Log: um, HoldOrder.stopPrice, End-Trading-Log: um, ticker.Last, Stop-Loss-Level: um, holdOrder.level);// Test Das ist nicht das Problem.\(.Buy(holdOrder.amount); Sie können die Daten in der Tabelle aufrufen. Sie können auch die Informationen über die Bestellung anfordern, die Sie erhalten. Sie können auch die Daten von einem anderen Benutzer verwenden. Das ist ein sehr schwieriges Problem, aber es ist nicht einfach. Profit = holdOrder.updateCurrentProfit ((lastPrice, sellInfo.amount)); Das ist ein sehr schwieriger Fall. Ich bin nicht derjenige. Wir sind hier. if ((state === STATE_BUY && MACD_Cross() === 2)) {// Wenn man zu viel macht, ist der MACD-Indikator tot - Toten-Fork-Bilanz Das ist nicht das Problem..Sell (behalten) Order.amount; Log (Log (Log) ist ein Tiefgarten, der den Anfangs-Stop-Loss-Preis: HoldOrder.price * (1 - stopProfit), den Gleitenden Stop-Loss-Preis: HoldOrder.stopPrice, den Endhandel: Hold, ticker.Last, den Stop-Loss-Level: HoldOrder.level);// Test Sie können die Daten in der Tabelle aufrufen. Sie können auch die Informationen über die Bestellung anfordern, die Sie erhalten. Sie können auch die Daten von einem anderen Benutzer verwenden. Das ist ein sehr schwieriges Problem, aber es ist nicht einfach. Profit = holdOrder.updateCurrentProfit ((lastPrice, sellInfo.amount)); Das ist ein sehr schwieriger Fall. Ich bin nicht derjenige. Wir sind hier. if(state === STATE_SELL && MACD_Cross() === 1 ) {// bei Leerlauf, MACD-Indikator Goldfork SellInfo = $.Buy ((holdOrder.amount); Log ((Goldfork-Gleichgewicht, Anfangs-Stopp-Preis: um, holdOrder.price * (1 + stopProfit), Gleitenden Stop-Preis: um, holdOrder.stopPrice, End-Trading-Preis: um, ticker.Last, Stop-Loss-Level: um, holdOrder.level);// Test Sie können die Daten in der Tabelle aufrufen. Sie können auch die Informationen über die Bestellung anfordern, die Sie erhalten. Sie können auch die Daten von einem anderen Benutzer verwenden. Das ist ein sehr schwieriges Problem, aber es ist nicht einfach. Profit = holdOrder.updateCurrentProfit ((lastPrice, sellInfo.amount)); Das ist ein sehr schwieriger Fall. Ich bin nicht derjenige. Wir sind hier. Wir sind hier. Sleep ((Interval);// Beratungsintervall, das bedeutet, dass das Programm eine Weile pausiert wird. Wir sind hier. Wir sind hier.
Ich möchte Ihnen etwas über die Grundsätze des Gleitverlustes erzählen.
In diesem Code über Gleitsteuerung wird die Anzahl der Schleudertrainer in der Liste der Schleudertrainer angegeben.SetStopPrice
Die Funktion wird nach dem eingegangenenstopState
(Ausfall) undticker
(Marktdaten) um den Stop-Loss-Preis zu aktualisieren.stopState === STATE_BUY
Der Preis wird nach den jeweiligen Umständen beurteilt und aktualisiert.orderState
Für den Nichtigkeitszustand (d.h. keine gültige Position gehalten) wird der aktuelle Stop-Loss-Preis zurückgegeben. Wenn der Stop-Loss-Preis 0 beträgt, wird er mit dem durchschnittlichen Kaufpreis multipliziert(1 - stopProfit)
Und dann, nach dem endgültigen Verkaufspreis.ticker.Last
) und Haltepreis (((this.price
Die Differenz zwischen dem aktuellen Stop-Loss-Klassenwert und dem aktuellen Stop-Loss-Klassenwertthis.level
) mit dem Multiplikator der Schrittlänge verglichen wird. Wenn der aktuelle Grad überschritten wird, wird der Stop-Loss-Preis auf den Wert nach dem Gleiten aktualisiert, während der Stop-Loss-Grade erhöht wird. Ansonsten bleibt der aktuelle Stop-Loss-Preis unverändert.stopState === STATE_SELL
Die Logik ist ähnlich, aber die Differenz zwischen dem endgültigen Handelspreis und dem Holdingpreis wird negativ abgezogen und bei der Aktualisierung des Stop-Loss-Preises subtrahiert.
Sliding Stop-Loss ist eine Risikomanagementstrategie.
Während des Haltegehaltes wird der Stop-Loss-Preis anhand von Marktpreisschwankungen angepasst, um Verluste zu reduzieren oder Gewinne zu schützen. Nach der Logik des Codes können die folgenden Schlüsselpunkte für einen Gleit-Stop-Loss gesehen werden:updateCurrentProfit
Die Methode dient zur Aktualisierung des aktuellen Gewinns und Verlusts und berechnet den aktuellen Gewinn auf der Grundlage von Haltestand (state) und aktuellem Preis (lastPrice). Wenn der Haltestand frei ist (STATE_SELL), wird der Gewinn multipliziert mit der Differenz zwischen dem aktuellen Preis und dem gleichen Preis des Haltestands; wenn der Haltestand (STATE_BUY) mehrfach ist, wird der Gewinn/Verlust negativ. Die SetStopPrice-Methode dient zur Aktualisierung des Stop-Loss-Preises.1 - stopProfit
Wenn der letzte Handelspreis einen Schritt über die aktuelle Stufe überschreitet, wird der Stop-Loss-Preis auf den Stop-Loss-Preis nach dem Gleiten gesetzt und der Stop-Loss-Prozess erhöht. In anderen Fällen bleibt der Stop-Loss-Preis unverändert. Wenn der Stop-Loss-Zustand Blank ist, ist die Logik ähnlich.
Referenzen
MittelschiffHallo, ich bin www.banbiren.com, Geldtransporter und Autor einer Geldtransfer-Plattform. Ich lerne Quantitative Transaktionen zu erlernen, meine QQ-Nummer ist:39866099, können Sie mich in die Gruppe einladen?
NullSchnell Fortschritte ~
MuschelnDas ist hart.
Die Erfinder quantifizieren - Kleine TräumeOK ^^, Sie können sich direkt bewerben, MAC QQ hat keine Einladung gefunden >_<, 1 Gruppe Nummer: 309368835 Jetzt gibt es mehrere Plätze.
Die Erfinder quantifizieren - Kleine TräumeIch bin ein großer Gott.
Die Erfinder quantifizieren - Kleine TräumeWir lernen zusammen.