自動売買の記事一覧

横綱FX 運用報告4

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

横綱FXってやつを買いました。


その後の報告です。

$1 030.02運用の結果です。
11月5日
AUDCAD:+15.16
EURJPY:+0.74
USDCHF:+19.41
USDJPY:-11.25
計:+24.06

$1 054.08となりました。

本家と比べると2つポジションが持てていません。
エラーを調べると、
6:トレードサーバと接続できない 「ERR_NO_CONNECTION」
138:再見積り 「ERR_REQUOTE」
の2つが発生していました。

6は、単純につながらなかった。
ログを見ると再接続を結構行っているので、タイミングが良くなかったのかもしれません。

138は、オーダーのタイミングで、移動量が多いときに発生します。
タイミング的には 本家と同じタイミングでエラーが出ているので動きとしては合っています。

メタトレーダーの数に影響があるかわからないので、来週は4つ起動してみます。

一応、今日の取引を載せておきます。

Open Time Type Size Item Price S / L T / P Close Time Price Swap Profit
2010.11.04 22:13 sell 0.19 audcad 1.0195 1.0445 1.0187 2010.11.04 22:32 1.0187 0.00 15.16
2010.11.05 01:32 sell 0.06 eurjpy 114.86 117.88 0.00 2010.11.05 04:37 114.85 0.00 0.74
2010.11.05 01:33 buy 0.31 usdchf 0.9575 0.9323 0.9581 2010.11.05 01:46 0.9581 0.00 19.41
2010.11.05 01:54 sell 0.13 usdjpy 80.79 83.30 80.72 2010.11.05 04:37 80.86 0.00 -11.25

タグ

FXメタトレーダー実践プログラミング

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

お久しぶりです。

年末からやたら忙しい状態がつづいていて、部署が変わったから楽になるかと思ったら、もっとひどくなってしまいました。

そんな訳で、更新もままならない状況です。

楽しみにしている方には、申し訳ないと思います。

出来る範囲で、ゆっくりとやっていきたいので期待せずにまっていてください。

ちょっと前に見つけて、今日買った本について

FXメタトレーダー実践プログラミング」という本です。

FXメタトレーダー実践プログラミング

FXメタトレーダー実践プログラミング

価格:2,940円(税込、送料別)

前作の「FXメタトレーダー入門」の続編に当たるものです。

FXメタトレーダー入門

FXメタトレーダー入門

価格:2,940円(税込、送料別)

FXメタトレーダー実践プログラミングは、結構いいですよ。

前作は、メタトレーダーの使い方とプログラムの触りでしたが、今回のはやりたい事をだいたい実現できるだけの情報が載っています。

目次はこんな感じ。

  • 第1章 メタトレーダーの構成を知る(メタトレーダーを使いこなす前に/メタトレーダーとMQL4プログラミング)
  • 第2章 カスタム指標プログラムで独自のテクニカル分析(カスタム指標プログラムの基本/組み込みテクニカル指標関数の使い方/オブジェクトを利用したカスタム指標/テクニカル指標のデータをファイルに出力)
  • 第3章 トレード関数で柔軟な注文を実現(トレード関数を使いこなす/トレード時のエラーチェック/トレード関数のライブラリー化/エキスパートプログラムによる注文)
  • 第4章 エキスパートプログラムでシステムトレード自由自在(売買システムの基本構成/仕掛けのパターン/手仕舞いのパターン/そのほかのシステムのパターン/ストラテジーテスターでの検証)
  • 第5章 MQL4をさらに使いこなしたい人のために(データの型/プリプロセッサ命令/変数の種類/配列の種類/数学関数/オブジェクトの表示/ファイルの入出力/文字列に関する関数/日時に関する関数/マーケット情報/口座情報/関数のライブラリー化)
  • 付録A MQL4関数一覧
  • 付録B 参考図書

いい感じで知りたい情報が分かります。

多少なり、プログラムの経験があればそれなりのプログラムが組めるようになります。

