Die Quantitative Währungsrunde sieht neu aus - bringt Sie näher an die Quantitative Währungsrunde.

Schriftsteller:Kleine Träume, Erstellt: 2021-05-28 09:50:12, aktualisiert: 2023-09-21 21:06:08

img

Die Münzkreis-Quantifizierung ist ein neuer Ansatz, der Sie näher an die Münzkreis-Quantifizierung bringt.

In einem früheren Artikel haben wir die Transaktionslogik-Analyse einer einfachen Netzstrategie erläutert, und in diesem Artikel haben wir die Konzeption dieser Lehrstrategie vervollständigt.

  • Transaktionslogik analysieren In dem vorherigen Artikel haben wir gesagt, dass es möglich ist, eine Transaktionsaktion zu starten, wenn man nur jede Gitterlinie des Gitternetzes durchläuft und den aktuellen Preis beurteilt. In der Tat gibt es jedoch noch viele logische Details, und Anfänger, die oft keine Strategie verstehen, können leicht eine falsche Vorstellung bilden, dass die Logik sehr einfach ist.

    Das erste Detail, das wir zuerst betrachten werden, ist die Gestaltung dieser Seite des unendlichen Gitter.createNetAlso? Diese Funktion erzeugt eine Gitterdatenstruktur, die eine begrenzte Anzahl von Gitterlinien ist. Und was ist, wenn der Preis bei der Ausführung der Strategie über die Grenzen dieser Gitterdatenstruktur hinausgeht (über die obersten, höchsten und untersten, niedrigsten Gitterlinien)? Wir haben also zunächst einen Erweiterungsmechanismus für die Gitterdatenstruktur hinzugefügt.

    Wenn Sie die wichtigste Funktion des Programms verwenden, die Sie verwenden möchten, ist es möglich, die wichtigste Funktion des Programms zu verwenden, die Sie verwenden möchten.

    var diff = 50                                 // 全局变量,网格间距,可以设计成参数,方便讲解,我们把这个参数写死在代码里。
    function main() {
        // 实盘开始运行后,从这里开始执行策略代码
        var ticker = _C(exchange.GetTicker)       // 获取市场最新的行情数据ticker,ticker这个数据的结构参看FMZ API文档:https://www.fmz.com/api#ticker
        var net = createNet(ticker.Last, diff)    // 我们上篇设计的初始构造网格数据结构的函数,这里构造一个网格数据结构net
    
        while (true) {                            // 然后程序逻辑就进入了这个while死循环,策略执行到此将不停的循环执行这里{}符号之内的代码
            ticker = _C(exchange.GetTicker)       // 死循环代码部分的第一行,获取最新的行情数据,更新给ticker变量
            // 检查网格范围
            while (ticker.Last >= net[net.length - 1].price) {
                net.push({
                    buy : false,
                    sell : false,
                    price : net[net.length - 1].price + diff,
                })
            }
            while (ticker.Last <= net[0].price) {
                var price = net[0].price - diff
                if (price <= 0) {
                    break
                }
                net.unshift({
                    buy : false,
                    sell : false,
                    price : price,
                })
            }
            
            // 还有其它代码...
        }
    }
    

    Der Code, der die Datenstruktur erweitert, ist dieser (aus dem oben stehenden Code gewählt):

          // 检查网格范围
          while (ticker.Last >= net[net.length - 1].price) {   // 如果价格超过网格最高价格的网格线
              net.push({                                       // 就在网格最高价格的网格线之后加入一个新的网格线
                  buy : false,                                 // 初始化卖出标记
                  sell : false,                                // 初始化买入标记
                  price : net[net.length - 1].price + diff,    // 在之前最高价格的基础上再加一个网格间距
              })
          }
          while (ticker.Last <= net[0].price) {                // 如果价格低于网格最低价格的网格线
              var price = net[0].price - diff                  // 区别于向上添加,要注意向下添加新网格线的价格不能小于等于0,所以这里要判断
              if (price <= 0) {                                // 小于等于0就不添加了,跳出这层循环
                  break
              }
              net.unshift({                                    // 就在网格最低价格的网格线之前添加一个新的网格线
                  buy : false,
                  sell : false,
                  price : price,
              })
          }
    

    Der nächste Schritt ist, sich Gedanken darüber zu machen, wie man Transaktions-Trigger konkret umsetzt.

    var diff = 50
    var amount = 0.002       // 增加一个全局变量,也可以设计成参数,当然为了简便讲解,我们也写死在策略代码,
                             // 这个参数控制每次网格线上触发交易时的交易量
    function main() {
        var ticker = _C(exchange.GetTicker)
        var net = createNet(ticker.Last, diff)
        var preTicker = ticker       // 在主循环(死循环)开始前,设置一个变量,记录上一次的行情数据
        while (true) {
            ticker = _C(exchange.GetTicker)
            // 检查网格范围
            while (ticker.Last >= net[net.length - 1].price) {
                net.push({
                    buy : false,
                    sell : false,
                    price : net[net.length - 1].price + diff,
                })
            }
            while (ticker.Last <= net[0].price) {
                var price = net[0].price - diff
                if (price <= 0) {
                    break
                }
                net.unshift({
                    buy : false,
                    sell : false,
                    price : price,
                })
            }  
    
            // 检索网格
            for (var i = 0 ; i < net.length ; i++) {     // 遍历网格数据结构中的所有网格线
                var p = net[i]
                if (preTicker.Last < p.price && ticker.Last > p.price) {         // 上穿,卖出,当前节点已经交易过不论SELL BUY ,都不再交易
                    if (i != 0) {
                        var downP = net[i - 1]
                        if (downP.buy) {
                            exchange.Sell(-1, amount, ticker)
                            downP.buy = false 
                            p.sell = false 
                            continue
                        }
                    }
                    if (!p.sell && !p.buy) {
                        exchange.Sell(-1, amount, ticker)
                        p.sell = true
                    }
                } else if (preTicker.Last > p.price && ticker.Last < p.price) {  // 下穿,买入
                    if (i != net.length - 1) {
                        var upP = net[i + 1]
                        if (upP.sell) {
                            exchange.Buy(-1, amount * ticker.Last, ticker)
                            upP.sell = false 
                            p.buy = false 
                            continue
                        }
                    }
                    if (!p.buy && !p.sell) {
                        exchange.Buy(-1, amount * ticker.Last, ticker)
                        p.buy = true 
                    } 
                }
            }
            preTicker = ticker    // 把当前的行情数据记录在preTicker中,在下一次循环中,作为“上一次”行情数据和最新的对比,判断上穿下穿
            Sleep(500)
        }
    }  
    

    Sie können sehen:

    • Die Bedingungen für den Anstieg des Netzes:preTicker.Last < p.price && ticker.Last > p.price
    • Die Bedingungen für den Zugang zum Netz sind:preTicker.Last > p.price && ticker.Last < p.price

    Ich bin der Meinung, dass die Menschen, die in der Welt leben, nicht mehr in der Lage sind, sich selbst zu retten.

    img

    Das ist nur der erste Schritt, um zu entscheiden, ob eine Transaktion bestellt werden kann, und es muss auch die Markierung in den Grid-Daten beurteilt werden.

    Wenn es sich um eine Übertragung handelt, wird der Preis unterhalb der aktuellen Gitterlinie und der letzten Gitterlinie als Buy markiert, wenn der Wert der Buy Markierung wahr ist, bedeutet dies, dass die vorherige Gitterlinie gekauft wurde, und der letzte Buy wird als False markiert und die aktuelle Gitterlinie als False markiert.

    Nach der Beurteilung der vorigen Bedingungen, wenn es keinen Auslöser gibt, wird weiter beurteilt, wenn die Buy/Sell-Markierung auf der aktuellen Gitterlinie falsch ist, dann bedeutet dies, dass die aktuelle Gitterlinie handeln kann.

    Die Logik ist die gleiche (hier bleibt es den Anfängern, darüber nachzudenken).

