Lewati ke isi

Cara mengotomatisasi strategi trading manual

Trading otomatis atau algoritmik menawarkan beberapa keuntungan dibandingkan trading manual:

  • Sistem otomatis menghilangkan pengambilan keputusan emosional dan mengeksekusi trading dengan presisi, kecepatan, dan efisiensi yang meningkat.
  • Algoritma secara konsisten menerapkan strategi trading canggih sementara langkah-langkah manajemen risiko ditegakkan secara andal.
  • Algoritma memungkinkan backtesting strategi menggunakan data historis dan diversifikasi di berbagai aset dan pasar secara bersamaan.

API cTrader Algo memberdayakan trader untuk mengotomatisasi strategi manual yang kompleks, memungkinkan mereka untuk memanfaatkan banyak keuntungan dari trading algoritmik. Dalam artikel ini dan video yang menyertainya, Anda akan belajar cara mengotomatisasi strategi manual yang rumit dan mengubah urutan operasi menjadi algoritma.

Identifikasi pola strategi manual

Untuk mengembangkan algoritma, mari kita asumsikan kita secara manual trading pola hammer untuk entri long dan pola hanging man untuk entri short.

Hammer terjadi selama tren turun dan menunjukkan potensi pembalikan bullish. Pola hammer digunakan untuk mengidentifikasi entri beli.

Hanging man muncul selama tren naik dan menunjukkan potensi pembalikan bearish. Pola hanging man digunakan untuk mengidentifikasi entri jual.

Kembangkan cBot untuk trading strategi manual

Di cTrader Algo, mari kita buat algoritma yang mengimplementasikan strategi yang dijelaskan di bagian sebelumnya.

Klik tombol New di bawah tab cBot. Ketik Patterns Strategy di kolom nama dan klik Create.

Pada metode OnBarClosed(), kita implementasikan logika untuk strategi kita. Entri kita harus memenuhi dua kondisi ini:

  • Harga penutupan cocok dengan harga tertinggi.
  • Ukuran candlestick setidaknya lima kali lebih besar dari badan candlestick.

Kita mulai dengan mendefinisikan parameter Volume, StopLoss dan TakeProfit.

1
2
3
4
5
6
7
8
[Parameter(DefaultValue = 1000)]
public double Volume { get; set; }

[Parameter(DefaultValue = 10)]
public double StopLoss { get; set; }

[Parameter(DefaultValue = 10)]
public double TakeProfit { get; set; }

Kemudian kita menulis snippet untuk mengeksekusi trading beli ketika kondisi yang diperlukan terpenuhi.

1
2
3
4
5
if (Bars.Last(0).Close == Bars.Last(0).High &&
            (Bars.Last(0).Close - Bars.Last(0).Open) < (Bars.Last(0).Close - Bars.Last(0).Low) * 0.2)
{
    ExecuteMarketOrder(TradeType.Buy, SymbolName, Volume, InstanceId, StopLoss, TakeProfit);
}
1
2
3
bar = api.Bars.Last(0)
if bar.Close == bar.High and (bar.Close - bar.Open) < (bar.Close - bar.Low) * 0.2:
    api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, api.Volume, api.InstanceId, api.StopLoss, api.TakeProfit)

Di sisi sebaliknya, ini adalah kondisi yang harus dipenuhi untuk entri jual kita:

  • Harga penutupan cocok dengan harga terendah.
  • Ukuran candlestick setidaknya lima kali lebih besar dari badan candlestick.

Demikian pula, kita menulis snippet untuk mengeksekusi trading jual ketika kondisi yang diperlukan terpenuhi.

1
2
3
4
5
if (Bars.Last(0).Close == Bars.Last(0).Low &&
                (Bars.Last(0).Open - Bars.Last(0).Close) < (Bars.Last(0).High - Bars.Last(0).Close) * 0.2)
{
    ExecuteMarketOrder(TradeType.Sell, SymbolName, Volume, InstanceId, StopLoss, TakeProfit);
}
1
2
if bar.Close == bar.Low and (bar.Open - bar.Close) < (bar.High - bar.Close) * 0.2:
    api.ExecuteMarketOrder(TradeType.Sell, api.SymbolName, api.Volume, api.InstanceId, api.StopLoss, api.TakeProfit)

