Эскиз панельки

17 ноября 2025, 06:17
Maxim Kuznetsov
0
48

В честь релиза ATcl, по шагам, делаем торговую панельку. Начнём с вариантов использования и чернового эскиза GUI.

Дублировать встроенную панель конечно не будем, это глупо. 

Будем делать панель для парной или корзинной торговли.

В панельке будем указывать какую валюту на какую меняем и указываем оборот в долларах. Софт должен предложить варианты сделки через кросс (если такой кросс есть) или через пару мажорных инструментов. Выбираем вариант и сделки осуществляются. Или нажимаем esc (или закрываем gui) и всё отменяем

А саму панельку повесим на хот-кей, то есть в терминологии MT она скрипт и будет вызываться по нажатию кнопок или перетаскиванием скрипта на график. Просто чтобы не занимать место экспертов и с ними не конфликтовать. 

В первом приближении выглядит так:

шрифты пока-что крупно, отдельные блоки обведены и подписаны. Тему (цвета, обводки и прочее) потом подправим благо что это просто.

На tcl/tk наш набросок выглядит вот так:

package require Tk
#
# мажорные валюты
#
set Majors {
        USD EUR GBP CHF AUD NZD JPY CAD
}
#
# тема и расцветки
#
ttk::style theme use clam
ttk::style configure Selected.TButton -background lightblue
ttk::style configure Big.TButton -borderwidth 3 -font {{Arial black}}
#
#
# панелька
#
oo::class create MajorTrade {
variable Window
variable SelectedBuy
variable SelectedSell

constructor args {
        set Window .currencyTrade
        set SelectedBuy  [ lindex $::Majors 1 ]
        set SelectedSell [ lindex $::Majors 0 ]
        my Layout
}
destructor {
}
method Layout {} {
        set w [ ttk::frame $Window ]
        # основые фреймы
        ttk::labelframe $w.buy -text    "Buy"
        ttk::labelframe $w.sell -text   "Sell"
        ttk::labelframe $w.invest -text "Invest"
        ttk::labelframe $w.cross -text "Cross"
        ttk::labelframe $w.majors -text "Majors"
        grid $w.buy -row 0 -column 0 -columnspan 2 -sticky "nsew"
        grid $w.sell -row 1 -column 0 -columnspan 2 -sticky "nsew"
        grid $w.invest -row 2 -column 0 -columnspan 2 -sticky "nsew"
        grid $w.cross -row 3 -column 0 -sticky "nsew"
        grid $w.majors -row 3 -column 1 -sticky "nsew"
        grid columnconfigure $w 0 -weight 1 -uniform same
        grid columnconfigure $w 1 -weight 1 -uniform same
        set column 0
        # кнопки Buy/Sell с валютами
        foreach name $::Majors {
                set lcname [string tolower $name]
                ttk::button $w.buy.$lcname -text $name -command [ list [ self ] SelectBuy $name ]
                ttk::button $w.sell.$lcname -text $name -command [ list [ self ] SelectSell $name ]
                grid $w.buy.$lcname -row 0 -column $column 
                grid $w.sell.$lcname -row 0 -column $column 
                grid columnconfigure $w.buy $column -weight 1 -uniform same
                grid columnconfigure $w.sell $column -weight 1 -uniform same
                if { $name == $SelectedBuy } {
                        $w.buy.$lcname configure -style "Selected.TButton"
                }
                if { $name == $SelectedSell } {
                        $w.sell.$lcname configure -style "Selected.TButton"
                }
                incr column
        }
        # оборот (инвестиция)
        ttk::label $w.invest.margin -text "Turnover:"
        ttk::spinbox $w.invest.moneys
        ttk::label $w.invest.xusd -text "* 1000 usd"
        grid $w.invest.margin -row 0 -column 1
        grid $w.invest.moneys -row 0 -column 2
        grid $w.invest.xusd -row 0 -column 3 
        grid columnconfigure $w.invest 0 -weight 1 -uniform same
        grid columnconfigure $w.invest 4 -weight 1 -uniform same
        # торговые варианты
        # через кросс
        text $w.cross.plan -width 20 -height 5
        ttk::button $w.cross.trade -text "trade crosses" -style "Big.TButton"
        grid $w.cross.plan -row 0 -column 0 -sticky "nsew"
        grid $w.cross.trade -row 1 -column 0 -sticky "nsew"
        grid columnconfigure $w.cross 0 -weight 1
        # парно через мажоры
        text $w.majors.plan -width 20 -height 5
        ttk::button $w.majors.trade -text "trade majors" -style "Big.TButton"
        grid $w.majors.plan -row 0 -column 0 -sticky "nsew"
        grid $w.majors.trade -row 1 -column 0 -sticky "nsew"
        grid columnconfigure $w.majors 0 -weight 1
}
method Window {} {
        set Window
}
# callback выбор покупаемой валюты 
method SelectBuy { name } {
        if { $name == $SelectedBuy } {
                return
        }
        set w $Window.buy.[string tolower $SelectedBuy ]
        $w configure -style TButton 
        set SelectedBuy $name
        set w $Window.buy.[string tolower $SelectedBuy ]
        $w configure -style Selected.TButton
}
# callback выбор продаваемой валюты 
method SelectSell { name } {
        if { $name == $SelectedSell } {
                return
        }
        set w $Window.sell.[string tolower $SelectedSell ]
        $w configure -style TButton 
        set SelectedSell $name
        set w $Window.sell.[string tolower $SelectedSell ]
        $w configure -style Selected.TButton
}

export Window SelectBuy SelectSell
};

#
# тестовая часть
#
set ct [ MajorTrade new ]
pack [ $ct Window ]
tkwait window .

на будущее, надо-бы разместить данные по балансу (экви,маржа), объёмы позиций и текущие цены. Последние наверное на кнопках, вместе с подписью валюты

вот примерно так вот ;-)

Следующим шагом будет моделька, то есть данные с которыми работает и отображает GUI. Наш эскиз немного оживёт, будет веселее