Die vollständige Strategie-Rückprüfung

Wir haben eine Funktion geschrieben, um einige der Daten zu sehen, die wir bei der Wiederholung haben.showTblDie Daten werden angezeigt

function showTbl(arr) {
    var tbl = {
        type : "table", 
        title : "网格",
        cols : ["网格信息"],
        rows : []
    }
    var arrReverse = arr.slice(0).reverse()
    _.each(arrReverse, function(ele) {
        var color = ""
        if (ele.buy) {
            color = "#FF0000"
        } else if (ele.sell) {
            color = "#00FF00"
        }
        tbl.rows.push([JSON.stringify(ele) + color])
    })
    LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`", "\n 账户信息:", exchange.GetAccount())
}

Der vollständige Strategie-Code:

/*backtest
start: 2021-04-01 22:00:00
end: 2021-05-22 00:00:00
period: 1d
basePeriod: 1m
exchanges: [{"eid":"OKEX","currency":"ETH_USDT","balance":100000}]
*/

var diff = 50
var amount = 0.002
function createNet(begin, diff) {
    var oneSideNums = 10
    var up = []
    var down = []
    for (var i = 0 ; i < oneSideNums ; i++) {
        var upObj = {
            buy : false,
            sell : false, 
            price : begin + diff / 2 + i * diff,
        }
        up.push(upObj)

        var j = (oneSideNums - 1) - i
        var downObj = {
            buy : false,
            sell : false,
            price : begin - diff / 2 - j * diff,
        }
        if (downObj.price <= 0) {  // 价格不能小于等于0 
            continue
        }
        down.push(downObj)
    }

    return down.concat(up)
}

function showTbl(arr) {
    var tbl = {
        type : "table", 
        title : "网格",
        cols : ["网格信息"],
        rows : []
    }
    var arrReverse = arr.slice(0).reverse()
    _.each(arrReverse, function(ele) {
        var color = ""
        if (ele.buy) {
            color = "#FF0000"
        } else if (ele.sell) {
            color = "#00FF00"
        }
        tbl.rows.push([JSON.stringify(ele) + color])
    })
    LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`", "\n 账户信息:", exchange.GetAccount())
}

