本ブログは、MetaTrader を利用して、EA プログラムを自作紹介するサイトです。
決して儲かるシステムを紹介するものではありませんのであしからず・・・
もし、記事中に嘘偽りを発見された方、ご連絡頂けると幸いです。
なお、過去に作成した EA プログラムの作り方はこちらになります。

Loop_Entry : 同じ指値エントリーを繰り返し実行するプログラムです。
estTurn : 高値(安値)で反対売買を実行するプログラムです。

2008年12月24日水曜日

損きり設定を施します

Loop_Entry プログラムに柔軟性を持たせたのは良いですが、大事な「損きり」設定を施す対応を忘れていました。

一夜にして US ドル/円で1円も2円も変動する昨今において、損きり設定を忘れるわけにはいきません。

どのようなルールにするか悩ましいところですが、指値価格みたいに画面から入力できるような仕組みは作りたくありません。

なぜなら、簡単に変更できてしまうと、裁量トレードの時みたいに雰囲気でコロコロ変えてしまう自分が目に浮かぶからです・・・

#自分をコントロールできる方であれば、利食い価格の対応をした時のような方法で、プログラムしてみてください。

私の場合には、次のルールでプログラムしたいと思います。

利食い時の利幅ポイントの倍のポイント分」を損きり価格とする。

つまり、入力画面で利食いポイントを プラス 20 ポイントと指定したら、自動的に損きり価格は マイナス 40 ポイントの価格で指定するようにします。

プログラムの変更は次のとおりです。

まず、注文するための OrderSend の損きり価格を指定する場所に、自動計算した損きり価格の結果が指定できるように SONKIRI_KAKAKU の識別子を指定します。

OrderSend(Symbo(),
CHUMON_TYPE,LOTSU,SASHINE,SLIPPAGE,SONKIRI_KAKAKU,RIKUI_KAKAKU,
NULL,0,0,Green);

#表示領域の都合上、改行記載してあります。

また、自動計算した損きり価格を保持するための識別子を、int init() エリアの上に次のように定義します。

double SONKIRI_KAKAKU; //入力した指値より算出した損きり価格を格納

最後に、利食い幅の倍のポイントで損きり価格を算出するプログラムを、注文種別ごとに処理している箇所に次のように追加します。

if(CHUMON_SHUBETSU=="指買")
{
//「指値買い」注文の場合
CHUMON_TYPE=2; //注文の種類を数値に変換
RIKUI_KAKAKU=SASHINE+RIKUI_POINT*Point; //利食い価格を算出
SONKIRI_KAKAKU=SASHINE-((RIKUI_POINT*Point)*2); //損きり価格を算出
}

これは、入力された利食いポイントである「RIKUI_POINT*Point」の部分に 2 を掛けたものを、指値価格から引いた結果を SONKIRI_KAKAKU にセットするという意味です。

#全ての注文種別部分に、同様(買と売りでプラスとマイナスは異なる)の計算プログラムを追記していきます。

プログラム全体を見ると次のようになります。

これで、一応プログラムは完成しました。

次回から、デモアカウントを利用して実際に取引してみたいと思います。

2008年12月23日火曜日

コメント入れてプログラムを整理します

Loop_Entry プログラムに柔軟性を持たせるためにいくつかの対応をしました。

ちょっとここで、対応したプログラムを整理したいと思います。

整理といってもプログラムにコメントを記入して、どこで何をしようとしているのかを忘れないようにするだけですが・・・。

コメントの書き方は以前紹介しましたが、次のような書き方もできます。

RIKUI_KAKAKU=SASHINE+RIKU_POINT*Point; //利食い価格を算出

つまり、プログラムと同じ行の最後にもコメントが書けますので、簡潔なものはこのように記載してもよいかと思います。

結果、このようなコメントを記載してみました。



なお、注文種別の違いにより異なる値をセットする部分に次のような変更を加えてあります。

if(CHUMON_SHUBETSU=="指買")
{
//「指値買い」注文の場合
}
else if(CHUMON_SHUBETSU=="指売")
{
//「指値売り」注文の場合
}
else if(CHUMON_SHUBETSU=="逆指買")
{
//「逆指値買い」注文の場合
}
else if(CHUMON_SHUBETSU=="逆指売")
{
//「逆指値売り」注文の場合
}


この "else" という書き方は、「上に書いた条件が成立しない場合だけ実行する」という意味です。

つまり、注文種別に"指買"が指定された場合、その後の注文種別を判断する部分のプログラムは実行されず、の部分へ飛んでいく形になります。

よし、これでコンパイルしてデモアカウントで試してみようかと思いましたが、一つ大事なルールを決めていませんでした。

損きりのルールです。

損きりについて考慮したプログラムになるように次回考えたいと思います。

2008年12月22日月曜日

利食い幅も調整できるようにします

前回で、注文種別の "買い" と "売り" ならびに、"指値" と "逆指値" に対応できました。

続いて、利食い計算の部分について対応したいと思います。

現在、利食い計算は、次のように指値価格に 20 ポイントプラスされるようになっています。

OrderSend(
Symbol(),CHUMON_TYPE,LOTSU,SASHINE,SLIPPAGE,0,SASHINE+20*Point,
NULL,0,0,Green);

#表示領域の都合上、改行記載してあります。

しかし、注文種別の対応にて、"買い" のみでなく "売り" も指定できるようになったため、利食いの計算も "買い" と "売り" に対応せねばなりません

また、利食いの幅についても、20ポイント固定ではなく任意の利食い幅を指定できるようにします。

そのため、入力パラメータを使い利食いポイントをプログラムへ渡すための識別子を "RIKUI_POINT" として、次のように入力パラメーター部分に追記します。

//---- input parameters
extern double SASHINE=0.0;
extern double LOTSU=0.1;
extern int SLIPPAGE=3;
extern string CHUMON_SHUBETSU="指買/指売/逆指買/逆指売";
extern int RIKUI_POINT=20;

さらに、注文種別の時と同じように、OrderSend の利食い価格を指定する箇所を、入力された注文種別と利食いポイントに従って計算された価格で置き換えられるようにします。

そのために、OrderSend の利食い価格を指定する箇所に、新たな識別子 "RIKUI_KAKAKU" を設けます。

OrderSend(
Symbol(),CHUMON_TYPE,LOTSU,SASHINE,SLIPPAGE,0,RIKUI_KAKAKU,
NULL,0,0,Green);

#表示領域の都合上、改行記載してあります。

そして、この識別子 "RIKUI_KAKAKU" に対して、入力された注文種別に沿って次のような利食い計算した結果の値をセットします。

"指値買い" の場合、指値価格に入力した利食いポイントをプラス
"指値売り" の場合、指値価格に入力した利食いポイントをマイナス
"逆指値買い" の場合、指値価格に入力した利食いポイントをプラス
"逆指値売り" の場合、指値価格に入力した利食いポイントをマイナス

この、「注文種別ごとの場合」という部分は、前回のプログラム作成において、int init() エリアにて if 文を利用して場合分けをしているため、この部分を利用して次のようにプログラムを変更します。

if(CHUMON_SHUBETSU=="指買")
{
CHUMON_TYPE=2;
RIKUI_KAKAKU=SASHINE+RIKUI_POINT*Point;
}
if(CHUMON_SHUBETSU=="指売")
{
CHUMON_TYPE=3;
RIKUI_KAKAKU=SASHINE-RIKUI_POINT*Point;
}
if(CHUMON_SHUBETSU=="逆指買")
{
CHUMON_TYPE=4;
RIKUI_KAKAKU=SASHINE+RIKUI_POINT*Point;
}
if(CHUMON_SHUBETSU=="逆指売")
{
CHUMON_TYPE=5;
RIKUI_KAKAKU=SASHINE-RIKUI_POINT*Point;
}

