하아찡

WPF - 호가창 및 차트 수정사항 완료 본문

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

WPF - 호가창 및 차트 수정사항 완료

하아찡 2022. 8. 20. 01:13

이전글에서 수정사항 수정완료

수정완료사항

 - 차트 실시간 반영은 완료했지만 현재 차트 최대값, 최소값 처리 안해둠.

 - 시간데이터를 UTC로 받아와서 KST로 변환작업 해야함.

 

추가로 알게된사항

해당 코인 틱을 불러올때 KST 시간을 기준으로해서 -540을 뺴줬는데 UTC랑 9시간 차이나서 뺴줘야 정상적으로 처리가 가능했던것.

KST 시간을 기준으로 작업하지 말고 UTC시간을 기준으로 틱을 불러와야할듯

 

 

이전글 수정사항

 

 

진행된 작업

 1. 코인목록컨트롤 정리작업.O

 2. DB에 모든 코인 거래 내용을 저장하는 기능 작업. O(C# 머신러닝 있길래 DB에저장해서 학습시켜서 사용해볼라했는데 일단 보류, 기능만 만들어둔상태로 사용하지않음.)

 3. 차트 오른쪽하단 UTC 시간데이터를 KST 시간으로 변경완료.

 4. 차트 오른쪽하단 시간을 데이터가 들어왔을때 변경하도록 추가 수정.

 

남은작업

 1. 자동으로 매매하는 기능 작업.

 

코인목록 수정된 XAML

<Grid  TextElement.FontSize="14">
        <Grid.RowDefinitions>
            <RowDefinition Height="26"/>
            <RowDefinition Height="26"/>
            <RowDefinition Height="1*"/>
        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="1*"/>
        </Grid.ColumnDefinitions>
        <ListView Grid.Row="2" Grid.ColumnSpan="4" x:Name="LvCoinList" Margin="0,0,0,0">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="코인" x:Name="Coin" DisplayMemberBinding="{Binding korean_name}" Width="200"/>
                </GridView>
            </ListView.View>

            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <EventSetter Event="MouseDoubleClick" Handler="ListViewItem_PreviewChartDoubleClick" />
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>
        <TextBox Grid.Row="1" Grid.ColumnSpan="4" 
                 x:Name="TxtSerchCoin" HorizontalAlignment="Left" Text="" 
                 TextWrapping="Wrap" VerticalAlignment="Center" Width="200" Height="26"
                 TextChanged="TxtSerchCoin_TextChanged"/>
        <StackPanel Grid.Row="0" Grid.Column="0" >
            <Button x:Name="BtnAll" 
                Grid.Row="0" Grid.Column="0" 
                Content="전체" VerticalAlignment="Center" Height="24"
                BorderThickness="0" Background="Transparent"
                MouseEnter="BtnSerch_MouseEnter" MouseLeave="BtnSerch_MouseLeave" Click="BtnSerch_Click"
                />
        
            <WrapPanel  x:Name="Bar1" Height="2"/>
        </StackPanel>
        <StackPanel Grid.Row="0" Grid.Column="1" >
            <Button x:Name="BtnKRW" 
                Grid.Row="0" Grid.Column="1" 
                Content="KRW" VerticalAlignment="Center" Height="24"
                BorderThickness="0" Background="Transparent"
                MouseEnter="BtnSerch_MouseEnter" MouseLeave="BtnSerch_MouseLeave" Click="BtnSerch_Click"/>
            <WrapPanel  x:Name="Bar2" Height="2"/>
        </StackPanel>
        
        <StackPanel Grid.Row="0" Grid.Column="2" >
            <Button x:Name="BtnBTC" 
                Grid.Row="0" Grid.Column="2" 
                Content="BTC" VerticalAlignment="Center" Height="24"
                BorderThickness="0" Background="Transparent"
                MouseEnter="BtnSerch_MouseEnter" MouseLeave="BtnSerch_MouseLeave" Click="BtnSerch_Click"/>
            <WrapPanel  x:Name="Bar3" Height="2"/>
        </StackPanel>
        
        <StackPanel Grid.Row="0" Grid.Column="3" >
            <Button x:Name="BtnUSDT" 
                Grid.Row="0" Grid.Column="3" 
                Content="USDT" VerticalAlignment="Center" Height="24"
                BorderThickness="0" Background="Transparent"
                MouseEnter="BtnSerch_MouseEnter" MouseLeave="BtnSerch_MouseLeave" Click="BtnSerch_Click"/>
            <WrapPanel  x:Name="Bar4" Height="2"/>
        </StackPanel>
       

    </Grid>

 

Code

private static readonly DependencyProperty selectTxtClr = DependencyProperty.Register("AskTxtColor", typeof(Brush), typeof(MarketListView));
        private static readonly DependencyProperty defaultTxtClr = DependencyProperty.Register("DefaultTxtColor", typeof(Brush), typeof(MarketListView));
        private static readonly DependencyProperty defaultBackClr = DependencyProperty.Register("DefaultBackColor", typeof(Brush), typeof(MarketListView));
        public Brush SelectTxtClr
        {
            get { return (Brush)this.GetValue(selectTxtClr); }
            set { this.SetValue(selectTxtClr, value); }
        }
        public Brush DefaultTxtClr
        {
            get { return (Brush)this.GetValue(defaultTxtClr); }
            set { this.SetValue(defaultTxtClr, value); }
        }
        public Brush DefaultBackClr
        {
            get { return (Brush)this.GetValue(defaultBackClr); }
            set { this.SetValue(defaultBackClr, value); }
        }

        List<Structs.MarketCodes> coins { get; set; }
        AccessUpbit upbit = new AccessUpbit();
        Button BtnTemp;
        WrapPanel wPanel;
        //0 = 전체 1 = KRW 2 = BTC 3 = USDT
        int selectType = 0;
        const int SelectAll = 0;
        const int SelectKRW = 1;
        const int SelectBTC = 2;
        const int SelectUSDT = 3;

        public MarketListView()
        {
            InitializeComponent();
            
        }
        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            coins = upbit.CoinList();
            //코인 목록을 읽고 출력
            CoinList();

            //클릭시 컬러 변경을위해 임시로 변수 초기화
            BtnTemp = BtnAll;
            wPanel = Bar1;
            selectType = SelectAll;

            DispatcherTimer timerCoinList = new DispatcherTimer();

            timerCoinList.Interval = TimeSpan.FromSeconds(100);//100초마다 코인목록 다시 읽어옴.혹시 신규코인 들어올까봐
            timerCoinList.Tick += new EventHandler(TimerCoinList_Tick);
            timerCoinList.Start();

            wPanel.Background = SelectTxtClr;
            BtnTemp.Foreground = SelectTxtClr;
            
        }
        private void TimerCoinList_Tick(object sender, EventArgs e)
        {
            coins = upbit.CoinList();
        }

        public string GetCoin()
        {
            return coins[LvCoinList.SelectedIndex < 0 ? 0 : LvCoinList.SelectedIndex].market;
        }

        private void CoinList()
        {
           
            List<Structs.PrintMarketCodes> it = new List<Structs.PrintMarketCodes>();

            foreach(var coin in coins)
            {
                //텍스트 검색창이 빈칸이 아닐때 작동
                if(TxtSerchCoin.Text != "")
                {
                    if (!coin.korean_name.Contains(TxtSerchCoin.Text))
                    {
                        continue;
                    }
                }
                
                string input = "";
                if (selectType == SelectAll)
                {
                    input = $"{coin.market.Split('-')[0]}-{coin.korean_name}";
                }
                else if (selectType == SelectKRW)
                {
                    if (coin.market.Split('-')[0] == "KRW")
                        input = $"{coin.korean_name}";
                    else
                        continue;
                }
                else if (selectType == SelectBTC)
                {
                    if(coin.market.Split('-')[0] == "BTC")
                        input = $"{coin.korean_name}";
                    else
                        continue;
                }
                else
                {
                    if (coin.market.Split('-')[0] == "USDT")
                        input = $"{coin.korean_name}";
                    else
                        continue;
                }

                it.Add(new Structs.PrintMarketCodes()
                {
                    korean_name = input
                });

            }

            LvCoinList.ItemsSource = it;

        }

        private void ListViewItem_PreviewChartDoubleClick(object sender, MouseButtonEventArgs e)
        {
            var item = sender as ListViewItem;
            if (item != null && item.IsSelected)
            {
                //MessageBox.Show(coins[LvCoinList.SelectedIndex].market);
                //SelectIndex = LvMyCoin.SelectedIndex;
            }

        }
        private void BtnSerch_MouseEnter(object sender, MouseEventArgs e)
        {
            //Hover 기능 만들라했는데 굳이..?
        }

        private void BtnSerch_MouseLeave(object sender, MouseEventArgs e)
        {
            //Hover 기능 만들라했는데 굳이..?
        }

        private void BtnSerch_Click(object sender, RoutedEventArgs e)
        {
            wPanel.Background = DefaultBackClr;
            BtnTemp.Foreground = DefaultTxtClr;

            string str = (string)((Button)(sender)).Content;
            if (str == "전체")
            {
                wPanel = Bar1;
                BtnTemp = BtnAll;
                selectType = SelectAll;
            }
            else if (str == "KRW")
            {
                wPanel = Bar2;
                BtnTemp = BtnKRW;
                selectType = SelectKRW;
            }
            else if (str == "BTC")
            {
                wPanel = Bar3;
                BtnTemp = BtnBTC;
                selectType = SelectBTC;
            }
            else
            {
                //USDT
                wPanel = Bar4;
                BtnTemp = BtnUSDT;
                selectType = SelectUSDT;

            }

            wPanel.Background = SelectTxtClr;
            BtnTemp.Foreground = SelectTxtClr;

            TxtSerchCoin.Text = "";
            CoinList();
        }

        private void TxtSerchCoin_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (coins == null)
                return;
            CoinList();
        }
반응형