function main() {
    var ticker = _C(exchange.GetTicker)
    var net = createNet(ticker.Last, diff)
    var preTicker = ticker 
    while (true) {
        ticker = _C(exchange.GetTicker)
        // 检查网格范围
        while (ticker.Last >= net[net.length - 1].price) {
            net.push({
                buy : false,
                sell : false,
                price : net[net.length - 1].price + diff,
            })
        }
        while (ticker.Last <= net[0].price) {
            var price = net[0].price - diff
            if (price <= 0) {
                break
            }
            net.unshift({
                buy : false,
                sell : false,
                price : price,
            })
        }

        // 检索网格
        for (var i = 0 ; i < net.length ; i++) {
            var p = net[i]
            if (preTicker.Last < p.price && ticker.Last > p.price) {         // 上穿,卖出,当前节点已经交易过不论SELL BUY ,都不再交易
                if (i != 0) {
                    var downP = net[i - 1]
                    if (downP.buy) {
                        exchange.Sell(-1, amount, ticker)
                        downP.buy = false 
                        p.sell = false 
                        continue
                    }
                }
                if (!p.sell && !p.buy) {
                    exchange.Sell(-1, amount, ticker)
                    p.sell = true
                }
            } else if (preTicker.Last > p.price && ticker.Last < p.price) {  // 下穿,买入
                if (i != net.length - 1) {
                    var upP = net[i + 1]
                    if (upP.sell) {
                        exchange.Buy(-1, amount * ticker.Last, ticker)
                        upP.sell = false 
                        p.buy = false 
                        continue
                    }
                }
                if (!p.buy && !p.sell) {
                    exchange.Buy(-1, amount * ticker.Last, ticker)
                    p.buy = true 
                } 
            }
        }

        showTbl(net)
        preTicker = ticker 
        Sleep(500)
    }
}

