Bài viết và video này cung cấp hướng dẫn từng bước để tạo robot giao dịch bằng Python.
Ghi chú
cTrader là nền tảng giao dịch lớn duy nhất có hỗ trợ Python tích hợp sẵn, cho phép bạn viết mã bằng Python và xây dựng bot, chỉ báo kỹ thuật và công cụ trực tiếp trong cTrader Windows hoặc Mac. Không cần bộ chuyển đổi hay giải pháp phức tạp.
Tạo robot giao dịch
Trong tab cBots của ứng dụng Algo, nhấp vào nút New để bắt đầu tạo bot giao dịch mới.
Đặt tên cho cBot và chọn Python làm ngôn ngữ lập trình.
Ghi chú
cTrader cung cấp một số thuật toán có sẵn bằng Python bao gồm nhiều chiến lược và hành động giao dịch tự động. Các mẫu thuật toán này đã có sẵn logic giao dịch và các tham số có thể tùy chỉnh, sẵn sàng chạy ngay sau khi bạn lưu và xây dựng chúng.
Chọn Using template làm phương thức tạo, chọn Grid Sample, sau đó nhấp vào Create.
Grid cBot triển khai chiến lược giao dịch lưới trong đó nhiều lệnh mua hoặc bán cho một biểu tượng được đặt ở các khoảng giá hoặc bước đều đặn, tạo thành một "lưới" các vị thế.
Hãy xây dựng cBot của chúng ta để xác thực mã của nó.
Nhấn Ctrl+B hoặc nhấp vào Build.
Nhấn Cmd+B hoặc nhấp vào biểu tượng Build.
Thêm chỉ báo
Hãy kết hợp một chỉ báo vào bot giao dịch của chúng ta để cải thiện độ chính xác.
Chỉ số sức mạnh tương đối (RSI) là một chỉ báo phổ biến báo hiệu các điều kiện mua quá mức hoặc bán quá mức trên thị trường. Chỉ báo này có thể giúp cBot của chúng ta tránh mở vị thế mới khi thị trường đang bị kéo quá mức theo một hướng.
Tích hợp RSI vào logic của robot. Khởi tạo chỉ báo với chu kỳ mặc định là 14 và đặt mức mua quá mức và bán quá mức lần lượt là 70 và 30. Sử dụng giá đóng cửa của biểu tượng để tạo RSI.
Thêm logic để kiểm tra xem các điều kiện RSI có cho phép giao dịch trước khi mở vị thế hay không. Nếu bộ lọc chặn giao dịch, hãy ghi lại một thông báo hiển thị giá trị RSI hiện tại.
Viết mã đảm bảo rằng vị thế lưới chỉ được mở nếu giá đã di chuyển đủ và giá trị RSI nằm trong phạm vi trung tính. Sử dụng giá trị RSI của nến đã đóng cuối cùng để đảm bảo ổn định và in một thông báo khi bị chặn bởi bộ lọc RSI.
1 2 3 4 5 6 7 8 9101112131415
ifdistance>=api.StepPips:# self.open_position()ifself.passes_rsi_filter():self.open_position()else:api.Print("RSI filter: no new entry (RSI={:.2f}, range {}-{})".format(self.get_rsi_value(),self.rsi_oversold,self.rsi_overbought))defget_rsi_value(self):# Use the last CLOSED bar for stabilityreturnself.rsi.Result.Last(1)defpasses_rsi_filter(self):r=self.get_rsi_value()return(r>self.rsi_oversold)and(r<self.rsi_overbought)
Điều chỉnh logic tính toán khoảng cách tính bằng pip giữa giá thị trường hiện tại và giá vào lệnh của một vị thế.
importclrclr.AddReference("cAlgo.API")# Import cAlgo API typesfromcAlgo.APIimport*# Import trading wrapper functionsfromrobot_wrapperimport*classSupercBot():defon_start(self):self.volumeInUnits=api.Symbol.QuantityToVolumeInUnits(api.VolumeInLots)self.enoughMoney=Trueself.rsi_period=getattr(api,"RsiPeriod",14)self.rsi_overbought=getattr(api,"RsiOverbought",70)self.rsi_oversold=getattr(api,"RsiOversold",30)self.rsi=api.Indicators.RelativeStrengthIndex(api.Bars.ClosePrices,self.rsi_period)iflen(self.get_grid_positions())==0:ifself.passes_rsi_filter():self.open_position()else:api.Print("RSI filter blocked initial entry (RSI={:.2f})".format(self.get_rsi_value()))defon_tick(self):grid_positions=self.get_grid_positions()net_profit_sum=sum([p.NetProfitforpingrid_positions])ifnet_profit_sum>=api.TargetProfit:api.Print("Target profit is reached. Closing all grid positions")self.close_grid_positions()api.Print("All grid positions are closed. Stopping cBot")api.Stop()iflen(grid_positions)>0andself.enoughMoney==True:position_with_highest_pips=sorted(grid_positions,key=lambdapos:pos.Pips,reverse=True)[0]distance=self.get_distance_in_pips(position_with_highest_pips)ifdistance>=api.StepPips:ifself.passes_rsi_filter():self.open_position()else:api.Print("RSI filter: no new entry (RSI={:.2f}, range {}-{})".format(self.get_rsi_value(),self.rsi_oversold,self.rsi_overbought))defget_rsi_value(self):# Use the last CLOSED bar for stabilityreturnself.rsi.Result.Last(1)defpasses_rsi_filter(self):r=self.get_rsi_value()return(r>self.rsi_oversold)and(r<self.rsi_overbought)defget_grid_positions(self):return[posforposinapi.Positionsifpos.SymbolName==api.SymbolNameandpos.TradeType==api.TradeType]defopen_position(self):result=api.ExecuteMarketOrder(api.TradeType,api.SymbolName,self.volumeInUnits,"Grid")ifresult.Error==ErrorCode.NoMoney:self.enoughMoney=Falseapi.Print("Not enough money to open additional positions")defclose_grid_positions(self):forpositioninself.get_grid_positions():position.Close()iflen(self.get_grid_positions())>0:self.close_grid_positions()defget_distance_in_pips(self,position):ifposition.TradeType==TradeType.Buy:diff=position.EntryPrice-api.Symbol.Askelse:diff=api.Symbol.Bid-position.EntryPricereturndiff/api.Symbol.PipSize
Khởi chạy một phiên bản
Hãy quay lại cBot của chúng ta và xây dựng nó. Bây giờ, nhấp vào biểu tượng Start cBot cho bất kỳ phiên bản nào và bot giao dịch sẽ bắt đầu chạy.
Ngoài ra, bạn có thể nhấp vào Add instance, chỉ định các tham số phiên bản ưa thích của bạn, thêm phiên bản mới và khởi động nó.
Bằng cách thêm và tùy chỉnh các phiên bản mới, bạn có thể chạy cBot đồng thời trên các biểu tượng, khung thời gian hoặc tham số khác nhau.
Chạy bot ở nơi khác
Với đồng bộ hóa đám mây được bật, cBot sẽ tự động xuất hiện trong tất cả các ứng dụng cTrader nơi cTID của bạn đang hoạt động. Chúng ta có thể khởi động cùng một robot giao dịch trong Đám mây trên bất kỳ ứng dụng cTrader nào, bao gồm cả cTrader Mobile và Web.
Trong cTrader Algo, hãy khởi động cBot.
Bài viết này đã chứng minh cách tạo robot giao dịch Python và khởi động nó, giúp bạn tự động hóa các chiến lược của mình và chạy thuật toán trên bất kỳ thiết bị nào.