JUGEMテーマ:FX自動売買システムトレード情報
まずは、OrderSelect関数の引数について説明します。
日本語にすると下記のようになります。
オーダーセレクト(番号、番号の種類、取得中か決済後か)
最初の番号(int index)はポジション番号かチケットナンバーを入力します。どちらを入力するかは次の番号の種類の引数で選びます。
ポジション番号は、現在取得しているポジションに対して0から割り振られたナンバーです。例えば、ポジションが3つあれば、先に取得した順に0、1、2とナンバーが付けられます。
いつも使っている上記のようなコードの場合は、このポジション番号を取得しています。
OrdersTotal()は現在の取得中のポジション数を調べる関数です。
この番号はポジション数の増減により、番号も変化します。例えば、0番のポジションが決済された場合は、1番が0番に、2番が1番に変更されます。
次にチケットナンバーですが、これはそのポジションに割り振られた固定のナンバーで変わることはありません。ポジションを保有していても、決済していもこのナンバーはずっと同じ番号になります。
チケットナンバーの調べ方は、一度ポジション番号でオーダーセレクトをしてから、OrderTicket()で取得出来ます。
次に番号の種類(int select)ですが、SELECT_BY_POS でポジション番号、SELECT_BY_TICKET でチケットナンバーを選択出来ます。
最後に取得中か決済後か (int pool)ですが、これは現在取得中のポジションか、すでに決済されているポジションかの選択です。
MODE_TRADESで取得中のポジション、MODE_HISTORY で決済されているポジションになります。ただし、番号の種類がチケットナンバーの時はここは必要ありません。チケットナンバーは取得中でも決済後でもナンバーが変わらないためです。
また、ここに何も書かない場合は、自動的にMODE_TRADESになります。
決済したポジション数を調べる関数はOrdersHistoryTotal()です。この関数で取得した数値−1が最後に決済、もしくは取り消されたポジションになります。
実際の使用例です。
上記の処理で過去に決済したポジションを調べることが出来ます。最新の決済されたポジションから順にループするごとに過去に決済されたポジションになります。
過去に決済したポジションは数が多くなります。その分処理も重くなりますので、必要なデータを見つけたら、そこでループを止める処理をしておいたほうがいいと思います。
今回はこれで終了です。
内容には注意を払っていますが、保障は出来ません。
実際に運用する場合は、自己責任でお願いします。
今回は「リミットとストップロスを計算で設定する」についてお話したいと思います。
よくあるシステムはリミットとストップロスを最初に設定しておけば、ポジションを取得した後に毎回同じリミットとストップロスを設定してくれます。今回は、そのリミットとストップロスを毎回違う値で設定するような方法を紹介します。
毎回同じリミットとストップロスにするのではなく、違った値で設定することが可能になります。
サンプルプログラムはこちらです。
http://jidoubaibai.com/Samples/Sample%20TPSL2.mq4
サンプルプログラムの使い方は、こちらで説明しています。
http://jidoubaibai.com/burogu11.html
今回はレートとボリンジャーバンドの中央線のクロスでポジションを取得し、TPSLはボリンジャーバンドの±2σの位置に設定してみます。
ボリンジャーバンドの中央線は移動平均線なので、ソース内の関数ではMAとのクロスで処理していますので注意してください。
では、MetaEditorを起動して下さい。
NameはTPSL2などにして下さい。
では、まとめてコードを書きますので、同じようにコードを半角英数で書いていってください。
書けましたか?
今回は以前こちら
で説明したオリジナル関数を使い、レートの終値とMAのゴールデンクロスとデッドクロスでポジションをとり、
その後にポジションを持っていて、リミットとストップロスが設定されていない場合に、
ボリンジャーバンドの位置を算出してリミットとストップロスを入れるプログラムになっています。
先ず下記のポジションを取るプログラムの説明です。
// ポジションチェック ポジション無し
if(CurrentPosition == -1)
{
//もし終値がMAを上に抜けたら
if( CrossMA(20) == 1 )
{
//買いポジションを取る
Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, 0, 0, "Buy", 0, 0, Red);
}
//もし終値がMAを下に抜けたら
if( CrossMA(20) == 2)
{
//売りポジションを取る
Ticket = OrderSend(Symbol(), OP_SELL, 1, Bid, 3, 0, 0, "Sell", 0, 0, Blue);
}
ここでは、ポジションを持っていないとき、関数内で計算された内容で終値とMAがゴールデンクロス、
またはデッドクロスと判定された時にポジションを取るようになっています。
今回もポジション取得時にリミットとストップロスを入れていると注文がキャンセルされる仕様のブローカーに合わせて、
リミットとストップロスは0でポジションを取得しています。
次に、取得しているポジションのリミットとストップロスが0の場合にボリンジャーバンドの±2σを算出し、
その位置にリミットとストップロスを新たに設定する為のプログラムです。
今回ここで初めて登場するのはiBands関数、
NormalizeDouble関数です。
iBands関数(通貨ペア,タイムフレーム(時間足),期間,偏差,バンドのシフト,値を取る時間(始値、終値など),モード,シフト)
ボリンジャーバンドの数値を出す関数です。他のインディケーターで使われる関数に似ている部分が多いので簡単に説明していきます。
通貨ペア
どの通過ペアなのかを表すシンボルです。
基本的に選択された通過ペアで行うNULLを入れておけば問題ありません。
タイムフレーム(時間足)
時間足等のタイムフレームです。
基本的に0を入れておけば問題ないです。
選択されたタイムフレームで行ってくれます。
期間
ボリンジャーバンドの期間です。
20期間のボリンジャーバンドにしたい場合は20と入力します。
偏差
ボリンジャーバンドの偏差です。
2σのボリンジャーバンドにしたい場合は2と入力します。
バンドのシフト
ボリンジャーバンドをシフトする値を入れます
ここに入力した数字の数だけ右側にシフトします。
よく分からない場合は0と入力しておけば問題ないです。
値を取る時間(始値、終値など)
始値、高値、安値、終値など、どのデータを使用してボリンジャーバンドを作るかです。
PRICE_CLOSE
PRICE_OPEN
PRICE_HIGH
PRICE_LOW
PRICE_MEDIAN
PRICE_TYPICAL
PRICE_WEIGHTEDの7種類あります。
モード
ボリンジャーバンドの上下のラインのうちどれを使うかの設定です。
MODE_UPPER
MODE_LOWERの2種類があります。
MODE_UPPERが上のライン、MODE_LOWERが下のラインになります。
シフト
ボリンジャーバンドの時間をシフトする数値です。
0なら現在のボリンジャーバンド、1なら一つ前の足のボリンジャーバンドのデータが入ります。
1時間足なら、一時間前の移動平均のデータが入ります。
NormalizeDouble関数(値,位)
この関数は数字の小数点以下を第何位までにするかを制御する関数です。
この関数でボリンジャーバンドの値を通貨ペアで使用されている小数点の位に合わせています。
値
ここに入力された値を処理します。
今回はここでボリンジャーバンドの値を処理しています。
位
ここに入力された数字分、小数点以下を使用します。
2と入力すると、小数第二位までという形になります。
今回はチャートの位と合わせるので、Digitsと入力しています。
これにより自動的にチャートの位に合います
プログラムの内容は、ポジションを持っている時で尚且つストップロスかリミットに0が入っていた場合、
ボリンジャーバンドの±2σの値を算出してその値にストップロスとリミットの値を変更するという内容です。
基本的な動き方は以前にこちらで説明したとおりです。
こちらが今回追加、または修正された内容です。
NormalizeDoubleの値の場所にiBands関数
が入っています。つまり、iBands関数で算出した値をチャートの小数点にあわせている形になります。それを変数に入れています
後は、OrderModify関数で、リミットとストップロスの値を先ほど算出した値で設定しています。
上記の内容はMAのオリジナル関数です。
ここでレートの終値とMAのクロスの判定を行っています。
詳しくは、オリジナル関数の作り方で説明しています。
今回はこれで終了ですが、一点だけ注意点があります。
TPSLを計算により算出した時、稀に現在のレートに近すぎるため指値を入れることが出来ない場合がありますので注意してください。
今回のような方法で、リミットとストップロスを毎回違う値で設定することが可能になります。
いろいろと応用が出来る方法ですので、ぜひマスターしてください。
内容には注意を払っていますが、保障は出来ません。 実際に運用する場合は、自己責任でお願いします。
買いポジションを取得した後、レートが逆行してしまい含み損を抱えてしまった場合、おとなしく損切りをするかレートが持ち直すのを待つのかという選択を迫られる場合があります。
そんな時、ナンピンをしてみるという選択肢があります。
分かりやすく書くと下記の通りになります。
(説明のため、スプレッドは考慮していません。)
ポジションA=90.00で取得したポジション。
ポジションB=89.50で取得したポジション。
レートが89.75の位置の場合のポジションAの損益=-0.25
レートが89.75の位置の場合のポジションBの損益=0.25
合計損益=0
更にレートが下がった場合、ナンピンを重ねることも可能なので、どんどん相殺レートは下がっていきます。
デメリットとしては、レートが反転せずに下降し続けた場合、ナンピンした数だけ損益が大きくなるという危険な一面もあります。
この方法は、ナンピンポジションのlot数を減らしたり増やしたり、ナンピンする幅を広げたり狭めたりとバランスのとり方も色々考えることができます。
その為デメリットもあるものの、バランスの比較的とり易い方法といえます。リスク管理がしっかりしているのであれば、有効な方法かもしれません。
他にもやり方としては、以下のような方法もあります。
(説明のため、スプレッドは考慮していません。)
ポジションA=90.00で取得したポジション、ロット数は1。
ポジションB=89.50で取得したポジション。ロット数は2
レートが89.75の位置でポジションAの1ロットとポジションBの半分にあたる1ロットを決済して相殺。
残りのポジションBの1ロットを引き続き保有して利益を狙うといった方法もあります。
実際にはスプレッドの影響などがありますので上記の説明ほど単純には行きませんが、考え方は上記の通りになります。
内容には注意を払っていますが、保障は出来ません。
実際に運用する場合は、自己責任でお願いします。
サンプルプログラムはこちらです。
http://jidoubaibai.com/Sample%20TPSL.mq4
サンプルプログラムの使い方は、こちらで説明しています。
http://jidoubaibai.com/burogu11.html
なぜ突然EAが動かなくなったのでしょうか。それはMetaTrader4 Proactiveの仕様に原因があります。決してMetaTrader4 Proactiveの性能の問題ではなく、「ポジション取得時にリミットとストップを設定できない。」という仕様に引っかかっていたのです。
MetaTrader4 Proactiveでは、ポジションを取得すると同時にリミットとストップを設定していると、エラーが発生し、注文がキャンセルされる仕様となっています。以前のEAでは、ポジション取得と同時にリミットとストップの設定がされているものがほとんどです。その為にEAが突如ポジションを取得しなくなる現象が起っています。つまりポジションを取得する時には、ストップとリミットを設定していてはいけません。
動かなくなったほとんどのEAはリミットとストップロスを無くせば、また動くようになるでしょう。ストップとリミットを設定する場合は、ポジションを取得した後に設定することになります。
今回はMACDのゴールデンクロスで買い、デッドクロスで売るシステムのリミットとストップを後からつけるプログラムを紹介します。決済はリミットとストップのみで行い、MACDの判定は以前こちらで紹介したオリジナル関数を使ってみましょう。
では、MetaEditorを起動して下さい。
NameはTPSLなどにして下さい。
では、まとめてコードを書きますので、同じようにコードを半角英数で書いていってください。
書けましたか?
今回は以前こちらで説明したオリジナル関数を使い、MACDのゴールデンクロスとデッドクロスでポジションをとり、その後にポジションを持っていて、リミットとストップロスが設定されていない場合に、リミットとストップロスを入れるプログラムになっています。
先ず下記のポジションを取るプログラムの説明です。
ここでは、ポジションを持っていないとき、関数内で計算された内容でMACDがゴールデンクロス、またはデッドクロスと判定された時にポジションを取るようになっています。普段と違うのは、ストップロスとリミットが0になっていることです。
次に、ポジションを持っている場合にリミットとストップロスが0の場合に新たに設定する為のプログラムです。
今回初めて登場するのはOrderModify関数、
OrderOpenPrice関数、OrderStopLoss関数、
OrderTakeProfit関数、OrderTicket関数です。
プログラムの内容は、ポジションを持っている時で尚且つストップロスかリミットに0が入っていた場合、ストップロスとリミットの値を変更するという内容です。
OrderOpenPrice関数は、ポジションのオープンレートを調べる関数です。
OrderStopLoss関数は、ポジションのストップロス値を調べる関数です。
OrderTakeProfit関数は、ポジションのリミット値を調べる関数です。
OrderTicket関数は、ポジションのチケット番号を調べる関数です。
上記がOrderModify関数です。注文の内容を変更するのに使われる関数となっています。サイズの関係上2行に分けて表記しましたが、皆さんは1行で書いても大丈夫です。
OrderModify関数(チケット番号, 指値, ストップロス値,リミット値, 有効期限, 表示される色)
個別に説明していきます。
チケット番号は変更する注文のチケット番号を選択します。
指値は指値を変更するときなどに使います。今回はオープンレートが入っています
ストップロス値はここに入力された数値をストップロスにします。
リミット値はここに入力された数値をリミットにします。
有効期限は指値などの未約定の注文の有効期限を指定します。
表示される色は色の設定です。
今回はストップロスとリミットを変更しています。
買いの場合、ストップロスに「OrderOpenPrice()-(200*Point)」、リミットに「OrderOpenPrice()+(200*Point)」を入力していますので、ストップロスはオープンレートから200pips下で、リミットはオープンレートから200pips上になるようにしています。
上記の内容はMACDのオリジナル関数です。ここでMACDのクロスの判定を行っています。詳しくは、オリジナル関数の作り方で説明しています。
余談ですが、MetaTrader4 Proactiveがリリースされた後にオーダーシステムでご注文頂いたシステムには、全て上記の対処がされていますので、正常に稼動します。
今回はこれで終了です。OrderModify関数は出来ることがたくさんありますので、是非マスターしてください。
内容には注意を払っていますが、保障は出来ません。
実際に運用する場合は、自己責任でお願いします。
内容には注意を払っていますが、保障は出来ません。
実際に運用する場合は、自己責任でお願いします。
上の図はテスター画面になります。この画面の赤い丸で囲ってある部分がVisual modeのスイッチです。
ここのチェックボックスにチェックしてください。
あとは普通にバックテストの設定をして、右下のスタートボタンを押します。
バックテストのやり方は以前こちらで紹介させて頂きました。
画面にチャートが出て、チャートが上下に動き出したのが確認できると思います。
ここで注意しなければならないのは、インディケーターを使ったEAの場合、Visual mode中はインディケーターが表示されないことです。
Visual modeのバックテストを終了した時に、利用しているインディケーターが表示され、EAが正常に稼動しているか、などのチェックが可能になります。
でもこれではそれほど役に立つ機能とは思えませんね、ですのでこれらの解決方をご紹介します。次の画像を御覧下さい。
赤い丸で囲っているバーでスピードの調節が出来ます。
画像ではマウスのポインタが表示されていませんが、赤丸の中の30と書いてある真下の縦長四角をマウスでドラッグすることによってスピード調節が可能です。
一番左に持っていくと1で最も遅く、一番右側に持っていくと32で最も早い速度で再生します。
緑の丸で囲っている場所はビデオのリモコンなどでもお馴染みの一時停止ボタンです。
一度押すとチャートの再生が一旦停止され、ボタンは「>>」マークになります。「>>」マークを押すと一旦停止が解除されます。
スピードを遅くするか、一旦停止で止めるかした後、Visual modeで表示されているチャートに、インディケーターを入れることが可能です。
これによって、Visual mode中にインディケーターが見れない問題を解決することが出来ます。
青の丸で囲っているものは、スキップスイッチです。右側の時間まで、一気に進みます。
この画像の場合、2009年10月1日から2009年11月1日までVisual modeでバックテストし、
バックテスト中にスキップボタンを押すと2009年10月21日までスキップすることになります。
これらの機能を使いこなせば、EAの弱点や、不具合、ルールの矛盾点などを比較的簡単に割り出すことが出来ます。とは言うものの根気が要ることには違い有りませんが・・・
スピード調節機能ですが、これのスピードはバックテストするEAや、EAで利用するインディケーターの動作の重さで大きく左右されます。
また、バーでのスピード調節も曖昧で、31から32の速度アップが大きすぎて31だと物足りないスピードも32だと目を見張る速度になる事が多いです。
私はこの調節が苦手で、調べたい時間をよく通り過ぎてしまいます(笑)。
以上でVisual modeの簡単な使い方は終了です。以前紹介した最適化(Optimization)とは併用できませんが、
Visual modeを使いこなせる様になれば自作EAの心強い味方になるでしょう。
今回はこれで終了です。他にもVisual modeの便利な使い方や利用方法があれば、また紹介したいと思います。
内容には注意を払っていますが、保障は出来ません。
実際に運用する場合は、自己責任でお願いします。
今回はMetaTrader4を使った最適化についてお話します。
皆さんは自分の作ったシステムなどの最適な数字に興味がありませんか?
例えばMACDのゴールデンクロスとデッドクロスでポジションを取るシステムがあったとします。
MACDのパラメーターはどの様な数値が一番利益が出るのでしょうか?
そんな疑問を有る程度解決してくれるのが最適化です。
MetaTrader4にデフォルトで「MACD Sample」というシステムがあると思います。最適化を使って過去の相場における最適な数字を探してみましょう。
みなさんは、調べてみたいシステムを選んでください。ただし、パラメーターが変更できるタイプのものを選んでくださいね。
まず、バックテストで使うテスター画面を表示しましょう。
テスターの出し方が分からない方は、以前こちらでも説明させて頂いてます。
上の画像の赤い○で囲っている部分に注目してください。
左側の赤い○はチェックボックスになっています。最適化したいパラメーターはここにチェックを入れます。
上の画像では、「MACDOpenLevel」「MACDCloseLevel」「MATrendPeriod」の三種類を最適化します。
右側の赤い○はパラメータの設定になります。
スタートの数字からストップの数字までを調べます。その際、ステップで決めた数値をスタートに足していきます。
「MACDOpenLevel」の場合、2〜7までを1ずつ増やしながら調べます。
設定が出来たら、OKボタンを押します。
次は上の画像の赤い○で囲っている「Optimization」にチェックをしてください。
後は、バックテストの時と同じように調べる期間などを決めてスタートを押すだけです。
しかし気をつけて頂きたいのが、最適化の数です。
あまり欲張って、パラメーター画面のスタート、ストップ間を広げたり、調べるパラメーターの種類を増やしたりすると終了までにものすごい時間がかかるだけでなく、
パソコンのスペックしだいでは全然動かなくなるぐらい動作が重くなったり、終了間際にメモリーが足りませんといわれて結果が見れなかったりします。
何事もほどほどがいいようです(笑)
この作業はパソコンの処理能力をすごく使いますので、パソコンのスペックと相談しながら、有効に利用してください。
最適化が終わると、赤い○の場所に今までには無かった「Optimization Results」「Optimization Graph」というタブが出てくると思います。
Optimization Resultsタブでは、最適化の結果が表示されます。一番右のパラメーターの入力という場所には、最適化された内容の数値が分かるようになっています。
左側の損益、Total Trades、Protit factor、Expected Payoff、Drawdoun $、Drawdown %、などを見て気に入った数値を探しましょう。
Optimization Graphタブでは、Optimization Resultsに書いてあるPassナンバーをグラフで表しています。成績の良いパラメーターを探す参考にしてください。
この結果を元に、自分の気に入ったパラメーターを探し出してください。
一つ一つパラメーターを変えながらバックテストするよりもずっと時間を短縮できると思います。
ですが、あまりやり過ぎるとカーブフィッティングになります。
あくまで数値を相場にあわせる作業ですので、その事をよく考えて利用したほうがいいと思います。
結果を分析して、参考にしてください。
今回は、これで終了です。
また機会があれば、もう少し詳しくご紹介したいと思います。
内容には注意を払っていますが、保障は出来ません。
実際に運用する場合は、自己責任でお願いします。
今回は意外と質問の多い、MetaTrader4で使える簡単なテクニカル分析を紹介していきたいと思います。
一言でテクニカル分析と言っても、沢山種類があります。今回はその中でもメジャーなテクニカル分析の紹介に絞らせていただきます。
◇移動平均線(MA)◇
英語でMoving Averageと呼ばれ、一般的に「MA」と略されます。一定期間のレートの平均を線として表します。
一般的な使い方として、短期間と長期間の移動平均線を利用し、短期が長期を下から上に抜けたときをゴールデンクロスと言い、買いシグナル。
短期が長期を上から下に抜けたときをデッドクロスと呼び、売りシグナルとして用いられます。
移動平均線は、トレンドを把握する為に使われることが多いです。
以前こちらのページで簡単なプログラムを紹介させて頂きました。
◇移動平均収束拡散法(MACD)◇
英語でMoving Average Convergence and Divergenceと呼ばれ、一般的に「MACD」と略されます。
移動平均線を応用したテクニカル分析で、指数平滑移動(EMA)の短期と長期とシグナル線を用いて分析を行います。MACD線がシグナル線を下から上に抜けたときをゴールデンクロス
と言い、買いシグナル。その逆がデッドクロスで売りシグナルになります。
特徴としては、トレンド相場を読み取りやすい反面、ボックス相場で脆くなります。
以前こちらのページで簡単なプログラムを紹介させて頂きました。
◇ボリンジャーバンド◇
英語表記でBollinger Bandsと書かれます。
移動平均線と標準偏差を用いたテクニカル分析で、移動平均線の上下に引かれたバンドを用いて分析を行います。
バンドは中央の移動平均線に対して上下で一対になってます。
中央の黒い線が移動平均線です
中央から上下に位置する黒い線が±1σのバンドで、間にレートが存在する確率は、68.27%
中央から上下に位置する黄色線が±2σのバンドで、間にレートが存在する確率は、95.45%
中央から上下に位置する紫線が±3σのバンドでn間にレートが存在する確率は、99.73%
上記の確率ですが、所詮は確率です。±2σのバンドを抜ける確率が5%を切っているからと信じ込んでいては危険です。あくまで目安にしましょう。
事実、上のチャートでは、黄色線を出るロウソクが5%どころではないです
これだけを聞くと使えないテクニカル分析の様に思えますが、ちゃんとした使い方を覚えれば応用性が高く、優れたテクニカル分析だと思います。
詳しい使い方を書くと、かなり長くなってしまいますので、ボリンジャーバンドの詳しい使い方については、また別の機会にしたいと思います。
プログラムでボリンジャーバンドを使うにはiBands関数を使います。
以前こちらのページで関数に頻繁に出てくる引数を説明させて頂いてます。
以前紹介した引数に出ていなかったものは「period」「deviation」「bands_shift」辺りですね。
int period
これは、移動平均期間の設定です。ここに入力したバーの数で計算します。
int deviation
これは標準偏差の設定です。2を入力すれば、2σの値が出ます。
int bands_shift
これはバンドをシフトするバーの数の設定です。バーは右方向へシフトします。
int mode
これは以前「関数に頻繁に出てくる引数」の時に説明しましたが、以前の説明は「MACD」でした。今回はボリンジャーバンドですので、内容が変わっています
「MODE_UPPER」が上のバンドを表します。
「MODE_LOWER」が下のバンドを表します。
仮に上記のプログラムを組み込んだ場合には移動平均期間が20で、終値が-2σのバンドを下回ったとき、買いポジションを取ることになります。
◇相対力指数(RSI)◇
英語表記でRelative Strength Indexと書かれます。一般的に「RSI」と略して呼ばれています。
RSIは%で表され一般的には70%を超えると買われすぎ、30%を下回ると売られすぎと言われています。そのため、逆張りの目安として使われる事が多いようです。
そのため、為替の転換点を示していると言われますので、ボックス相場で効果を発揮すると思います。逆にボックス相場からトレンドが発生したときには注意が必要です。80%以上や30%以下に張り付くことが有りますので、安易な逆張りでの損失が恐れられます。
プログラムでRSIを使うにはiRSI関数を使います。
以前こちらのページで関数に頻繁に出てくる引数を説明させて頂いてます。
int period
これは、移動平均期間の設定です。RSIでは、14を一般的に使います。
今回の内容は以上になります。
また別の機会に、ほかのテクニカル分析を紹介をしたいと思います。