В честь релиза 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. Наш эскиз немного оживёт, будет веселее