Anda dapat menyalin kode lengkapnya di bawah ini:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None, AddIndicators = true)]
    public class PatternsStrategy : Robot
    {
        [Parameter(DefaultValue = 1000)]
        public double Volume { get; set; }

        [Parameter(DefaultValue = 10)]
        public double StopLoss { get; set; }

        [Parameter(DefaultValue = 10)]
        public double TakeProfit { get; set; }

        protected override void OnStart()
        {

        }

        protected override void OnBarClosed()
        {
            if (Bars.Last(0).Close == Bars.Last(0).High &&
            (Bars.Last(0).Close - Bars.Last(0).Open) < (Bars.Last(0).Close - Bars.Last(0).Low) * 0.2)
            {
                ExecuteMarketOrder(TradeType.Buy, SymbolName, Volume, InstanceId, StopLoss, TakeProfit);
            }

            if (Bars.Last(0).Close == Bars.Last(0).Low &&
            (Bars.Last(0).Open - Bars.Last(0).Close) < (Bars.Last(0).High - Bars.Last(0).Close) * 0.2)
            {
                ExecuteMarketOrder(TradeType.Sell, SymbolName, Volume, InstanceId, StopLoss, TakeProfit);
            }

        }

        protected override void OnStop()
        {

        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class PatternsStrategy():
    def on_start(self):
        pass

    def on_bar_closed(self):
        bar = api.Bars.Last(0)

        if bar.Close == bar.High and (bar.Close - bar.Open) < (bar.Close - bar.Low) * 0.2:
            api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, api.Volume, api.InstanceId, api.StopLoss, api.TakeProfit)

        if bar.Close == bar.Low and (bar.Open - bar.Close) < (bar.High - bar.Close) * 0.2:
            api.ExecuteMarketOrder(TradeType.Sell, api.SymbolName, api.Volume, api.InstanceId, api.StopLoss, api.TakeProfit)

    def on_stop(self):
        pass

Untuk membangun cBot, tekan Ctrl+B atau klik Build.

Untuk melakukan backtesting cBot, pertama-tama kita menambahkan sebuah instance. Pilih opsi Locally, tentukan parameter yang Anda inginkan dan klik tombol Add instance.

Kemudian kita beralih ke tab Backtesting, tentukan periode untuk operasi backtesting dan mulai backtesting.

Setelah proses backtesting selesai, kita dapat memeriksa trading. Anda akan melihat bahwa kondisi entri terpenuhi tepat sebelum setiap trading dimasuki.

Dengan keberhasilan otomatisasi strategi kita, kita dapat menggunakan cBot untuk melakukan trading atas nama kita.

Implementasikan strategi pembalikan RSI

Dalam contoh kedua kita, kita ingin mengimplementasikan strategi berdasarkan pembalikan indikator Relative Strength Index (RSI). Dalam strategi ini, kita memasuki posisi dengan mengharapkan RSI membalikkan arahnya dan mengikuti aturan-aturan berikut:

  • Ketika nilai RSI bergerak di bawah ambang batas beli RSI, kita memasuki posisi beli.
  • Ketika nilai RSI bergerak di atas ambang batas jual RSI, kita memasuki posisi jual.

Mari kita buat cBot baru, masukkan RSI Reversal Strategy sebagai namanya dan klik Create.

Setelah editor kode muncul, tambahkan System.Linq ke bagian atas kode sebagai referensi.

1
using System.Linq;

Mari kita tambahkan dua parameter yang akan memungkinkan kita memodifikasi ambang batas sebelum kita menjalankan cBot.

1
2
3
4
5
[Parameter(DefaultValue = 30)]
public int BuyLevel { get; set; }

[Parameter(DefaultValue = 70)]
public int SellLevel { get; set; }

Kita mendeklarasikan dan menginisialisasi indikator relative strength kita.

1
2
3
4
5
6
private RelativeStrengthIndex _rsi;

protected override void OnStart()
{
    _rsi = Indicators.RelativeStrengthIndex(Bars.ClosePrices, 14);
}
1
2
3
class RSIReversalStrategy():
    def on_start(self):
        self._rsi = api.Indicators.RelativeStrengthIndex(api.Bars.ClosePrices, 14)

Kemudian kita mengimplementasikan kondisi-kondisi yang mendefinisikan logika trading kita.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
protected override void OnBarClosed()
{

    if (_rsi.Result.LastValue < BuyLevel)
    {
        if (Positions.Count == 0)
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000);
        foreach (var position in Positions.Where(p => p.TradeType == TradeType.Sell))
        {
            position.Close();
        }

    }
    else if (_rsi.Result.LastValue > SellLevel)
    {
        if (Positions.Count == 0)
            ExecuteMarketOrder(TradeType.Sell, SymbolName, 1000);
        foreach (var position in Positions.Where(p => p.TradeType == TradeType.Buy))
        {
            position.Close();
        }
    }

}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
def on_bar_closed(self):
    rsi_value = self._rsi.Result.LastValue

    if rsi_value < api.BuyLevel:
        if api.Positions.Count == 0:
            api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 1000)
        for position in api.Positions:
            if position.TradeType == TradeType.Sell:
                position.Close()

    elif rsi_value > api.SellLevel:
        if api.Positions.Count == 0:
            api.ExecuteMarketOrder(TradeType.Sell, api.SymbolName, 1000)
        for position in api.Positions:
            if position.TradeType == TradeType.Buy:
                position.Close()