なお、int init()エリアと OrderSend が記載されている int start() エリアで、同じ RIKUI_KAKAKU 識別子を使う場合には、int init()エリアよりも上に RIKUI_KAKAKU 識別子 の定義を次のようにしておく必要があります。

double RIKUI_KAKAKU;

これで、利食い計算の対応も完了しました。

次回は、Loop_Entry プログラムに柔軟性を持たせるために施した対応を整理します。

2008年12月21日日曜日

注文種別に対応します

さて、Loop_Entry プログラムに柔軟性を持たせるため、次の対応を行いました。

・通貨ペアを "USDJPY" 固定から、プログラムを表示するチャートにあわせた
・ロット数(取引数)を 0.1 固定から、任意の数量を入力できるようにした
・スリッページを 3 固定から、任意のスリッページを入力できるようにした

次に"注文種別"の対応をしていきたいと思います。

注文種別は、「(指値)買い」固定になっていますが、これを「(指値)売り」もできるようにします。さらに、逆指値もできるようにしようと思います。

どうやって、上記種別をプログラムに判断させるかは、やはり入力パラメーターを使って、注文種別の情報をプログラムに渡すことにします。

そこで、次のルールで注文種別を入力するようにします。

・入力画面で "指買" と入力したら "指値買い"
・入力画面で "指売" と入力したら "指値売り"
・入力画面で "逆指買" と入力したら "逆指値買い"
・入力画面で "逆指売" と入力したら "逆指値買い"

そのため、プログラムに注文種別を渡すための識別子を "CHUMON_SHUBETSU" とし、入力画面に初期表示する値を "指買/指売/逆指買/逆指売" とするために、入力パラメーター部分に次のように追記します。

//---- input parameters
extern double SASHINE=0.0;
extern double LOTSU=0.1;
extern int SLIPPAGE=3;
extern string CHUMON_SHUBETSU="指買/指売/逆指買/逆指売";

CHUMON_SHUBETSU には文字を入力するため、識別子のデータ種類は "string" を指定します。

これで、何の注文種別で注文したいかを、プログラムへ渡すことができました。

では、渡された注文種別にしたがって、注文部分のプログラム OrderSend を修正したいと思います。

注文種別の指定は、OrderSend の次の部分で行います。

OrderSend(
Symbol(),OP_BUYLIMIT,LOTSU,SASHINE,SLIPPAGE,0,SASHINE+20*Point,
NULL,0,0,Green);

#表示領域の都合上、改行記載してあります。

以前、「注文の書き方」で調べた際、注文種別は次のように指定することができました。

指定内容 : 注文方法
--------------------------------------------------
0 : 成り行き買い
1 : 成り行き売り
2 : 指値買い
3 : 指値売り
4 : 逆指値買い
5 : 逆指値売り

#今回、"成り行き"は使いません。

そのため、それぞれの注文種別では、