Die Strategie wird überprüft:

img

img

img

Es ist ein Zeichen für die Eigenschaften der Netzwerkstrategie, dass bei einem Trendmarkt ein größerer Verlust auftritt und die Gewinne in einem erschütterten Sektor wieder aufsteigen. So ist die Netzstrategie nicht risikofrei, die Notfallstrategie kann sich noch verharren, während die Futures-Kontrakt-Netzstrategie riskanter ist und eine konservative Einstellung der Netzparameter erfordert.


Verwandt

Mehr

Hussr12345Das ist die Sprache C++.

- Ich weiß nicht.Ich habe das Gefühl, dass es hier eine logische Lücke gibt. Sollte es nicht sein, dass man beim Verkauf des Verkaufs nur über die Netzlinie reisen muss, die höher ist als der aktuelle Preis? Es gibt auch exchange.Sell ((-1, amount, ticker) Wie ist diese Funktion anders als in der API-Dokumentation, ich sehe, dass die API-Dokumentation exchange.Sell ((Price, Amount) schreibt, warum hast du drei Parameter?

- Ich weiß nicht.Das ist schwer.

- Was ist?Bei Auf- und Abwärtstrends, exchange.Buy ((-1, amount * ticker.Last, ticker), amount * ticker.Last ist eine Ironie.

CYZWXDie Kommission hat die Kommission aufgefordert, ihre Stellungnahme zu unterbreiten. Last_tick = [] Linie = [] Grid_buy_list = [] Definition des Nettopreises: globale Linie Druck (nun_preis) Linie = [now_price*(1+0.003*i) für i im Bereich ((-1000,1000) ] (Log (line)) - Ich weiß. Definition auf dem Stichwort: Globale letzte Markierung globale Linie globale Netzwerk_Kaufliste Konto = Austausch.GetAccount ((() Tick = Tausch. Last_tick.append ((Ticker['Last']) wenn len ((letztes_Tick) == 1:zurückgeben Der letzte tick. für i im Bereich (Linien): wenn last_tick[-1] > line[i] und last_tick[-2] < line[i] und len(grid_buy_list)!= 0 und i > min(grid_buy_list) und Konto['Aktien'] >= 0,001: Die Kommission hat eine Reihe von Maßnahmen ergriffen. Der Grid_buy_list[grid_buy_list.index(min(grid_buy_list))] Log ((Exchange.GetAccount)) elif last_tick[-1] < line[i] und last_tick[-2] > line[i] und i nicht in grid_buy_list: Der letzte Ticket[-1],0.01) Grid_buy_list.append (i) Log ((Exchange.GetAccount)) Definition der Haupt*: Sie sind nicht mehr in der Lage, sich zu bewegen. Log ((Exchange.GetAccount)) während ((True): Aufschlag Schlaf ((1000)

CYZWXDank Dreamhöhe, das ist sehr detailliert, ich habe alles erklärt, um es wieder zu kaufen, als hätte ich eine Py-Version geschrieben.

Kleine TräumeDie Strategie ist die JavaScript-Sprache.

- Ich weiß nicht.Sind nicht die Futurverträge in den Verträgen festgeschrieben?

Kleine TräumeDie Futures sind die Anzahl der Aufträge, die Zahlungen sind die Summe; die Zahlungen sind die Anzahl der Münzen.

- Ich weiß nicht.Dabei ist es wichtig, dass Sie sich mit den Anwendungen der E-Mail-Verbindung vertraut machen. Dabei ist es wichtig, dass Sie die E-Mail-Verbindung für die E-Mail-Verbindung verwenden.

- Ich weiß nicht.Oh, ich verstehe.

Kleine TräumeIn der FMZ-API-Funktion können Log-Ausgabe-Funktionen erzeugt werden, z. B. Log (..) ⋅ exchange (b) ⋅ Buy (Price, Amount) ⋅ exchange (b) ⋅ CancelOrder (Id) ⋅ und einige zusätzliche Ausgabe-Parameter mit notwendigen Parametern.