売買システムを作る

売買システムを作る


 さあ、いよいよシステム作りです!

今回は、基本練習のため移動平均線で作ってみましょう。

システムトレードで有名な石井正敏氏によれば、結局のところ移動平均線が一番使えるとのことです。

作り方は、

  1. MetaTrader4のMeta Editor ボタンをクリック(→Meta Editor が起動する)
  2. Meta EditorのNew ボタンをクリック
  3. Expert Advisor にチェック →次へボタン
  4. Name: に名前を入れる →完了ボタン
  5. EAのプログラムを書く →Compile ボタン

これで完了です。

1のMeta Editor ボタンはMT4画面のツールバーの中の黄色い四角にビックリマークのボタンです。

2のNew ボタンはMeta Editor画面のツールバーの中の一番左、用紙に緑のプラスマークのボタンです。

3は簡単。

4の名前は、HeikinSample とでもしておきましょうか。

5これが一苦労ですね・・・。コツコツとやってきましょう。
画面には、あらかじめテンプレートが書かれたプログラムがあらわれました。骨組みですね。

EAのプログラムを書く

上から順番に見ていきましょう。

左に // がある行はコメントメモの役割を果たします。これはプログラムを見やすくするためです。
コンピュータはその行の // から右は無視しますので、何を書いてもかまいません。日本語を書きたいときは、Tools→Options→fontで設定することができます。

#property~

は特に気にしなくてもよいです。

int init()
  {
//----
   
//----
   return(0);
  }

これは、プログラムを作動させたときの最初一回だけ読み取られます。初期設定などに使われますが、今のところ特に使わなくても大丈夫です。

つぎの

int deinit()
  {
//----
   
//----
   return(0);
  }

は、終了時に読み取られるプログラムです。これも、特に気にしなくてもよいです。

int start()
  {
//----
   
//----
   return(0);
  }

は、そのチャートに動きがあったときに、読み取られるプログラムです。値動きするたびに毎回です。ここにプログラムを書きましょう。

//----
   
//----

の間にプログラムを書けば、よいわけです。

 まずは、変数の宣言をしなければなりません。
数学の方程式に出てくる x や y といった感じです。 x や y ではわかりにくいので文字をつなげてわかりやすくしましょう。
 たとえば、seisuu という変数を使おうとします。日本人なら、これはたぶん整数がはいるんだろうなぁと思ったりしますが、コンピュータは理解できないので、seisuu には整数が入りますよって教えてあげましょう。

int seisuu;

といった感じです。

型 変数名;

で宣言します。 int は整数の型という意味。最後の ; は文の終わりを意味します。忘れずにつけましょう。

他にも、

  • double は小数
  • bool は true か false のどちらかがはいる2択のようなもの
  • string は文字列

などがあります。

今回は ma という小数が入る変数を作ります。

   //変数の宣言
   double ma;

これで変数の宣言はオッケーです。

次に移動平均の値の計算です。
これは、あらかじめ用意されている iMA という構文をつかって先ほど作った変数 ma に代入するという文を書きます。

   ma = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 1);

ma に 移動平均値を 代入

という意味です。

ma は先ほど作った変数

= は代入するという記号
(数学でつかうイコールは == というように書きます)

iMA(・・・) はカッコ内の条件で移動平均値を算出する便利な言葉(関数)

便利な関数は他にもいろいろあって、iMA を選択してキーボードのF1ボタンを押すと Toolbox の表示がかわり、左の方にいろんな便利な関数がならんでいます。それぞれ、カッコ内の書き方が違うのでそのつど調べるようにしましょう。

カッコ内の(NULL,0,10,0,MODE_SMA,PRICE_CLOSE,1) は、
順番に

(通貨ペア,時間足,計算期間,ずらし幅,平均値の種類,用いる価格,時期)

といった感じです。

通貨ペアには、 "USDJPY" とか "EURGBP" などが入ります。現在のチャートの通貨ペアを計算するには、NULL と入力します。