興味のある方は、本屋で立ち読みしてみてください。

タグ

インジケータからEAを作ってみるときに

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

かなりご無沙汰しています。

仕事が忙しくてなかなか更新できなかったり、プライベートでも子供が生まれたりと、どこにいても忙しい毎日をおくっているため、なかなか更新できないでいます。

ちょっと質問を受けたので、その回答を

 

質問:

インジケータのソースが手に入ったので、それをベースにEAを作ろうと思っていますがどこをどうしていいかわかりません。

 

まあ、こんな感じの質問です。

簡単に回答してしまうとインジケータからEAを作るのは、かなりプログラムがわかっていないと難しいです。

理由は簡単で、足単位で計算しているプログラムを必要な足の情報だけを取得するように変更する必要があるからです。

だいたい、ソースが提供されているインジケータは、サンプルみたいなものでかなり適当に作られていることが多いです。

いい感じに関数化してあり、部品として流用可能ならあまりわからなくてもEA化ができるかもしれませんが、再利用など考えていないことが多いので整理しなおす必要があります。

 

この辺は、経験がものを言うのでチャレンジしてもらうことはものすごくいいことです。

でも、難しいじゃないですか。

 

ということで、なるべく簡単にインジケータのデータをEAで利用するには、「iCustom」を利用してインジケータをそのまま利用してしまうことです。

インジケータの情報を取得する2で説明しているので、そっちの方向でまずがんばってみてください。

タグ

オーダーやオーダー変更時に失敗する場合

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

EAでのトレイルストップがうまくいかない質問を受けたので、たぶんこれかな?ってのを回答しておきます。

わたしも初期はこれで悩んだので。。。

OrderSendOrderModifyを行うとエラーになることがあると思います。

こんなとき何が悪いかちょっと確認してほしいことがあります。

1.注文の方向でAskとBidが間違っていないか。

2.StoplossとTakeprofitの幅

の2点です。

1番は、結構よくやります。

2番は、ストップレベルポイントというのがあって、現在のポイントからいくつか離さないといけないというルールがあります。

だいたい、20pipsぐらいだと思います。

この値は、会社などで違ってきます。

調べる方法は、

MarketInfo(Symbol(),MODE_STOPLEVEL);

を使います。

インジケーターでもEAでもいいので、適当なのを作って以下のソースを書いてみてください。

Comment(”ストップレベル:”,MarketInfo(Symbol(),MODE_STOPLEVEL));

これで、最低離さなければいけない値が表示されます。

もう一つ気をつけなければいけないのは、スリップです。

注文するときにスリップページをいくつにするか指定していますよね。

3pipsを指定していたら、20+3で23離す必要があります。

何でもいいけど、20pipsは大きいですよね。

だから、私がEAを作るときは、LossとTakeは保険(通信障害などの)でかける程度にして、実際のクローズはEAにやらせるようにしています。

これだと、1pipsでも狙えます。

あまり細かいとスリップが大きいとダメですがね。

参考にしてみてください。

タグ

週末にまとめてクローズするEA

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

サンプルプログラムばかりであまり役に立っていないと思うので、ほしい人はほしいもの。

 

週末持ち越しは、いやだけどEAがポジション持ちっぱなしなんだよね!

という人のために、週末に強制的にクローズするEAです。

 

121証券のようにサーバが日本時間であることを前提に話します。

別の時間帯を採用しているFX会社と契約している方は、時間を調整してください。

 

EAを作ってみるを参考にEAを作ってください。

名前は、WeekendCloseとします。

 

パラメータは、ウィザードで設定してもらっても構いませんし、コードに以下のように指定してもらっても構いません。

extern int CloseWeek=6;

extern int CloseTime=5;

CloseWeekの6は、土曜日。

CloseTimeの5は、5時です。

 

曜日は、日曜日が0で、月曜日が1。

順番になっています。

 

まず、曜日と時刻をチェックする関数を追加します。

int ChkCloseTime()

