• 2008/ 1/26 新バージョン1.8.5リリース

BLOG
機能説明ダウンロード拡張キットサポートとコミュニティ

ライセンス

よくある質問
 (機能面)

よくある質問
 (プロジェクトの方針)

ユーザのコメント集

リンク

将来のバージョン

謝辞

Omega Chart 拡張キットマニュアル

拡張キットの構文

 OmegaChart拡張キットファイルの全体の構造は次のようになります。

<?xml version="1.0" encoding="shift_jis"?>
<omegachart-extension version="1.0">
  <info title="***" author="***" />
  
  <indicator>...</indicator>
  <screening>...</screening>
  <auto-trading>...</auto-trading>
  <prediction>...</prediction>
  
  <oscillator-group>...</oscillator-group>
  <library>...</library>
  <brand>...</brand>
  
</omegachart-extension>

 それぞれの簡単な説明は次のようになります。

要素名 説明
info 拡張キット全体の説明を記述します。これは拡張キット全体で1個のエレメントだけが許されます。
indicator チャートの要素を記述します。
screening スクリーニング条件を記述します。
auto-trading 購入・利益確定・ロスカットのルールを定め、それに従って売買するとどのような結果になったかをシミュレートします。バージョン1.3で導入されました。
prediction セオリー検証の要素を記述します。indicator,screening,predictionを合わせて拡張キット要素と呼びます。拡張キット要素は、1つの拡張キットに何回でも登場できます。
oscillator-group オシレータのグループ(乖離率、RSI、など)を定義します。OmegaChartでは右下に出るラジオボタンにより、同時に表示するオシレータのグループはひとつに制限されています。
library 拡張キット内で共通して使う式を定義します。
brand 複数の銘柄の値を組み合わせて計算する独自定義銘柄を作成します。

 

infoエレメント

 拡張キット全体に関する情報を定義します。

要素名(*1) 説明
@title この拡張キットの見出しです。
@id この拡張キットを識別する文字列です。スペースを含めることはできません。
@author この拡張キットの作者です。空欄でも構いません。

(*1)以下、要素名の頭に@がついているものはXMLのアトリビュート、そうでないものはXMLのエレメントを表します。

indicatorエレメント

 チャートの要素を記述します。

要素名 説明
@target チャートが何を示しているかです。取りうる値は次のどれかです。
  • price 価格
  • volume 出来高
  • oscillator オシレータ
@name この要素の内部的な名前です。拡張キット内で一意につける必要があります。
@format "F2,100"のように、カンマで区切った前半と後半に別れます。数値の表現形式を示す、.NETの書式指定文字列、後半は"100" "%"のどちらかです。100のときはRSI,RCIのように計算した値を100倍して表示することを意味し、%のときは乖離率のように%表示になることを示します。省略時はそれぞれF2,100が指定されたものとみなされます。
@display V1.3で仕様が変わりました凡例ウィンドウにどう表示するかを示します。次の値をいずれかです。
  • normal チャート・数値・凡例の3箇所すべてに表示します。
  • chart チャートに表示します。
  • value 数値欄(画面右上)に表示します。
  • explanation チャート画面には出さず凡例にのみ出します。
chart, value, explanationは'+'で連結して複数指定できます。例えばチャートと数値に出すときはchart+valueとします。
@group @targetがoscillatorのときのみ必要なアトリビュートです。どのオシレータグループに属するかを宣言します。
@count このチャートを何個まで同時に表示できるかの値です。省略すると1とみなされます。たとえば3種類の移動平均線を表示したいときはここの値に3と入れます。
@brand V1.1 このチャートを描画する対象銘柄を指定できます。たとえば、日経平均のチャートにのみ表示したい場合は 101 と指定し、日経平均以外のチャートにのみ表示したい場合は !101 と指定します。省略した場合は全銘柄に対して表示されます。現在のところ複数個を指定する仕組みはありません。
@relativise V1.1 ここに日付を8桁で指定(たとえば 20040101)すると、この日を基準にした相対値によって描画されます。標準添付の拡張キットには、各銘柄に日経平均を相対化した値を描画するようになっていますのでそれを参考にすると意味がよく掴めると思います。
title この要素の見出しです。カスタマイズダイアログなどではここに指定した値が使われます。
header 凡例ウィンドウで使われる見出しです。ここでは、パラメータ補完(後述)が使われる点がtitleエレメントとは違います。
description 指標の説明です。カスタマイズダイアログのヘルプボタンに関連付けられるテキストです。
expression この要素を示す計算式です。後述の"expressionエレメント"を参照してください。
defaultappearance 初期状態での見え方と色を指定します。
例<defaultappearance style="Line" color="Lime"/>
styleはLine,BoldLine,Dottedのいずれか、colorは.NETの色指定文字列として正しいものを使います。
param 引数があるときはparamエレメントを使います。後述のパラメータの説明を参照してください。

