■超直感!MT4プログラミング講座■ 第38回 ブレイクアウトシステムのEA作成

スポンサーリンク

おはようございます。キリンです。
脱サラしたことがついに親に発覚し、昨日電話かかってくると思ったらきませんでした。
親は話したいこといっぱいあるんだろうけど、こっちにはないから困るんですよね。
しっかり話し聞くよう心がけます。


第38回 ブレイクアウトシステムのEA作成(3)

■ブレイクの判断の方法
■実際のプログラム

■ブレイクの判断の方法

前回は、実際に直近までの安値・高値をLowやHighを用いて導出し、
それが現在の終値に対してブレイクしているか?ということを判断しました。
ですが、iLowest()やiHighest関数の特徴を使えば別に価格の比較をする必要がないんですね。
iLowest関数を次のように引数を割り当てたとしましょう。
lowestBar = iLowest(NULL, 0, MODE_LOW, LongSpan ,0)
前回との違いは最後の引数を1から0にしたということですね。
すると、最新のローソク足が最安値を記録したときに、この関数の戻り値が0になります。
ということで、安値のブレイクを「iLowestが0になったとき」という風に考えてもいいわけです。
・・・ですが、この方法ではあまり融通を利かすことができません。
例えば、「安値を5pips以上更新したとき」という判断をしたい場合などは、
iLowest関数の戻り値0になるだけでは判断できないですよね。
僕の場合は最新のローソク足をiLowest()関数の中に含めずに、
Low[]安値を算出し、現在の値と比較するほうが好きです。
■実際のプログラム
こんな感じに作ってみました。
※豊嶋先生の本から、ライブラリーをお借りしています。
[ 参考文献 ]
FXメタトレーダー実践プログラミング (現代の錬金術師シリーズ)/豊嶋久道

¥2,940Amazon.co.jp
BreakOutSystem.mq4
中身は前回の講座を見ていただければと思います。
ただ、サブルーチンの説明が必要だと思うので、簡単に説明させていただきます。
詳しくは豊嶋先生の著書をご覧ください。
▼bool MyOrderSend(int type, double lots, double price, int slippage, double sl, double tp, string comment, int magic);
注文をします。基本的にはOrderSendと変わりませんが、
エラー処理が含まれていて便利です。
▼double MyCurrentOrders(int type, int magic);
ポジションがあるかを確認します。
▼bool MyOrderClose(int slippage, int magic);
指定マジックナンバーのポジションを決済します。
プログラムの中身を見て分からない点などありましたら、
お声をおかけいただければと思います。
今日もお読みいただきまして、ありがとうございます!

