FXやその他投資についてのつれづれです
× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
こんばんは(*'-')
今までいくつかEAを作ってきましたけど、どれもテクニカル分析の関数 を使ってこなかったので、今回お試しでテクニカル分析を使ったEAを作成してみました EAのロジックはシュワッガーさんの本にのっていたこんなロジックです(・∀・) 1.チャートの価格が移動平均線を上回ったら買い 2.チャートの価格が移動平均線を下回ったら売り 3.移動平均線が買い/売りと同じ方向 これだけです トレンドフォローなロジックらしいですけどねぇ・・・ そんなわけで作成したソースがこちら→ダウンロード(mq4) メイン部分は、時間足が変わったら、各関数を読んでるだけですね ------------------------------------------------------------------------------------ call_Ma(); call_Filter(); call_MM(); call_PositionChk(); call_Trade(); ------------------------------------------------------------------------------------ call_Ma()関数は移動平均の関数を呼び出して、価格と比較しています ------------------------------------------------------------------------------------ dMa = iMA(NULL,0,iMa_Period,iMa_Shift,iMa_Method,iApplied_Price,1); //価格がMAを上回ったら買いフラグを立てる if(dMa <= Close[1]){ bMa_Buy = true; }else{ bMa_Buy = false; } //価格がMAを下回ったら売りフラグを立てる if(dMa >= Close[1]){ bMa_Sell = true; }else{ bMa_Sell = false; } ------------------------------------------------------------------------------------ iMAていうのが、MT4で準備された移動平均を算出する関数です。 パラメータの1つめは通貨、2つ目は時間足ですけど、EAが稼動するチャート と同じものを使う場合はNULLや0で問題なしです(・∀・) b 3つ目からは、実際の移動平均のパラメータになります 最後のパラメータは、何本前の足を使って計算するかを指定しています。 今回は1本前の足ですね そうやって出した移動平均の値と1本前のクローズ価格と比較して売り買いフラグ を立てています call_Filter()関数は移動平均が右肩上がりか下がりかを判定してフラグを立てます ------------------------------------------------------------------------------------ double dMa_1 = iMA(NULL,0,iMa_Period,iMa_Shift,iMa_Method,iApplied_Price,1); double dMa_2 = iMA(NULL,0,iMa_Period,iMa_Shift,iMa_Method,iApplied_Price,2); //Maの値が右肩上がりなら買いフラグを立てる if(dMa_2 < dMa_1){ bFilter_Buy = true; }else{ bFilter_Buy = false; } //Maの値が右肩下がりなら売りフラグを立てる if(dMa_2 > dMa_1){ bFilter_Sell = true; }else{ bFilter_Sell = false; } ------------------------------------------------------------------------------------ 1本前と2本前の移動平均を算出して、大小でフラグを立てております(*'-') MMの関数はいつも出しているからスルーして・・・ call_PositionChk()は、すでに持っているポジションを特定して 買い増しや売り増しをしないようにフラグを立てます ------------------------------------------------------------------------------------ // 持っている注文数を取得 int iTotal = OrdersTotal(); // 注文があればポジションクローズと注文のキャンセルを実施 if(iTotal > 0){ for(int i = iTotal -1; i >= 0; i-- ){ // オーダー特定 bool bSelected = OrderSelect(i, SELECT_BY_POS, MODE_TRADES); // マジックNoを判定して、自分が出したオーダーかチェック if(bSelected == true && OrderMagicNumber() == iMagicNo){ // オーダーの種類を特定 int iType = OrderType(); switch(iType){ // Longポジション case OP_BUY: bPosition_Sell = false; bPosition_Buy = true; break; // Shortポジション case OP_SELL: bPosition_Sell = true; bPosition_Buy = false; break; } } } } ------------------------------------------------------------------------------------ 他の部分からソースコピーして改良しただけだから、コメントがおかしい(;'-') 基本として、同時には1つしかポジションを持たないようにするための配慮です call_Trade()関数は実際の売買部分です 今までの関数で設定されたフラグを判定して売りポジションなりをとっていきます ------------------------------------------------------------------------------------ // 買い注文 if(bMa_Buy == true && bFilter_Buy == true && bPosition_Buy == false){ // まずは既存のエントリをクローズする Ordclose(); // 買い注文 Aki0307_OrderSend(Symbol(), OP_BUY, dEntry_Lots, Ask, iSlip, 0.0, 0.0, "買い注文", iMagicNo, 0, Blue); } // 売り注文 if(bMa_Sell == true && bFilter_Sell == true && bPosition_Sell == false){ // まずは既存のエントリをクローズする Ordclose(); // 買い注文 Aki0307_OrderSend(Symbol(), OP_SELL, dEntry_Lots, Bid, iSlip, 0.0, 0.0, "売り注文", iMagicNo, 0, Blue); } ------------------------------------------------------------------------------------ ああ、今見てみるとやっぱりコメントが・・・・ フラグが立っていて、ポジションを持っていないときにその方向に向かってエントリーします。 どてんなので、注文出す前に既存のポジションを閉じます さてさて、こんなんでできたEAですが、ドル円日足でバックテストしてみましたよ(・∀・) おおお!∑( ̄□ ̄;) 予想外にすばらしい結果に驚きですねヽ( ゚∀゚)/ PR |
カレンダー
カウンター
プロフィール
投資は自己責任・自己判断で実施するようお願いいたします。
ここの情報を見て損失が発生しても責任は負えませんのでご注意してください
HN:
Aki
性別:
男性
最新コメント
[06/06 fxjol]
[02/18 FXに人生を賭ける男]
[01/01 Aki]
[01/01 Aki]
[12/31 FXに人生を賭ける男]
最新記事
ブログ内検索
最新トラックバック
アクセス解析
|