{

    int ChkWeek=DayOfWeek();

    int ChkHour=Hour();

 

    if((ChkWeek==CloseWeek && ChkHour>=CloseTime))

    {

        return(1);

    }

    return(0);

}

 

曜日と時間を取得して、指定した曜日と時間以上なら、1を返します。

 

次に、チケット番号をクローズする関数を追加します。

 

void ClosingTicket(int CloseTicket)

{

    if(OrderSelect(CloseTicket, SELECT_BY_TICKET)==true)

    {

        if(OrderType() == OP_SELL || OrderType() == OP_SELLLIMIT || OrderType() == OP_SELLSTOP)

        {

            // Closing

            if(OrderClose(OrderTicket(),OrderLots(),Ask,3,Green) == false)

            {

                OrderDelete(OrderTicket());

            }

        }

        else

        {

            // Closing

            if(OrderClose(OrderTicket(),OrderLots(),Bid,3,Green) == false)

            {

                OrderDelete(OrderTicket());

            }

        }

    }

}

 

指定された、チケットのオーダーをコントロールできるようにしてからクローズします。

クローズに失敗したときは、未確定の注文として注文の取り消しを行っています。

 

次に、実装部分を作ります。

 

int start()

  {

    if(ChkCloseTime() == 0) return(0);

 

    int total=OrdersTotal();

    int i;

    for(i=0;i < total;i++){

        if(OrderSelect(i, SELECT_BY_POS)==true)

        {

           ClosingTicket(OrderTicket());

        }

    }

 

   return(0);

  }

 

まず、終了時間かチェックします。

まだなら、そのまま関数を抜けます。

 

終了時間の場合は、現在もっているポジションを調べ、すべてのポジションをクローズしていきます。

 

サンプルを参考に改造して使ってみてください。

 

 

今回のプログラムは、以下からダウンロードできます。

ここから、ダウンロード

 

EA(自動売買)は、

インストールパス\MetaTrader\experts

に入れてください。

タグ

フォワードテストをしてみる

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

前回、前々回とバックテストをやってみました。

では、今回はフォワードテストです。

 

バックテストは、過去の履歴データを元にテストを行いました。

フォワードテストは、未来です。

 

未来は、わからないじゃないか!!

って、いう人もいると思いますがその通りです。

 

分からないので、実際に走らせてみるのがフォワードテストです。

でも、テストというだけあって、実弾口座では行いません。

 

デモ口座でのテストということになります。

 

簡単に言うと、デモ口座でEAを走らせることをフォワードテストといいます。

 

なぜ、こんなことをやるかというと、

過去のデータは、ある程度は信用おけますが、通信の問題やPCの負荷など色々問題がありそうな気がしませんか?

それに、ちゃんと思ったように動くかやってみないと分かりませんよね。

 

ということで、実際のEAの動きのチェック。

パラメータ調整は、大丈夫だったか。

といったことを確かめることがフォワードテストの意味するところです。

 

資金に余裕がある人で、自分の作ったEAに自信があれば、このフェーズは飛ばしてもかまいませんが、

少なくても2週間ぐらいはやった方がいいでしょう。

 

このフェーズで、もしダメでもデモですから懐は痛みません。

納得がいくまで、バックテスト、フォワードテストを繰り返してください。

 

ここで焦るとしっぺ返しが大きいので。。。

 

ということで、バックテスト、フォワードテストはしっかりと!

という話でした。

タグ

バックテストをしてみる2

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

前回、EAを作ってみるでつくったEA(自動売買)、MA_EAをバックテストしてみました。

結果は、あまりよくありませんでしたね。

 

でも、EAを作ったときにパラメータをいくつか外出しにしたと思います。

覚えていますか?

 

もしかしたら、このパラメータをいじるといい感じの結果が出そうな予感がしませんか?

思わなくてもしたことにしてください。

話が進まないので。。。

 

で、パラメータのパターンをテストしていけばいいだけです。

たとえば、1つのパラメータで5パターンするとします。

 

