Sebagai bagian dari penelitian saya baru-baru ini, saya merasa nyaman untuk menulis fungsi plotting kustom lainnya untuk Oktaf, yang memplot harga satu garis terhadap latar belakang berwarna bersyarat, misalnya dua warna terpisah untuk rezim pasar bullish dan bearish.
Dengan kemampuan membuat grafik seperti ini, Anda tidak perlu lagi terus-menerus berpindah antara dua grafik terpisah untuk membandingkan grafik fitur input potensial dan grafik harga. Jadi, tanpa basa-basi lagi, berikut ini kode untuk fungsi tersebut:
## Copyright (C) 2018 dekalog
##
## This program is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 3 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program. If not, see .
## -*- texinfo -*-
## @deftypefn {} {@var{retval} =} bull_bear_background_plot (@var{price}, @var{condition})
##
## Plots price with different, vertically coloured background stripes, according
## to the integer values 1, 2... etc contained in condition.
##
## see https://web.njit.edu/~kevin/rgb.txt.html for colour codes
##
## @seealso{}
## @end deftypefn
## Author: dekalog
## Created: 2018-10-17
function [retval] = bull_bear_background_plot ( price , condition )
% if price is a row vector, change it to a column vector
if ( size( price , 1 ) == 1 && size( price , 2 ) > 1 )
price = price' ;
endif
up_lim = max( price ) ; low_lim = min( price ) ;
x = [ 1 : size( price , 1 ) ]' ;
y = unique( condition ) ;
ix1 = find( condition == y(1) ) ; color1 = [ 173 216 230 ] ./ 255 ; % LightBlue
ix2 = find( condition == y(2) ) ; color2 = [ 255 228 225 ] ./ 255 ; % MistyRose
if ( low_lim >= 0 ) % all prices are positive; normal for a price chart
bar( x(ix1) , ones(size(ix1)).*(1.05*up_lim) , 1 , 'facecolor' , color1 , 'edgecolor' , color1 ) ; hold on ;
bar( x(ix2) , ones(size(ix2)).*(1.05*up_lim) , 1 , 'facecolor' , color2 , 'edgecolor' , color2 ) ;
plot( price , 'k' , 'linewidth' , 2 ) ; axis([min(x),max(x),0.95*low_lim,1.05*up_lim]) ; grid minor on ; hold off ;
elseif ( up_lim > 0 && low_lim < 0 ) % plotting an ocscillator around a zero line
% or perhaps some negative back-adjusted prices
bar( x(ix1) , ones(size(ix1)).*(1.05*up_lim) , 1 , 'facecolor' , color1 , 'edgecolor' , color1 ) ; hold on ;
bar( x(ix1) , ones(size(ix1)).*(1.05*low_lim) , 1 , 'facecolor' , color1 , 'edgecolor' , color1 ) ; ;
bar( x(ix2) , ones(size(ix2)).*(1.05*up_lim) , 1 , 'facecolor' , color2 , 'edgecolor' , color2 ) ;
bar( x(ix2) , ones(size(ix2)).*(1.05*low_lim) , 1 , 'facecolor' , color2 , 'edgecolor' , color2 ) ;
plot( price , 'k' , 'linewidth' , 2 ) ; grid minor on ; hold off ;
elseif ( up_lim < 0 ) % all prices are negative
bar( x(ix1) , ones(size(ix1)).*(1.05*low_lim) , 1 , 'facecolor' , color1 , 'edgecolor' , color1 ) ; hold on ;
bar( x(ix2) , ones(size(ix2)).*(1.05*low_lim) , 1 , 'facecolor' , color2 , 'edgecolor' , color2 ) ;
plot( price , 'k' , 'linewidth' , 2 ) ; axis([min(x),max(x),1.05*low_lim,0.95*up_lim]) ; grid minor on ; hold off ;
endif
endfunction
dan beginilah tampilan plotnya:
dengan latar belakang biru muda yang menyoroti tren naik dan MistyRose menyorot tren menurun dalam grafik gelombang sinus hitam. Saat ini fungsinya belum begitu sempurna dan dikodekan secara kaku hanya untuk dua warna ini, tetapi akan menjadi tugas yang mudah untuk memperluas fungsinya ke lebih dari dua kondisi dan menjadikan warna sebagai input pengguna. Namun, ini berada di urutan paling bawah dalam daftar prioritas saya saat ini. Saya harap pembaca yang menggunakan Octave seperti saya merasa fungsi ini bermanfaat.