indicator
indicator
02 Mar 2025, 07:35
Please check and fix this indicator: using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
namespace cAlgo.Indicators
{
[Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class MultiTimeframeChoChIndicator : Indicator
{
// Tham số cài đặt
[Parameter("Khoảng cách mũi tên (pips)", DefaultValue = 10)]
public int ArrowOffset { get; set; }
[Parameter("Kích thước mũi tên", DefaultValue = 20)]
public int ArrowSize { get; set; }
[Parameter("Màu mũi tên Buy", DefaultValue = "Green")]
public string BuyArrowColor { get; set; }
[Parameter("Màu mũi tên Sell", DefaultValue = "Red")]
public string SellArrowColor { get; set; }
[Parameter("Gửi thông báo đến mobile", DefaultValue = true)]
public bool SendMobileNotification { get; set; }
// Khung thời gian để phân tích
private TimeFrame _higherTimeframe1;
private TimeFrame _higherTimeframe2;
// Dữ liệu từ các khung thời gian khác
private Bars _higherTimeframeBars1;
private Bars _higherTimeframeBars2;
protected override void Initialize()
{
// Xác định khung thời gian cao hơn dựa trên khung thời gian hiện tại
if (TimeFrame == TimeFrame.Minute30)
{
_higherTimeframe1 = TimeFrame.Hour4;
_higherTimeframe2 = TimeFrame.Daily;
}
else if (TimeFrame == TimeFrame.Hour4)
{
_higherTimeframe1 = TimeFrame.Daily;
_higherTimeframe2 = TimeFrame.Weekly;
}
else
{
Print("Chỉ hỗ trợ khung thời gian M30 và H4.");
return;
}
// Lấy dữ liệu từ khung thời gian cao hơn
_higherTimeframeBars1 = MarketData.GetBars(_higherTimeframe1);
_higherTimeframeBars2 = MarketData.GetBars(_higherTimeframe2);
}
public override void Calculate(int index)
{
// Chỉ tính toán khi có nến mới
if (index < 1) return;
// Kiểm tra ChoCh trên khung thời gian cao hơn 1
CheckForChoCh(_higherTimeframeBars1, index, "H4");
// Kiểm tra ChoCh trên khung thời gian cao hơn 2
CheckForChoCh(_higherTimeframeBars2, index, "D1");
}
private void CheckForChoCh(Bars higherTimeframeBars, int index, string timeframeLabel)
{
// Lấy dữ liệu giá từ khung thời gian cao hơn
double currentHigh = higherTimeframeBars.HighPrices.Last(1);
double currentLow = higherTimeframeBars.LowPrices.Last(1);
double previousHigh = higherTimeframeBars.HighPrices.Last(2);
double previousLow = higherTimeframeBars.LowPrices.Last(2);
// Kiểm tra ChoCh cho Buy (phá vỡ kháng cự)
if (currentHigh > previousHigh)
{
DrawArrow(TradeType.Buy, higherTimeframeBars.OpenTimes.Last(1), currentHigh, BuyArrowColor, timeframeLabel);
SendNotification($"Tín hiệu Buy - ChoCh {timeframeLabel}");
}
// Kiểm tra ChoCh cho Sell (phá vỡ hỗ trợ)
if (currentLow < previousLow)
{
DrawArrow(TradeType.Sell, higherTimeframeBars.OpenTimes.Last(1), currentLow, SellArrowColor, timeframeLabel);
SendNotification($"Tín hiệu Sell - ChoCh {timeframeLabel}");
}
}
private void DrawArrow(TradeType tradeType, DateTime time, double price, string color, string label)
{
// Vẽ mũi tên trên biểu đồ
Chart.DrawIcon(
$"{tradeType}_{label}_{time}",
tradeType == TradeType.Buy ? ChartIconType.UpArrow : ChartIconType.DownArrow,
time,
price - (tradeType == TradeType.Buy ? Symbol.PipSize * ArrowOffset : -Symbol.PipSize * ArrowOffset),
Color.FromName(color),
ArrowSize);
}
private void SendNotification(string message)
{
// Gửi thông báo đến mobile
if (SendMobileNotification)
{
Notifications.PlaySound("alert.mp3");
Notifications.SendEmail("your-email@example.com", "ctrader@example.com", "Tín hiệu giao dịch", message);
Notifications.SendPushNotification(message);
}
}
}
}