簡體   English   中英

Pine Script v4 中大型 function IF 的簡化

[英]Simplification of large function IF in Pine Script v4

我正在嘗試編寫一個腳本,該腳本將幫助自動更改“MASignalPeriod”的輸入,具體取決於在指標操作期間查看的加密貨幣。 我還希望能夠通過菜單手動進行更改,所以我依賴復選框“設置模式”。 一切正常,但指標開始運行很長時間。 為了讓它工作,每 20 種加密貨幣我需要 4 段這樣的代碼(在代碼中選擇了隨機的),這意味着加載需要更長的時間。

我的代碼如下 -

//------------- MASignalPeriod input -------------//
MASignalPeriod = if Settingmode == false and syminfo.ticker == "DYDXUSDTPERP" // 1
    MASignalPeriod = 15
else
    if Settingmode == false and syminfo.ticker == "GALAUSDTPERP" // 2
        MASignalPeriod = 15
    else
        if Settingmode == false and syminfo.ticker == "DOTUSDTPERP" // 3
            MASignalPeriod = 15
        else
            if Settingmode == false and syminfo.ticker == "ATOMUSDTPERP" // 4
                MASignalPeriod = 15
            else
                if Settingmode == false and syminfo.ticker == "GALAUSDTPERP" // 5
                    MASignalPeriod = 15
                else
                    if Settingmode == false and syminfo.ticker == "DOTUSDTPERP" // 6
                        MASignalPeriod = 15
                    else
                        if Settingmode == false and syminfo.ticker == "ATOMUSDTPERP" // 7
                            MASignalPeriod = 15
                        else
                            if Settingmode == false and syminfo.ticker == "GALAUSDTPERP" // 8
                                MASignalPeriod = 15
                            else
                                if Settingmode == false and syminfo.ticker == "DOTUSDTPERP" // 9
                                    MASignalPeriod = 15
                                else
                                    if Settingmode == false and syminfo.ticker == "ATOMUSDTPERP" // 10
                                        MASignalPeriod = 15
                                    else
                                        if Settingmode == false and syminfo.ticker == "GALAUSDTPERP" // 11
                                            MASignalPeriod = 15
                                        else
                                            if Settingmode == false and syminfo.ticker == "DOTUSDTPERP" // 12
                                                MASignalPeriod = 15
                                            else
                                                if Settingmode == false and syminfo.ticker == "ATOMUSDTPERP" // 13
                                                    MASignalPeriod = 15
                                                else
                                                    if Settingmode == false and syminfo.ticker == "GALAUSDTPERP" // 14
                                                        MASignalPeriod = 15
                                                    else
                                                        if Settingmode == false and syminfo.ticker == "DOTUSDTPERP" // 15
                                                            MASignalPeriod = 15
                                                        else
                                                            if Settingmode == false and syminfo.ticker == "ATOMUSDTPERP" // 16
                                                                MASignalPeriod = 15
                                                            else
                                                                if Settingmode == false and syminfo.ticker == "GALAUSDTPERP" // 17
                                                                    MASignalPeriod = 15
                                                                else
                                                                    if Settingmode == false and syminfo.ticker == "DOTUSDTPERP" // 18
                                                                        MASignalPeriod = 15
                                                                    else
                                                                        if Settingmode == false and syminfo.ticker == "DOTUSDTPERP" // 19
                                                                            MASignalPeriod = 15
                                                                        else
                                                                            if Settingmode == false and syminfo.ticker == "DOTUSDTPERP" // 20
                                                                                MASignalPeriod = 15
                                                                            else
                                                                                MASignalPeriod = input(15, title="MA Signal Period", group="Signals settings")

請幫助我簡化此功能。

感謝和問候。

您可以提取Settingmode以簡化結構:

MASignalPeriod = 0
if not Settingmode
    MASignalPeriod := syminfo.ticker == "DYDXUSDTPERP" ? 15 : 0
    MASignalPeriod := syminfo.ticker == "GALAUSDTPERP" ? 15 : 0
    MASignalPeriod := syminfo.ticker == "DOTUSDTPERP" ? 15 : 0
    MASignalPeriod := syminfo.ticker == "ATOMUSDTPERP" ? 15 : 0
    MASignalPeriod := syminfo.ticker == "GALAUSDTPERP" ? 15 : 0
    MASignalPeriod := syminfo.ticker == "DOTUSDTPERP" ? 15 : 0
    MASignalPeriod := syminfo.ticker == "ATOMUSDTPERP" ? 15 : 0
    MASignalPeriod := syminfo.ticker == "GALAUSDTPERP" ? 15 : 0
    MASignalPeriod := syminfo.ticker == "DOTUSDTPERP" ? 15 : 0
    MASignalPeriod := syminfo.ticker == "ATOMUSDTPERP" ? 15 : 0
    MASignalPeriod := syminfo.ticker == "GALAUSDTPERP" ? 15 : 0
    MASignalPeriod := syminfo.ticker == "DOTUSDTPERP" ? 15 : 0
    MASignalPeriod := syminfo.ticker == "ATOMUSDTPERP" ? 15 : 0
    MASignalPeriod := syminfo.ticker == "GALAUSDTPERP" ? 15 : 0
    MASignalPeriod := syminfo.ticker == "DOTUSDTPERP" ? 15 : 0
    MASignalPeriod := syminfo.ticker == "ATOMUSDTPERP" ? 15 : 0
    MASignalPeriod := syminfo.ticker == "GALAUSDTPERP" ? 15 : 0
    MASignalPeriod := syminfo.ticker == "DOTUSDTPERP" ? 15 : 0
    MASignalPeriod := syminfo.ticker == "DOTUSDTPERP" ? 15 : 0
    MASignalPeriod := syminfo.ticker == "DOTUSDTPERP" ? 15 : 0

這幾乎看起來像 Pine 5 引入的 switch-case,你可以看看: https://www.tradingview.com/blog/en/say-hello-to-pine-script-v5-26900/

我稍微修改了@karatedog 推薦的代碼並得到了結果,但它有一個錯誤 - 如果你 select 在設置模式中的值“false”,那么硬幣的選定值只考慮最后一個硬幣,在以前的硬幣采用默認值,而不是選定的硬幣。 例如,在 DYDXUSDTPERP 中,我們收到值 15,並且有必要收到 100。雖然如果選擇 DOTUSDTPERP,我們收到理想值 300:

MASignalPeriod = input(15, title="MA Signal Period", group="Signals settings")
if not Settingmode
    MASignalPeriod := syminfo.ticker == "DYDXUSDTPERP" ? 100 : 0
    MASignalPeriod := syminfo.ticker == "GALAUSDTPERP" ? 200 : 0
    MASignalPeriod := syminfo.ticker == "DOTUSDTPERP" ? 300 : 15
SMA = sma(open,MASignalPeriod)
plot(SMA)

在此處輸入圖像描述

在此處輸入圖像描述

修復了代碼中的一個錯誤,也許這個功能會派上用場

MASignalPeriod = input(15, title="MA Signal Period", group="Signals settings")
MASignalPeriod_defval = MASignalPeriod
if not Settingmode
    MASignalPeriod := 
     syminfo.ticker == "DYDXUSDTPERP" ? 100 : 
     syminfo.ticker == "GALAUSDTPERP" ? 200 : 
     syminfo.ticker == "DOTUSDTPERP" ? 300 : 
     MASignalPeriod_defval
SMA = sma(open,MASignalPeriod)
plot(SMA)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM