하아찡

[C#/WPF] Chart - 1 본문

C#/코인프로그램 - 진행상황

[C#/WPF] Chart - 1

하아찡 2023. 11. 23. 18:33

 

 

추가내역 

 - Y축에 현재 코인이 존재할경우 내 평단가 데이터 추가 완료

 

내 잔고 리스트 다시 불러와 현재 로드한 차트랑 내 잔고에 해당 코인이 존재 할 경우 평단가 커서를 추가시키는 방향으로 코드를 작성했음.

 

차트에 출력하기위해 커서 구조 코드

public class ChartSideCursor : INotifyPropertyChanged
{
    private double x;
    public double X
    {
        get { return x; }
        set
        {
            x = value;
            OnPropertyChanged(nameof(x));
        }
    }

    private double y;
    public double Y
    {
        get { return y; }
        set
        {
            y = value;
            OnPropertyChanged(nameof(y));
        }
    }

    private string cursorvalue;
    public string CursorValue
    {
        get { return cursorvalue; }
        set
        {
            cursorvalue = value;
            OnPropertyChanged(nameof(cursorvalue));
        }
    }
    private Brush backcolor;//색상
    public Brush BackColor
    {
        get { return backcolor; }
        set
        {
            backcolor = value;
            OnPropertyChanged(nameof(backcolor));
        }
    }

    private Brush color;//색상
    public Brush Color
    {
        get { return color; }
        set
        {
            color = value;
            OnPropertyChanged(nameof(color));
        }
    }
    public string Type { get; set; }
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

INotifyPropertyChanged를 추가해서 사용한 이유는 내부 데이터가 변경시 UI쪽도 변경이 일어나야해서 추가해줬음.

X값은 X축을 사용할때 캔버스에 그려지는 X축값임.

Y값은 Y축을 사용할때 캔버스에 그려지는 Y축값임.

CursorValue값은 해당 커서에 출력되는 값을 저장함.

Color값은 각 커서마다 색상을 다르게 하기위해 각각 저장시킴.

 - BackColor값은 해당 커서 색과 텍스트 배경색값

 - Color값은 텍스트 색상값.

 

 

아래코드는 차트에서 캔버스에 출력하기위해 Y축에 저장된 값을 변경하기위해 함수를 작성.

private void GetCoinPrice()
{
    if (Market == "")
        return; 

    UpbitFunctions.Accounts FAccount = new UpbitFunctions.Accounts();
    double price = FAccount.GetAccountCoinPrice(Market);
    if( price >= 0)
    {
        PrintChartYAxis[4].CursorValue = price.ToString();
        PrintChartYAxis[4].Y = (GridHeight * ((MaxPrice - price) / (MaxPrice - MinPrice))) + GapYAxis;
    }
    else
    {
        PrintChartYAxis[4].Y = -100;
    }
}

 

PrintChartYAxis 4번째는 내 평단가 출력하는 List값임.

 

아래코드는 잔고를 불러오는코드와 잔고안에 전달받은 코인이 존재하는지 확인 후 평단가를 전달해주는 함수.

public class Accounts
{
    public async Task<List<Structs.Accounts>> AccountsAsync()
    {
        URLs url = new URLs();
        List<Structs.Accounts> ListResult = new List<Structs.Accounts>();
        if (!Access.UpbitInstance.GetAccess())
        {
            return ListResult;
        }

        

        try
        {
            var client = new HttpClient();
            var request = new HttpRequestMessage
            {
                Method = HttpMethod.Get,
                RequestUri = new Uri(url.Account),
                Headers =
                {
                    { "accept", "application/json" },
                    { "Authorization", JWT.GetJWT() },
                },
            };


            using (var response = await client.SendAsync(request))
            {
                response.EnsureSuccessStatusCode();
                var body = await response.Content.ReadAsStringAsync();

                JArray jsonArray = JArray.Parse(body);


                foreach (var item in jsonArray.Children())
                {
                    Structs.Accounts lr = new Structs.Accounts();

                    lr.Currency = item["currency"].ToString();
                    lr.Balance = item["balance"].ToString();
                    lr.Locked = item["locked"].ToString();
                    lr.AvgBuyPrice = item["avg_buy_price"].ToString();
                    lr.AvgBuyPriceModified = (bool)item["avg_buy_price_modified"];
                    lr.UnitCurrency = item["unit_currency"].ToString();

                    ListResult.Add(lr);
                }

                return ListResult;
            }
        }
        catch (Exception e)
        {
            Language.Lang.Upbit Lang = new Language.Lang.Upbit();
            string KeyError = Lang.LKeyError;
            string KeyComment = Lang.LKeyComment;
            MessageBox.Show(KeyError + "\n" + KeyComment);
            //MessageBox.Show(e.ToString());
            Logs.Loginstance.UpbitLog(KeyError);
            Access.UpbitInstance.ExceptionKey();
            return ListResult;
        }


    }

    public double GetAccountCoinPrice(string Market)
    {
        double value = -1;
        string[] str = Market.Split("-");
        List<Structs.Accounts> accounts = Task.Run(() => AccountsAsync()).Result;
        foreach(Structs.Accounts v in accounts)
        {
            if(v.UnitCurrency == str[0] && v.Currency == str[1])
            {
                value = Convert.ToDouble(v.AvgBuyPrice);
                break;
            }
        }

        return value;
    }

 

해당코드는 Upbit OpenApi를 사용해서 AccessKey와 SecretKey를 할당받아야 사용가능함. 

추후 Prism으로 변경할때 변경된 코드를 블로그에 정리하여 업로드 할때 코드들을 다 올리겠음.

반응형