1つで5パターン。

  楽勝!!

2つで25パターン。

  ちょっといやになってきますね。

3つで、125パターン。

  やる気でないですね。

4つで、625パターン。

  もう無理です。

 

やっぱり無理でした。。。

っていうことになりそうですが、メタトレーダーには、便利な機能があります。

 

スタート、ステップ、ストップの値をパターン分析したいパラメータにセットすると、すべての組み合わせを行ってくれる機能があるんです。

テスターに「Optimization」というチェックがあったのに気がつきませんでしたか?

このチェックが、パターン分析を行うチェックなんです。

 

では、チェックを入れてスタート!

と行く前に、

先ほどの説明のスタート、ステップ、ストップを設定して、どのパラメータを変更して解析させるかを指定する必要があります。

 

では、「Expert properties」ボタンを押して、プロパティウィンドウを開いてください。

次に、「パラメータの入力」タブを押してください。

では、設定していきます。

 

BuyLots:変更しません。

LossEntry:変更しません。

残りは、すべてチェックします。

MaPerirod:スタート(7)、ステップ(7)、ストップ(35)

TakeMa:スタート(5)、ステップ(5)、ストップ(25)

LossMa:スタート(5)、ステップ(5)、ストップ(20)

TakeEntry:スタート(25)、ステップ(5)、ストップ(50)

 

では、早速スタートを押してみましょう!

 

以下のタグに利益が出ているものだけ表示されます。

Optimization Results:損益やトレード回数、ドローダウンと利用したパラメータ

Optimization Graph:損益のグラフ

 

すべての解析が終了するまで、待ってください。

 

Optimization Resultsの損益をクリックしたください。

利益の多い順や少ない順にソートされます。

他の項目も同様です。

 

利益の多い順に並べます。

 

では、一番利益の多い行をダブルクリックしてください。

セッティングタブに戻ると思います。

「Optimization」のチェックが外れていることを確認してください。

 

先ほどのダブルクリックで、「Expert properties」のパラメータに選択行のパラメータが自動的にセットされました。

 

では、このパラメータでバックテストをとしてみましょう。

スタートボタンを押してください。

 

今度は、利益が出ましたね。

100pipsぐらいは増えたと思います。

 

サンプル用に適当に作ったEAとしては、まずますですかね。

 

バックテストは、こんな感じで行います。

 

ちなみに、一番利益が上がっているからいいパラメータではありません。

ドローダウンが大きく損失も大きいかもしれません。

 

たまたまその月はよかったと思いますが、未来もよいとは限りません。

また、テストの期間などもどのぐらいがいいのか?というのもEAの特性で変わってくるでしょう。

 

この辺はやってみないと分かりませんね。

 

とりあえず、これというパラメータが決まったあとは、フォワードテストというのを行います。

次回は、フォワードテストについて書きたいと思います。

タグ

バックテストしてみる

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

今回は、バックテストのやり方を説明します。

前回のEAを作ってみるで作ったMA_EAを利用して、バックテストしてみたいと思います。

 

バックテストは、デモ環境でしか行えません。

もしかしたら、本番環境でも行えるかもしれませんが、121証券ではレートの履歴データをデモ環境でしか取得できないためです。

まず、本番環境の人はデモ環境に切り替えてください。

ナビゲーターの口座に、本番とデモ用の口座があるはずです。

デモ口座をダブルクリックして、切り替えてください。

デモ口座がない場合や期限切れの場合は、メニューのファイル-デモ口座の申請で申し込んでください。

 

デモ口座は、有効期限(121証券は2週間)がありますが、何度でも申請できるので期限が切れたら申請しましょう。

121証券の場合

申請するとき、口座タイプを選択できます。

forex-jpyを選択してください。

日本のサーバになるので、実際の口座に近くなります。

121証券の場合、時間が日本時間になっているので、時間による操作を考えるとこちらの口座を選択しておいた方がいいでしょう。

 

では、バックテストに必要な履歴データを取得します。

