Der Preis ist entweder nach oben oder unten. Auf lange Sicht sollte die Wahrscheinlichkeit eines Preisanstiegs und -falls 50% betragen, also um den zukünftigen Preis richtig vorherzusagen, müssen Sie alle Faktoren erhalten, die den Preis in Echtzeit beeinflussen, und dann jedem Faktor ein richtiges Gewicht geben, und schließlich objektive und rationale Analyse machen. Um alle Faktoren aufzulisten, die den Preis beeinflussen, kann es das gesamte Universum füllen.
Zusammenfassend als: globale Wirtschaftsumgebung, nationale Makropolitik, verwandte Industriepolitik, Angebot und Nachfrage Beziehungen, internationale Ereignisse, Zinssätze und Wechselkurse, Inflation und Deflation, Marktpsychologie, und andere unbekannte Faktoren, etc. Vorhersage ist eine riesige und unmögliche Aufgabe geworden. So früh begriff ich, dass der Markt unvorhersehbar ist. Dann sind alle Vorhersagen auf dem Markt zu Hypothesen geworden, und der Handel ist zu einem Spiel der Wahrscheinlichkeit geworden, was interessant ist.
Da der Markt unberechenbar ist, ist er wirklich gleichgültig? Nein, alle Makro- und Mikrofaktoren haben sich im Preis widerspiegeln, was bedeutet, dass der Preis das Ergebnis der Wechselwirkung aller Faktoren ist. Wir müssen nur den Preis analysieren, um eine vollständige Handelsstrategie zu machen.
Warum steigt der Preis?
Man könnte sagen, weil: das Land die entsprechenden Industriepolitik unterstützt, das Herkunftsland ist Sturmregen, der internationale Handelskrieg, die MACD-Goldfork wird gekauft, andere haben es gekauft, etc. Natürlich können diese nicht falsch sein.
Der Preisanstieg ist untrennbar mit der Förderung von Geldern verbunden. Auf dem Markt wird der Preis steigen, wenn es mehr Käufer als Verkäufer gibt. Umgekehrt wird der Preis fallen, wenn es mehr Verkäufer als Käufer gibt. Mit diesem Konzept können wir vernünftige Erwartungen an zukünftige Preistrends auf der Grundlage der Angebots- und Nachfragebeziehung geben, die sich im Nettofluss von Geldern widerspiegelt.
Anders als bei der traditionellen Analyse analysiert die Fundflow-Analyse, welche Transaktionen der aktive Geldzufluss sind und welche Transaktionen der aktive Geldfluß sind, basierend auf den Transaktionsdaten über einen bestimmten Zeitraum. Dann können wir durch Subtrahieren des aktiven Ausflussvolumens vom aktiven Zuflussvolumen in diesem Zeitraum den Nettoeinfluss von Geldmitteln in diesem Zeitraum kennen. Wenn der Nettoeinfluss von Geldmitteln positiv ist, bedeutet dies, dass das Angebot dieses Produkts knapp ist; wenn der Nettoeinfluss von Geldmitteln bedeutet, dass das Angebot dieses Produkts überangeboten ist.
Nach dem Lesen dieses Artikels mögen sich einige Leute fragen, dass bei tatsächlichen Transaktionen ein Deal nur dann abgeschlossen wird, wenn jemand kauft und jemand verkauft. Die Transaktionsanordnung muss so viel Verkaufsvolumen haben wie das Kaufvolumen, und die Mittel müssen in und aus der gleichen Menge sein. Woher kommt der Kapitalzu- und -ausfluss? Tatsächlich muss strikt genommen jeder Kaufbefehl einer entsprechenden Verkaufsanordnung entsprechen, und der Kapitalzu- und -ausfluss muss gleich sein. Wenn wir berechnen wollen, welche Aufträge aktiv gekauft und welche Aufträge aktiv verkauft werden, können wir nur eine Kompromissmethode verwenden, indem wir K-Zeile-Bar-Daten verwenden, die auf Transaktionsvolumen und Preis basieren.
Die Veränderung des Geldflusses entspricht genau dem Echtzeitmarktverhalten, und der Netto-Geldfluss wird in Echtzeit durch Integration von k-Linienbalkendaten berechnet.
Wenn der aktuelle Transaktionspreis des aktuellen Auftrags zum Gegenparteienpreis oder zu einem Überpreis ausgeführt wird, ist der Kauftransaktionspreis >= der Verkaufstransaktionspreis, was bedeutet, dass der Käufer eher bereit ist, die Transaktion zu einem höheren Preis abzuschließen, der in den aktiven Geldzufluss einbezogen wird.
Zweitens, wenn der aktuelle Transaktionspreis > den letzten Transaktionspreis beträgt, kann davon ausgegangen werden, dass das aktuelle Transaktionsvolumen den Preisanstieg aktiv nach oben treibt, der in den aktiven Geldzufluss einbezogen wird.
Nehmen wir den obigen zweiten Algorithmus als Beispiel:
Der Schlusskurs eines bestimmten Produkts um 10:00 Uhr beträgt 3450, und der Schlusskurs um 11:00 Uhr beträgt 3455, so dass wir das Transaktionsvolumen zwischen 10:00 und 11:00 Uhr als aktiven Kapitalzufluss einbeziehen. Ansonsten wird es in den Initiativ-Ausfluss von Geldern enthalten. Dieser Artikel basiert auf der zweiten Methode und addiert den Faktor der Preisvolatilität. Durch den Vergleich des Schlusskurses der k-Linienleiste vor und nach dem Schlusskurs wird das Volumen der steigenden oder fallenden k-Linienleiste * Volatilität in einer Reihenfolge eingeschlossen und dann weiter nach der Reihenfolge Berechnen Sie die aktive Zuflussquote der Gelder.
Dieser Artikel beschreibt den Geldfluss auf dem Futures-Markt aus der Perspektive von
Die Preissteigerungen und der aktive Nettozufluss von Geldern pro Zeiteinheit: Diese Situation ist stark, und der zukünftige Preis wird wahrscheinlich weiter steigen;
Der Aktienkurs steigt und der aktive Nettoausfluss von Geldern pro Zeiteinheit: In diesem Fall handelt es sich um eine mittelstarke Position, und die Rate künftiger Preiserhöhungen wird stark reduziert;
Der Aktienkurs fällt, während der aktive Nettozufluss von Geldern pro Zeiteinheit: Dies ist eine schwache Situation, und der zukünftige Preis fällt weiterhin wahrscheinlicher;
Der Aktienkurs fällt, und gleichzeitig der aktive Nettoabfluss von Geldern pro Zeitstück: in diesem Fall handelt es sich um eine mäßig schwache Position, und die Rate künftiger Preisrückgänge wird stark reduziert;
Vorheriges Tief (ll) Vorheriger Höchststand (hh) Aktiver Kauf (barIn) Aktiver Verkauf (barOut) Das Verhältnis von aktivem Kapitalzufluss zu aktivem Kapitalabfluss (barRatio) Öffnungsposition Schwelle (OpenValve) Aktuelle Halteposition (myAmount) Letzter Schlusskurs der K-Linie (Schlusskurs)
Eine gute quantitative Handelsstrategie erfordert nicht nur eine stabile Rendite, sondern auch die Fähigkeit, Risiken zu kontrollieren und große Verluste zu vermeiden, wenn es eine geringe Wahrscheinlichkeit gibt.
Öffnung der Long-Position: Wenn keine aktuelle Hold-Position und barRatio > openValve vorhanden ist, wird die Long-Position geöffnet.
Eröffnung einer Shortposition: Wenn keine aktuelle Holdposition und barRatio < 1 / openValve vorhanden sind, wird die Shortposition eröffnet.
Schließung der Long-Position: Wenn die aktuelle Long-Position gehalten und geschlossen wird, wird die Long-Position verkauft und geschlossen.
Schließung der Shortposition: Wenn die aktuelle Shortposition gehalten und geschlossen wird > hh, wird die Shortposition gekauft und geschlossen;
Erhebung und Berechnung von Daten
function data() {
var self = {};
var barVol = [];
var bars = _C(exchange.GetRecords); //Get K line bar data
if (bars.length < len * 2) { //Control the length of the K line bar data array
return;
}
for (var i = len; i > 0; i--) {
var barSub_1 = bars[bars.length - (i + 1)].Close - bars[bars.length - (i + 2)].Close; //Calculate the difference between the current closing price and the previous K line bar closing price
if (barSub_1 > 0) { //If the price rises, add a positive number to the array
barVol.push(bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
} else if (barSub_1 < 0) { //If the price drops, add a negative number to the array
barVol.push(-bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
}
}
if (barVol.length > len) {
barVol.shift(); //Free up excess data
}
self.barIn = 0;
self.barOut = 0;
for (var v = 0; v < barVol.length; v++) {
if (barVol[v] > 0) {
self.barIn += barVol[v]; //Consolidate all active inflows funds
} else {
self.barOut -= barVol[v]; //Consolidate all active outflow funds
}
}
self.barRatio = self.barIn / Math.abs(self.barOut); //Calculate the ratio of active inflows to active outflows
bars.pop(); //Delete unfinished K line bar data
self.close = bars[bars.length - 1].Close; //Get the closing price of the pervious bar
self.hh = TA.Highest(bars, hgLen, 'High'); //Get the previous high price
self.ll = TA.Lowest(bars, hgLen, 'Low'); //Get the previous low price
return self;
}
Erhalten Sie K-Linienbalkendaten direkt über dieGetRecords
Methode in der FMZ API. Enthält den höchsten Preis, den niedrigsten Preis, den Eröffnungspreis, den Schlusspreis, das Volumen und den Standardzeitstempel. Wenn der letzte Transaktionspreis größer ist als der letzte Transaktionspreis, wird das letzte Transaktionsvolumen * (höchster Preis-niedrigster Preis) in den aktiven Kauf aufgenommen; wenn der letzte Transaktionspreis kleiner ist als der letzte Transaktionspreis, wird das letzte Volumen * (höchster Preis-niedrigster Preis) in den aktiven Verkauf aufgenommen;
function positions(name) {
var self = {};
var mp = _C(exchange.GetPosition); //Get positions
if (mp.length == 0) {
self.amount = 0;
}
for (var i = 0; i < mp.length; i++) { //Position data processing
if (mp[i].ContractType == name) {
if (mp[i].Type == PD_LONG || mp[i].Type == PD_LONG_YD) {
self.amount = mp[i].Amount;
} else if (mp[i].Type == PD_SHORT || mp[i].Type == PD_SHORT_YD) {
self.amount = -mp[i].Amount;
}
self.profit = mp[i].Profit;
} else {
self.amount = 0;
}
}
return self;
}
Erhalten Sie die Basis-Positionsdaten durch dieGetPosition
Die Funktionsweise der Funktionsweise ist eine einfache Methode in der FMZ-Plattform-API, um die Basisdaten weiter zu verarbeiten. Wenn die aktuelle Long-Position gehalten wird, wird die positive Positionsmenge zurückgegeben; wenn die aktuelle Position kurz ist, wird die negative Positionsmenge zurückgegeben.
function trade() {
var myData = data(); //Execute data function
if (!myData) {
return;
}
var mp = positions(contractType); //Get position information
var myAmount = mp.amount; //Get the number of positions
var myProfit = mp.profit; //Get floating profit and loss
if (myAmount > 0 && myData.close < myData.ll) {
p.Cover(contractType, unit); //close long position
}
if (myAmount < 0 && myData.close > myData.hh) {
p.Cover(contractType, unit); //close short position
}
if (myAmount == 0) {
if (myData.barRatio > openValve) {
p.OpenLong(contractType, unit); //open long position
} else if (myData.barRatio < 1 / openValve) {
p.OpenShort(contractType, unit); //open short position
}
}
}
Wenige Kernparameter: Das Modell hat eine klare Konstruktionsidee mit nur drei Kernparametern. Starke Universalität: Die Strategie ist einfach in der Logik und hat eine hohe Universalität.
Hinzufügen von Holding-Positionsbedingungen: Einweg (Aktien) -Markt-Fluss von Geldern kann den Zufluss oder Abfluss von Geldern basierend auf Faktoren wie Preisschwankungen und Handelsvolumen definieren.
Hinzufügen der Standardabweichungsbedingung: Wenn man sich nur auf den Geldfluss als Bedingung für die Eröffnung einer Position stützt, können häufige falsche Signale auftreten, die zu häufigen Eröffnungen und Schließungen von Positionen führen.
/*backtest
start: 2016-01-01 09:00:00
end: 2019-12-31 15:00:00
period: 1h
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
*/
var p = $.NewPositionManager(); //Call commodity futures trading library
//Holding Position data processing
function positions(name) {
var self = {};
var mp = _C(exchange.GetPosition); //Get positions
if (mp.length == 0) {
self.amount = 0;
}
for (var i = 0; i < mp.length; i++) { //Holding Position data processing
if (mp[i].ContractType == name) {
if (mp[i].Type == PD_LONG || mp[i].Type == PD_LONG_YD) {
self.amount = mp[i].Amount;
} else if (mp[i].Type == PD_SHORT || mp[i].Type == PD_SHORT_YD) {
self.amount = -mp[i].Amount;
}
self.profit = mp[i].Profit;
} else {
self.amount = 0;
}
}
return self;
}
//Market data processing function
function data() {
var self = {};
var barVol = [];
var bars = _C(exchange.GetRecords); //Get K line bar data
if (bars.length < len * 2) { //Control the length of the K line bar data array
return;
}
for (var i = len; i > 0; i--) {
var barSub_1 = bars[bars.length - (i + 1)].Close - bars[bars.length - (i + 2)].Close; //Calculate the difference between the current closing price and the previous K line bar closing price
if (barSub_1 > 0) { //If the price rises, add a positive number to the array
barVol.push(bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
} else if (barSub_1 < 0) { //If the price drops, add a negative number to the array
barVol.push(-bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
}
}
if (barVol.length > len) {
barVol.shift(); //Free up excess data
}
self.barIn = 0;
self.barOut = 0;
for (var v = 0; v < barVol.length; v++) {
if (barVol[v] > 0) {
self.barIn += barVol[v]; //Consolidate all active inflows funds
} else {
self.barOut -= barVol[v]; //Consolidate all active outflow funds
}
}
self.barRatio = self.barIn / Math.abs(self.barOut); //Calculate the ratio of active inflows to active outflows
bars.pop(); //Delete unfinished K line bar data
self.close = bars[bars.length - 1].Close; //Get the closing price of the last K line bar
self.hh = TA.Highest(bars, hgLen, 'High'); //Get the previous high price
self.ll = TA.Lowest(bars, hgLen, 'Low'); //Get the previous low price
return self;
}
//Trading function
function trade() {
var myData = data(); //Execute data function
if (!myData) {
return;
}
var mp = positions(contractType); //Get position information
var myAmount = mp.amount; //Get the number of positions
var myProfit = mp.profit; //Get floating profit and loss
if (myAmount > 0 && myData.close < myData.ll) {
p.Cover(contractType, unit); //close long position
}
if (myAmount < 0 && myData.close > myData.hh) {
p.Cover(contractType, unit); //close short position
}
if (myAmount == 0) {
if (myData.barRatio > openValve) {
p.OpenLong(contractType, unit); //open long position
} else if (myData.barRatio < 1 / openValve) {
p.OpenShort(contractType, unit); //open short position
}
}
}
//The main entrance of the program, start from here
function main() {
while (true) { //Enter the loop
if (exchange.IO("status")) { //If it is the market opening time
_C(exchange.SetContractType, contractType); //Subscription contract
trade(); //Execute trade function
}
}
}
Strategieadresse:https://www.fmz.com/strategy/87698
Konfiguration der Strategie:
Leistung des Backtests:
Durch Modellierung verwendet dieser Artikel die von der FMZ-Handelsplattform bereitgestellten Rohstoff-Futures-K-Linien-Streifendaten, um durch Datenerhebung, zugehörige Analyse und Vorhersage-Technologie ein Netto-Kapitalflussmodell zu erstellen.
Es ist zu beachten, dass der in diesem Artikel erwähnte Geldfluss auf den aktiven Geldfluss hinweist. Er bezieht sich auf die Stärke des Verkäufers und des Käufers auf dem Markt, nicht auf den Ein- oder Ausstieg von Geldern.