Dari YouTube, "Magic Double EMA Equilibrium Strategy"

Penulis:Mimpi kecil, Dibuat: 2022-10-09 15:56:22, Diperbarui: 2023-09-15 20:50:38

img

Dari YouTube, "Magic Double EMA Equilibrium Strategy"

Dalam edisi ini, kami akan membahas "strategi EMA dua arah yang ajaib" yang berasal dari YouTube, yang dikenal sebagai strategi pembunuh pasar saham dan mata uang kripto. Saya menonton video dan mengetahui bahwa strategi ini adalah strategi bahasa pine untuk trading view, menggunakan dua indikator trading view.

Indikator yang digunakan dalam strategi

Indikator EMA 1.

Untuk desain yang sederhana, kita tidak menggunakan Moving Average Exponential yang tercantum di video ini. Kita menggunakan ta.ema built-in di trading view sebagai gantinya.

2, Indikator VuManChu Swing Free

Ini adalah indikator di Trading View, dan kita harus pergi ke Trading View dan mengunduh kode sumbernya.

img

Kode VuManChu Swing Free:

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

// Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/
// This version is the old version of the Range Filter with less settings to tinker with

//@version=4
study(title="Range Filter - B&S Signals", shorttitle="RF - B&S Signals", overlay=true)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Size Function
rng_size(x, qty, n)=> 
//    AC       = Cond_EMA(abs(x - x[1]), 1, n)
    wper      = (n*2) - 1
    avrng     = ema(abs(x - x[1]), n)
    AC = ema(avrng, wper)*qty
    rng_size = AC

//Range Filter Function
rng_filt(x, rng_, n)=>
    r          = rng_
    var rfilt  = array.new_float(2, x)
    array.set(rfilt, 1, array.get(rfilt, 0))
    if x - r > array.get(rfilt, 1)
        array.set(rfilt, 0, x - r)
    if x + r < array.get(rfilt, 1)
        array.set(rfilt, 0, x + r)
    rng_filt1 = array.get(rfilt, 0)
    
    hi_band   = rng_filt1 + r
    lo_band   = rng_filt1 - r
    rng_filt  = rng_filt1
    [hi_band, lo_band, rng_filt]
 
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Source
rng_src = input(defval=close, type=input.source, title="Swing Source")

//Range Period
rng_per = input(defval=20, minval=1, title="Swing Period")

//Range Size Inputs
rng_qty   = input(defval=3.5, minval=0.0000001, title="Swing Multiplier")

//Bar Colors
use_barcolor = input(defval=false, type=input.bool, title="Bar Colors On/Off")

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Filter Values
[h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per)

//Direction Conditions
var fdir = 0.0
fdir    := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward   = fdir==1 ? 1 : 0
downward = fdir==-1 ? 1 : 0

//Trading Condition
longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0 
shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color  = upward and (rng_src > filt) ? (rng_src > rng_src[1] ? #05ff9b : #00b36b) :
             downward and (rng_src < filt) ? (rng_src < rng_src[1] ? #ff0583 : #b8005d) : #cccccc

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Filter Plot
filt_plot = plot(filt, color=filt_color, transp=67, linewidth=3, title="Filter")

//Band Plots
h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title="High Band")
l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title="Low Band")

//Band Fills
fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title="High Band Fill")
fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title="Low Band Fill")

//Bar Color
barcolor(use_barcolor ? bar_color : na)

//Plot Buy and Sell Labels
plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = color.white, style=shape.labelup, size = size.normal, location=location.belowbar, color = color.new(color.green, 0))
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = color.white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = color.new(color.red, 0))

//Alerts
alertcondition(longCondition, title="Buy Alert", message = "BUY")
alertcondition(shortCondition, title="Sell Alert", message = "SELL")

Logika strategis

Indikator EMA: Strategi menggunakan dua EMA rata-rata, satu garis cepat (parameter siklus kecil) dan satu garis lambat (parameter siklus besar). Peran EMA ganda adalah untuk membantu kita menentukan arah tren pasar.

  • Peringkat multi-head Di sini, Anda dapat melihat beberapa gambar yang menarik.

  • Peringkat kosong Di bawah jalur lambat ada jalur cepat.

Indikator VuManChu Swing Free: Indikator VuManChu Swing Free digunakan untuk mengirim sinyal, kemudian dikombinasikan dengan kondisi lain untuk menentukan apakah akan melakukan perdagangan. Dari sumber indikator VuManChu Swing Free dapat dilihat: variabel longCondition mewakili sinyal beli, variabel shortCondition mewakili sinyal jual.

Sekarang kita akan membahas kondisi pemicu sinyal perdagangan yang spesifik dalam strategi:

1, Aturan untuk masuk ke beberapa halaman: Harga penutupan garis K harus berada di atas garis cepat EMA, dua garis rata EMA harus menampilkan array multi-head (garis cepat di atas garis lambat), dan indikator VuManChu Swing Free harus muncul sinyal beli (long Condition true). Tiga kondisi berlaku, garis K adalah garis K kunci untuk melakukan banyak masuk, dan harga penutupan garis K adalah posisi masuk.

2, aturan untuk masuk dengan kepala kosong (sebagai kebalikan dari kepala banyak): Harga penutupan garis K harus berada di bawah garis cepat EMA, dua EMA rata-rata harus menunjukkan urutan kosong (garis cepat di bawah garis lambat), dan indikator VuManChu Swing Free harus menunjukkan sinyal jual (kondisi pendek benar). Tiga kondisi berlaku, harga penutupan garis K adalah posisi masuk kosong.

Logika trading tidak terlalu sederhana, karena tidak ada penjelasan khusus tentang stop loss di video yang muncul, penulis bebas bermain di sini menggunakan metode stop loss yang membandingkan, menggunakan stop loss titik tetap, dan melacak stop loss.

Desain Kode

Di sini kita bisa melihat beberapa contoh dari kode indikator VuManChu Swing Free yang kita masukkan langsung ke dalam kode strategi kita.

img

Setelah itu, kami menulis kode dalam bahasa Pine untuk melakukan transaksi:

// extend
fastEmaPeriod = input(50, "fastEmaPeriod")         // 快线周期
slowEmaPeriod = input(200, "slowEmaPeriod")        // 慢线周期
loss = input(30, "loss")                           // 止损点数
trailPoints = input(30, "trailPoints")             // 移动止盈触发点数
trailOffset = input(30, "trailOffset")             // 移动止盈偏移量(点数)
amount = input(1, "amount")                        // 下单量

emaFast = ta.ema(close, fastEmaPeriod)             // 计算快线EMA
emaSlow = ta.ema(close, slowEmaPeriod)             // 计算慢线EMA

buyCondition = longCondition and emaFast > emaSlow and close > open and close > emaFast         // 做多入场条件
sellCondition = shortCondition and emaFast < emaSlow and close < open and close < emaFast       // 做空入场条件

if buyCondition and strategy.position_size == 0
    strategy.entry("long", strategy.long, amount)
    strategy.exit("exit_long", "long", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)
if sellCondition and strategy.position_size == 0
    strategy.entry("short", strategy.short, amount)
    strategy.exit("exit_short", "short", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)

A.可以看到,当buyCondition为真时即:

Variabel 1, longCondition adalah benar (VuManChu Swing Free menunjukkan lebih banyak sinyal). 2, emaFast > emaSlow (EMA berulangkali disusun). 3, close > open (menunjukkan bahwa BAR saat ini adalah garis matahari), close > emaFast (menunjukkan bahwa harga penutupan berada di atas garis cepat EMA).

Ada tiga kondisi yang harus dipenuhi.

B.当sellCondition为真时,则做空的三个条件成立(这里不再赘述)。

Kemudian, jika sinyal if-condition judgment dipicu, gunakan strategi.entry untuk masuk dan buka, dan atur strategi.exit untuk stop loss, track stop.

Kode lengkap