Anda dapat menyalin kode lengkapnya di bawah ini:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None, AddIndicators = true)]
    public class RSIReversalStrategy : Robot
    {
        [Parameter(DefaultValue = 30)]
        public int BuyLevel { get; set; }

        [Parameter(DefaultValue = 70)]
        public int SellLevel { get; set; }

        private RelativeStrengthIndex _rsi;

        protected override void OnStart()
        {
            _rsi = Indicators.RelativeStrengthIndex(Bars.ClosePrices, 14);
        }

        protected override void OnBarClosed()
        {

            if (_rsi.Result.LastValue < BuyLevel)
            {
                if (Positions.Count == 0)
                    ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000);
                foreach (var position in Positions.Where(p => p.TradeType == TradeType.Sell))
                {
                    position.Close();
                }

            }
            else if (_rsi.Result.LastValue > SellLevel)
            {
                if (Positions.Count == 0)
                    ExecuteMarketOrder(TradeType.Sell, SymbolName, 1000);
                foreach (var position in Positions.Where(p => p.TradeType == TradeType.Buy))
                {
                    position.Close();
                }
            }

        }

        protected override void OnStop()
        {

        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class RSIReversalStrategy():
    def on_start(self):
        self._rsi = api.Indicators.RelativeStrengthIndex(api.Bars.ClosePrices, 14)

    def on_bar_closed(self):
        rsi_value = self._rsi.Result.LastValue

        if rsi_value < api.BuyLevel:
            if api.Positions.Count == 0:
                api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 1000)
            for position in api.Positions:
                if position.TradeType == TradeType.Sell:
                    position.Close()

        elif rsi_value > api.SellLevel:
            if api.Positions.Count == 0:
                api.ExecuteMarketOrder(TradeType.Sell, api.SymbolName, 1000)
            for position in api.Positions:
                if position.TradeType == TradeType.Buy:
                    position.Close()

    def on_stop(self):
        pass

Mari kita bangun strategi kita, tambahkan instance dan lakukan backtesting, seperti yang kita lakukan dengan strategi sebelumnya.

Kita dapat memeriksa dan meninjau beberapa trading lagi untuk melihat kondisi entri yang terpenuhi tepat sebelum sebuah trading dimasuki.

Artikel ini telah mendemonstrasikan cara mengidentifikasi strategi manual dan mengubahnya menjadi strategi otomatis, memungkinkan operasi trading algo.

Image title