メニューのツール-History CenterかF2キーを押してください。

 

ヒストリー・センター

ヒストリー・センター

今回のテストは、USDJPYで行おうと思うので、通貨ペアのタブを開き、USDJPYを選択してください。

次にDownloadボタンを押して、出てきたウィンドウはOKを押してください。

履歴のダウンロードが始まります。

ダウンロードには、時間がかかるので気長に待ちましょう。

また、テストするときは最新の情報が必要なので、毎回ダウンロードするようにしてください。

 

ダウンロードが終了したら、閉じるボタンを押してください。

 

次にテスターを開きます。

メニューの表示-Strategy Testerを選択してください。

 

テスター

テスター

 Expert Advisor:MA_EA

通貨ペア:USDJPY

モデル:Every tick

期間:M5

期間を全期間で行うと時間がかかるので、4月にしたいと思います。

「日時と時間を使用」にチェックを入れます。

送信者:2009.04.01

宛先:2009.04.30

を指定します。

これで、5分足の4月1日から30日までの試験を行えます。

 

次に、いくらでテストをするか設定します。

Expert propertiesをクリックしてください。

ma_ea_param

日本円では、テストができないのでUSD、500ドルを指定します。

121証券の最低入金額が5万円なので近いところで500ドルとします。

 

パラメータの入力タブでは、EAのパラメータを設定できますが、今回はそのまま利用します。

では、試験をやってみましょう。

スタートボタンを押してください。

tester2

こんな感じで終了です。

ちなみに、「Visual mode」にチェックを入れてスタートすると描画しながらトレードの様子を見ることができます。

描画スピードは、バーを操作することで変更できます。

 

Graphタブを押すと以下のようなグラフになっていると思います。

testergraph

ダメでしたね。

減っています。

 

ちなみに、結果タブではトレードの詳細、レポートタブでは売買レポートが表示されます。

 

こんな感じで、バックテストを実行します。

 

次回は、パラメータを変更しながらバックテストを行い、最適なパラメータを見つける方法を説明します。

タグ

EAを作ってみる2

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

前回のEAを作ってみるで説明不足のところを説明します。

 

まず、スリップについてです。

成行でオーダーするときに、メタトレーダーではAskかBidの金額を指定してオーダーします。

しかし、為替は動いていますので、この金額からずれていることがあります。

ですが、注文をなるべく成功させたいと考えたときに、ズレの許容値を指定することができます。

これが、スリップです。

 

スリップは、オーダーするときもクローズするときも指定可能です。

OrderSend(Symbol(),OP_SELL,BuyLots,Bid,3,Bid+LossEntry*Point,Bid-TakeEntry*Point,”MA_EA Sell”,MagicNo,0,Blue);

OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);

の3がスリップの値になります。

 

ですから、Bidから+-3pipsのズレまで、許可するということになります。

このズレ以上の場合は、オーダーされないことになります。

 

クローズの方が失敗するのがいやな人は、多めを指定した方がいいでしょう。

 

次は、自分でオーダーした注文かどうかを判断する方法です。

前回は、マジックナンバーというのを利用しました。

他にもオーダーしたときにもらえるチケットナンバー、コメントなどをキーに探すことが可能です。

ただし、チケット番号は再起動したときに分からなくなってしまうので、マジックナンバーを利用するのがいいでしょう。

※グローバル変数を使うことで、2週間覚えておく方法もあります。

 

なぜ、このようなことを行うかというと、利用中の口座のオーダーはすべて見ることができてしまうからです。

別の通貨ペアでも、別のEAでも、手動オーダーでもなんでも見ることができます。

ですから、自分のEAが注文したものかどうかを判断する必要があるんです。

 

初めてのEAなので、こうしたことをやならくてもよかったのですが、今後EAを作る場合、こうした仕組みで作ることになると思い、初めからちゃんとした機能を持たせました。

そのため、少し難しくなっています。

 

ちなみに、すべて見えることの応用ですが、たとえば週末にすべてのオーダーをクローズするEAなんていうのも作ることができます。