時間足には、

  • 5分足なら PERIOD_M5
  • 1時間足なら PERIOD_H1
  • 日足なら PERIOD_D1

という具合に入力します。
現在のチャートの時間足を計算するには、0 と入力します。

計算期間には、何本前までの値を計算するのかを入れます。
例えば、日足で 10 なら10日間の移動平均値といった感じです。

ずらし幅は、移動平均線をチャート上に表示させる時のための機能なので、今回は 0 とします。

平均値の種類には、平均値の算出方法を入力します。

  • 単純移動平均なら MODE_SMA
  • 指数平滑移動平均なら MODE_EMA
  • 修正移動平均なら MODE_SMMA
  • 加重移動平均なら MODE_LWMA

という具合です。

用いる価格には、4本値や高値安値の平均値などのうちどれを使うかです。

  • 終値なら PRICE_CLOSE
  • 始値なら PRICE_OPEN
  • 高値なら PRICE_HIGH
  • 安値なら PRICE_LOW
  • 高安平均なら PRICE_MEDIAN

などがあります。

時期には、何本前の移動平均値かを入れます。
現在の移動平均値は 0 と入力します。

なので

   ma = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 1);

は、

ma に このチャートの通貨ペアと時間足をずらさずに単純平均で終値を用いて1本前の値を 代入する

という意味になります。
そして、最後の ; でこの行を終わりにします。

これで、ma にはコンピュータで計算された数値が小数で入っていることになります。

少し長くなってしまったので今回は、このへんで。
次回は、いよいよ注文の命令文を書きます。ではでは。

完全自動売買への道のり

タグ

2007年10月12日|コメント (15)

カテゴリー:完全自動売買

コメント (15)

はじめまして、メタトレーダーで取引はしたことありませんが、今回初めてEAを作ろうと、挑戦しているところです。平均足の直近の足が陽線か陰線か調べる方法として、iCustomを使うと可能との事で検索したところこのブログにたどり着きました。具体的にiCustomでどのようなプログラムをしたら上記の内容を調べて返す式を作れるのでしょうか?よろしかったら教えて欲しいです。よろしくお願いいたします。

投稿者:kk |2009年2月19日 23:11

はじめまして、メタトレーダーで取引はしたことありませんが、今回初めてEAを作ろうと、挑戦しているところです。平均足の直近の足が陽線か陰線か調べる方法として、iCustomを使うと可能との事で検索したところこのブログにたどり着きました。具体的にiCustomでどのようなプログラムをしたら上記の内容を調べて返す式を作れるのでしょうか?よろしかったら教えて欲しいです。よろしくお願いいたします。

投稿者:kk |2009年2月19日 23:12

kkさん

こんにちわ!

平均足の返す数値にはシグナルがありませんが、カスタムインディケータをEAにする方法の記事を参考に、平均足の各インデックスがどうなれば、表示が陽線かなどを調べるとわかります。
具体的なプログラムは来年度開催予定の勉強会の1つに盛り込みたいと思いますので、ぜひご連絡ください^^

投稿者:慶次 |2009年2月20日 15:16

はじめまして、ど初心者のJackyです
基本練習どおりにやりはじめて、最初の1行目でつまづきました


//変数の宣言

のところで日本語の文字を入れようとすると見たことのないような文字が出てきて日本語を書くことができませんが、どこがまちがっているのでしょうか?

初歩的な質問ですみません

投稿者:Jacky |2009年4月 4日 19:02

Jackyさん

こんにちわ!

日本語を書きたいときは、
Tools→Options→fontで
Script:日本語
にします。
fontによっては日本語がないものもありますのでご注意ください。
ちなみに私は、MS ゴシックを使用してます^^

投稿者:慶次 |2009年4月 4日 19:36

おひさしぶりです 先日はサイコロジカルラインのご提示ありがとうございました

今回も、厚かましく、お願いがあるのですが、気が向いたらご返答よろしくです

ひとつのEA内で、パラメータの違いによっての、ふたつのポジションで運用するポートフォリオ化をしたい場合、どのようなプログラムになるのかご指導願えますでしょうか

まことにプログラム素人の不勉強の致すところ恥ずかしいのですけど。

あのランダムエントリーでも利益を出すATRストップで例えていただけるとうれしいのですが。

投稿者:ma |2009年5月 3日 11:10

始めまして、Jakiと申します。
貴殿のブログは大変勉強になっております。
初心者なのでまだまだ勉強しないとだめだと思っています。
お忙しい中、ひとつ教授していただきたい件がありメールしました。
CCI(Commodity Channel Index)を使って、
+100及び-100で買われすぎ・売られすぎを判断するとの事のようですが、
その値を超えたらトレードをしないようにするコードの書き方を
御教授していただきたくメールしました。
また、+100及び-100はパラメーターで変更可能にするようにするにはどうしたらいいのか、
初歩的な質問で申し訳ありません。
何卒、明快なご指導をお願いします。

投稿者:Jaki |2009年11月 4日 18:02

Jakiさん

こんにちわ^^

パラメータにするには、
{}の無いところ、#property・・・の下あたりに、
例えば、
extern double CCI_UpperLimit = 100;
extern double CCI_LowerLimit =-100;
として、

start()関数の{}内に、

int sign;
//シグナル計算でsignに1や-1などのシグナルを代入する
省略

double cci0 = iCCI(NULL,0,14,PRICE_TYPICAL,0);
if(cci0CCI_UpperLimit) sign = 0;

もし、CCI(14)の現在の値が、CCI_LowerLimitより小さい、または、
CCI_UpperLimitより大きい場合、
signに0を代入。

としてあげると、シグナル計算でsignに0以外の数値が代入されていても、
CCIのフィルタ条件に当てはまったときは、signには0が代入されます。

そして、その後に、
sign が 1のとき買い注文を出す等のコードがつづきますね^^


投稿者:慶次 |2009年11月 5日 01:40

始めまして、いつも楽しく拝見させていただいてます。
VQのEAのパラメータをいろいろ変更してバックテストしていた所、驚くほどすばらしく(?)右肩下がりの結果が出るパラメータがありました。
そのまま逆にポジションを取ったら、うまく右肩上がりになるのか実験してみたいのですが、どこをいじればいいのか、皆目検討もつきません。
図々しいお願いで申し訳ありませんが、ご指導いただけないでしょうか。
よろしくお願いします。

投稿者:バンビ |2009年11月10日 00:32

慶次さん こんにちは
いつもEAの勉強の参考にさせていただいてます。
質問させてください。現在62SMA>200SMA>800SMAをトレンド発生とみなして5SMAと25SMAの交差するところで売買するEAを作成中なのですがコンパイルしてもエラーが出ないのでバックテストしてみたらTestGenerator: unmatched data error (low value 113.5300 at 2010.10.15 00:00 is not reached from the least timeframe, low price 114.0910 mismatches)というメッセージが出て動かないので頭をかかえています。あまり難しくないEAだと思うのですが、ご教示願えないでしょうか?

//利食い損切りピプス
extern int TakeProfit = 100;
extern int StopLoss =100;

//ロット数
extern double lots=0.1;
//移動平均の計算期間
extern int FastMAPeriod =5;
extern int SlowMAPeriod =25;
extern int A_SMA=62;
extern int B_SMA=200;
extern int C_SMA=800;
int bar,LastType;

