本ブログは、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);

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

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

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

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