サンプル

  <indicator
    target="price"
    count="3"
    name="MA"
    format="F2"
    display="normal">
    <expression>avg(close({0}))</expression>
    <title>移動平均線</title>
    <header>{0}平均</header>
    <description>過去の一定期間の終値を平均し、
短期的な変動の影響を除去した線です。</description>
    <param index="0" type="positiveInteger">
      <daily  unit="日" default="25,75,200"/> 
      <weekly unit="週" default="13,26,52"/>
    </param>
    <defaultappearance style="Line,Line,Line"
      color="Khaki,DarkKhaki,DarkGoldenrod"/>
  </indicator>

screeningエレメント

 スクリーニング条件を定義します。

要素名 説明
@name 上述のindicatorエレメントと同一です。
expression
title
header
description
param
@format "F2,100"のように、カンマで区切った前半と後半に別れます。前半はindicatorのときと同じで数値の書式指定、後半は"100" "%"のどちらかです。100のときはRSI,RCIのように計算した値を100倍して表示することを意味し、%のときは乖離率のように%表示になることを示します。
filter ここにbool型を返すexpressionを書くと、trueを返した銘柄のみスクリーニングの対象になります。省略した場合は、すべての銘柄(スクリーニングのダイアログで指定した銘柄)が対象になります。

サンプル

  <screening
    name="rci_s"
    format="F2,100">
    <title>RCI</title>
    <description>トレンドの強弱を示す指標です。
正の値は上昇トレンド、負の値は
下降トレンドを示します。</description>
    <header>{0}RCI</header>
    <expression>rci({0})</expression>
    <param index="0" type="positiveInteger">
      <name>期間</name>
      <daily  unit="日" default="14"/> 
      <weekly unit="週" default="13"/>
    </param>
  </screening>

auto-tradingエレメント

 自動売買検証の内容を定義します。

要素名 説明
@name 上述のindicatorエレメントと同一です。
title
header
description
param
type long, shortのいずれかの値をとります。買いか売りかどちらの売買かを指定します。
signal 売買を仕掛ける条件を指定します。この条件が成立した日の終値で仕掛けたものとして計算されます。書式はindicatorのexpressionエレメントと同一ですが、bool値を返す式にしないといけないことに注意してください。
exit 利益確定をする条件を指定します。この条件が成立した日の終値で利益確定したものとして計算されますが、後述の指値の仕組みを使うこともできます。
losscut ロスカットをする条件を指定します。この条件が成立した日の終値でロスカットしたものとして計算されますが、後述の指値の仕組みを使うこともできます。
entry/@type バージョン1.7で追加されました。entry要素のtypeアトリビュートによって、シグナル発生と仕掛けの関係を指定します。省略時はシグナル発生日の終値、tomorrow-openはシグナル発生日の翌日の始値(右のサンプルにあるとおりです)、signal-limitorderで逆指値です。逆指値については下に別途説明があります。

 このexit, losscutでは、通常の計算式に加えて次の組み込み関数を使うことができます。

  • entry()
    シグナルに従って仕掛けを行った値を返します。
  • day()
    仕掛けてから何営業日経過しているかを返します。仕掛けた当日が0、翌日が1になります。
  • limitorder()
    指値による利益確定/ロスカットをします。引数の値が値幅に含まれていればそこで約定したものと扱われます。右のサンプルを参照してください。

 バージョン1.7で、逆指値を用いた自動売買検証がサポートされました。たとえば、

<entry type="signal-limitorder">close()*0.99</entry>

と書くと、シグナル発生日の終値から1%低い値段で逆指値をするという意味になります。entry要素の中に式が書けるのはsignal-limitorderを指定したときのみであることに注意してください。

 逆指値についてさらに補足説明をします。

  • シグナル発生日の翌日に、<entry>で与えた式の値(これをEとします)によって、「値段が E 以上になったら Eで指値」とします。従って、安値 <= E <= 高値のときのみ約定し、約定するときは常に値段は E であることになります。
  • 約定しなかったときはそのシグナルについての判定は終了し、翌日から次のシグナル発生をチェックします。
  • 約定したときは、あとは従来の自動売買検証と同じですが、利益確定/ロスカットの判定は約定した次の日(シグナル発生日の2日後)からスタートします。