週末の持ち越しはしたくない!って方で、販売されているEAを利用している方は、こうしたEAを作れると便利かもしれませんね。

タグ

EAを作ってみる

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

今回は、EA(自動売買)のプログラムを作ってみたいと思います。 今回は、単純移動平均のラインをブレイクしたときに順張りするEAを作成します。  

単純移動平均をブレイクしたときに、成行でオーダーし、テイク(利益確定)ポイントとロスカットポイントを指定します。

これは、通信できなかったときの保険で、実際の利益確定やロスカットはEAが値を確認して行います。  

 

注意事項ですが、ここで作成したプログラムを実運用で利用してもかまいませんが、利益を保証するものではありません。

ご自分の判断で、利用してください。

損害等は、一切保証しません。

 

では、プログラムの作成を行いましょう。  

MetaEditorを開き、Expert Advisor Wizardを開きます。  

Expert Advisor作成

Expert Advisor作成

Expert Advisorを選択し、次へを押します。

 

EAの名前を決める

EAの名前を決める

NAMEに「MA_EA」と入力します。

パラメータを指定できますが、今回はコード上で指定しますので、そのまま完了を押してください。

スケルトンが作成されます。

 

前半の設定を行います。

 

//オーダーするときのロット数をパラメータとして指定します。

//0.1ロットが1万通貨となります。

extern double BuyLots=0.1;

//単純移動平均のサンプリングする足の数をパラメータとして指定します。

extern int MAPeriod=21;

//EAが利益確定するポイント数をパラメータとして指定します。

extern int TakeMA=20;

//EAがロスカットするポイント数をパラメータとして指定します。

extern int LossMA=10;

//オーダー時に保険として設定する利益確定ポイントを指定します。

extern int TakeEntry=25;

//オーダー時に保険として設定するロスカットポイントを指定します。

extern int LossEntry=25;

 

//オーダー番号を格納する変数を設定します。

int ticket=0;

//このEAのオーダーを判断するための番号を設定します。

int MagicNo=1;

 

今回は、初期処理と終了処理ではなにも行いません。

実行処理を指定します。

 

int start()

  {

//ポジションを持っているか判断するフラグを設定します。

//0がポジションなし、1がポジションを持っていることにします。

    int KeepPosition=0;

//現在持っているオーダー数を取得します。

    int total=OrdersTotal();

    int i;

//現在持っているオーダーの中からこのEAがポジションを持ったオーダーを探します。

    for(i=0;i < total;i++){

//オーダーを選択します。

        if(OrderSelect(i, SELECT_BY_POS)==true)

        {

//オーダーの通貨ペアが同じで、このEAが指定したマジックNoが同じものを探します。

            if(Symbol() == OrderSymbol() && OrderMagicNumber() == MagicNo)

            {

//このEAがオーダーしたものが見つかったときはオーダーを持っていることにします。

                KeepPosition = 1;

//チケット番号をセットします。

                ticket=OrderTicket();

//ループを抜けます。

                break;

            }

        }

    }

 

//現在から過去の単純移動平均を5本分取得します。

    double Ma0=iMA(NULL,0,MAPeriod,0,MODE_SMA,PRICE_CLOSE,0);

    double Ma1=iMA(NULL,0,MAPeriod,0,MODE_SMA,PRICE_CLOSE,1);

    double Ma2=iMA(NULL,0,MAPeriod,0,MODE_SMA,PRICE_CLOSE,2);

    double Ma3=iMA(NULL,0,MAPeriod,0,MODE_SMA,PRICE_CLOSE,3);

    double Ma4=iMA(NULL,0,MAPeriod,0,MODE_SMA,PRICE_CLOSE,4);

 

//ポジションを持っている場合、クローズするか確認します。

    if(KeepPosition == 1)

    {

//オーダーから何本足を描画したかを求めます。

//オーダーから最小値、最大値を求めるために利用します。

        int ChkAshi = (OrderOpenTime()-TimeCurrent())/(Period()*60);

//売りポジションの場合

        if(OrderType() == OP_SELL)

        {

//オーダーしてから、TakeMAの2倍の値を出して、TakeMAまで戻ってきたときにクローズします。

//利益確定は、戻ってきたときとオーダー時に設定したポイントの2つが利益確定ポイントです。

            if(OrderOpenPrice()-TakeMA*Point >= Ask && OrderOpenPrice()-TakeMA*2*Point >= Low[iLowest(NULL,0,MODE_LOW,0,ChkAshi)])

            {

                OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);

            }

//LossMAで指定したポイントを割ってしまったときにロスカットします。

            if(OrderOpenPrice()+LossMA*Point <= Ask)

            {

                OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);

            }

        }