int start()
{

//現在の移動平均線の値
double FastSMA0 = iMA(NULL,0,FastMAPeriod,0,MODE_SMA,PRICE_CLOSE,0);
//1つ前の移動平均線の値
double FastSMA1 = iMA(NULL,0,FastMAPeriod,0,MODE_SMA,PRICE_CLOSE,1);
//
double SlowSMA0 = iMA(NULL,0,SlowMAPeriod,0,MODE_SMA,PRICE_CLOSE,0);
//
double SlowSMA1 = iMA(NULL,0,SlowMAPeriod,0,MODE_SMA,PRICE_CLOSE,1);
//
double A_SMA = iMA(NULL,PERIOD_D1,A_SMA,0,MODE_SMA,PRICE_CLOSE,1);
double B_SMA = iMA(NULL,PERIOD_D1,B_SMA,0,MODE_SMA,PRICE_CLOSE,1);
double C_SMA = iMA(NULL,PERIOD_D1,C_SMA,0,MODE_SMA,PRICE_CLOSE,1);
if(FastSMA0>SlowSMA0 && A_SMA>B_SMA>C_SMA) int sign=1;
if(FastSMA1<SlowSMA1 && A_SMA<B_SMA<C_SMA) sign=-1;

// オーダーチェック(ポジションなどのデータ)
int CurrentPosition=-1;
for(int cnt=0;cnt0)
{
bar=Bars;
LastType=1;
}
}
//売り条件
if(bar!=Bars && LastType!=-1 && sign==-1 )
{
//売りポジションを取る
Ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid+(StopLoss*Point), Bid-(TakeProfit*Point), "test", 123, 0, Red);
if(Ticket>0)
{
bar=Bars;
LastType=-1;
}
}
}
// ポジション有り
else
{
//ポジションの選択
OrderSelect(CurrentPosition,SELECT_BY_POS);
//もし買いポジションで売りシグナルがでたら
if(OrderType()==OP_BUY && sign==-1)
{
//手仕舞い
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Green);
//ドテン売り
Ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid+(StopLoss*Point), Bid-(TakeProfit*Point), "test", 123, 0, Red);
if(Ticket>0)
{
bar=Bars;
LastType=-1;
}
}
//もし売りポジションで買いシグナルがでたら
if(OrderType()==OP_SELL && sign==1)
{
//手仕舞い
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Green);
//ドテン買い
Ticket = OrderSend(Symbol(), OP_BUY,lots, Ask, 3, Ask-(StopLoss*Point), Ask+(TakeProfit*Point), "test", 123, 0, Blue);
if(Ticket>0)
{
bar=Bars;
LastType=1;
}
}
}

return(0);
}

投稿者:saruoyaji |2010年11月10日 13:48

saruoyajiさん

こんにちわ^^

TestGenerator: unmatched data errorは、
テストで使う時間足と稼動させる時間足のデータが違うときに出力されます。
1分足をもとに、各時間足を生成すると出なくなります。

投稿者:慶次 |2010年11月10日 14:08

いつもサンプルを追いかけ勉強させてもらってます。はじめての投稿ですが、「売買システムを作る」のMA(移動平均)のEAですが、スタート実行すると、すぐに買いや売りのポジションを持ってしまいますが、次のシグナルまで待つようにするには、どのようにしたら良いですか?
(強制に手仕舞いしたとき、ストップロスの後)も。ご教授頂ければ幸いです。

投稿者:miura |2010年11月25日 15:42

miuraさん

こんにちわ^^

ma1 = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 1);
ma2 = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 2);

と1つ前のMAと2つ前のMAを取得して、

if(Close[2] <= ma2 && Close[1] > ma1)

というようにする方法などがあります^^

投稿者:慶次 |2010年11月27日 17:33

お世話になります。

iMAの関数は、発見しましたが、iParabolicは、存在してないようです。

どのようにしたらPrabolicのパラメーターが使えるのか、教えて頂ければありがたいです。

投稿者:山崎 康弘 |2016年5月 5日 18:38

山崎さん

こんにちは。
パラボリックは、iSAR()関数を使用します。

投稿者:keiji Author Profile Page|2016年5月 6日 12:45

コメントを投稿する

(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)






画像の中に見える文字を入力してください。

Captchaの認証で入力ミスがありますと、コメントが消えてしまいますのでご注意ください。
コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。