サンプル

<auto-trading name="shitahige_p">
  <title>下ひげ陽線の買い場検証</title>
  <description>下ひげ(チャート上のひげの長さが
  終値の1%以上で判定しています)かつ陽線を出し、
  さらにその下ひげで安値を更新したときに買ったと
  想定して勝率を測定します。</description>
  <header>下ひげ陽線かつ{0}安値更新をし、{1}
  動いたら利益確定/ロスカット</header>
  <type>long</type>
  <signal>shita_hige() and yosen() and
          (low()==min(low({0})))</signal>
  <entry type="tomorrow-open"/>
  <exit><![CDATA[
    close() > entry()*(1+{1}/100)
  ]]&gt;</exit>
  <losscut><![CDATA[
    limitorder(entry()*(1 - {1}/100))
  ]]&gt;</losscut>
  <param index="0" unit="日" default="5"/>
  <param index="1" unit="%" default="5"/>
</auto-trading>

predictionエレメント

 セオリー検証の内容を定義します。

要素名 説明
@name 上述のindicatorエレメントと同一です。
title
header
description
param
condition 検証するための前提条件を書きます。書式はexpressionエレメントと同一ですが、bool値を返す式にしないといけないことに注意してください。
claim 前提条件が成立したときに、検証したい内容を書きます。これもexpressionエレメントと同一で、bool値を返す式にします。セオリー検証を実行すると、conditionが成立した日の一覧とclaimが成立したかどうかの結果が表示されます。

サンプル

  <prediction name="uehige_p">
    <title>上ひげ陰線の売り場検証</title>
    <header>上ひげ陰線かつ{0}高値更新なら
空売りで{1}以内に{2}以上下降</header>
    <condition>ue_hige() and insen() and
(high()==max(high({0})))</condition>
    <claim>min(low(0,0-{1})) &lt;
      close()*(1-{2}/100)</claim>
    <param index="0" type="positiveInteger"
      unit="日" default="5"/>
    <param index="1" type="positiveInteger"
      unit="日" default="5"/>
    <param index="2" type="positiveInteger"
      unit="%" default="2"/>
  </prediction>

oscillator-groupエレメント

 オシレータグループを定義します。同時には1つのオシレータグループしか表示できず、ユーザはグループ間を切り替えながら使うことになります。

要素名 説明
@name このグループの名前です。oscillatorを定義するときには、indicatorエレメントのgroup後アトリビュートの値をここに一致させないといけません。
@title このグループの説明です。
@type 値の表示方法を指定します。次の値のいずれかです。
  • default 特に何も加工しません
  • origin0 オシレータの中間の線が0で、上が正、下が負の値になります。たとえば乖離率の表示で使います。
  • percent0_1 RSIのように、下限が0、上限が100の指標で使います。
  • percent1_1 RCIのように、下限が-100、上限が+100の指標で使います。

サンプル

  <oscillatorGroup
    name="kairi"
    title="乖離率"
    type="origin0"/>

libraryエレメント

 拡張キット全体で共有する関数を定義します。

要素名 説明
@name 関数の名前です。ASCII文字・数字・アンダースコアのみが使えます。
expression 関数定義の本体です。パラメータを使うこともできます。

サンプル

  <library
    name="yosen"> <!--陽線判定-->
    <expression>open() &lt; close()</expression>
  </library>

expressionエレメント

 いよいよ拡張キットの中核部分、数式の記述の説明です。(*2)

 型

 拡張キットの数式部分はexpressionエレメントの中に書きます。この式の各項には型があり、それは次のいずれかです。

説明
double 四則演算などを行います。内部的には浮動小数点数です。
bool 論理演算などを行います。true/falseのどちらかの値をとります。
time-series 時系列データです。doubleの配列といえば概ね間違いありません。

 time-seriesはなれないうちはとまどうかもしれませんが、たとえば平均を求める組み込み関数avgは、時系列データを引数として受け取りdoubleを返す関数として内部的に定義されています。