"指値買い" の場合、OrderSend(Symbol(),2,LOTSU,SASHINE,・・・
"指値売り" の場合、OrderSend(Symbol(),3,LOTSU,SASHINE,・・・
"逆指値買い" の場合、OrderSend(Symbol(),4,LOTSU,SASHINE,・・・
"逆指値売り" の場合、OrderSend(Symbol(),5,LOTSU,SASHINE,・・・

と指定すればよいのですが、入力される注文種別はどれが来るかわかりません

そこで、OrderSend の注文種別を指定する箇所が、入力された注文種別に従って変わるようにしたいと思います。

そのために、OrderSend の注文種別を指定する箇所に、新たな識別子 "CHUMON_TYPE" を設けます。

OrderSend(Symbol(),CHUMON_TYPE,LOTSU,SASHINE,・・・

そして、この識別子 "CHUMON_TYPE" に対して、入力された注文種別に沿った値をセットするようなプログラムを書きます。

プログラムの書き方としては、次の通りです。

if(CHUMON_SHUBETSU=="指買")
{
CHUMON_TYPE=2;
}

これは以前、「注文しすぎ」を防ぐ で記載した if 文 を使います。

つまり、CHUMON_SHUBETSU(入力した注文種別)が "指買" という文字と等しければ中括弧の内容を実行するという書き方です。

中括弧の内容は、先ほど設けた識別子 "CHUMON_TYPE" に対して "指値買い" を意味する 2 の数値をセットしています。

これを、次のように OrderSend の前(上)に書くことで、指値買いの注文が可能となります。

if(CHUMON_SHUBETSU=="指買")
{
CHUMON_TYPE=2;
}

OrderSend(Symbol(),CHUMON_TYPE,LOTSU,SASHINE,・・・

同様に、"指値売り(3)" "逆指値買い(4)" "逆指値売り(5)" についても次のように記載します。

if(CHUMON_SHUBETSU=="指買")
{
CHUMON_TYPE=2;
}
if(CHUMON_SHUBETSU=="指売")
{
CHUMON_TYPE=3;
}
if(CHUMON_SHUBETSU=="逆指買")
{
CHUMON_TYPE=4;
}
if(CHUMON_SHUBETSU=="逆指売")
{
CHUMON_TYPE=5;
}

OrderSend(Symbol(),CHUMON_TYPE,LOTSU,SASHINE,・・・

これで、入力画面にてどの注文種別が来ても、一つの OrderSend で注文をすることが可能となりました。

ただこのままでは、Tick が変わる度に4つの if 文 が実行されてしまい非常に無駄です(注文タイミングが遅れてしまいます)。

入力したパラメーターは、プログラムが再起動されない限り変わることはありません。

そのため、注文種別を判定する部分は、プログラムが起動した際に1回だけ実行される場所であるint init() エリアに記載することで無駄な実行を避けることができます。

なお、int init()エリアと OrderSend が記載されている int start() エリアで、同じ CHUMON_TYPE 識別子を使う場合には、int init()エリアよりも上に CHUMON_TYPE 識別子 の定義を次のようにしておく必要があります。

int CHUMON_TYPE;

#OrderSend の注文種別の指定は整数で行う必要があるため、CHUMON_TYPE の識別子も int で定義します。
#入力パラメーターの定義も int init()エリアよりも上に記載されているため、両方のエリアで扱えます。

長くなりましたので、続きは次回へ。

2008年12月20日土曜日

もう少し柔軟性をもたせてみます

とりあえず、プログラムに指値の値を渡して実行する仕組みはできました。

これだけでも十分取引はできますが、

・通貨ペアが "USDJPY" で固定
・ロット数(取引数)が 0.1 で固定
・スリッページが 3 で固定
・注文種別が "買い" で固定
・利食い計算が "プラス 20 ポイント" で固定

なので、この辺にもう少し柔軟性を持たせたいと思います。

まず、通貨ペアについて。

これは以前、注文の書き方で調べた時に、OrderSend の通貨ペアを指定する部分に "Symbol()" と記載することで、プログラムを連動させるチャートと同じ通貨ペアが指定されることがわかってます。

そのため、OrderSend 部分を次のように書き換えます。

OrderSend(
Symbol(),OP_BUYLIMIT,0.1,SASHINE,3,0,SASHINE+20*Point,NULL,0,0,Green);

#表示領域の都合上、改行記載してあります。

これで、どの通貨ペアでも、このプログラムが使えるようになりました。


次にロット数(取引数)です。

私の場合は、資金が無いためロット数(取引数)を変更することはあまり無いと思いますが、もしかしたらロット数(取引数)を増やした取引ができる日がくるかもしれませんので、一応変更可能にしておきます。

これは、指値同様、画面から入力される任意のロット数(取引数)を OrderSend 部分に渡す仕組みを利用します。

そのため、プログラムにロット数(取引数)を渡すための識別子を "LOTSU" とし、入力画面に初期表示する値を "0.1" とするために、入力パラメーター部分に次のように追記します。

//---- input parameters
extern double SASHINE=0.0;
extern double LOTSU=0.1;

そして、OrderSend のロット数(取引数)部分を次のように書き換えます。

OrderSend(
Symbol(),OP_BUYLIMIT,LOTSU,SASHINE,3,0,SASHINE+20*Point,NULL,0,0,Green);

#表示領域の都合上、改行記載してあります。

これで、ロット数(取引数)も自由に指定できるようになりました。


次にスリッページです。

こちらもロット数同様の修正になります。

そのため、プログラムにスリッページを渡すための識別子を "SLIPPAGE" とし、入力画面に初期表示する値を "3" にするために、入力パラメーター部分に次のように記載します。

//---- input parameters
extern double SASHINE=0.0;
extern double LOTSU=0.1;
extern int SLIPPAGE=3;

ここで、ちょっと注意が必要なのは、指値やロット数(取引数)と違いスリッページは小数点の値を扱わないため、識別子のデータの種類が "double" ではなく "int" となります。

"int" とは整数値のみ扱うことを意味します。

そして、OrderSend のスリッページ部分を次のように書き換えます。

OrderSend(
Symbol(),OP_BUYLIMIT,LOTSU,SASHINE,SLIPPAGE,0,SASHINE+20*Point,
NULL,0,0,Green);

#表示領域の都合上、改行記載してあります。

これで、スリッページも自由に指定できるようになりました。

続きは次回に。

2008年12月18日木曜日

受け取った値で注文してみる

任意の値(入力した指値の値)をパラメーターとしてプログラムに渡す仕組みはできました。

次は、渡された任意の値をプログラムの中で注文時に利用するようにしたいと思います。

まずは、注文のプログラム部分を作成します。

これは”Test1”のプログラムで作った注文をする部分をコピーしてきます。

#"Test1"プログラムの「 int start() 」エリアに記載した内容をコピーしてください。

すると、"Loop_Entry"プログラムは次のようになります。

注文するプログラム部分である OrderSend は、次のように構成されていました。

OrderSend("USDJPY",OP_BUYLIMIT,0.1,109.65,3,0,109.85,NULL,0,0,Green);

・注文する通貨ペアは"USDJPY"
・注文方法は指値買い(OP_BUYLIMIT)
・ロット数(取引数)は 1 万通貨(0.1)
指値は 109.65 円
・スリッページは 3 Pips
・損きり価格は無し
・利食い価格は 109.85 円
・コメントは無し
・識別番号は無し
・有効期限は無し
・チャートの色は緑

今回は指値を任意の値にしたいので、上記 OrderSend の赤い部分を次のように置き換えます。

OrderSend("USDJPY",OP_BUYLIMIT,0.1,SASHINE,3,0,109.85,NULL,0,0,Green);

つまり、OrderSend の 指値の値を指定する場所に、入力パラメータとして定義した指値の識別子(SASHINE)を指定することで、画面で入力した指値の値で注文されるようになります。

ただし、このままだと利食い価格が固定の109.85のままなので、こちらも合わせて修正が必要です。

とりあえず、指値より20ポイント分プラスになったら利食いすることにします。

任意の指値より20ポイントプラスするプログラムの書き方は

SASHINE+20*Point

となります。

そのため、OrderSend の部分は次のようになります。

OrderSend(
"USDJPY",OP_BUYLIMIT,0.1,SASHINE,3,0,SASHINE+20*Point,NULL,0,0,Green);

#表示領域の都合上、改行記載してあります。

もし、利食い価格も都度入力したいと思うのであれば、指値同様、プログラムに渡すプロパティを増やしてやることで可能となります。

例えば、利食いの識別子を "RIKUI" とすれば、パラメータを指定する部分への追加と OrderSend の修正を次のように行えば OK です。

//---- input parameters
extern double SASHINE=0.0;
extern double RIKUI=0.0;

OrderSend("USDJPY",OP_BUYLIMIT,0.1,SASHINE,3,0,RIKUI,NULL,0,0,Green);

これで、注文時の指値の金額を任意に決められるようになりました。

あとは、コンパイルをして、プログラムを実行し試してみてください。

2008年11月24日月曜日

受け取った値を表示してみる

では、ウィザードにより表示されたプログラムをみてみます。

ウィザードの「Parameters」部分に指定した内容が次のように(画面赤枠部分)記述されています。

//---- input parameters
extern double SASHINE=0.0;

これは、「外部から、小数点ありの値を、"SASHINE"という識別子で受け取る」という意味を持ちます。

なお、"SASHINE"の横に"=0.0"とありますが、これは画面に表示する初期の値を指定する書き方で
す。

実際どのように画面に表示されるのか早速試してみます。

まずは、ウィザードにより作成された"Loop_Entry"プログラムを実行形式にコンパイルします。

#コンパイルの手順はこちらを参照ください。

次に、MetaTrader 画面にてコンパイルされた"Loop_Entry"プログラムをチャート上に表示します。

#プログラムをチャートに表示させる手順はこちらを参照ください。

すると、下記ウィンドウが表示されると思います。

このウィンドウの「パラメーターの入力」タグが、プログラムに受け渡すための値を入力する画面になります。

この画面を見てみると、一覧エリアの「Variable」の欄に"SASHINE"が、「Value」の欄に"0.0"が表示されています。

つまり、プログラムの"extern"行で指定した、"SASHINE=0.0"が画面上に表示され、「Value」欄をダブルクリックすることで任意の値を入力でき、OK ボタンをクリックすることでプログラムに入力した任意の値を渡すことができます。

では、本当に任意の値がプログラムに渡せるのか試してみます。

MetaEditor で"Loop_entry"プログラムを表示し、次のプログラムコードを追記します。

Print("指値の値は=",SASHINE);

上記コードは、"SASHINE"の識別子に入っている値を画面に表示するプログラムコードです。

これを、int init()エリアに追記します。

#init()エリアは、プログラムが起動するときに1回だけ実行される部分です。詳しくはこちら

上記図のように記述できたら、再度プログラムをコンパイルします。

コンパイルが終了したら、MetaTrader にて"Loop_entry"プログラムをチャートに表示し、パラメーターの入力画面にて、"SASHINE"の Value 値として"123.45"を入力し OK ボタンをクリックしてください。

#すでにチャートにプログラムを表示済みの場合は、次の手順でも OK です。

1.チャート上のプログラム名が表示されているところにカーソルを合わせます。
2.右クリックをして<Expert Advisors>-<Properties>を選択します。

すると、ターミナルウィンドウの「Experts」タグに、入力された指値の値が表示されると思います。

これで、任意の値(今回は指値)をプログラムに受け渡すプログラムができました。

次は、受け渡した指値の値を注文で扱うようにしたいと思います。

2008年11月23日日曜日

プログラムを起動する時にパラメーターを渡す

では、「プログラムを起動する時にパラメーターを渡す」機能を利用したプログラムを作りたいと思います。

今まで作成した"Test1"プログラムを使って実現することも可能ですが、折角プログラムの目的も決まりましたので、プログラム名を変えて初めから作りたいと思います。

以前、「MetaEditor を起動してみよう」でプログラムの新規作成手順を説明しました。

1.MetaEditor を起動
2.MetaEditor 画面のメニューバーより、<File>-<New>を選択
3.Welcome 画面で"Expert Advisor" を選択

すると、次の画面が表示されます。

前回は上記画面でプログラム名( Name:)に"Test1"とだけ入力して完了ボタンを押しましたが、今回はこの画面の下にある「Parameters」の部分を使います。

まず、プログラム名ですが、繰り返しエントリーするプログラムを作りたいので、"Loop_Entry"と名付けたいと思います。

次に「Parameters」の部分ですが、ここは、今から作成するプログラムに対して値を受け渡す仕組みを定義するためのものです。

今回は「注文する際の指値」を入力できるようにしたいため、次の手順で定義します。

1.Parameters エリアの右にある<Add>ボタンをクリック
2.Parameters の一覧エリアに表示された行の「Name」欄に"SASHINE"と入力
3.同じ行の「Type」欄をダブルクリックして、"double"を選択
4.同じ行の「Initial Value」欄をダブルクリックして、"0"を入力

ちなみに「Name」「Type」「Initial Value」の意味は、

Name:プログラムの中で入力された値(今回は指値)を扱うための識別名
Type:Name で指定された識別名で扱うデータの種類
Initial Value:プログラムに受け渡す値を入力する画面を最初に開いた際に表示する値

となります。

なお、「Type」欄で指定できる種類の意味は、

int:整数のみ入力可能
bool:真か偽の判定値のみ入力可能
datetime:日付のみ入力可能
color:色の定義のみ入力可能
double:小数点ありの数値のみ入力可能
string:文字(数値含む)を入力可能

となります。

今回は指値を入力したいので、小数点ありの数値が入力できる"double"を選択します。

さて、入力した結果の画面は、

となります。

最後に完了ボタンをクリックしプログラムを表示します。

次はウィザードにて作成されたプログラムを修正していきます。

2008年11月22日土曜日

指値を入力する画面を作る

さて、同じエントリーポイントを繰り返すプログラムにおいて、プログラムを変更することなくその時の状況に応じて注文する際の指値を変更する画面を設けたいと思います。

イメージとしては、

1.作った画面を表示する
2.表示された画面上で指値を入力する
3.表示された画面上で OK ボタンをクリックする

といったアクションを起こすと、プログラムで注文する際の指値が置き換わる感じになればいいなぁと思っています。

上記アクションを起こすための「画面」をどうやって作るかを調べてみます。


・・
・・・

解りません・・・

ヘルプやネットで画面を作る手順などの情報を探したのですが、見つけられません・・・

その代わり、「プログラムを起動する時にパラメーターを渡す機能」があることが解りました。

独自の画面を作らなくても、やりたいことは全く同じ事ができますので、この機能を利用することにします。

「プログラムを起動する時にパラメーターを渡す機能」とはどこにあるのでしょうか?

これは、作成したプログラムをチャート上に表示する際に出てくる画面上にあります。

以前、”Test1”プログラムをチャート上で実行する際の手順として次のような操作を行いました。

1.ナビゲータウィンドウの<Expert Advisors>で”Test1”を右クリックする
2.<チャートに表示>を選択する

すると次のウィンドウが表示され、OK ボタンをクリックすることで、チャート上にプログラムを表示することができました。

実は、この画面上に「プログラムを起動する時にパラメーターを渡す機能」が出てくるのですが、残念ながら”Test1”プログラムでは出てきません。

「プログラムを起動する時にパラメーターを渡す機能」に対応したプログラムを作成すると、上記画面上で次のような「パラメータの入力」タグが表示されます。

次は、このタグが表示されるようなプログラムを作ってみましょう。

2008年11月10日月曜日

プログラム修正の手間を省く

テストのやり方に関する設定や結果の確認項目については、まだまだ色々あるみたいですが、追々調べることにし、プログラム作成に戻りたいと思います。

さて、同じエントリーポイントを繰り返すプログラムは一応実現できましたが、指値ポイントを変更したい場合、いちいちプログラムを修正しなければなりません。

面倒です・・・

色んなデータを駆使し自動で決められるプログラムを作ればよいのでしょうが、100年に1度の荒れ相場において全てを自動にする知識も度胸もありません。

そこで、入力した指値に従いプログラムが動くようにしたいと思います。

そのためには、次のような手順をプログラムに追加しなければなりません。

1.指値を入力する画面を表示する
2.画面に入力された指値をプログラムに渡す
3.渡された指値で注文をする

これらのやり方を調べていきたいと思います。

2008年11月9日日曜日

Mismatched charts errors

レポート機能の見方でもう一つわからない項目に「Mismatched charts errors」がありました。

こちらについてネットで調べてみると、「周期ごとの時間足データに不整合がある数」とのこと。

おそらく同じ時間帯における1分足と5分足の高値や安値の値が一致しないってことだと思われますが、何のために周期ごとの情報を比較しエラーとしているのかは不明です・・・

もしかしたら、不足している時間足データを擬似的に作成する際のエラー情報なのではないかと思われます。

#この項目に関する日本語の情報があまり無かったのでちょっと自信ないです・・・

いずれにしろ、テストで使われた時間足データに不備があることを意味するみたいなので、このエラーが発生する場合には、時間足データを入れ替え(作り変え)た方がよさそうです。

ちなみに、時間足データはどこにあるるのでしょう?

MetaTrader のメニューバーより<ツール>-<History Center>を選択すると、各通貨ペアごとの時間足データが表示されます。


このヒストリーセンター画面にて、時間足データの修正ができます。

ただし大量なデータですので、一つずつ追加や修正することは、ほぼ無いでしょう。

そのため、時間足データを一旦全て削除し、新しくダウンロードし直すかインポート機能を使って取り込むことになるでしょう。

2008年9月28日日曜日

テストのタイプについて

レポートの結果を調べてみたところ、テストデータの精度については、テストのやり方に左右されることがわかりました。

そのため、テストのやり方について調べてみます。

今までのテストでは、テスターウィンドウの「セッティング」タグにて、初期設定の状態でテストを実施していました。

各項目をみてみると

Expert Advisor

テストしたい EA プログラムを選択する

通貨ペア

テストしたい通貨ペアを選択する

日付と時間を使用

テストしたい期間を指定する

項目のタイトルが合っていませんが、送信者に開始期間、宛先に終了期間を指定します。指定しない場合には、MetaTrader が保有する全てのテストデータ期間でテストされます。

Visual Mode

ここにチェックを付けると、テスト時の取引状況を、チャート図に表しながら実行してくれます。

チャート図を作成しながらテストするため、結果が出るまで時間がかかりますが、ちょっと臨場感を味わえておもしろいです。またその横にあるボタンを押すとテストが一時停止されたり、指定した期日までスキップできたりします。

ここまでは、特にテストデータの精度にかかわる項目ではありませんが、次の「期間」と「タイプ」の2つをどのように指定するかで結果がだいぶ変わる様子です。

「期間」はテストで利用するローソク足を選択する項目で、ここで選択したローソク足の値(始値/終値/高値/安値)を使ってテストが実施されるみたいです。

試しに、期間を”Daily”と”H1”に切り替えて Test1 プログラムを実行してみると

”Daily”では、1日1回の注文しか実行されていない


”H1”では、1日に何回か注文はされているものの、1時間以内に2回以上の注文は実行されていない

となりました。

となると、MetaTrader は Tick の変動タイミングによってプログラムが実行されるため、一番短い周期のローソク足を利用してテストすれば、より精度の高い結果がでるものと思われます。

では、モデルは何のためにあるのでしょう?

モデルには、次の3つの選択肢があります。

Open prices only

これは、期間で指定した周期のローソク足情報のみを使ってテストするタイプで、今までやってきたテストがこれになります。

#ちなみに、MetaTrader では、周期が短いほどテストデータの保有期間が短くなり、テストできる期間が短くなります。

Control points

期間で指定したローソク足より一つ周期の短いローソク足を使ってテストする様子ですが、何のためにこのモデルがあるのかは、ちょっと解りません・・・

Every tick

Tick(1分足?)を利用してテストをするみたいです。つまり、期間でどの周期を選択しても、Tickデータを利用してテストするみたいです。

試しに、テスト期間と周期設定(日足)を同じ状態で3つのモデルを実行してみました。

左から「Open Price Only」「Control Point」「Every Tick」になりますが、確かに、それっぽく注文をしているみたいです。

では、Every Tick でテストするのと、Open Price Only で1分足でテストするのでは、何が違うのでしょうか?

Open Price Only タイプでは、先にも書いたように、MetaTrader が保有しているローソク足の情報のみを使ってテストするため、テストできる期間が保有データに左右されます。 

つまり1分足のデータは大量になるため、あまりデータが保持されておらず、最近のデータでしかテストできません。

Every Tick は、MetaTrader が保有している全てのローソク足情報を駆使して、指定されたテスト期間分の Tick データを擬似的に作成し、そのデータを使ってテストしているみたいです。

#どのようなルールで擬似データを作成しているかは、解りません・・・

そのため、長い期間で精度の高いテストを行うためには、Every Tick タイプでテストすれば良いみたいですが、擬似的なデータですので参考程度に考えていた方がよいのかもしれません。

#どうやら、1分足のデータを追加するやり方もある様子ですので、いつか調べてみます。

2008年9月21日日曜日

レポート機能の見方

注文履歴ならびに利益グラフとも、まあまあの結果でした。

では、レポート機能の情報について確認してみます。

私のレポート結果は次の図になります。

英語のマニュアルを翻訳ソフトを使いながら、それぞれの項目を日本語で表してみると

Bars in test : テストで利用したバー(ローソク足)の数
Ticks modelled : テストで利用した Tick の数
Modelling quality :?
Mismatched charts errors :?
Initial deposit : プログラム開始時の保有資産
Total net profit : 純利益(総利益-総損失)
Gross profit : 総利益
Gross loss : 総損失
Profit factor : 勝率(総利益÷総損失)
Expected payoff : 平均利益
Absolute drawdown : 絶対ドローダウン
Maximal drawdown : 最大ドローダウン
Relative drawdown : 相対ドローダウン
Total trades : トレード回数合計
Short positions : 売りポジション回数(割合)
Long positions : 買いポジショントレード回数(割合)
Profit trades : 利益が出たトレード回数(割合)
Loss trades : 損失が出たトレード回数(割合)
Largest profit trade :1トレード当たり最大利益
Largest loss trade :1トレード当たり最大損失
Average profit trade :1トレード当たり平均利益
Average loss trade :1トレード当たり平均損失
Maximum consecutive wins : 最大連勝回数
Maximum consecutive losses : 最大連敗回数
Maximal consecutive profit : 最大連続利益(回数)
Maximal consecutive loss : 最大連続損失(回数)
Average consecutive wins : 平均連勝回数
Average consecutive losses : 平均連敗回数

となります。

日本語にすることで大体理解できたのですが、次の項目の意味がわかりません・・・

Modelling quality :?
Mismatched charts errors :?

翻訳ソフトではさっぱり分からないので、ネットで調べてみました。

・・・

どうやら、Modelling quality とは、テストで利用した「データの精度の高さ」を表しているみたいです。

私の結果を見ると”n/a”となっていますが、これは判定できないレベルらしく、本来は数字(パーセント)が表示されるようです。

さらに、その下に表示されている「バー」は、MetaTrader がテスト用に保持しているデータの期間を表しており、判定した期間分だけ色(ピンクか緑)がつく様子です。

#グレー部分は判定期間外となります

また、色のつき方にもデータの精度が関わっているらしいです。

私の結果をみると、全てピンク色となっていますが、これは「擬似的に作成されたデータで判定している期間」を表すみたいです。

擬似的に作成された???

これはテストのやり方に関わる事らしいので、テストのやり方と合わせて調べてみたいと思います。

2008年9月17日水曜日

注文しすぎ、その対応結果は

注文しすぎの対処方法は考えました。

では早速、プログラムを修正し、バックテストで確認してみたいと思います。

MetaTrader より”Test1”プログラムを MetaEditor で開きます。

#MetaTrader 画面のナビゲーターウィンドウより Test1 を右クリックし、修正を
#選択すれば”Test1”プログラムを直接 MetaEditor で開くことができます。

下図のように、ini Start() のエリアに前回調べた OrdersTotal() を書きます。

#前回まで残っていた Print("Test1プログラム・・・")の文字表示行は邪魔なので削除しました。

書けたら、コンパイルボタンを押してプログラムにエラーがないことを確認します。

これでプログラムの修正が終わり、実行準備ができました。

では、前回と同じ条件でバックテストで動かしてみます。

テスターウィンドウの結果タグにて注文&決済履歴を見てみると、

①処理1で注文番号1として指値注文
②処理2で注文番号1の指値注文が実行され買いポジション保有
③処理3で注文番号1で保有したポジションを決済
④処理4で注文番号2として指値注文
⑤処理5で注文番号2の指値注文が実行され買いポジション保有
⑥処理6で注文番号2で保有したポジションを決済



見事に「指値注文 -> 買い -> 決済」を一つのポジションで繰り返しています。

ちなみに、自分で作った”Test1”プログラムによって実行されているものは、上記①④などの指値注文のみであり、②③⑤⑥などの「買い」や「決済」は注文に従ってサーバー側で条件が一致した際に勝手に処理されます。

一応、グラフも確認すると、右肩上がりで利益確保できています。

これで、注文しすぎは防げました。

2008年9月15日月曜日

「注文しすぎ」を防ぐ

注文のしすぎを防ぐ手段として、「すでに注文していたら、またはポジションを持っていたら、新しい注文をしない」ということを考えました。

そのため、自分がすでに注文している、並びにポジションを持っているかどうかを調べる必要がありますが、どうすればよいのでしょう・・・

とりあえず Google で”MetaTrader ポジション 調べる”をキーワードに検索してみました。

・・・

どうやら OrdersTotal() を使えば判別できるかもしれません。

OrdersTotal() とは、「保有している注文の数」を返してくれるみたいです。

この「注文の数」には、注文が実行されてまだ決済されていないポジションも含めて数をカウントし、結果を返してくれる様子です。

ですので、「注文をしているかどうか?」と「ポジションを持っているか?」の 2 つを一緒に調べられます。

ただし単に数を返してくれるだけなので、どんな注文があるのか、またはどんなポジションを持っているかは分かりません。

でも私の場合、「一つのポジションを持つのが限界」なので、数さえ分かれば十分です。

では、これをプログラムで具体的にどのように書くかというと

if (OrdersTotal()==0)
{
○○○○○○
}

となります。

これは「もし注文の数が 0 (ゼロ)だったら波括弧({})の間に書いてあるプログラムを実行する」という意味です。

もう少し具体的に説明すると

・if は右側の括弧に書いてあることが正しければ波括弧の間を実行する
・== は左と右が等しいかどうかを表す書き方

となります。

そのため、波括弧の間に前回の OrderSend() を書いてみると

if (OrdersTotal()==0)
{
OrderSend("USDJPY",OP_BUYLIMIT,0.1,109.65,3,0,109.85,NULL,0,0,Green);
}

となり、これで注文のしすぎを防げると思われます。

では、次回、”Test1”プログラムを修正しバックテストを実行してみたいと思います。

2008年9月14日日曜日

注文タイミングをコントロールする

前回のテスト結果を通してレポート機能について調べて書いてみようと思いましたが、レポートの記録(画面ショット)を撮るのを忘れていたので、次の機会にします。

さて、利益は出たといえ恐ろしい注文の仕方をしたプログラムを修正しなければいけません。

まずは、前回の結果から一番大きな問題である「注文しすぎ」について対応したいと思います。

MetaTrader は「プログラムを繰り返し実行することで自動売買を実現している」ために、単に注文するプログラムを書いただけでは、タイミングが来る度に注文してしまいます。

そのため、注文しすぎないようにコントロールする必要があります。

どうすればよいのでしょう・・・

まあ、注文のしすぎという考え方は保有資金やリスクの考え方によって異なるでしょうが、私の場合は「USD/JPY のポジションを 1000 通貨一つ持つ」のが限界です・・・

そのため、「すでにポジションを持っていれば注文しない、または、注文を一つ出したらもう注文しない」というルールを取り入れることで、注文のしすぎを防げると思います。

では、どうやってこれをプログラムにすればよいのでしょうか?

プログラムの流れを図にしてみると、こんな感じです。



次はこの流れをプログラムにするために、「ポジションを持っているかどうか?をどうやって知るか」を調べてみたいと思います。

2008年8月30日土曜日

バックテスト結果の見方

前回、とりあえず買い注文を出すプログラムを作ってバックテストしてみました。

どんな結果になったかを説明すると同時にバックテスト機能の使い方についても見て行きたいと思います。

バックテストを実行すると、テスターウィンドウに「結果」「Graph」「レポート」といったタグが表示されます。

結果タグには、過去のデータを使って注文したり決済したりした結果が時系列で表示されます

表形式で各列にはタイトルもありますので大体わかると思います。

今回のプログラム実行結果を見ながら各列を説明してみると、まず、一番左側の”#”は、処理NOであり、プログラムによって注文されたり、利益確定や損きり処理などされたときの処理番号になります。

次に”時間”の列ですが、これは各行の処理が行われた日時を表しています。今回は”Daily”モードで動かしていますので、注文処理は1日1回のタイミングで処理されています。

次は”取引種別”ですが、ここでは取引の種別を次のように表しています。

buylimit : 指値買い注文
buy : 買い
t/p : 利益確定決済
delete:注文取消し
close at stop:ストップロス?

取引種別には他にもあるみたいですが、プログラムの結果を見てみると、最初は全て BUYLIMIT (指値買い注文)が続いています。

"Test1"プログラムでは注文をする場合の条件を特に付けていないので、プログラム実行タイミング(Tickが変動する度)がくる度に注文してしまっています・・・

次に注文番号欄ですが、こちらはプログラムにより注文処理された際に番号が割り振られていき、その注文に対して処理がなされた場合に、該当する注文 NO が、この注文番号欄に表示されます。

つまり、処理 NO 3880 の行を見てみると、注文番号欄に 1 が表示されていますので、注文 NO 1 の内容に従い、買いポジションを持つ処理が行われたことになります。


あとは、タイトルとおりの内容になります。

Graphタグには、取引期間中の資産履歴がグラフで表示されます。横軸に時間、縦軸に資産という形になりますので、グラフの線が右肩上がりになれば、どんどん資産が増えることを意味します。

ちなみに、青い線と緑の線が表示されていますが、青い線が資産履歴を表しているみたいですが、緑いの線は、何を表しているのでよくわかりません・・・(あとでもうちょっと調べてみます)



今回のプログラムの結果を見てみると、見事に上がり続けてはいますが・・・

レポートは次回に。

2008年8月23日土曜日

注文ルール

注文の書き方は大体分かりました。

では早速、今まで作成してきた”Test1”プログラムを使って、注文するプログラムを作ってみます。

まず、どのような注文ルールにするかを決めたいと思います。

あるメールマガジンサイトで紹介されていた手法を前からやってみたいと思っていましたので、そのルールに沿ったプログラムを作ってみたいと思います。

そのルールとは、「相場が一定のレンジ内で上がったり下がったする時に、買いと売り注文のセットを繰り返す」というものです。

と言葉で書いただけでは?でしょうから、下の図で説明すると


「109.65 円で買って 109.85 円で売る」という注文を繰り返したいのです。

すると赤丸の部分(109.65)で”買い”、青丸の部分(109.85)で”売り”が成立するようになり利益が獲得できるというルールです。

これをプログラムするにはどうすればよいでしょうか?

まずは前回調べた OrderSend() を使って注文を書いてみます。

注文内容としては、次のようになります。

・注文する通貨ペアは"USDJPY"
・注文方法は指値買い
・ロット数(取引数)は 1 万通貨
・指値は 109.65 円
・スリッページは 3 Pips
・損きり価格は無し
・利食い価格は 109.85 円
・コメントは無し
・識別番号は無し
・有効期限は無し
・チャートの色は緑

これを OrderSend() で書いてみると

OrderSend("USDJPY",OP_BUYLIMIT ,0.1,109.65,3,0,109.85,NULL,0,0,Green);

となります。

上記 OrderSend を書く場所は、int Start() の部分になるので、”Test1”プログラムに次のように書きます。

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
// Print("Test1プログラムを実行しています");
OrderSend("USDJPY",OP_BUYLIMIT,0.1,109.65,3,0,109.85,NULL,0,0,Green);
//----
return(0);
}
//+------------------------------------------------------------------+

なお、"Test1プログラムを実行しています"の文字を画面に表示する必要はもうないため、削除するか、左端にスラッシュ("/")を2つ入れてコメント状態にします。

これでコンパイルをすれば、とりあえず注文はできるはずです。

それでは早速注文してみようと思いましたが、デモ用のIDとはいえ、さすがにいきなり取引しては何がおきるか分かりませんので、バックテスト環境でまずは取引してみます。

バックテスト環境での動かし方は以前ご紹介したように、MetaTrader のメニューバーから<表示>-<Strategy Tester>を選択します。

前回と同じように「セッティング」タグにて次の内容を指定してスタートボタンをクリックします。

・Expert Advisor:”Test1, Copyright ・・・”
・通貨ペア :”USDJPY, US Dollar vs Japanese Yen”
・期間 :”Daily”
・モデル :”Open prices only (fastest method to ・・・”

では、実行!!

おっ、注文してるしてる!!って注文しすぎだろ!!

結果の詳細は次回に。

2008年8月16日土曜日

注文の書き方

では、自動売買に必要となるであろうプログラムを試していきたいと思います。

何はともあれ、注文するプログラムを作ってみます。

注文する時のプログラムの書き方が分からなかったので、Google で”MetaEditor と 注文”をキーワードにネットで調べてみると、”OrderSend()”というものを使ってプログラムを書くことが分かりました。

MetaEditor の Navigator ウィンドウの Search タグにて”OrderSend()”を検索してみると Help タグに詳しい説明が表示されます。

ヘルプの中には具体的なプログラムの書き方も紹介されており、次のように記載されています。

いろいろ書いてありますが、とりあえず必要なのは OrderSend(); の行みたいなので、この部分だけカンマごとに分解してみます。

OrderSend(
Symbol(), //通貨ペア
OP_BUY, //注文方法
1, //ロット数(取引数)
Ask, //売買価格
3, //スリッページ
Ask-25*Point, //損きり価格
Ask+25*Point, //利食い価格
"My order #2", //コメント
16384, //識別番号
0, //有効期限
Green //チャート上矢印の色
);

大体見聞きしたことがある言葉ばかりだと思いますが、OrderSend は括弧の中で指定された内容に従い注文をします。

また、注文内容の指定順番は決まっており、カンマで区切って指定する形になります。

それぞれの指定内容について、もう少し詳しく見ていきます。

[通貨ペア]
注文したい通貨ペアを指定します。指定の種類としては次のようになります。

指定内容 : 通貨ペア
----------------------------
"EURUSD" : ユーロ・ドル
"USDJPY" : ドル・円
"EURJPY" : ユーロ・円

そのため、”ドル・円”で取引をしたい場合には、

OrderSend("USDJPY",・・・);

と書きます。

#通貨ペアは文字で指定する必要があるためダブルクォーテーション("")で囲みます。

なお、サンプルに記載されている「Symbol()」は、プログラムを連動させているチャートと同じ通貨ペアを指定する場合の記述方法になるようです。


[注文方法]
注文方法を指定します。指定の種類としては次のようになります。

指定内容 : 注文方法
--------------------------------------------------
0 : 成り行き買い
1 : 成り行き売り
2 : 指値買い
3 : 指値売り
4 : 逆指値買い
5 : 逆指値売り

そのため、「指値買い」で取引したい場合には

OrderSend("USDJPY",2,・・・);

と書きます。

#注文方法は数値で指定する必要があるためダブルクォーテーション("")では囲みません。

また、次のような指定方法もできます。

指定内容 : 注文方法
------------------------------------------------------
OP_BUY : 成り行き買い
OP_SELL : 成り行き売り
OP_BUYLIMIT : 指値買い
OP_SELLLIMIT : 指値売り
OP_BUYSTOP : 逆指値買い
OP_SELLSTOP : 逆指値売り

そのため、次の注文方法の指定は、同じ「指値買い」を意味しています。

OrderSend("USDJPY",OP_BUYLIMIT,・・・);


[ロット数]
売買数量を指定します。1 ロット当たり 10 万通貨となりますので、1 万通貨の場合には、0.1 を次のように指定します。

OrderSend("USDJPY",OP_BUYLIMIT ,0.1,・・・);

#ロットは数値を指定する必要があるためダブルクォーテーション("")では囲みません。


[売買価格]
売買価格を指定します。指定の仕方として売買価格(105.25)を直接指定する場合

OrderSend("USDJPY",OP_BUYLIMIT ,0.1,105.25,・・・);

と書きます。

#売買価格は数値を指定する必要があるためダブルクォーテーション("")では囲みません。

なお、上記は価格を直接記載する方法ですが注文時に計算(情報取得)させる記載方法もあります。

チャート表示されている通貨ペアの注文時レート(売り値)で指定する場合
OrderSend(Symbol(),OP_BUYLIMIT ,0.1,Ask,・・・);

チャート表示されている通貨ペアの注文時レート(買い値)で指定する場合
OrderSend(Symbol(),OP_BUYLIMIT ,0.1,Bid,・・・);

Ask」と「Bid」はプログラムを連動させているチャートの通貨ペアの現在レート価格を取得する書き方のため、一番最初に指定する「通貨ペア」も”Symbol()”を指定することになると思われます。


[スリッページ]
スリッページの許容範囲を指定します。Pips で指定します。

3 Pips (USDJPYならば 0.03円)までを許容する場合には

OrderSend("USDJPY",OP_BUYLIMIT ,0.1,105.25,3,・・・);

と書きます。

#スリッページは数値を指定する必要があるためダブルクォーテーション("")では囲みません。


[損きり価格]
損きり価格を指定します。損きり価格を設定しない場合には 0 (ゼロ)を指定します。

OrderSend("USDJPY",OP_BUYLIMIT ,0.1,105.25,3,0,・・・);

価格(105.00)を直接記載する場合には

OrderSend("USDJPY",OP_BUYLIMIT ,0.1,105.25,3,105.00,・・・);

と書きます。

#損きり価格は数値を指定する必要があるためダブルクォーテーション("")では囲みません。

なお、上記は価格を直接記載する方法ですが注文時に計算(情報取得)させる記載方法もあります。

注文時に計算した結果を損きり価格として指定する場合には

OrderSend(Symbol(),OP_BUYLIMIT ,0.1,Bid,3,Ask-25*Point,・・・);

などと書きます。

これは「注文時レート価格(売値)から 25 ポイント引いた価格を損きり価格とする」を表しています。

”ポイント(Point)” とは、プログラムを連動させているチャートの通貨ペアの最小単位を取得する書き方で、”USD/JPY”の場合には「0.01」になります。

つまり、注文時レート価格(売値)が 105.25 ならば、損きり価格は「105.00」になります。

Ask - 25 * Point
105.25 - 25 * 0.01 = 105.00

#上記計算式の * は掛け算を意味します。


[利食い価格]
利食い価格を指定します。利食いを設定しない場合には 0(ゼロ) を指定します。

指定の仕方は[損きり価格]の場合と同じです。


[コメント]
注文時の履歴情報としてコメントを残す場合に指定します。

#コメントは文字を指定する必要があるためダブルクォーテーション("")で囲みます。

MetaTrader は以前作成した”Test1”プログラムのように、注文時の結果を自動的に画面に表示する仕組みの様子です。 その際に、この「コメント」欄に記載された内容が表示されます。


[識別番号]
注文を識別するための番号を指定します。複数の注文をする場合や、後から注文したものを特定する場合に有効な情報です。不要であれば 0(ゼロ) を指定します。

#識別番号は数値を指定する必要があるためダブルクォーテーション("")では囲みません。


[有効期限]
注文の有効期限を指定します。指値注文と逆指値注文の時のみ有効であり、期限を設けない場合には 0 (ゼロ)を指定します。

有効期限を指定する場合には、Navigator ウィンドウの Dictionary タグ にて「MQL4 Reference」-「Basics 」-「Data types」-「Datetime constants」を選択し、サンプルとして記載してある各種日時指定方法を参考にします。


[チャート上矢印の色]
チャート上に表示される注文印の色を指定します。MetaTrader では、プログラムが連動しているチャート上に、注文が成立した日時ならびに価格情報を矢印で表現してくれます。

色を指定する場合には、Navigator ウィンドウの Dictionary タグ にて「MQL4 Reference」-「Basics 」-「Data types」-「Color constants」を選択し、サンプルとして記載してある各種色指定方法を参考にします。

なお、Color constants ページ内にある「Web colors set」リンク部分をクリックすると実際の色を見比べながら指定すべき文字を検索できます。



長くなりましたので実際の注文は次回にします。

2008年8月6日水曜日

プログラムの起動と終了

とりあえずプログラムを動かすことを体験できました。

とは言っても、とりあえず動かすことを目的に、画面にメッセージを表示するという実際の売買には余り役に立たないプログラムでしたので、もう少し役に立つプログラムを書いてみたいと思います。

その前に、後で調べようと思っていたことを先に整理しておきます。

まず、”Test1”プログラムを作成した際に、次のような行を書きました。

Print("Test1プログラムを実行しています");

これは、MetaTrader 画面の ターミナルウィンドウ内の Expert タグにメッセージを表示するためのものですが、書いた場所に注目してみます。

//+------------------------------------------------------------------+
// expert start function
//+------------------------------------------------------------------+
int start()
{
//----
Print("Test1プログラムを実行しています");
//----
return(0);
}
//+------------------------------------------------------------------+

int start() って何でしょう?

MetaEditor では、疑問に思った箇所にカーソルを合わせて F1 キーを押すと、ヘルプが表示されます。

#"start"の文字部分にカーソルを合わせ F1 キーを押してみると、

#英語が得意な方は、是非読んでみてください。

私は英語が不得手なので、何となくで理解してしまいましたが、int Start() の後にある中括弧”{ }”の間に書かれたプログラムが、Tick に沿って繰り返し実行される様子です。

また、ヘルプにはその他にも、int init() int deinit() についても記載してあります。

これは、Expert Advisor ウィザードにより作成された”Test1”プログラム内にも、次のようにあらかじめ準備されている内容です。

//+------------------------------------------------------------------+
// expert initialization function
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
// expert deinitialization function
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}

これは、それぞれ、「プログラムが起動するときにだけ実行させたいものを書く場所」と、「プログラムが終了するときにだけ実行させたいものを書く場所」になる様子です。

プログラムが起動や終了する時とは、次のような場合です。

[起 動]
・チャートにプログラムを表示し、Expert Advisors ボタンを有効にした場合

[再起動]
・周期設定(1分足/5分足/15分足・・・)を変更した場合

[終 了]
・チャートよりプログラムを削除した場合
・チャートを閉じた場合

#ちなみに、プログラム実行中に通信が切れた場合どうなるか試してみましたが、
#プログラムの再起動は行われず、ずっと動き続けて( Tick に変化があるのを
#監視して)いる様子です。

実際に起動時と終了時に1回だけ実行されるのか試してみます。

またもや、メッセージを表示するコードを”Test1”プログラムに次のように追加してみます。

#”Test1”プログラムを修正するには、MetaTrader 画面の Navigater ウィンドウより”Test1”を右クリックし、「修正」を選択すると MetaEditor が起動します。

//+------------------------------------------------------------------+
// expert initialization function
//+------------------------------------------------------------------+
int init()
{
//----
Print("Test1プログラムの起動時メッセージです");
//----
return(0);
}
//+------------------------------------------------------------------+
// expert deinitialization function
//+------------------------------------------------------------------+
int deinit()
{
//----
Print("Test1プログラムの終了時メッセージです");
//----
return(0);
}
//+------------------------------------------------------------------+
// expert start function
//+------------------------------------------------------------------+
int start()
{
//----
Print("Test1プログラムを実行しています");
//---- return(0);
}
//+------------------------------------------------------------------+

プログラムをコンパイルして実行形式ファイルを作成し、次の手順でプログラムの実行と終了を行ってみます。

1.MetaTrader を起動
2.新しいチャートを表示
3.チャートにプログラムを表示
4.Expert Advisors ボタンを有効にする(プログラム起動)
5.チャートよりプログラム削除(プログラム終了)

本当でした。少しすっきりしました。

2008年7月30日水曜日

プログラムは Tick をきっかけに動いている

MetaTrader はプログラムを繰り返し実行することで自動売買の仕組みを実現していることはわかりましたが、繰り返すタイミングがどうやら定期的ではない様子です。

いったい何をきっかけに動作させているのでしょうか?

ちょっと、”Test1”プログラムが表示するメッセージを眺めてみます。

やっぱり、一定時間ごとには表示されません。

チャートにプログラムを連携させて動かしている様子ですので、何かチャートに関係することだと思うのですが、試しに周期設定(1分/5分/15分・・・)を切り替えてみました。

すると、プログラムは再起動しましたがプログラム実行タイミングが大きく変化する様子ではありません。

ちなみに、プログラムが再起動しているかどうかは、ターミナルウィンドウの Experts タグのメッセージ欄に

deinitialized
uninit reason 3
initialized

が表示されていることで分かります。

#それぞれの行について、詳しくはプログラムを作成する時に改めて調べてみます。

何がきっかけで動いているのかさっぱり分からないので、ネットで調べてみました。

すると、「Tick に沿って動作する」との記事を見つけたので、MetaTrader のヘルプで tick を検索してみると、それらしき説明が記載してありました。

#英語は得意ではないので、違ったらごめんなさい。

試しに気配値表示ウィンドウの「ティックチャート」タグを選択し、眺めていると、tick チャートが変動するたびに、”Test1”のメッセージも表示されているように見えました。

ここまでで、プログラムは「チャートに連動した環境で Tick をきっかけに繰り返し実行される」ことがわかりました。

よし次は、エントリーするプログラムを作ってみようかな。

2008年7月23日水曜日

プログラムとチャートの関係

無事、ライブでプログラムを動かすことができました。

MetaEditor は、作成したプログラムをチャート画面に連動させて動かす仕組みの様子。

プログラムとチャート画面の関係について、いろいろ試してみます。

まずは、ひとつのチャート上で2つのプログラムが同時に動くのか試してみました。

”Test1”と似たようなプログラム”Test2”を作成し、同じチャート画面で動かす設定(「チャートに表示を選択」)をしてみたところ、

”Test1”が”Test2”のプログラムに変わってしまいました。

どうやら1チャート上で動かせるプログラムは1つみたいです。

次に、複数のチャート上で2つのプログラムが同時に動くのか試してみました。

別なチャート(EUR/USD)を表示し、画面上に2つ以上のチャートを表示した状態で、それぞれのチャート上でプログラムを動かす設定をしてみたところ、

2つのプログラムが同時に動きました。

どうやら、複数のプログラムを同時に動かせるみたいです。

さらに、同じプログラムが別々のチャートで同時に動くかどうか試してみました。

”Test1”プログラムを2つ以上のチャートで動かす設定をしたところ、

バッチリ動きました。

あと、チャート画面を切り替えてみましたが、プログラムは動き続けている様子です。

最後に、チャート画面を閉じてみると、

プログラムはとまりました。

と、チャートごとにプログラムを動かせることが確認できましたが、気になることが一つ。

同じプログラム内で表示されるメッセージの表示タイミングが一定間隔ではありません

何を基準にプログラムが繰り返し実行されているのでしょう?

次はプログラムが動くタイミングについて試してみます。

2008年7月21日月曜日

ライブでプログラムを動かしてみます

いよいよリアルタイム(ライブ)な自動売買の開始です。

とは言っても、メッセージを表示するだけですから損も得もしませんので気楽ですが。

まずは、プログラムを動かす準備が必要です。

MetaTrader を起動し、ナビゲーターウィンドウを見てみると、「Expert Advisors」のフォルダ?のところに”Test1”が表示されています。

ネットで MetaTrader について色々調べているときに、よく”EA”という言葉が出てきていたのですが、どうやら「自動売買用のプログラム?」のことを”Expert Advisor”略して”EA”と呼んでいる様子です。

#そう言えば、MetaEditor で”Test1”プログラムを「ウィザード機能」を利用して作成するとき、”Expert Advisor”を選択したことを思い出しました。

ナビゲータウィンドウの Expert Advisors にて”Test1”を右クリックすると「チャートに表示」と書かれた選択肢が表示されます。

#ここから MetaEditor を起動してプログラムの修正/削除/追加もできるみたいです。

この「チャートに表示」を選択すると、”Test1”というタイトルで下図のようなプロパティ画面が表示されます。

このプロパティ画面の「Live Trading」(上図赤枠)の部分の「Allow live trading」にチェックをつけて OK ボタンをクリックします。

#他にも項目はありますが、とりあえずそのままで。

すると、チャートの右上部分に「Test1 ×」の文字が表示されます。

どうやら、これで準備は完了みたいです。

あとは、画面上部にある「Expert Advisors」ボタンをクリックすると、チャートの右上部分の「Test1 ×」の×部分がニコチャンマーク?に変りプログラムが動作している状態になりました。


実際に動いているかどうか確認してみます。

画面下のターミナルウィンドウに「Experts」タグが現れ、プログラムした”Test1プログラムを実行しています”の文字がバックテストと同じように次々と表示されました。

プログラムを止めるには、画面上部にある「Expert Advisors」ボタンをクリックすると、チャートの右上部分が再び「Test1 ×」になりプログラムがとまりました。

とりあえず、これで、プログラムを動かすことはできました。

#ひと満足です。

MetaEditor は、作成したプログラムをチャート画面に連動させて動かす仕組みの様子ですので、次は、もう少しチャートとの関係性について調べてみようと思います。

参考になりました? よろしければご協力ください。

にほんブログ村 為替ブログへ 人気ブログランキング【ブログの殿堂】