コメント

  1. ごんた より:

    SECRET: 0
    PASS:
    親御さんには、内緒でしたか心配…
    と言うより若いし技術があるのだから頑張って欲しいです(^-^)b
    良い、インジケータやEAを開発すれば必ず社会の役に立ちます!!
    私も、早くFXの技術を磨き、早期退社したものの、まだ仕事が見つかってない同僚に教えてあげたいです!!
    その為にも良いインジケータを期待してます
    同じ本買いましたがちんぷんかんぷんでした(>へ<)

  2. junky より:

    SECRET: 0
    PASS:
    実践編を買わないといけないんですね(笑)
    宝の持ち腐れにならなければいいのですが・・・

  3. SECRET: 0
    PASS:
    >ごんたさん
    コメントありがとうございます!
    実績で示すしかないと思っているので、
    親には説明をやめてしまいました。
    (散々説明してきたんですけどね^^;)
    同じ本に至るまでの下地を着けるための超直感プログラミング講座だったつもりです。
    講座を一通り見ていただければ、
    理解も早くなると思いますよ!
    分からないところがあればお気軽にご質問いただければと^^

  4. SECRET: 0
    PASS:
    >junkyさん
    実践編にのっている内容を載せると、
    豊嶋さんに悪いのでその当たりの説明ができないんですよね^^;
    今までの講座をお読みいただいていれば、
    間違いなく理解できると思います!
    ぜひぜひチャレンジしてみていただければと^^
    コメントありがとうございます!

  5. junky より:

    SECRET: 0
    PASS:
    3ヶ月も経過しちゃいましたが、やっと実践編を入手しました(笑)
    このプログラムを改良して、自分の思うようなモノを作りたいと思います。
    が、言語の理解が進んでおらず、色々とアドバイスをお願いしたいのですが・・・

  6. SECRET: 0
    PASS:
    >junkyさん
    お久しぶりです^^
    おお。実践編を購入されたのですね!
    どんなアドバイスがいりますか?

  7. junky より:

    SECRET: 0
    PASS:
    このEAを叩き台にしてですが・・・
    先ずは、N日の高値・安値を取得するのはこのままでOKですよね。
    で、高値・安値を5pips越えたら逆指値でエントリー、10pipsで利確又は損切り。
    非常にシンプルに出来そうなんですが・・・
    よろしくご指導願いますm(__)m

  8. SECRET: 0
    PASS:
    >junkyさん
    内容が簡単ですので、一度チャレンジしてみてはいかがでしょうか。
    多分、中身を理解できれば10分かからない改造です・・・。
    それで分からなければ質問していただければと^^

  9. junky より:

    SECRET: 0
    PASS:
    コレを最初に追加。
    extern int SLpips = 10; //ストップロスの幅pips
    extern int RKpips = 10; //利益確定の幅pips
    extern int ORpips = 5; //エントリーの幅pips
    で、発注部分を
    if(Close[0] – ORpips*Point <= longLowestPrice && s.pos == 0){
    MyOrderSend(OP_SELL, Lots, Bid, Slippage, Bid + SLpips * Point, Bid – RKpips * Point, COMMENT, MAGIC);
    }
    if(Close[0] + ORpips*Point >= longHighestPrice && b.pos == 0){
    MyOrderSend(OP_BUY, Lots, Ask, Slippage, Ask – SLpips * Point, Ask + RKpips * Point, COMMENT, MAGIC);
    }
    逆指値にしようと思ったんですが、そのまま成行で。
    これでコンパイルしたところエラーはなく、早速テストしてみたんですが、約定が一つもナシで・・・
    どうしたものでしょうか?

  10. junky より:

    SECRET: 0
    PASS:
    上のは、実践編を見て失敗だとわかりました(笑)
    メンドウになったので、
    #include <MyLib.mqh>
    を使いました。
    で、これを追加。
    extern int SLpips = 100; // 損切り値幅(pips)
    extern int TPpips = 200; // 利食い値幅(pips)
    extern int ORpips = 5; // ブレイク後に何pips上下でエントリーするか
    スタート関数の改造。
    if(Close[0] – ORpips*Point <= longLowestPrice && s.pos == 0){
    MyOrderSendSL(OP_SELL, Lots, Bid, Slippage, SLpips, TPpips, COMMENT, MAGIC);
    }
    if(Close[0] + ORpips*Point >= longHighestPrice && b.pos == 0){
    MyOrderSendSL(OP_BUY, Lots, Ask, Slippage, SLpips, TPpips, COMMENT, MAGIC);
    }
    最後にキモのコレを。
    // オーダー送信関数(損切り・利食いを値幅で指定)
    bool MyOrderSendSL(int type, double lots, double price, int slippage, int slpips, int tppips, string comment, int magic)
    {
    int mult=1;
    if(Digits == 3 || Digits == 5) mult=10;
    slippage *= mult;
    if(type==OP_SELL || type==OP_SELLLIMIT || type==OP_SELLSTOP) mult *= -1;
    double sl=0, tp=0;
    if(slpips > 0) sl = price-slpips*Point*mult;
    if(tppips > 0) tp = price+tppips*Point*mult;
    return(MyOrderSend(type, lots, price, slippage, sl, tp, comment, magic));
    }
    一応、意図するように動いています。

  11. SECRET: 0
    PASS:
    >junkyさん
    MyOrderSendSLいいですよねー。
    それ自体をmqhにほりこんじゃいました^^
    解決できてよかったです
    あの本いいですよねー。

  12. ko-san より:

    はじめまして。
    FXのEAに興味を持ち、超直感!MT4プログラミング講座を進めてきましたが、第38回にある
    BreakOutSystem.mq4が
    404 not foundで確認できません。
    参照できるようにならないでしょうか?
    ずいぶん前のブログなのに申し訳ありません。

    • Kirin pgkireek より:

      確かにリンク切れしてますね・・・。
      原因は分からないですが、残念ながらもうソースも残ってないです orz

タイトルとURLをコピーしました