(*2)と、力んではみたもののこれではまだ説明不足のところもあると思います。本格的に拡張キットを自作してみようという人は、OmegaChartのソースコードを入手して研究するのがよいかもしれません。私の趣味の範囲内のことですからご容赦を...

 プリミティブ

 OmegaChartに用意されたプリミティブ値は以下のとおりです。すべての計算はこれらのデータを出発点としています。

名前 説明
open() double 当日の始値です。
open(double n) time-series 過去 n 営業日の始値からなる時系列データです。
open(double m, double n) time-series m-1 営業日前から n 営業日前までの始値からなる時系列データです。例えば3営業日前から前日までの場合はopen(4,1)になります。m-n が長さになることに注意してください。
close, high, low, volume 始値のかわりにそれぞれ終値、高値、安値、出来高になっただけで、使い方はopenと同じです。
cl, cs 信用買残、信用売残です。使い方は上記と同じですが、データ取得の都合上週に1度しか更新されないので注意が必要です。

 組み込み演算子

名前 引数と結果 役割
*, / (double,double)->double 普通の乗算・除算です。
*, / (time-series, double)->time-series time-seriesを定数倍した別のtime-seriesを作るために使います。
*, / (time-series, time-series)->time-series サイズの等しい2つの時系列データについて、各要素を演算した結果を返します。
+, - (double,double)->double 普通の加算・減算です。
+, - (time-series, time-series)->time-series サイズの等しい2つの時系列データを足します。
<, >, <=, >= (double,double)->bool 普通の大小比較です。
&&, || (bool,bool)->bool 普通の論理演算です。かわりにand, orを使うこともできます。

 演算子には優先順位があり、乗除算=>加減算=>比較=>論理の順で行われます。たとえば 3 * 5 - 2 は ( 3 * 5 ) - 2 のように計算されます。


 

 数式解析の都合で、定数を引くときには注意が必要です。 3*5-2と書いてしまうと、"3*5"と定数"-2"の間に演算子がみつからないとしてエラーになっていまいます。これは改善したい点ですが、いまのところは- 2とスペースを入れるようにしてください。(*3)


(*3)かなり専門的な話になりますが、これはOmegaChartで使っているコンパイラ・コンパイラ Grammaticaの都合です。

 組み込み関数

 ここからがちょっと難しくなります。

名前 引数と結果 役割
avg (time-series)=>double 平均を求めます。
sdev (time-series)=>double 標準偏差を求めます。
sqrt (double)=>double, (time-series)=>time-series 平方根を求めます。
log (double)=>double, (time-series)=>time-series 自然対数を求めます。
pow (double, double)=>double, (time-series, double)=>time-series べき乗を求めます。
first (time-series)=>double 時系列データの最初の値を求めます。
last (time-series)=>double 時系列データの最後の値を求めます。
min (time-series)=>double 時系列データでの最小値を求めます。
(double,double,...)=>double 引数のdouble値の最小を求めます。
max (time-series)=>double 時系列データでの最大値を求めます。
(double,double,...)=>double 引数のdouble値の最大を求めます。
abs (time-series)=>time-series 時系列データの各項の絶対値から成るtime-seriesを返します。
(double)=>double 引数の絶対値を求めます。
sum (time-series)=>double 時系列データの各値の和を求めます。
suma (time-series)=>double 時系列データの各値の絶対値の和を求めます。
sump (time-series)=>double 時系列データの各値のうち正のものの和を求めます。
sumn (time-series)=>double 時系列データの各値のうち負のものの和を求めます。
diff (time-series)=>time-series 時系列データの各値の差分を取り、引数に対してサイズが1小さいtime-seriesを返します。たとえばRSIの計算で使います。
each (double, expression)=>time-series 最初の引数で示される長さの期間、日付をずらしながらtime-seriesを作ります。いまのところMACDの計算にしか使っていません。
value_at (double, expression)=>expression 指定の日数移動させて引数のexpressionを計算します。たとえばvalue_at(2, close())は2営業日前の終値を示します。
if (bool, expression, expression)=>expression 最初の引数がtrueのとき2番目の引数、falseのとき3番目の引数を返します。ExcelのIF関数と同じ働きです。
rankcorrelation (time-series)=>double Rank Correlationです。たぶんRCIの計算以外で使うことはないので、テクニカル分析の本を参考にしてください。
pdm,mdm double DMIの計算を楽にするために導入しました。
refbrand V1.1 (code, expression)=>expression 銘柄コード code に対してexpressionを計算した結果を返します。指定できるコードは、通常の銘柄コードの他、組み込みの株価指数や為替も使えます。これらのコードはメニューから 表示 - 指数・為替 を見てください。
yobine V1.3 (double)=>double 価格を引数にとり、それに対応した呼値の値を返します。常に東証のものがつかわれます。
unit_trading V1.3 ()=>double 現在見ている銘柄の単元株数を返します。

 いろいろと拡張キットを作っていると、新しい組み込み関数が必要になることがあると思います。そのときはサポート経由でリクエストを送ってください。

 サンプル

 これでだいぶ雰囲気がわかってきたと思います。いくつか例を出してみましょう。

