2007年12月30日
2007年を振り返って
2007年も残すところあと一日です。今年も色々なことがありました。
1月、2月はFXオプションだけでなく、XPRESSTRADEに口座を開いてS&P先物オプションなどに手を出しています。
FXオプションの方は、年初の誓いはさっさと破って、EUR/USD, USD/JPY, EUR/JPY 以外に GBP/USD, USD/CHF, AUD/USD, GBP/JPY などに手を出しています。
そして、3月の円高時にマージンコール。またもポンドにやられたと書いています。
5月に、MT4本の話が来て執筆に入ったため、ブログではMT4の記事は書かなくなりました。
代わりに、IPAMのPOWER FOREXのシステムのレビューを始めました。しかし、結局このシステムは、運用結果が悪くなるとシステムを変更することがわかり、11月に運用を止めています。
11月はMT4本の発売目前となり、宣伝の記事ばかりでした。そして、12月は発売後のサポートの記事をいくつか書きましたが、自身のトレードについてはほとんど書けませんでした。
実際には8月の円高時もちょっと危なかったのですが、レバレッジを下げていた分、致命傷には至らず、多少の資金追加で乗り切りました。FXオプション戦略も、スワップを取ることより、オプションのプレミアムを積極的に取りに行く戦略に変え、プットとコールの売りを同枚数分ポジションを取ってヘッジすることで、比較的安定した結果を残すことができました。
今年はFXで脱税、円高で大損など様々なニュースが流れ、「FX」という言葉もポピュラーになりました。FXやシステムトレード、MT4に関するブログもかなり増えた感じです。でも、一般的には投資と言えば株という人が多く、FXに対して危険というイメージを持っている人もまだ多いようです。
こういう時期には色々な情報に振り回される人も多く、そのため高価な情報商材もまだまだ売れることでしょう。でも、本当に使えるシステムは表には出て来ないことも事実だと思います。それを実感した1年でもありました。
これが今年最後の記事です。皆さん、よいお年を。
2007年12月19日
メタトレーダーQ&A:エキスパートプログラムで自動売買できない
- toyolab
- 15:42
- カテゴリー:!「FXメタトレーダー入門」
「FXメタトレーダー入門」読者向けのサービスとして、メタトレーダー全般に関してちょっと注意する点をQ&A形式で記事にしていきます。
まずは、
Q:エキスパートプログラムで自動売買ができないのですが。
という質問です。単に自動売買ができないだけだと様々な理由が考えられます。
最も基本的なものは、メタトレーダーの設定でエキスパートプログラムが利用できない状態になっている、トレードを許可していない状態になっているなどがあります。これらの解決方法については、「FXメタトレーダー入門」の265ページ以降の解説をご覧ください。
ここでは、それ以外の理由として、「カスタム指標としてシグナルを表示させることはできるが、それをエキスパートプログラムにした場合に売買されない」というケースについて見てみます。
まず、サンプルプログラムとして214ページの「MACross_Ind.mq4」を取り上げます。これは単純な移動平均交差システムなので、期間の異なる二つの移動平均の交差で売買シグナルを表示させるものです。
以下のコードは2本の移動平均線を算出する部分です。
for(int i=limit-1; i>=0; i--)
{
BufFastMA[i] = iMA(NULL,0,FastMA_Period,0,MODE_SMA,PRICE_CLOSE,i);
BufSlowMA[i] = iMA(NULL,0,SlowMA_Period,0,MODE_SMA,PRICE_CLOSE,i);
}
ここで、注意するのはiMA()の最後のパラメータ「i」です。これは最新のバーの位置を0、1つ前のバーを1、2つ前のバーを2というように、移動平均を算出する位置を表すものです。
BufFastMA[i]の[]の中の「i」とiMA()の最後のパラメータの「i」が一致していれば、それぞれの「i」の位置で正しく移動平均の値が算出されることになります。
ここで、間違った例として、iMA()の最後のパラメータを「i-10」としてみます。
for(int i=limit-1; i>=0; i--)
{
BufFastMA[i] = iMA(NULL,0,FastMA_Period,0,MODE_SMA,PRICE_CLOSE,i-10);
BufSlowMA[i] = iMA(NULL,0,SlowMA_Period,0,MODE_SMA,PRICE_CLOSE,i-10);
}
これは、iの位置での移動平均を、iから10バーほど右側のバーから過去に遡ったバーにおける値から算出することを意味します。これは見た目としては、元の移動平均線が左に10バー移動した形になります。そうすると、売買シグナルも10バーほど早く出ることになるので、チャート上で見ると、非常に的確に売買シグナルが発生できているように見えます。
しかし、このシグナルはリアルタイムで出せるものでしょうか?答えはNOです。チャートの右端を見てください。
この図では、最新のバーから過去の10本のバーまでは、移動平均が計算できていません。そうなってくると、リアルタイム、つまり最新のバーでシグナルを出せるはずはありません。このシグナルは10バー経過した後に表示される、言わば「後だしジャンケン」のようなものです。
このようなシグナルは、カスタム指標として表示させる場合、プログラム上の問題はありません。しかし、このシステムをエキスパートプログラムとして書いた場合、どうなるでしょうか?
例えば、222ページのエキスパートプログラム「MACross_Exp.mq4」で、
double FastMA1 = iMA(NULL,0,FastMA_Period,0,MODE_SMA,PRICE_CLOSE,1-10);
double SlowMA1 = iMA(NULL,0,SlowMA_Period,0,MODE_SMA,PRICE_CLOSE,1-10);
double FastMA2 = iMA(NULL,0,FastMA_Period,0,MODE_SMA,PRICE_CLOSE,2-10);
double SlowMA2 = iMA(NULL,0,SlowMA_Period,0,MODE_SMA,PRICE_CLOSE,2-10);
と書いてみます。先ほどと同じく、iMA()の最後のパラメータをそれぞれ -10 します。これをストラテジーテスターで動かしても、全く売買はされません。自動売買では常に最新のバーの位置で売買することになるので、最新のバーで売買シグナルが出せないシステムでは、当然ながら一切売買できないということになります。
ここでのエキスパートプログラムで自動売買のできない理由は、「最新のバーでシグナルを発生するシステムになっていない」ということだったわけです。
この手の間違いは、ネット上に公開されているシグナル指標をそのままエキスパートプログラムに移行しようとする場合によく陥ります。しかし、それもそのはずで、もし、このシグナル指標から移動平均線が消えていて、シグナルの場所だけ表示されていたらどうでしょう? 特に初心者にとっては、プログラムを見てこれが自動売買できないということがすぐにわかるでしょうか?
実際に、そういうプログラムを意図的に公開、もしくは販売しているケースもあるのです。そういう悪質なプログラムに引っかからないためにも、シグナル指標プログラムやエキスパートプログラムにおいて、シグナルを発生させる位置や、そのシグナルの計算のためにどの範囲のデータを使うかということを正確に理解しなければいけないのです。
2007年12月15日
高金利通貨買い+オプション戦略
久しぶりにFXオプション取引に関する記事を。
SAXO系の業者で最近、アイスランドクローナISK/JPYのトレードができるようになったということで、高金利通貨買いとオプションを合わせた戦略を考えてみた。
まずは、高金利通貨ってどんなものがあるのか調べてみた。
http://www.saxobank.com/?id=824
これでNZDより高金利な通貨を集めてみると、
ISK:13.45%
TRY:15.8%
ZAR:10.5%
などがあった。最近よく聞く高金利通貨だ。
本来ならこのようなマイナー通貨はボラティリティを考えなくてはいけないところだが、金利が10%を超えていることから、ここでは深く考えずにクロス円のスポット買い。
ただ、価格の桁数が違うので購入通貨単位は同じではいけない。最近のレートはざっと、
ISK/JPY=1.7-1.95
NZD/JPY=75-100
TRY/JPY=80-100
ZAR/JPY=15-18
なので、それぞれ100万円程度とすると、購入通貨高はそれぞれ
ISK/JPY:500,000
NZD/JPY: 10,000
TRY/JPY: 10,000
ZAR/JPY: 50,000
くらいにしておく。
ただ、このままでは普通の高金利通貨スワップ狙いトレードでしかないので、ここでヘッジのためオプション取引を使う。
当然、これらのマイナー通貨ではNZD/JPYを除いてオプションには対応していないので、円高時のヘッジのため、USD/JPYのオプションを利用。円高時のヘッジというと、USD/JPYのプット買いが正当法だと思われるが、今回は、50,000ドルのUSD/JPYのATMでのコール売りを実行。
但し、これは完全に円高時のヘッジになっているわけではなく、円高時にプレミアムが取れるという程度でしかない。
しかし、コール売りを繰り返すことで、高金利通貨買いの為替差損を多少でもカバーすることができる。逆に円安になってもUSD/JPYスポットのショートポジをショートコールポジに変えることで、ほとんどゼロコストでこの戦略を続けることができる。要はスワップとプレミアムを確実に取るための戦略なのである。
ここで注意することはやはりレバレッジ。急激な円高に対してはヘッジできないので、マイナー通貨のクロス円という急激な変動に耐えられるようレバは2、3倍程度に抑えておく必要がある。
ちなみに国内でSAXO系のFXオプション取引が可能な業者は下の二つ。
2007年12月12日
MQL4入門(2) - 文字列の連結
- toyolab
- 18:20
- カテゴリー:!「FXメタトレーダー入門」
前回データ型の説明の中で string(文字列)型を説明しました。そこで、文字列の連結として、「+」でつなぐ方法と、StringConcatenate()関数を使う方法を紹介しました。
違いはStringConcatenate()の方が高速で省メモリだと説明しましたが、色々と試してみるとそれだけはありませんでした。
どちらの方法でも、文字列だけでなく、整数や実数の数値もそのまま書くだけで連結されるのですが、実数の場合、ちょっと結果が違うようです。
StringConcatenate()のように、複数のパラメータをいくつでもコンマ「,」で区切って指定する関数は、他にもAlert()、Comment()、Print()などがあります。
例えば「FXメタトレーダー入門」の190ページで紹介した Comment()関数を使って、
Comment("Bid=", Bid);
と書くと、チャートがEUR/USDの場合だと、
Bid=1.4717
と表示され、チャートがUSD/JPYの場合だと、
Bid=111.93
と表示されます。特にそのままで問題ないように見えます。
276ページで説明した Alert()も同様で、Ask をそのまま指定するだけで、買値がそのままの形式で表示されます。
しかし、
double x=0.123456789;
Comment("x=", x);
のように小数点以下9桁もある実数を同じように表示させると、
x=0.1235
と四捨五入されて小数点以下4桁までしか表示されません。
一方、281ページで説明した SendMail()では、文字列を予め「+」で連結したものをパラメータとして指定します。このような関数は他にも MessageBox()などがあります。
この場合、
SendMail("Subject","Ask="+Ask);
と書くと、メールの内容を表す部分が、
Ask=111.93000000
と小数点以下8桁までが0を含めて強制的に表示されます。
このように、同じ文字列の連結でも、実数に関しては、
・StringConcatenate()で連結する場合、小数点以下4桁まで0を切り捨てて変換
・「+」で連結する場合、小数点以下8桁まで0を含めて変換
という違いがあるのです。
FXレートのような数値データの場合、どちらかというとStringConcatenate()の方が扱いやすいので、
SendMail("Subject",StringConcatenate("Ask=",Ask));
と書くと、
Ask=111.93
のように変換され、小数点以下の0はカットされます。
あるいは、小数部の桁数を明確に指定したい場合は、278ページでの説明のように小数部の桁数を指定して文字列に変換するDoubleToStr()という関数を使って
SendMail("Subject","Ask="+DoubleToStr(Ask, Digit));
と書くこともできます。
文字列の連結に関してはいくつかの方法があるので、色々と試してみて自分の好みの方法を見つけてください。
最後に文字列に関連するMQL4の関数を挙げておきます。これらの関数を駆使すれば、さらに複雑な文字列の操作を行うことができます。(今回は詳細は省略します)
文字列関数
string StringConcatenate( ...) 文字列の結合
int StringFind(text, matched_text, start) 文字列の検索
int StringGetChar(text, pos) 文字列中の文字コード
int StringLen(text) 文字列長
string StringSetChar(text, pos, value) 文字列の変更
string StringSubstr(text, start, length) 部分文字列の抽出
string StringTrimLeft(text) 文字列の左詰め
string StringTrimRight(text) 文字列の右詰め
変換関数
string CharToStr(char_code) 文字から文字列へ変換
string DoubleToStr(value, digits) 実数から文字列へ変換
double NormalizeDouble(value, digits) 実数の正規化
double StrToDouble(value) 文字列から実数へ変換
int StrToInteger(value) 文字列から整数へ変換
datetime StrToTime(value) 文字列から時間へ変換
string TimeToStr(value, mode) 時間から文字列へ変換
2007年12月10日
MQL4入門(1) - データ型(変数)
- toyolab
- 15:32
- カテゴリー:!「FXメタトレーダー入門」
拙作「FXメタトレーダー入門」では、サンプルプログラムをもとにして、その理解に必要な項目だけをその都度解説する形式をとっています。初心者が手っ取り早くプログラムを理解するにはこの方法がいいと思ったからです。
ただ、ある程度色々なことがわかってくると、それらをつなぎ合わせるための系統だった理解が必要でしょう。このような内容も本書に盛り込みたかったのですが、下手をすると単にレファレンスマニュアルの和訳だけになってしまいかねないこともあり、採用にはいたりませんでした。
その代わりといっては何ですが、本書の内容を補足する記事を 「MQL4入門」ということでブログに掲載していきたいと思います。一応、「FXメタトレーダー入門」の読者向けのサービスですので、本を片手にご覧いただけると幸いです。
まずは、データ型からです。
MQL4ではデータを表す型として以下のような種類があります。
・Integer (int)
・Boolean (bool)
・Literals (char)
・Strings (string)
・Floating-point number (double)
・Color (color)
・Date and time (datetime)
ただし、プログラム中に変数として使う型は
・Integer (int)
・Boolean (bool)
・Strings (string)
・Floating-point number (double)
の4つに絞られます。今回の記事はこれらの4つの型についてです。
■int型とdouble型
「FXメタトレーダー入門」では、まず、数値を表す型として int(整数型)とdouble(実数型)を紹介しました。(128ページ参照)
基本的に数値計算ができればカスタム指標は作れます。
ただ、全く説明しないのもなんなので、残りの string(文字列型)と bool(論理型)もサンプルプログラムに登場させて簡単に説明しています。ここでは、もうちょっと説明を追加しておきます。
■string型
string(文字列型)は、データウィンドウに指標のラベルを表示させる部分で簡単に説明しています。(192ページ参照)
文字列を表す型はC言語にはないので、MQL4独自の型というわけです。これがプログラミング言語的にいいのかどうかわかりませんが、初心者にとっては結構扱いやすい便利な仕様になっています。
文字列を扱う関数もいくつか用意されています(358ページ参照)が、よく使うのが、文字列の連結だと思います。これが「+」の記号でできるのは便利です。
"ABC"+"XYZ"
と書くと、二つの文字列が連結されて "ABCXYZ" となります。さらに意外だったのが、数値を連結すると、勝手に文字列に変換されて連結される点です。
つまり、
int Period=21;
string label="ABC"+Period+"XYZ";
と書くと、labelが "ABC21XYZ" と数値部分まで連結されるのです。この機能は初心者にとってはそんなに意外なことではないでしょうが、個人的にはちょっとびっくりしました。ただ、本書では、このように著者が動揺したことについては触れていません(^^;
いずれにしろ、「+」で文字列や数値データまで連結できると覚えておいて問題ありません。ただ、もし、大量のデータを連結(そういうケースがあるかどうかわかりませんが)する場合などで、動作がおかしくなったときに、次のようにStringConcatenate()という関数を使う手があるということも覚えておくといいかと思います。
string label=StringConcatenate("ABC", Period, "XYZ");
この書き方は276ページで説明している Alert()関数のパラメータの書き方と同じです。内部では同じルーチンを使っているのだと思います。
MQL4のヘルプによると、「+」で連結するより、StringConcatenate()関数を使う方が「高速で使用メモリが少ない」とあります。一応、ご参考まで。
■bool型
最後にbool型です。
bool型についても、221ページ、322ページで簡単な使用例を紹介しています。二つの状態を二者択一で表すものです。
bool型というのは論理型と言って、if文中で出てくる AND(&&)とか OR(||) とかの論理演算を使った論理代数を提唱したブールさんという人名から名づけられたものです。
と言っても、そう難しく考える必要はありません。
簡単に言うと、bool型で宣言したときに代入される値は、false=0、true=1 と同じことなのです。
じゃあ、わざわざbool型にしなくても int 型で0と1を使えばいいじゃないかと思う方も多いでしょう。(私もプログラムを始めた頃はそういう使い方をしてました)
確かにint型で表しても間違いじゃありません。なぜ、boolを使うかと言うと、「プログラムの間違いを少なくするための工夫」と言ったところでしょうか。
プログラム中には数値としての0、1もよく現れます。その中で二者択一を表す場合にも0、1を使うと、プログラムを見直すときに0、1の意味が数値なのか、二者択一なのか、いちいち考えなくてはいけなくなります。
それを一目でわかるようにするためにbool型として true、false という記号を使うというわけです。
最初はよくわからなくても構いません。プログラミングに慣れてくると、どういう場面で bool型を使えばいいかがわかってくることでしょう。
2007年12月08日
2007年12月07日
サンプルプログラムのインストール方法
- toyolab
- 14:43
- カテゴリー:!「FXメタトレーダー入門」
「FXメタトレーダー入門」発売されました。予約注文も既に発送済みなので、遅くともこの週末には皆様のお手元に届くことと思います。
早速ですが、本書に関する情報第一弾です。
本書に掲載されたプログラムはすべてパンローロング社のサイトからダウンロードできます。ダウンロード先は本書の113ページに掲載されています。特にダウンロードするためにパスワードは必要はなく、場所さえわかれば誰でもダウンロードできます。
mq4.zip という圧縮されたファイルとしてダウンロードされるのですが、それをお使いのメタトレーダーにインストールする方法が詳しく書かれていません。mq4.zip ファイルのフォルダ構成は以下のようになっています。
まず「mq4」というフォルダがあります。そしてその下に「experts」というフォルダがあります。自動売買用のエキスパートプログラムは、この experts フォルダの下に格納されています。
そして、さらにその下の「indicators」フォルダの下にカスタム指標プログラムが格納されています。
このようにexperts フォルダから下は、メタトレーダー上のフォルダと同じ構成となっています。
ですから、mq4.zip をファイルエクスプローラなどで閲覧してフォルダを開いていく(Windows XP以降の場合、特に解凍する必要はありません)とexperts フォルダが現れるので、この「experts」フォルダを、お使いのメタトレーダーがインストールされているフォルダにコピー(マウスでドラッグ&ドロップ)すると、サンプルプログラムをインストールすることができます。
プログラムの保存場所については本書の109ページ以降をご参照ください。
2007年12月04日
「FXメタトレーダー入門」明日発売!
- toyolab
- 18:45
- カテゴリー:!「FXメタトレーダー入門」
パンローリング社の直販サイト、トレーダーズショップによると、「FXメタトレーダー入門」明日発送予定と変わっていました。
ということは、もう普通に注文できるということですね。
しかし、実は私、まだ本を見ていません(^^;
もしかすると、作者より先に本を目にする人もいるのかもしれません。
早く見たいです。
2007年12月その他のエントリー
2007年12月19日
2007年12月15日
2007年12月12日
2007年12月10日
2007年12月08日
2007年12月07日
2007年12月04日
上位ランキングのブログ記事はこちら