//買いポジションの場合

//売りポジションと同じことを行います。

//符号の向きが逆なのとAskではなくBidを利用しているところが違います。

        else if(OrderType() == OP_BUY)

        {

            if(OrderOpenPrice()+TakeMA*Point <= Bid && OrderOpenPrice()+TakeMA*2*Point <= High[iHighest(NULL,0,MODE_HIGH,0,ChkAshi)])

            {

                OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);

            }

            if(OrderOpenPrice()-LossMA*Point >= Bid)

            {

                OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);

            }

        }

    }

 

//ポジションを持っていない場合、ポジションを持つかどうか確認します。

    else if(KeepPosition == 0)

    {

//下降トレンドの場合

        if(Ma4 > Ma3 && Ma3 > Ma2 && Ma2 > Ma1 && Ma1 > Ma0)

        {

//Ma4、Ma3、Ma2のクローズが大きくて、Ma1と現在値(Bid)が小さい場合売りポジションを持ちます。

            if(Ma4 < Close[4] && Ma3 < Close[3] && Ma2 < Close[2] && Ma1 > Close[1] && Ma0 > Bid)

            {

                ticket=OrderSend(Symbol(),OP_SELL,BuyLots,Bid,3,Bid+LossEntry*Point,Bid-TakeEntry*Point,”MA_EA Sell”,MagicNo,0,Blue);

                if(ticket==0) Print(”Error opening SellChk order : “,GetLastError());

            }

        }

//上昇トレンドの場合

        else if(Ma4 < Ma3 && Ma3 < Ma2 && Ma2 < Ma1 && Ma1 < Ma0)

        {

//Ma4、Ma3、Ma2のクローズが小さくて、Ma1と現在値(Bid)が小さい場合買いポジションを持ちます。

            if(Ma4 > Close[4] && Ma3 > Close[3] && Ma2 > Close[2] && Ma1 < Close[1] && Ma0 < Ask)

            {

                ticket=OrderSend(Symbol(),OP_BUY,BuyLots,Ask,3,Ask-LossEntry*Point,Ask+TakeEntry*Point,”MA_EA Buy”,MagicNo,0,Red);

                if(ticket==0) Print(”Error opening BuyChk order : “,GetLastError());

            }

        } 

    }

 

   return(0);

  }

 

OrderSelectで、選択しているオーダーはOrder???関数で値を取得することができます。

Low[iLowest(NULL,0,MODE_LOW,0,ChkAshi)、High[iHighest(NULL,0,MODE_HIGH,0,ChkAshi)]は、オーダーしてからの最安値、最高値を求めています。

OrderSendは売買注文を行う関数で、成行、IFD、OCOなどのオーダーを組み合わせて注文することができます。

今回の例では、成行+OCO注文を行っています。

また、ticketが0の場合は注文失敗で、GetLastErrorを利用してエラー番号を取得しています。

Printは、操作履歴に結果を出力する関数です。

操作を残したいときに利用すると便利です。

次は、バックテストのやり方を説明したいと思います。

 

 

今回のプログラムは、以下からダウンロードできます。

ここから、ダウンロード

 

EA(自動売買)は、

インストールパス\MetaTrader\experts

に入れてください。

 

タグ