内容
avg(close(25)) 25日移動平均線
close() / avg(close(25)) - 1 25日移動平均線乖離率
sump(diff(close(15)))/suma(diff(close(15))) 14日RSI
close() / refbrand(101, close()) 日経平均に対する終値の比 (101は日経平均のコードです)

 パラメータ

 式の中にパラメータをいれたいことはしばしばあります。たとえば、移動平均の表示をするとき何日の平均にするかはGUIで簡単に変えることができると便利です。このような場合は、{}で数値を囲むとパラメータの参照になります。

 avg(close({0}))

 こうすると、{0}の部分が外部から読み込んだパラメータによって補われます。具体的には、この式を書いた拡張キット要素のparamタグを使って、

    <param index="0" type="positiveInteger">
      <daily  unit="日" default="25"/> 
      <weekly unit="週" default="13"/>
    </param>

のようにします。indexアトリビュートはパラメータの番号、typeは型(現在は正整数を示すpositiveIntegerのみです)、その下は日足・週足それぞれでの単位とデフォルト値です。このようにすると、OmegaChart本体のカスタマイズダイアログからこのパラメータを変更・保存できるようになります。


 

派生銘柄

V1.1
 派生銘柄は、他の銘柄のデータを演算することで派生的な銘柄を作成する機能です。バージョン1.1で導入されました。

 銘柄を定義するには、拡張キットにbrandエレメントを書きます。

要素名 説明
@code この銘柄に割り当てるコードです。401以上999以下の数値を使ってください。
name この銘柄の名前です。
expression この銘柄の値を計算するための式です。4本値すべてについて同じ式が使われます。なお、現在は派生銘柄の出来高や信用残はサポートされていません。値段のみを計算します。
format この値を表示するときのフォーマットです。indicatorエレメントの説明を参照してください。
param この銘柄の値を計算するために必要な銘柄コードを必要な個数書きます。各paramエレメントのindexアトリビュートの値はexpressionエレメントに書いたものと一致します。
priceScale 次の説明を参照してください。

 なお、OmegaChartでは内部的な値段は整数で定義されます。従って、小数点2位まで必要な銘柄を定義するときには、必要な値の100倍をその銘柄の値として定義し、表示するときに1/100にするという形をとる必要があります。右のサンプルでは、expressionエレメントで100倍しているのはそのためです。これがないと、日経平均ドル建ての値は整数化されてしまい、かなり値が飛んでしまいます。もちろん、expressionの内容を100倍しただけでは不完全なので、表示を補正するためにpriceScaleエレメントで表示を1/100にしています。


サンプル

  <brand code="0401">
    <name>日経平均ドル建て</name>
    <expression>({0} / {1})*100</expression>
    <priceScale>0.01</priceScale>
    <format>F2</format>
    <param index="0" code="0101"/>
    <param index="1" code="0201"/>
  </brand>

さらに先へ

 とりあえずの説明はここまでです。実は、まだ他にも

  • 複数の拡張キット要素でのパラメータ共有
  • 複数インスタンスのときのパラメータの書式

 などのトピックがあるのですが、この文書を書いている時点ではそこまで使いこなす人がいるかどうか確信できないので省きました。興味がある人はOmegaChart標準添付の拡張キットや、さらに意欲があればソースコードの中身を見れば使い方はわかってくるでしょう。

 また、現状ではまだ細かいところに手が届いていないので、特に拡張キットが誤った書かれ方をしているときにエラーメッセージを適切に表示することはできていないこともあります。

 なので、もし自分で書いてみたけれども思うような動作にならない、というときはメール等でサポートを求めてください。皆さんが拡張キットを書いているということがわかれば、私もこの機能をさらに充実させる意欲につながりますので遠慮なくどうぞ。


 


Copyright(C) 2004-2006 Daisuke OKAJIMA, All Rights Reserved.