/*backtest
start: 2022-01-01 00:00:00
end: 2022-10-08 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
args: [["ZPrecision",0,358374]]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

// Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/
// This version is the old version of the Range Filter with less settings to tinker with

//@version=4
study(title="Range Filter - B&S Signals", shorttitle="RF - B&S Signals", overlay=true)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Size Function
rng_size(x, qty, n)=> 
//    AC       = Cond_EMA(abs(x - x[1]), 1, n)
    wper      = (n*2) - 1
    avrng     = ema(abs(x - x[1]), n)
    AC = ema(avrng, wper)*qty
    rng_size = AC

//Range Filter Function
rng_filt(x, rng_, n)=>
    r          = rng_
    var rfilt  = array.new_float(2, x)
    array.set(rfilt, 1, array.get(rfilt, 0))
    if x - r > array.get(rfilt, 1)
        array.set(rfilt, 0, x - r)
    if x + r < array.get(rfilt, 1)
        array.set(rfilt, 0, x + r)
    rng_filt1 = array.get(rfilt, 0)
    
    hi_band   = rng_filt1 + r
    lo_band   = rng_filt1 - r
    rng_filt  = rng_filt1
    [hi_band, lo_band, rng_filt]
 
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Source
rng_src = input(defval=close, type=input.source, title="Swing Source")

//Range Period
rng_per = input(defval=20, minval=1, title="Swing Period")

//Range Size Inputs
rng_qty   = input(defval=3.5, minval=0.0000001, title="Swing Multiplier")

//Bar Colors
use_barcolor = input(defval=false, type=input.bool, title="Bar Colors On/Off")

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Filter Values
[h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per)

//Direction Conditions
var fdir = 0.0
fdir    := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward   = fdir==1 ? 1 : 0
downward = fdir==-1 ? 1 : 0

//Trading Condition
longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0 
shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color  = upward and (rng_src > filt) ? (rng_src > rng_src[1] ? #05ff9b : #00b36b) :
             downward and (rng_src < filt) ? (rng_src < rng_src[1] ? #ff0583 : #b8005d) : #cccccc

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Filter Plot
filt_plot = plot(filt, color=filt_color, transp=67, linewidth=3, title="Filter")

//Band Plots
h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title="High Band")
l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title="Low Band")

//Band Fills
fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title="High Band Fill")
fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title="Low Band Fill")

//Bar Color
barcolor(use_barcolor ? bar_color : na)

//Plot Buy and Sell Labels
plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = color.white, style=shape.labelup, size = size.normal, location=location.belowbar, color = color.new(color.green, 0))
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = color.white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = color.new(color.red, 0))

//Alerts
alertcondition(longCondition, title="Buy Alert", message = "BUY")
alertcondition(shortCondition, title="Sell Alert", message = "SELL")


// extend
fastEmaPeriod = input(50, "fastEmaPeriod")
slowEmaPeriod = input(200, "slowEmaPeriod")
loss = input(30, "loss")
trailPoints = input(30, "trailPoints")
trailOffset = input(30, "trailOffset")
amount = input(1, "amount")

emaFast = ta.ema(close, fastEmaPeriod)
emaSlow = ta.ema(close, slowEmaPeriod)

buyCondition = longCondition and emaFast > emaSlow and close > open and close > emaFast
sellCondition = shortCondition and emaFast < emaSlow and close < open and close < emaFast

if buyCondition and strategy.position_size == 0
    strategy.entry("long", strategy.long, amount)
    strategy.exit("exit_long", "long", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)
if sellCondition and strategy.position_size == 0
    strategy.entry("short", strategy.short, amount)
    strategy.exit("exit_short", "short", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)

Tes ulang

Rentang waktu uji coba retargeting dipilih dari Januari 2022 hingga Oktober 2022, siklus garis K adalah 15 menit, menggunakan model retargeting harga penutupan. Pasar memilih kontrak permanen ETH_USDT Binance. Parameter pengaturan sesuai dengan garis cepat 50 siklus, garis lambat 200 siklus, dan parameter lainnya tidak berubah secara default.

img

img

Hasil retesting Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma

Jika Anda ingin membeli Bitcoin, Anda harus membeli Bitcoin dengan harga yang lebih murah.

img

Hasilnya di BTC juga meledak:

img

img

Alamat kebijakan:https://www.fmz.com/strategy/385745

Tampaknya metode perdagangan ini masih lebih dapat diandalkan untuk menangkap tren, dan dapat terus mengoptimalkan desain berdasarkan gagasan ini. Dalam artikel ini, kita tidak hanya memahami ide strategi garis lurus ganda, tetapi juga memahami cara menggunakan strategi minyak untuk memproses dan belajar.


Berkaitan

Lebih banyak

fantadongApakah strategi ini juga untuk parameter yang sama?

hyc1743Dream Big, kenapa sinyalnya ada di ikon, tapi tidak ada kartu nyata? /upload/asset/23cc031609caa7a896da3.jpg /upload/asset/23cae1c5d5b26ec763ea6.jpg /upload/asset/23d49ff4aec3475793e5e.jpg

Awan ringanMengharukan, menyarankan untuk mencari dua atau tiga strategi yang lebih representatif dari pipa minyak, yang sulit ditulis ulang, fungsi, parameter, dan metode operasi yang lebih banyak untuk membuat beberapa versi teks tutorial, seperti yang mirip dengan line.delete seperti. Tidak perlu strategi yang menguntungkan, bahkan jika strategi yang merugikan tidak berarti, terutama digunakan untuk belajar menulis strategi). Saya sekarang telah belajar untuk mengubah beberapa strategi kombinasi yang tidak terlalu rumit dengan strategi dua garis lurus ini, saya telah mengubah lebih dari selusin strategi kombinasi, salah satu atau dua di antaranya adalah hasil pengulangan data 21 tahun 22 tahun yang sangat bagus, dan telah diuji di run disk, tetapi menemukan operasi parameter fungsi yang rumit seperti tip: line: 62 Could not find function or function reference 'line.delete', namun tidak ada penjelasan terkait line.delete yang ditemukan dalam dokumen FMZ PINE Script. Terima kasih banyak.

HaykoSaatnya 21 April - 10 Oktober, BTC lebih buruk.

yingjunJika Anda tidak mengerti apa yang dimaksud dengan stop loss, apakah Anda bisa menjelaskan? misalnya, 30 secara default berarti BTC turun 30 inci? stop loss?

Awan ringanDreamDa, tolong, apakah PINE bisa menulis cara yang agak rumit untuk menghentikan jerawat? Jika PINE dapat dikombinasikan dengan JS, misalnya menulis indikator dengan PINE, maka bagian transaksi JS akan lebih mudah ditulis.

yingjunDisk nyata akan mengalami kesalahan pada tahun 2022

FmzeroKebijakan Menyimpan Slogan Ini REST: sql: no rows in result set (tidak ada baris dalam result set)

FmzeroMimpi yang keras kepala

Mimpi kecilHa ha, strategi tren itu sendiri adalah "Ya, jika pasar di masa depan memiliki tren, jika tidak, itu akan menjadi strategi guncangan".

Mimpi kecilTidak sopan.

hyc1743Terima kasih banyak.

Mimpi kecilHalo, ini karena tanda BUY yang ditampilkan pada grafik hanya menunjukkan tanda indikator dalam artikel, dan di belakangnya juga ada garis lurus. `` /Plot Beli dan Jual Label plotshape ((longCondition, title = "Buy Signal", text ="BUY", textcolor = color.white, style=shape.labelup, size = size.normal, location=location.belowbar, color = color.new(color.green, 0)) plotshape ((shortCondition, title = "Sell Signal", text ="SELL", textcolor = color.white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = color.new(color.red, 0)) `` plotshape ((longCondition, title = "Buy Signal", text ="BUY Gambar menunjukkan bahwa hanya kondisi longCondition yang sesuai. Kondisi berikut di bagian ini: `` if buyKondisi dan strategi.position_size == 0 strategi.entry (untuk "panjang", strategi.panjang, jumlah) strategi.exit (("exit_long", "long", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset) if sellKondisi dan strategi.position_size == 0 strategi.entry (untuk short, strategy.short, amount) strategi.exit (("exit_short", "short", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset) ``

Awan ringanTidak mengherankan, saya mengerti, terima kasih.

Mimpi kecilline belum didukung di FMZ, jadi beberapa garis mungkin tidak dapat diubah. Beberapa kebijakan menggunakan obyek ini untuk berpartisipasi dalam perhitungan.

Mimpi kecil"Saya tidak tahu apa yang akan terjadi", katanya, "tapi saya pikir itu mungkin karena waktu retesting terlalu lama dan terlalu banyak data".

Mimpi kecilTutorial bahasa Pine memiliki bagian dan deskripsi yang dapat Anda lihat di sini: https://www.fmz.com/bbs-topic/9390#%E5%B8%A6%E8%B7%F%E8%B8%AA%E6%AD%A2%E6%8D%9F%E6%AD%A2%E7%9B%88%E7%9A%84%E8%B6%85%E7%BA%A7%E8%B6%8B%E5%8A%BF%E7%AD%96%E7%95%A5

Awan ringanOh, saya mengaturnya dalam setahun atau 10 bulan, dan pada dasarnya saya bisa menyelesaikannya, dan setelah setahun saya akan memiliki tip ini atau banyak lagi.

Mimpi kecilTidak ada batasan, kesalahan ini seharusnya terlalu besar.

Awan ringanBaiklah, terima kasih, dan apakah ada batasan waktu untuk memeriksa PINE? Saya memilih 1 Januari 2021 hingga 11 Oktober 2022, dan ini menunjukkan kesalahan: RunError: abort(undefined) at Error at StackTrace (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:1:147), :1:2096171) at stackTrace (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:1:147), :1:2096345) at abort (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:147), :192xx:1478) at stackTrace (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:147), :2096171) at stackTrace (eval at self.onmessage (https://www.fmz.fmz. Namun jika tidak mengubah rentang waktu, maka reset normal....... /upload/asset/5a09837c7498543a0c5c.jpg

Mimpi kecilPine seharusnya dapat merancang penghentian yang lebih kompleks, yang belum ada di dalam kode JS.

Mimpi kecilAnda dapat mengirim screenshot untuk melihat laporan kesalahan tertentu.

Mimpi kecilOh, maaf, alamat kebijakan yang salah, sudah diubah.