FX自動売買「Dr.EAのブログ」

最新情報

FXDDの8%入金ボーナスでEAプレゼント

FXDDの8%入金ボーナス
に新規口座開設で参加された方で、

お問い合わせフォーム
に、お名前・メールアドレスをご記入の上
参加口座のアカウントIDと特典EA希望とご記入頂いた方全員に
EAプレゼントいたします!!

EAは、レンジ相場に有効なあの手法です^^

是非、ご参加ください^^

でわ、このへんで^^

和訳MQL言語リファレンス(日本語翻訳)(その2)

今回は前回和訳MQL言語リファレンス(日本語翻訳)で紹介したファイルの改良版です^^

→metaeditor2.zipをダウンロード

前回の記事で

語句をマークして、F1でリファレンスを見ているのですが
今回は、それはできないようなので、
これができるように、是非とも改良をお願いします!!

といったコメントを頂きましたので、
語句を選択してF1ボタンを押したら和訳のページを表示するようにしました。

ファイルの保存先等は、前回の記事を参考にしてください^^;

でわ、このへんで^^

和訳MQL言語リファレンスの関連記事

タグ

EAの休止時間をcsvファイルで指定する方法

今回のテーマは、csvファイル等で指定した時間の前後は
取引をしないようにする方法です。

サンプルファイルはこちら→Sample_NoTradeTime.zip

2つのmq4ファイルと、2つのcsvファイルがありますが、
2つの対になっていて、それぞれやり方が違っています^^

どのように違うかは、
・・・^^;

また、次の機会に書きますm(_ _;)m

通常稼動で使う場合は、csvファイルをMT4→experts→filesフォルダに保存してください。
バックテストで使う場合は、MT4→tester→filesフォルダに保存してください。

でわ、このへんで^^

タグ

和訳MQL言語リファレンス(日本語翻訳)

今回のテーマは、MetaEditor(メタエディタ)でEAを作成・編集中に参照する
MQL言語リファレンスについてです。

メタエディタでMQLリファレンスを参照するには、

  • NavigatorウィンドウのDictionaryタブで選択
  • ToolboxウィンドウのHelpタブで選択
  • EA内の調べる語句をダブルクリックしてF1ボタン

などがありますが、
英語で説明されていて、よく解らなかったりします^^;

そんな時は、Google検索などで
使い方を調べる旅にでることになります^^;

和訳MQLリファレンスがあったらいいなぁ・・・
と思っていましたが!!

ありました!
メタシス・シーカーのMQL言語リファレンスの日本語翻訳マニュアル
ほとんどの部分が翻訳されています^^

さらに、メタエディタで参照できるようにしたいと思い、
サイトオーナーのMIYAさんに翻訳部分を使わせていただけるようお願いしたところ

サイトお手軽参照システム?についても歓迎です。
ゼロサムゲームの厳しい世界で、矛盾したことを言いますが、
システムトレードで人々に幸せを与えれるお手伝いになるのであれば歓迎です。

と、ありがたいお言葉を頂きました^^

メタエディタで和訳MQL言語リファレンスを参照できるようにする方法

→metaeditor.zipをダウンロード

metaeditor.zipを解凍し、中のmetaeditor.xmlを
MT4フォルダ内のlanguagesフォルダに保存します。(上書きで構いません^^;)

メタエディタを開いていた場合は、再起動させてください。

メタエディタのToolboxのHelpタブで、【和訳リファレンス】という項目をクリックすると
web上の和訳リファレンスを参照できます^^
リファレンスのトップに戻るときは、ToolboxのHomeボタンで戻ってください。

今後、バージョンアップする可能性ありです^^;

でわ、このへんで^^

和訳MQL言語リファレンスの関連記事

タグ

決まった時刻に残高情報をメールするインジケータ

今回は、毎日決まった時刻に残高情報ををメールするといったインディケータです。
また、残高変動がなかったらメールしないという条件も加えます。

サンプルファイルはこちら→Sample_AccountBalanceCheckMail.zip

中身の解説等は、また後日じっくり書きます^^;

この記事を編集するか、改めて記事を書くかは未定ですm(_ _;)m

もし、ファイルの中身を見て疑問に思ったりした場合は、
質問してくださいね^^;

でわ、このへんで^^

タグ

2010年1月29日|コメント (3)トラックバック (0)

カテゴリー:indicators

複数のシグナル・複数のフィルタを搭載し選択できるEA

今回のテーマは、EAの中で複数のシグナル・複数のフィルタを搭載し、
それを使うかどうかパラメータで選択できるようにする方法です。

サンプルファイルはこちら→Sample_SwitchSignal.zip
(↑'10.01.22 午前 一部修正)

Start()関数の中身は上から、

  • シグナル計算2つ
  • フィルタ計算3つ
  • エントリシグナル計算
  • エグジットシグナル計算
  • ポジション確認
  • エグジット処理
  • エントリ処理

という感じです。

シグナルが2種類、フィルタが3種類あり、
それぞれどれを使うか[Use~]というパラメータで選択できるようにしています。

シグナル計算やフィルタ計算はそれぞれ[~sign]や[~filter]といった
個別の変数に計算結果を代入します。

そして、サンプルファイル132行目~140行目を見てください。

   int sign;
   
   if((!UseMaCrossSignal || MaCrossSign==1) &&
      (!UseMacdCrossSignal || MacdSign==1) &&
      (!UseMaTrendFilter || MaFilter==1) &&
      (!UseAdxFilter || AdxFilter) &&
      (!UseAtrFilter || AtrFilter)) sign=1;
      
   if((!UseMaCrossSignal || MaCrossSign==-1) &&
      (!UseMacdCrossSignal || MacdSign==-1) &&
      (!UseMaTrendFilter || MaFilter==-1) &&
      (!UseAdxFilter || AdxFilter) &&
      (!UseAtrFilter || AtrFilter)) sign=-1;

エントリ用のシグナルを代入する整数変数 sign を宣言。
もし、
UseMaCrossSignal が false または、MaCrossSign が1で
UseMacdCrossSignal が false または、MacdSign が1で
UseMaTrendFilter が false または、MaFilter が1で
UseAdxFilter が false または、AdxFilter が true で
UseAtrFilter が false または、AtrFilter が true の場合、
signに1を代入
もし、
UseMaCrossSignal が false ・・・(省略)
・・・の場合、
signに-1を代入

といった感じにします。

これで、選択されたシグナルやフィルタのみを使ったシグナルが
sign に入ります^^

フィルタのシグナル用の変数でtrue/falseのbool型の場合は、
外でif文で書いてもいいですね^^

その下のエグジット用のシグナルの条件では
サンプルではフィルタ用の条件は含めてませんが、
書き方としては、同じ感じですね^^

そのほかで、ちょっと分かりづらいところがありますが^^;
コメントで質問してくださいね^^;

でわ、このへんで^^

タグ

MQL4からMQL5への移植(その2)

前回【MQL4からMQL5への移植(その1)】のつづきです^^

MT4では、BidやBarsといった変数には自動的にその値が入っていましたが、
MT5では、SymbolInfoDouble(_Symbol,SYMBOL_BID)や
Bars(_Symbol,PERIOD_CURRENT)といった感じに関数で呼び出さなくてはなりません。

Close[1]やHigh[0]といった配列にいたっては、
データを入れる配列をつくって、
そのなかにデータをコピーして、
どのデータを知りたいか選択してやっと呼び出せます^^;

そのうえ、MT4のように1本前の足の高値をHigh[1]といったように、
シフトの数で指定するようにする場合は、
ArraySetAsSeries(...)という関数を使って『最新の足を0として数えますよ』と
書いておかないといけません。

例えば、ArraySetAsSeries(Open,true)を書き忘れてしまっていて、
MT4のように、最新の足の始値を取得しようとOpen[0]と書いたら、
最古の始値を取得しちゃいます^^;

慣れるまで大変ですので、頭に

#include <mql4to5_timeseries_array.mqh>

と、start()に替わるOnTick()(EAの場合)の中の最初に

   CopyCurrent();

を、書き込むだけでよいインクルードファイルを作りました^^

今回は、前回よりも書き換え手順が楽ですね^^

ダウンロードはこちらから→mql4to5_timeseries_array.zip

そのサンプルEA→timeseries_sample1.zip

でわでわ^^

MQL4からMQL5への移植の関連記事

タグ

2009年10月24日|コメント (41)トラックバック (0)

カテゴリー:MQL5

MQL4からMQL5への移植(その1)

MT5(MetaTrader5)のメタエディタをいじって気が付いたこと。

EAなどから呼び出す、テクニカルインディケータの関数(iMAなど)の使い方が
大きく違いますね^^;

MT4では、iMA(平均線のパラメータ,何本前の足か)と入力すれば、
知りたい平均線の値が呼び出せましたがMT5では、
iMA(~~)の固有のハンドル(変数)をつくって、
さらに、データを入れる配列をつくって、
そのなかにデータをコピーして、
どのデータを知りたいか選択してやっと呼び出せます^^;

作業が、4~5倍になった感じです。
(使いこなせば、処理のパフォーマンスは上がると思いますが^^;)

多くのEAをMT5に移植する場合、1つ1つのEAを
MQL5の形にするのはとても大変です。

そこで、便利なのがインクルード機能です。

#include <MQL4toMQL5_TechnicalIndicators.mqh>

といった感じにEAの頭の部分に書くと、includeフォルダにある 【MQL4toMQL5_TechnicalIndicators.mqh】を
そのEAの中に書いたことにしてくれます^^

includeフォルダのサブフォルダMQL4toMQL5の中にある場合は、

#include <MQL4toMQL5/mql4to5_timeseries_array.mqh>

です^^ 2009.10.21 内容を修正しました。

mqhファイルの保存場所はとあるMetaTraderの備忘秘録さんが、説明されております^^

今回は、MQL4でiMA(~)と書いていたものを、iMA4(~)と書き換えるだけで、 大丈夫なようにした、mqhファイルを作りました。
サンプルのEA(ただ、値を表示するだけのモノ)もあります。
よかったらダウンロードしてくださいね^^

リファレンスと、MetaEditorの書式が違ったりとまだまだ未完成な部分がたくさんあるようですが、
いまのうちから、移植準備をしておきましょうね^^;

ダウンロードはこちらから→MQL4toMQL5.zip

そのサンプルEA→mt4_tech_sample_ea.zip

2009.10.24 サンプルEA更新

でわでわ^^

タグ

2009年10月21日|コメント (8)トラックバック (0)

カテゴリー:MQL5

MT5bata版をインストール

MT5(MetaTrader5)のベータ版が公開されました!

またワクワクどきどきがやってきました!

残念なことに、MT4のインディケータやEAは使えないのですが、
性能がグンとアップしているようです^^

付属のTetrisというEAを稼動させてみました。

mt5beta.jpg

MQL5の可能性を大いに感じました!

ダウンロードはこちらから→MQL4のフォーラム

でわでわ^^

タグ

VQをEA内で計算する方法

のやり方でいきますと、

extern   bool     Crash = false;
extern   int      TimeFrame = 0;
extern   int      Length = 5;
extern   int      Method = 3;
extern   int      Smoothing = 1;
extern   int      Filter = 5;
extern   int      SignShift = 1;

として、VQからコピペ&SignShiftというパラメータを追加。
そして、Start()関数内で

int sign;
sign = iCustom(NULL, TimeFrame, "VQ", Crash, 0, Length, Method, Smoothing, Filter, 6, SignShift );

とすれば、買い状態の時は、sign が1、売り状態の時は、sign が-1となり、あとは条件をいろいろと加えるだけですね^^

でも、VQ自体にいろいろな機能が付いているため、EA内で計算したほうが稼動がスムーズです。

VQを内部で計算したEAのコード

extern string  Entry_Setting  = "---------- Entry Setting";
extern double  Lots           = 0.1;
extern int     StopLoss       = 50;
extern int     TakeProfit     = 100;
extern int     Slippage       = 3;
extern int     MagicNumber    = 123456;

extern string Indicator_Setting = "---------- Indicator Setting";
extern int     TimeFrame      = 0;
extern int     Length         = 5;
extern int     Method         = 3;
extern int     Smoothing      = 1;
extern int     Filter         = 5;

extern int     EntryShift     = 1;
extern int     ExitShift      = 0;

//記憶用共通変数
int VQsign[2];    //VQのシグナル
int VQsignbar[2]; //VQのシグナルが出た場所(足の番号)
int bar;          //エントリした時の足の数(足の番号)

int init()
  {
//----
   ArrayInitialize(VQsign,0);
   ArrayInitialize(VQsignbar,0);
   bar=0;
//----
   return(0);
  }

int start()
  {
//----
   //VQ sign計算************
   FuncVQ(0);
   FuncVQ(1);
   
   //オーダーに関する部分******
   
   //現在のポジションの情報を取得
   int pos=-1;
   for(int i=OrdersTotal()-1;i>=0;i--)
   {
      OrderSelect(i,SELECT_BY_POS);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) pos=i;
   }
   
   /*
   この時点でポジションなしの場合 pos は -1
   ポジションありの場合 pos は、そのポジションのインデックスの値
   となります。
   */
   
   //ポジション有りの場合
   if(pos>=0)
   {
      //そのポジションを選択し情報を取得できるようにする
      OrderSelect(pos,SELECT_BY_POS);
      
      if((OrderType()==OP_BUY && VQsign[ExitShift]==-1) || (OrderType()==OP_SELL && VQsign[ExitShift]==1))
         OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Yellow);
   }
   
   int ticket=0;   //注文番号を代入する変数
   double sl,tp;   //ストップとリミットを代入する変数
   
   //まだエントリしていない足で ポジションなしの場合
   if(bar!=iBars(NULL,TimeFrame) && pos<0)
   {
      //エントリ条件を計算
      int sign;
      if(VQsignbar[EntryShift]==iBars(NULL,TimeFrame)-EntryShift)
      {
         if(VQsign[EntryShift]==1) sign=1;
         if(VQsign[EntryShift]==-1) sign=-1;
      }
      
      //sign が 1 の場合
      if(sign==1)
      {
         sl=Ask-StopLoss*Point;
         if(StopLoss<=0) sl=0;
         tp=Ask+TakeProfit*Point;
         if(TakeProfit<=0) tp=0;
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,sl,tp,NULL,MagicNumber,0,Blue);
      }
      //sign が -1 の場合
      if(sign==-1)
      {
         sl=Bid+StopLoss*Point;
         if(StopLoss<=0) sl=0;
         tp=Bid-TakeProfit*Point;
         if(TakeProfit<=0) tp=0;
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,sl,tp,NULL,MagicNumber,0,Red);
      }
      //エントリした時の足の数を代入
      if(ticket>0) bar=iBars(NULL,TimeFrame);
   }
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

//VQ keisan
void FuncVQ(int VQshift)
{
   double MH1,ML1,MO1,MC1,MCS1,VQ1,SumVQ1,SumVQ2;
   HideTestIndicators(true);

   if(MathAbs(VQsign[VQshift])!=1)
   {
      for(int j=0;j 0) if (MathAbs(SumVQ1 - SumVQ2) < Filter * Point) SumVQ1 = SumVQ2;

         if(SumVQ1 > SumVQ2)
         {
            if(VQsign[VQshift]==-1) break;
            
            VQsign[VQshift]=1;
            VQsignbar[VQshift]=iBars(NULL,TimeFrame)-VQshift-j;
         }
         if(SumVQ1 < SumVQ2)
         {
            if(VQsign[VQshift]==1) break;
            
            VQsign[VQshift]=-1;
            VQsignbar[VQshift]=iBars(NULL,TimeFrame)-VQshift-j;
         }
      }
   }
   
   MH1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_HIGH,VQshift);
   ML1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_LOW,VQshift);
   MO1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_OPEN,VQshift);
   MC1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_CLOSE,VQshift);
   MCS1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_CLOSE,VQshift + Smoothing);
   
   if(MathMax(MH1 - ML1,MathMax(MH1 - MCS1,MCS1 - ML1))==0 ||(MH1 - ML1)==0) return(0);
   
   VQ1 = MathAbs(((MC1 - MCS1) / MathMax(MH1 - ML1,MathMax(MH1 - MCS1,MCS1 - ML1)) + (MC1 - MO1) / (MH1 - ML1)) * 0.5) * ((MC1 - MCS1 + (MC1 - MO1)) * 0.5);
   SumVQ2 = iClose(NULL,TimeFrame,2);
   SumVQ1 = SumVQ2 + VQ1;
   if (Filter > 0) if (MathAbs(SumVQ1 - SumVQ2) < Filter * Point) SumVQ1 = SumVQ2;

   if(SumVQ1 > SumVQ2 && VQsign[VQshift]==-1)
   {
      VQsign[VQshift]=1;
      VQsignbar[VQshift]=iBars(NULL,TimeFrame)-VQshift;
   }
   if(SumVQ1 < SumVQ2 && VQsign[VQshift]==1)
   {
      VQsign[VQshift]=-1;
      VQsignbar[VQshift]=iBars(NULL,TimeFrame)-VQshift;
   }
   if(VQshift==0 && SumVQ1 == SumVQ2)
   {
      VQsign[0]=VQsign[1];
      VQsignbar[0]=VQsignbar[1];
   }
   HideTestIndicators(false);
}

今回は詳しい説明は、省略です^^;

ソースファイルもアップしますので、いろいろと改良してみてくださいね!

→VQsimple.mq4ダウンロード

でわ、今回はこのへんでm(..)m

VQの関連記事

カスタムインジケータをEAにする方法の関連記事

タグ

取引を有利にする方法 = CashBackForexのキャッシュバック

次のバックテストレポートを見てください。

Sample_break_rのバックテストレポート

トレードルール検証中によくある右肩下がりの失敗EAです^^;

すべて1ロット(10万通貨)で取引して、5ヶ月ちょっとで約-2582ドル。
動かせば動かすだけ資産が減っていきます。

ここで少し、コストを計算してみましょう。
通貨ペアは、ドル円(USDJPY)スプレッド2ピプスとします。
1ピプスあたりのコストが1000円(現在のレートで約10.7ドル)ですので、
1トレードあたり、21.4ドルのコストがかかります。
取引総数が、853回ですので、21.4ドル×853回で、

コスト総額:18254.2ドル

スプレッドがなければ、資産は約2.5倍に膨らんでました。

キャッシュバックでコスト削減

cbf_letters_logo11.gif

今度は、無料登録でキャッシュバックが受けられるCashBackForexに登録していた場合の計算をしてみましょう。

取引ブローカーによって、還元率が違いますが、
FXCM(1トレードあたり、0.7ピプス)の場合、
1トレードあたり、10.7ドル×0.7ピプス=7.49ドルのキャッシュバック。
取引総数が、853回ですので、7.49ドル×853回で、

キャッシュバック総額:約6389ドル

差し引き、約3807ドルの利益で、右肩上がり、
動かせば動かすだけ資産が増えていきます。

ごく単純計算で、100万円の資産から、5ヶ月で26万円の損失を出すEAが38万円の利益を出すEAになったということです^^
普通に利益を出すEAなら、更に利益増です。

まだ、登録されていない方は、すぐ登録されることを強くお勧めいたします。

CashBackForex無料登録方法

CashBackForexトップページ

上のページにジャンプ後、メニューバーの【Signup】をクリック。

  • First Name(名前)
  • Last Name(苗字)
  • Username(ニックネーム)
  • Password(パスワード)
  • Confirm Password(パスワード再入力)
  • Preferred Broker(使いたいブローカー)
  • Email Address(メールアドレス)

を入力し、Accept Terms of Use(利用規約への同意)にチェックします。

Registerボタンをクリックして登録完了です^^

日本語ページがないようですので、分からない部分はGoogle翻訳などで、しらべながら見てみましょう^^;

ブローカーによって既存の口座を登録できる場合や、新規で口座を開設する必要がある場合があります。
無料で将来の利益の増減が変わるのであれば、1回の手続きはそれほど手間ではないですよね^^

でわこのへんで。

cbf_letters_logo11.gif

2009年8月28日|コメント (0)トラックバック (0)

カテゴリー:その他

会社設立で税金対策

今回は、税金のことについてです^^;

通常のブローカーで、個人でFXをやっている場合、FXの利益は雑所得として納税しなければなりません。

去年マイナスで、今年その分を取り返してトントンとなったとしても、
今年の利益分に税金がかかり、結局マイナスになってしまいます--;

運用資金が大きくなってきたら、会社設立して税金対策をしたほうがお得のようです。

大変お世話になっている山田先生のページでFXの会社設立と税金の比較についての情報がありますので紹介します。

会社設立Web-FXを利用した資産運用会社を設立する

年間の利益が大きくなってきたら相談してみるといいかもですね^^

でわでわ^^

2009年8月 8日|コメント (0)トラックバック (0)

カテゴリー:その他

MT4 EA/インジケータ作成セミナー

MT4(MetaTrader4)のEA・インディケータ作成セミナー開催のお知らせ


これからプログラミングをはじめる
EAを作ってみたけど、思い通りに動かない
独自のインディケータの作りたい

そんな方は、ぜひご参加ください!


【内容】
☆絶対に覚えなきゃいけない3つの事柄
☆プロでもハマる落とし穴
☆EA作成の基本・インディケータ作成の基本
☆慶次流・プログラミング技術がぐんぐん上達する方法
☆メタエディタの便利な使い方
☆質問タイム

などを予定しております。
(その他、ご希望があればお知らせださい。)


【場所】
名古屋駅すぐ近く

【日時】
2009年6月28日(日曜)
13:30~15:30(2時間)

【定員数】
20名

【参加料】
8000円

参加希望・詳細希望の方は
下のフォームリンクからお願い致します。

→お問い合わせフォーム

※定員になり次第、受付終了とさせていただきます。

MetaTrader4のTrading方法説明書(無料)

今回は、これからMetaTrader4でFX取引を始めようと考えている方や、
もう取引をしているけど、まだ使いなれていないといった方に、
各Broker(業者)で無料配布されているMetaTrader4の操作説明書のご案内です。

最近また、MetaTraderユーザーが増えてきて、操作方法などの質問がありましたので^^;


121証券
ページ下の方
「MetaTrader4」システムガイド


ODL Japan
マニュアルpdfファイルあり
MetaTrader4 マニュアルサイト


もう、EA作成などの勉強を始めてる方は必要ないとは思いますが、
一度目を通しておいてもよいかもって思います^^

でわでわ^^

2009年5月23日|コメント (2)トラックバック (0)

カテゴリー:投資書籍

メール機能を追加する方法


今回は、メール機能を追加する方法の基礎の部分です^^

その前に、MT4のツール→オプション→E-メールで
有効にするにチェックし、各項目に必要事項を入力してください。


メールを送信するには、

SendMail( 題名, 本文) ;

というようにSendMail関数を書いてあげましょう。


今回は、練習として
新たな足がでたら、メールする。
メールは3回まで。
題名を【Test】
本文を【通貨ペア 足の番号】
というようにしましょうか。

でわ、早速

extern int MailCount=3;

int bar,cnt;


として、
メール発信する回数をパラメータ用整数変数 MailCount として
初期値を3としてあげましょう。
そして、記憶用整数変数 bar と cnt として、
現在の足の番号、メール送信した回数を代入するため宣言します。

次に start() 関数の{}内に


if(Bars>bar && MailCount>cnt)
{
SendMail("Test",Symbol()+" "+Bars);
bar=Bars;
cnt++;
}

としてあげましょう。

これは、

もし、足の番号がbarより大きくて、cntがMailCount未満の場合

   題名 Test
   本文 通貨ペア名 足の番号
   のメールを送信。
   barに現在の足の番号を代入。
   cntに1を足す。

といった感じの意味です。

これで、足が変わるたびにメールを送信し、MailCountで設定した回数に達したらメール送信は終わります。


こんな感じで、条件が揃ったときだけメールを送るというコードを
インディケータなどに組み込むこともできますね^^

いろいろ試してみてくださいね!

でわこのへんで^^

カスタムインディケータをEAにする方法3

下記の前回の記事と前々回の記事・・・

の続きです!

まずは、ファイルダウンロード
BBands_Stops_EA.zip(mq4ファイルのダウンロード)

  1. EAの全体構成を決める
  2. EAのパラメータを作る
  3. 条件分けをする

といった感じにやっていきましょう!

1.EAの全体構成を決める

まず、ドテンを実現するためにはシグナルでクローズするというコードが必要ですね。
ドテンするかしないかの選択ができるように、そのパラメータもつくりましょう。

ドテンする場合で、シグナルが出た瞬間の取引の場合、コストが大きくなってしまいますので、

「1度エントリしたら次の足まで待って、シグナルがダマシだった場合は
クローズして次のシグナルまで待つ」

といった取引をするようにしましょうか。

2.EAのパラメータを作る

EAを使うときに、選択できるようにするものをパラメータ化していきましょう!

エントリの時のパラメータとして

extern double Lots = 0.1;
extern int StopLoss = 0;
extern int TakeProfit = 0;
extern int Slippage = 1;

ロット数、ストップ値、リミット値、スリッページ

インディケータの使い方として

extern int SignShift = 1;
extern bool ClosebySign = true;

何本前の足のシグナルか、シグナルでクローズするか


EAのマジックナンバーもパラメータにしましょうか^^;

extern int MagicNumber = 883102;

EAでエントリしたときのコメントをパラメータにしたいときは、

string EA_Comment = "EA";

の前にexternをつけてください。


また、他のインディケータを使うときに改造しやすいように

//Other Set
string IndicatorName ="BBands_Stops_mtf";
int IndicatorUpIndex = 2;
int IndicatorDnIndex = 3;
int NoSignValue = -1;

として、インディケータ名、シグナルのインデックス、シグナルが出ていないときの値
変数に代えときましょうか。

シグナル部分は

double upsign=iCustom(NULL,TimeFrame,IndicatorName,0,Length,Deviation,
IndicatorUpIndex,SignShift);
double dnsign=iCustom(NULL,TimeFrame,IndicatorName,0,Length,Deviation,
IndicatorDnIndex,SignShift);

int sign;
if(upsign!=NoSignValue) sign=1;
if(dnsign!=NoSignValue) sign=-1;

といった形になるかと思います。

3.条件分けをする

条件分けは、

  • ポジションがあるかないか
  • シグナルがどういう状態か
  • エントリした足から足が新たにできているか

などなど・・・大まかな条件から、枝分かれするイメージで作っていきましょう。

まず、ポジションがあるか無いかを調べるために、

int pos=-1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS); if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) pos=i;
}

として、
ポジションが無かったら変数posは-1
ポジションがあれば、posはそのポジションのインデックスの値

とします。

そして、

if(pos>=0)
{
}
のカッコ内にポジションがあるときに実行してもらうコード

if(pos<0)
{
}
のカッコ内にポジションが無いときに実行してもらうコード

を書いていきましょう。

まず、ポジションが無いときに実行してもらうコードを書いていきましょうか。

//MM
double lots=Lots;

として、後でマネーマネジメントの機能追加をしやすいように書いておきましょう^^

if(bar!=iBars(NULL,TimeFrame))
{

として、エントリした足(TimeFrameで指定したチャートのバー番号)では、実行しないようにします。
ここで出てくる bar は、エントリしたときのバー番号を記憶してもらう整数変数ですので、
パラメータの下あたりに、

int bar;

として、記憶用整数変数 bar を宣言しておきましょう!

そして、

if(sign==1)
{
if(TakeProfit>0) double tp=Ask+TakeProfit*Point;
else tp=0;
if(StopLoss>0) double sl=Ask-StopLoss*Point;
else sl=0;
int ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,Slippage,sl,tp,EA_Comment,MagicNumber, 0,Blue); if(ticket>0) bar=iBars(NULL,TimeFrame); }

として、sign が1のときに実行してもらう内容を書いてあげましょう。

内容は、
もし、TakeProfitが0より大きい場合、小数変数tpは買値+TakeProfitピプス。
そうでない場合、tpは0。
もし、StopLossが0より大きい場合、小数変数slは買値-StopLossピプス。
そうでない場合、slは0。
指定した内容で買い注文をし、整数変数ticketに注文番号を代入。
もし、ticketが0より大きい場合、 bar にTimeFrameで指定したチャートのバー番号を代入。

という感じです。

ここで、TakeProfitやStopLossが0の場合、ストップやリミットを設定しないで注文をするといったことが出来るようになりました。
最近では、ストップやリミットが小さいとエントリを受け付けないブローカーが増えてきましたので、
MarketInfo(Symbol(),MODE_STOPLEVEL)と
MarketInfo(Symbol(),MODE_SPREAD)
ブローカーのストップ・リミット制限と
スプレッド
を使って条件わけをするとよいかと思います。
今回は省略します^^;

signが-1のときも同様に書いてあげましょう。
ここでの注意は、変数 tp,sl,ticket はすでに宣言してありますので、
変数宣言の必要がありません。

これでポジションなしの時のコードが完成しました!

次に、ポジションがあるときに実行してもらうコードを書いていきましょう!

OrderSelect(pos,SELECT_BY_POS);

として、ポジションの情報を取得できるようにポジションの選択をしておきます。

if(ClosebySign==true && bar!=iBars(NULL,TimeFrame))
{

として、ClosebySignがtrueでバー番号がエントリした足のバー番号ではないときだけ、実行してもらうようにします。

この条件は、ポジションの分岐とあわせて、

if(pos>=0 && ClosebySign==true && bar!=iBars(NULL,TimeFrame))
{
といった感じにもできますが、後から改造しやすいように分けてあります。

次に

if( (OrderType()==OP_BUY && sign==-1) || (OrderType()==OP_SELL && sign==1) )
{
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Yellow); pos=-1; }

として、買いポジションでsignが-1、または、売りポジションでsignが1のときクローズ
posに-1を代入とします。

ここで、posに-1を代入してあげると、下に書いたポジション無しの場合のコードも実行してくれるといった感じです。

そして、最後に大きな課題
「1度エントリしたら次の足まで待って、シグナルがダマシだった場合はクローズして、次のシグナルまで待つ」
を書きましょう。

if(SignShift==0 && bar==iBars(NULL,TimeFrame)-1)
{
double upsign1=iCustom(NULL,TimeFrame,IndicatorName,0,Length,Deviation,
IndicatorUpIndex,1);
double dnsign1=iCustom(NULL,TimeFrame,IndicatorName,0,Length,Deviation,
IndicatorDnIndex,1);

if( (OrderType()==OP_BUY && upsign1==NoSignValue) || (OrderType()==
OP_SELL && dnsign1==NoSignValue) )
{
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Yellow);
return(0); } }

とします。

SignShiftが0で、前の足でエントリしたときにのみ実行してもらうコードです。
また、iCustom関数で1つ前の足のシグナルをしらべます。
(signを決定するブースで記憶変数を使って調べる方法もありますが、今回はiCustom関数を使ってみましょう)

結局シグナルが出ていなかった場合、クローズする

という条件のコードを書いてあげましょう。

これで、一旦クローズしておいて、次のシグナルを待つという形になりました。

今回は、これで完成です。

あとは、ストップ・リミットが0でシグナルでもクローズしないとなるといつまででもポジションをもっていることになりますので、お好みでその条件も加えると良いかと思います。

でわ、今回はこのへんでm(..)m

カスタムインジケータをEAにする方法の関連記事

カスタムインディケータをEAにする方法2


前回の記事「カスタムインディケータをEAにする方法

の続きです!

③シグナルに換える。

iCustom関数の()内の書き方は、

iCustom(通貨ペア,時間足,インディケータ名,,...,インデックス,バーシフト);

でしたね。

・シグナルが出た瞬間の売買/シグナルが出た次のバーの始値で売買の切り替え

を実現するために、パラメータを作りましょうか。

iCustom関数のバーシフトの部分に入れるためのパラメータ

extern int SignShift=1;

としましょうか。
場所はインディケータのパラメータをコピペした下あたりでいいと思います。

そして、これを使ってインデックス2番と3番の値を取得するコードが

double upsign=iCustom(NULL,TimeFrame,"BBands_Stops_mtf",0,Length,Deviation,2,SignShift);
double dnsign=iCustom(NULL,TimeFrame,"BBands_Stops_mtf",0,Length,Deviation,3,SignShift);

となりますね!

こうすれば、パラメータ SignShift が0で、シグナルが出た瞬間に対応できますし、
SignShift が1でシグナルが出た次のバーの始値で売買に対応できるようになりました!

この取得できた値を使って、シグナルを作ってみましょう!

int sign;
if(upsign!=-1) sign=1;
if(dnsign!=-1) sign=-1;

シグナル用変数を sign として
upsign が-1ではないとき sign に1を代入
dnsign が-1ではないとき sign に-1を代入

といった感じです。


あとは基本的なEA製作と同じです。

1つ注意することは、
シグナルが出た瞬間に取引をする場合に、
同じ足で何度もシグナルが変わることがあるので、制限をつけるとよいということです。


途中ですが、続きは次回にしたいと思いますm(..)m

2008年12月31日|コメント (37)トラックバック (0)

カテゴリー:indicators

カスタムインディケータをEAにする方法

今回は、
BBands_Stops_mtf
というインディケータを使って
・途転売買を実行する/しない、の切り替え
・シグナルが出た瞬間の売買/シグナルが出た次のバーの初値で
売買の切り替え
の機能がついたEAの作り方を知りたいといったお便りを頂きましたので、
書いていこうと思います!

まずはインディケータダウンロード
BBands_Stops_mtf.zip(mq4ファイルのダウンロード)


今回のように、インディケータにマルチタイムフレーム機能(違う時間足のものを表示させる機能)がついたものは、
バックテストのビジュアルモードでちゃんと表示できなかったり、ちゃんとバックテストできなかったりしますので、気をつけなければなりません。
バックテストでもちゃんと表示させるようにするにはインディケータを修正する必要がありますので省略させていただきますね^^;


では、早速。
手順としましては、

①インディケータのインデックスを大体把握する。
②iCustom関数で必要なインデックスの値を取得する。
③シグナルに換える。

といった具合です。


①インディケータのインデックスを大体把握する。

通常のインディケータは、特別な配列(インディケータ用配列)をつかって計算します。
普通の配列とは違い、新しい足ができる度に同じように配列の先頭に1つ記憶スペースができるといった機能があります。

そのインディケータ用配列には、

SetIndexBuffer(インデックス番号,インディケータ用配列);
という形でインデックス(番号)が割り当てられています。

BBand_Stops_mtfの場合も、

init()関数の中に

SetIndexBuffer(0,UpTrendBuffer);
SetIndexBuffer(1,DownTrendBuffer);
SetIndexBuffer(2,UpTrendSignal);
SetIndexBuffer(3,DownTrendSignal);
SetIndexBuffer(4,UpTrendLine);
SetIndexBuffer(5,DownTrendLine);


といった具合に、0~5のインデックスがそれぞれ割り当てられています。

この中のどれかを使うわけですが、幸いこのインディケータの場合、

・シグナル系だということ
・インディケータ用配列の名前が分かりやすいということ

で、インディケータの表示と照らし合わせても
買いシグナルにはインデックス2番
売りシグナルにはインデックス3番
を使えばよさそうですね!


②iCustom関数で必要なインデックスの値を取得する。

では早速、Newボタンで新規EA作成しましょう!
ファイル名は、何でもよいですが、BBands_Stops_EAとしましょうか。

iCustom関数の()内の書き方は、

iCustom(通貨ペア,時間足,インディケータ名,,...,インデックス,バーシフト);

です。

インディケータ名は、文字列で入力してあげましょう。

その後ろの【,,...,】が気になりますが、ここにはインディケータのパラメータ(インディケータのプロパティで表示されるもの)が入ります。
省略することもできますが、正確には、『以下省略』という具合に、後ろ側を省略するという感じです。
なので、「1つ目のパラメータを省略して2つ目を入力する」ということができません。
インディケータのパラメータの最後のものをEAで変更して使いたいというときは、
インディケータのパラメータを全部並べてあげる必要があるわけですね^^;

インデックスはインディケータ用配列に割り振られたインデックスです。

バーシフトは、何本前の足の値を使うかという値です。
現在変動中の足での値を取得する場合は、0と入力してあげます。

以上のことを考えると、インディケータで使っているパラメータを
EAでもパラメータ化してあげる必要がありますね!

インディケータのコードの

//---- input parameters
extern int TimeFrame = 0;
extern int Length=13; // Bollinger Bands Period
extern double Deviation=1.62; // Deviation was 2

の部分をコピーして、EAのコードに貼り付けてしまいましょう!
場所は、#property ... の下あたりにしましょう。

そして、start関数の中でiCustom関数を使って、買いシグナルの値を取得してみましょう!

int start()
{
//----
double upsign=iCustom(NULL,0,"BBands_Stops_mtf",TimeFrame,Length,Deviation,2,0);

...

といった感じです。

その後、

Comment(upsign);

として、バックテストのビジュアルモードで確認してみましょう!

んが(T□T;)!!このインディケータ、バックテストではTimeFrameの機能がちゃんと作動しないようです。

こんなときは、インディケータのTimeFrameの機能をつかわず、
iCustom関数のTimeFrameの機能を使いましょう!

int start()
{
//----
double upsign=iCustom(NULL,TimeFrame,"BBands_Stops_mtf",0,Length,Deviation,2,0);

...

という具合です。

これで、TimeFrameで設定した時間足のシグナルが取得できるようになりました。
おまけに、シグナルが出ているときはシグナルの高さ(レート)の値になり、
そうでないときは、-1という値になることがわかりました(^0^)/

このComment関数を使った確認方法はいろんなケースで使えますので、
ぜひ覚えておいてくださいね!


まだ、途中ですが続きは次回とさせていただきますm(..)m

でわでわ。

VQpsV2テスト終了


EAテスト用口座でのVQpsV2のテストを終了しました。

少資金のため、ロスカットになってしまいましたが^^;、
最低資金量を守れば、パラメータをそのままでもプラスになっているので、
まずはこのバージョンで実運用しようかと思ってます。


121証券

先月まで、通貨ペア名の最後に【_】アンダーラインがついてましたが、
今月からなくなりました。

EAでの情報取得時も、楽になりましたね!


でわ、このへんで。

タグ

2008年12月 3日|コメント (24)トラックバック (0)

カテゴリー:その他

予知夢


テスト中のEAで大きな損切りがあった夢を見ました。

数年に一度、あるかないかと思っていましたので、
まさか・・・と思いつつパソコンを見てみると、やっぱり・・・。

VQのシグナル確定から逆方向に200ピプス以上^^;

最近の値動きには冷や冷やしてましたが、
ボラティリティによって柔軟に対応できるものに改良が必要です。

2008年11月21日|コメント (0)トラックバック (0)

カテゴリー:その他

VQpsV2

もうすでに、お気づきの方もいらっしゃるかと思いますが、1ヶ月ほど前から
このブログのどこかに、EAテスト用のリアル口座(FXDD・マイクロロット・最低資金)
へのリンクがあります^^;

はじめは、マイクロロットではなかったのですが、購入したEA(EURUSD.M30で使うもの)
でマイナスになってしまいましたので^^;
VQsimpleDePS(自作EA)を改良しつつ
現在はVQspV2(自作EA改良版)で右肩上がりになってますv^-^

9月16日 $466.65
から運用

約2ヶ月で+230ドル前後(+50%前後)

です。

FXDDのUSDJPYのスプレッドは3pips。
トレード回数が470以上。

コストがかなりかかっています^^;
スプレッドでEAのパフォーマンスも落ちていると思います・・・。


なので、実運用(低資金でない運用)は、

121証券

で行なうことにしました!

11月10日より USDJPYのスプレッドが1pipsになったそうです。

日本の会社、MetaTrader4でEAが使える、スプレッド1pipsということで今のところは最高の条件だと思います^-^


口座開設の手続きをはじめたばかりですので、まだ口座はないのですが、
ワクワクしています^-^

→121証券

タグ

2008年11月18日|コメント (8)トラックバック (0)

カテゴリー:その他

VQの計算方法


今回は、VQの中身のお話です^^

VQって何?ってゆう方は
http://samuraifx.seesaa.net/article/102860052.html
↑の記事を読んでみてください^^;


VQの値は、次の計算式で割り出しています。
(説明のため形を変えてます。このままではうごきません^^;)

MH = iMA(NULL,0,Length,0,Method,PRICE_HIGH,0);
ML = iMA(NULL,0,Length,0,Method,PRICE_LOW,0);
MO = iMA(NULL,0,Length,0,Method,PRICE_OPEN,0);
MC = iMA(NULL,0,Length,0,Method,PRICE_CLOSE,0);
MCS = iMA(NULL,0,Length,0,Method,PRICE_CLOSE,Smoothing);

VQ0 = MathAbs(((MC - MCS) / MathMax(MH - ML,MathMax(MH - MCS,MCS - ML)) + (MC - MO) / (MH - ML)) * 0.5) * ((MC - MCS + (MC - MO)) * 0.5);

SumVQ= Close[1] + VQ0;
if (Filter > 0 && MathAbs(VQ0) < Filter * Point)
SumVQ = SumVQ1;

↑この【SumVQ】というのが、VQの値です。
(注意:チャートの通貨ペア・時間足、現在変動中のバーの値)


では上の方から見ていきましょうか!

MH = iMA(NULL,0,Length,0,Method,PRICE_HIGH,0);
ML = iMA(NULL,0,Length,0,Method,PRICE_LOW,0);
MO = iMA(NULL,0,Length,0,Method,PRICE_OPEN,0);
MC = iMA(NULL,0,Length,0,Method,PRICE_CLOSE,0);
MCS = iMA(NULL,0,Length,0,Method,PRICE_CLOSE,Smoothing);

VQのパラメータである、Length,Method,Smoothingはここで使われます。

それぞれ、高値、安値、始値、終値、Smoothing本前までの終値
の移動平均ですね。
ちなみに、
Lengthは平均する期間
Methodは平均の方法(4種類)
MODE_SMA 0 単純移動平均
MODE_EMA 1 指数平滑平均
MODE_SMMA 2 平滑平均
MODE_LWMA 3 加重平均
です。


VQ0 = MathAbs(((MC - MCS) / MathMax(MH - ML,MathMax(MH - MCS,MCS - ML)) + (MC - MO) / (MH - ML)) * 0.5) * ((MC - MCS + (MC - MO)) * 0.5);

さっき計算した移動平均をつかって計算します。
ここで出てくる
MathAbs はカッコ内の絶対値
MathMax は、コンマの左右でおっきい方
といった意味です。

ごちゃごちゃしてるので、紙に書いて確認してみてください^^;

MH - ML
MH - MCS
MCS - ML
の内、最大のもので
MC - MCS
を割ったものと、
MH - ML

MC - MO
を割ったものを
足して0.5をかけたものと、
MC - MCS

MC - MO
を足して0.5をかけたものを
かけた値

となるでしょうか^^;


最後に
SumVQ= Close[1] + VQ0;
if (Filter > 0 && MathAbs(VQ0) < Filter * Point)
SumVQ = SumVQ1;

VQのパラメータである、Filterはここで使われます。

一旦、SumVQ に前のバーの終値に VQ0 を足したものを代入して、
もし、Filterが0より大きくて、VQ0の絶対値がFilterピプスよりちいさかったら、
SumVQ は SumVQ1(前のバーのSumVQ)を代入。

といった感じです。

SumVQ= Close[1] + VQ0
となって、値に変化があったときにシグナルを出すのですが、
今までと同じ方向への変化はシグナルを出さないようにしてありますので、売り買い交互のシグナルになる感じです。


基本部分はこんな感じですね^^;

でわ、このへんで。

タグ

2008年11月 8日|コメント (3)トラックバック (0)

カテゴリー:EAの作成方法

為替レート当てキャンペーン

今回は、メタトレとは関係ありませんが、サイバーエージェントで面白いキャンペーンをやっているので紹介します。
(口座を持ってなくても平等に参加できます)

------------------------------------------------------------------------

  ○○○円○○銭 5つの数字を当てると【☆ 1000万円 ☆】
   サイバーエージェントFX 「為替レート当てキャンペーン」  

------------------------------------------------------------------------


・キャンペーン概要
2008年9月30日のドル/円レートの終値「○○○円○○銭」を予測して下さい。
正解者には総額1000万円を当選人数で均等に分割した額をプレゼントします。

・応募締切
2008年9月24日12:00まで

・お申込・詳細
→こちらから


------------------------------------------------------------------------

といった感じです。

予想の数字は何度でも変更可能だそうです!

現在、2万人弱の応募があり、108円~110円辺りに集中しているようです。

上昇再開し、週足の一目均衡表の雲上限までといったところでしょうか。

締め切り前にブレイクがあっても面白いですね!


でわ、このへんで。

2008年9月13日|コメント (5)トラックバック (0)

カテゴリー:その他

記録ファイルを作ってみよう!

今回は、弱気なブルートさんのコメントにありました一定時間毎のドローダウンを記録するファイルを作るEAを作ってみましょう!

サンプルとして、ランダムエントリーでATRの数倍のトレイリングストップするシステムとして
紹介した記事「利益を出すランダムエントリーシステム!?
を使って、作ってみました。

FileWriteSample.zip(mq4ファイルをダウンロード)


内容は、ポジションが有る時、4時間足が新しくできるたびに
月、日、時間、残高、有効証拠金、現在のポジションのドローダウン、残高ピーク時からのドローダウン
を記録するという感じです。

バックテストで実行した場合は、
testerフォルダ→filesフォルダ内にファイルが作成されます。

リアルタイムで実行した場合は、
expertsフォルダ→filesフォルダ内にファイルが作成されます。


でわ、さっそくコードを見ていきましょうか(^-^)/


extern int ATRperiod=14;
extern double stoplevel=4.5;
extern double lots=0.1;
extern int Magic=216326;
extern string FileName="writesample";
extern string FileType="txt";

パラメータ用の変数です。
FileNameには、作成するファイル名を入力します。
FileTypeには、作成するファイルの拡張子を入力します。
『txt』や『log』などと入力すると、テキストファイルとなります。
『xls』と入力すると、エクセルファイルになります。

int bar;
int writebar;
double HighAB;
string filename;

記憶用の変数です。
それぞれ
整数 現在のバーの値
整数 ファイルに書き込んだ時の4時間足のバーの値
小数 過去最高の残高の値
文字列 ファイル名
です。

次に出てきますが、filenameには、パラメータで設定したファイル名と拡張子をつなげたものを記憶してもらっています。

int init()
{
//----
filename=FileName + "." + FileType;
int handle;
handle=FileOpen(filename,FILE_WRITE,"\t");
if(handle>0)
{
FileWrite(handle ,"Month","Day","Hour","Balance", "Equity", "PosDD","DD");
FileClose(handle);
}

//----
return(0);
}


int init()の{}内にスタート前にしてもらうことを書きます。

まず、
filename=FileName + "." + FileType;
で、filename にFileName と FileType をピリオドでつなげたものを代入します。
(パラメータ初期値の場合、『writesample.txt』といった具合になります。)

次に、
int handle;
handle=FileOpen(filename,FILE_WRITE,"\t");
で、handleという整数変数を宣言。
filename というファイルを書き込みモードでタブ区切り形式で開きます。
(ファイルがない場合は作成されます。)
そして、その時のファイルハンドル(ファイル認識番号みたいな感じ)を変数 handle に代入します。
FileOpen関数を使うと、指定したファイルを開くと同時に『現在開いているファイルで何番目か』という番号が割り当てられます。
ポジション確認の時のインデックス番号に似ていますね!ファイルハンドルの場合は、1から始まっているので間違えないように気をつけましょう。

そして、
if(handle>0)
{
FileWrite(handle ,"Month","Day","Hour","Balance", "Equity", "PosDD","DD");
FileClose(handle);
}
handleに正常に番号が割り当てられたら、
Month,Day,Hour,Balance,Equity,PosDD,DDという文字を書き込みます。
そして、ファイルを閉じます。
FileWrite関数のカッコ内の最初やFileClose関数のカッコ内は、ファイル名ではなく、ファイルハンドルで指定しますので気をつけましょう!

続いて、int start()のカッコ内を見ていきましょう!


//残高の最高額更新
if(AccountBalance()>HighAB) HighAB=AccountBalance();

現在の残高が HighAB に記憶しておいた値より大きい場合は、
HighAB に現在の残高を代入します。


ARTを使ったストップ用の数値の計算
ポジションの確認
ポジション無しの時

は、省略です^^;


//ポジション有りの時
else
{
(中略)
//ファイル書き込み
if(iBars(NULL,240)!=writebar)
{

ポジション有りの時で、
4時間足のバーの値が writebar に記憶しておいた値と違う場合は、
といった感じです。


次にファイルに記録したいものを変数として宣言し、値を代入していきます。

int month=TimeMonth(TimeCurrent());
int day=TimeDay(TimeCurrent());
int hour=TimeHour(TimeCurrent());

現在の月、日、時間をmonth,day,hourとし、値を代入します。


double AB=AccountBalance() ;
double AE=AccountEquity() ;

残高、有効証拠金も同様にします。


double posDD=(1-AE/AB)*100;
if(posDD<=0) string posDDstr="-";
else posDDstr=DoubleToStr(posDD,2)+"%";

小数変数 posDD を宣言し、現在の残高からのドローダウンを代入します。
そして、posDD が0以下(ドローダウンなし)の時は、文字列変数 posDDstr に『-』を代入。
それ以外(含み損が有る)時は、 posDDstr に posDD の値に『%』を付け加えたものを代入します。


double HighDD=(1-AE/HighAB)*100;
if(HighDD<=0) string HighDDstr="-";
else HighDDstr=DoubleToStr(HighDD,2)+"%";


残高ピーク時からのドローダウンも HighAB の値を使って計算し、同様にします。


int handle;
handle=FileOpen(filename,FILE_READ|FILE_WRITE,"\t");

先ほどと同じ様な感じで、読み込んダリ、書き込んダリ、...モードで^^;
タブ区切り形式で、 filename に記憶されているファイルを開きます。
この時、FILE_READモードも加えてあげないと、ファイルには上書きを繰り返して最後の書き込みしか残らなくなってしまいますので、気をつけましょう!


if(handle>0)
{

正常にファイルが開いたら、


FileSeek(handle, 0, SEEK_END);
FileWrite(handle ,month,day,hour,DoubleToStr(AB,2), DoubleToStr(AE,2), posDDstr,HighDDstr);
FileClose(handle);
writebar=iBars(NULL,240);
}
}
}//ポジション有りの時のカッコ

ファイルの最後の段にポインタを移動させ、
それぞれの値をファイルに書き込みます。
ABやAEを文字列にしているのは、テキストファイルの表示桁数をそろえるためです。文字列に変換しなくても、問題はないです^^;
そして、ファイルを閉じます。
最後に、現在の4時間足のバーの値を writebar に記憶しておいてもらいます。


こんな感じですね。


書き込みのタイミングや、記録する内容など改造したりして試してみてくださいね。


でわ、このへんで(^0^)/

VQに関するお知らせ

前回、VQに関するEAをアップしたのですが、不具合がございましたので、修正しアップし直しました。今日の午前中までにダウンロードされた方は、お手数ですがもう1度ダウンロードし直してくださいm(..)m

商材の特典のVQsimpleDePSも、不具合がございましたのでメールでダウンロードされたVQsimpleDePSを送っていただければ、修正したものを送付します。
ご自身で修正される場合は、ポジションを持っていないときは、VQのサインが出たバーのみ、トレンドサインを出すようにしてください。

VQsimpleをGBPUSDの5分足で最適化してみました。

StopLoss 90
TakeProfit 60
Filter 7

に変更でなんとか利益がでました^^;


VQSimpleDePSは、USDJPYの1時間足で

trailingpips 35

に変更で、取引時間を指定するとよさそうでした。


その他、いろいろ試してみてくださいね!

でわ、このへんで。

タグ

2008年7月21日|コメント (4)トラックバック (0)

カテゴリー:その他

VQとVQ_EAと商材紹介^^;

今回は、VQ(Volatility Quality)というインディケータの紹介です!

私は、FXのインディケータなどをとてもよく研究されている方から教えてもらい、知りました。

ダウンロードはこちら→VQのページ

『VQ_EA』というのがEAで、『VQ』というのがインディケータです。
それぞれのフォルダに入れましょう!
(ダウンロード先参考記事→ダウンロードしたものを使う

インディケータの完成度、EAの完成度ともに抜群だと思います!

が、

・・・

重たいです^^;

これは、インディケータの計算部分で時間がかかっているのだと思います。
これでは、検証作業がなかなか進みません。

そこで、VQの計算部分だけを抽出し、シンプルなEAを作りました。
EAのみで、計算するので検証もスムーズにできます。

バックテスト用のEA(ex4ファイル)ダウンロードはこちら↓
VQSimpleForTest.zip(ex4ファイル)

さらに、このサインにPipShaker(改)を搭載したものを作りました!

バックテスト用のEA(ex4ファイル)ダウンロードはこちら↓
VQSimpleDePSforTest.zip(ex4ファイル)

これで、VQの検証効率が飛躍的にアップしました!

商材紹介終了しました^^;

では、このへんで。

タグ

2008年7月15日|コメント (6)トラックバック (0)

カテゴリー:MetaTrader EA

PipSHakerのアルゴリズム2


今回は、前回の記事「PipSHakerのアルゴリズム1」のつづきです。


でわ、さっそく

オーダー部分です。

TrendSignが1の時

ロットの大きさを決めて、

買いロット合計がMaxTotalLots以内なら

買いオーダー送信。約定されたらtrade1をtrueに。


TrendSignが-1の時

同様に売りのオーダーです。


続いてクローズの部分です。

double WinTotal=BuyWinTotal+SellWinTotal;
double HighPoint = MathMax(HighestBuy, HighestSell);
double LowPoint = MathMin(LowestBuy, LowestSell);
double MidPoint = (HighPoint + LowPoint) / 2;

と変数の宣言をします。

WinTotal 利益が出ているポジションの利益合計
HighPoint 保持ポジションの中の最高値
LowPoint 保持ポジションの中の最安値
MidPoint HighPointとLowPointの中間値

といった感じです。


いよいよ、ここからがPipShakerのシンズイです!


①買いポジションを2つ保持、売りポジション無しで、
最安値の方の買いポジションの利益が ProfitTarget 以上のとき、
 それをクローズ。

②売りポジション無し、かつ、買いポジションが1つ以外で
 買いポジションで利益が出ているものの利益合計と、一番高く買ったポジションの損益との和が ProfitTarget 以上のとき、
一番高く買ったポジションをクローズ。
利益が出ているもの全部をクローズ。(←CloseWin()という関数を作って実行しています)

③買いポジション無し、売りポジション2つ保持で、
最高値の方の売りポジションの利益が ProfitTarget 以上のとき、
 それをクローズ。

④買いポジション無し、かつ、売りポジションが1つ以外で
 売りポジションで利益が出ているものの利益合計と、一番安く売ったポジションの損益との和が ProfitTarget 以上のとき、
一番安く売ったポジションをクローズ。
利益が出ているもの全部をクローズ。

⑤合計ポジション数が1より大きい(2以上の)とき
買値がMidPoint(保持ポジションの中間値)より上の場合で、
利益が出ているものの利益合計と、一番安く売ったポジションの損益との和が ProfitTarget 以上のとき、
 一番安く売ったポジションをクローズ。
利益が出ているもの全部をクローズ。

売値がMidPoint(保持ポジションの中間値)より下の場合で、
利益が出ているものの利益合計と、一番高く買ったポジションの損益との和が ProfitTarget 以上のとき、
 一番高く買ったポジションをクローズ。
利益が出ているもの全部をクローズ。


といった感じです。

①~④はディテールでより効率よく取引するためのもの。
⑤はPipMakerに似てますが、利益が出ているポジション全体で一番離れているポジションを相殺するようにしてあります。


次に、オブジェクト部分、ストップロス、トレイリングストップ
と続きます。
これらは、特に変わったことが無いので省略します。

トレイリングストップの部分で
if(OrdersTotal()==1 && trailingpips!=0)

if(BuyOrders + SellOrders==1 && trailingpips!=0)
に変えたほうがいいですね^^;


スタート関数を閉じた後に、

void CloseWin()

として、CloseWin()関数を作っています。

これは、利益が出ているポジション全てをクローズするといった関数になっています。


これで、おしまいですね。

サラッとだけでしたので、分からないところとかは、コメントでよろしくお願いします^^;


でわ、このへんで。

タグ

PipSHakerのアルゴリズム1


今回は、PipShakerOneのコードを使って、アルゴリズムをみていきましょう!
PipShakerV4はPipShakerOneのエントリ部分が違う感じですが、あとは大体同じです。
PipShakerOneのコードを入手できなかった人は、コードをイメージしながら読んでみてください^^;

まずは、パラメータですが、内容は過去記事の「PipShakerOne」を参照して確認してください。


double lotstep;
int lotsizing;

など記述がございますが、今回は関係ありません。
複利機能のなごり(消し忘れ)です^^;


続いて、start関数の中を見てみましょう!

double BuyLots, SellLots;
int BuyOrders = 0, SellOrders = 0;
double LowestBuy = 999, HighestBuy = 0.0001, LowestSell = 999, HighestSell = 0.0001;
double Profit, BuyProfit, SellProfit, BuyWinTotal, SellWinTotal;
int HighestBuyTicket, LowestBuyTicket, HighestSellTicket, LowestSellTicket;
double HighestBuyProfit, LowestBuyProfit, HighestSellProfit, LowestSellProfit;


変数の宣言です。

BuyLots, SellLots; 買いのロット合計,売りのロット合計
BuyOrders, SellOrders; 買いのポジション数,売りのポジション数
LowestBuy, HighestBuy; 買いポジションの中で最安値と最高値
LowestSell, HighestSell; 売りポジションの中で最安値と最高値
Profit; ポジションの損益を代入するためだけの便利変数^^;
BuyProfit, SellProfit; 買いの損益合計,売りの損益合計
BuyWinTotal, SellWinTotal; 買いの利益合計,売りの利益合計
HighestBuyTicket,LowestBuyTicket,HighestSellTicket,LowestSellTicket;
売り買いのポジションの最安値最高値のチケットナンバー
HighestBuyProfit,LowestBuyProfit,HighestSellProfit,LowestSellProfit;
売り買いのポジションの最安値最高値の損益


という感じです。

PipShakerでは、使わない変数もいくつかありますが、
改造する時とかに使えるものもあるかもですね。


つづいての73行目から128行目までのfor文は
現在保持しているポジションの情報を各変数に代入する
ための文です。

一つずつ丁寧に調べて代入!って感じです。


次に、シグナル部分に入ります。
変数の宣言int TrendSign,TradeSpace;
TrendSign シグナル
TradeSpace ←不要ですので削除してください

Trend に現在のバーの移動平均
TrendPrev に一つ前のばーの移動平均

を代入します。

シグナルの条件

if(BuyOrders + SellOrders <1 && TimeCurrent()>=Date1 && trade1==false)
{
if (buy0sell1==0) TrendSign=1;
if (buy0sell1==1) TrendSign=-1;
}

ポジションが無くて、Date1以降でtrade1がfalseの場合、
buy0sell1==0 のとき TrendSignに1を代入。
buy0sell1==1 のとき TrendSignに-1を代入。

if(BuyOrders + SellOrders >0 && TrendPrev != 0)
{

もし、ポジションがあり、TrendPrevが0ではない場合


// BUY Trade Criteria
if (TrendPrev < Trend)
{
if (Ask < LowestBuy - (Spacing * Point) || Ask > HighestBuy + (Spacing * Point))  TrendSign=1;
if(BuyOrders ==1 && SellOrders==0 && Ask > HighestBuy )  TrendSign=0;
}

移動平均が上昇の場合で、
現在の買値が買いポジションの最安値よりSpacing ピプス低いか、
現在の買値が買いポジションの最高値よりSpacing ピプス高いとき、
TrendSignに1を代入。
もし、買いポジションを1つだけ持っていて、売りポジションをもっていなくて、現在の買値が買いポジションより高いとき、
TrendSignを0にする。


// SELL Trade Criteria
if (TrendPrev > Trend)
{
if (Bid < LowestSell - (Spacing * Point) || Bid > HighestSell + (Spacing * Point))  TrendSign=-1;
if(BuyOrders ==0 && SellOrders==1 && Bid < LowestSell )
TrendSign=0;
}
}

移動平均が下降の場合、

同じ感じでTrendSignを決定します。


今日は、このへんで。
次回は、この続きでオーダーの部分からです。

タグ

サイコロジカルライン

前回maさんから、サイコロジカルラインのインディケータやEAの作り方についてのコメントを頂きましたので、早速作ってみましょうか!


ちなみにサイコロジカルラインの算出方法は

(n日間で終値比プラスの日数)÷n×100

ですね!


インディケータの作り方

まず、MetaEditorのNewボタンを押して、
Custom Indicator にチェック。

次へ

インディケータの名前を入力したら、パラメータを作るためAddボタンを押します。
今回は、インディケータの名前は「Psychological」、
パラメータは「Psycho_Period」で、タイプは int 、初期値は 12 としましょうか。

次へ

Indicator in separate window にチェック。←サブウインドウで表示
Minimum,Maximum にチェックし、Minimumを0、Maximumを100にします。

Addボタンを押して、好きな色を選びましょう!
タイプは、Lineのままでよいです。

完了


これで、コードの表面部分が出来上がりました!


後は、サイコロジカルの計算を記入するだけです。
start関数内に記入していきましょうか。

int counted_bars=IndicatorCounted();

という文が、あらかじめ書いてありますが、特に使わなくてもよさそうなので、消しちゃっても問題ないと思います^^;


int i,j, limit=Bars-IndicatorCounted();

変数の宣言です。

limitは、数えていないバーの数(最初はバーの本数、通常1、バーが増えた時2)が入っていることになります。

(実験)
Comment(Bars + "\n" + IndicatorCounted());
と加えて、1分足で見てみると Bars と IndicatorCounted() の関係が
分かり易いかもです。
(実験終わり)


for(i=limit-1; i>=0; i--)
{

まずは、計算しなければならないバーの分の繰り返し文です。

ExtMapBuffer1[i] =0;

一応、インディケータ用の配列変数の数値を初期化します。

for(j=0; j<Psycho_Period; j++)
{
if(Close[i+j]>Close[i+j+1]) ExtMapBuffer1[i]+=100;
if(Close[i+j]==Close[i+j+1]) ExtMapBuffer1[i]+=50;
}
ExtMapBuffer1[i] /=Psycho_Period;

計算するバーからPsycho_Period前までのバーの1本1本について、
終値が前のバーの終値と比べて、プラスならExtMapBuffer1[i]に100を足す。
同じなら50を足す。
Psycho_Period本分のバーを全部計算した後、Psycho_Periodで割ってあげましょう!

これで、
(n日間で終値比プラスの日数)÷n×100

の計算ができました。

}

Psychological.zip(mq4ファイルのダウンロード)


↓MT4の勉強のつよ~い味方!

FXメタトレーダー入門―最先端システムトレードソフト使いこなし術 [現代の錬金術師シリーズ56] (現代の錬金術師シリーズ 56)

EAの作り方

EAに関しては、今までどおりの作り方でやってますので、サラッといきますね^^;
(ややこしくなるといけないので、基本部分しか書いてません。各自パワーアップさせてみてください)

サイコロジカルの数値は、EAの中で計算してしまってもいいですし、
先ほど作ったインディケータ「Psychological」から、iCustom関数で取得してもよいです。

double psycho;
/* for(i=SignalTiming; i {
if(Close[i]>Close[i+1]) psyco+=100;
if(Close[i]==Close[i+1]) psyco+=50;
}
psycho /=Psycho_Period;
*/
psycho=iCustom(NULL, 0, "Psychological",Psycho_Period,0,SignalTiming);

一応このように参考のため、両方書いて片方はコメント部分にして実行しないようにしてありますので、試してみてください。


パラメータの説明

StopLoss 損切り設定ピプス
TakeProfit 利食い設定ピプス
Lots ロット数
Psycho_Period サイコロジカルの計算期間
SignalTiming シグナルを出すタイミング(現在のバーの数値でシグナル発信する場合は、0と入力。1つ前のバーで確定してからの場合は1と入力。)
BuyLevel 買い条件の数値
SellLevel 売り条件の数値
CloseBySignal 反対シグナルが出た時にクローズするかどうか

といった感じです。


Psycho_EA.zip(mq4ファイルのダウンロード)


↓プログラム作成時の辞書に最適!

【FX完全自動売買システム構築のための250の技 MetaTrader4逆引き大全集】

以上、サイコロジカルラインについてでしたが、
これ、フィルタとかに使用すると面白いかもですね!


でわ、このへんで!

PipShakerOne


今回は、PipShakerの単発版、PipShakerOneというEAを作ってみました!

PipShakerの最初のエントリ(日時と売り買い)をパラメータで決定、その後PipShaker作動し、ポジションがなくなれば終了。
といった感じです。


PipShakerOne.zip(ex4ファイル)


パラメータ

第一取引設定
Date1 最初のエントリの時間
buy0sell1 最初のエントリの売りか買いか
(「買い」は0、「売り」は1を入力)

最少単位での設定
MaxLotSize 最大ロット数
LotSize 最初のエントリのロット数
LotIncrement 買い増し時、売り増し時のロット増加数
MaxTotalLots 1方向の合計ロット数の上限
ProfitTarget 目標利益(単位は口座通貨と同じ)

Spacing ポジショニング用スペース(単位:ピプス)

移動平均線設定
TrendTimeFrame 平均線の時間足(1・5・15...)
TrendPeriods 平均線の計算期間

EA設定
comment コメント
MagicNumber マジックナンバー

trailingpips トレイリングストップ(単位:ピプス)
stoploss 損切り値(単位:ピプス)


使用上の注意

EA作動開始から、移動平均線の計算期間分は買い増し売り増しを行なわないので、開始からエントリの間に余裕を持たせてください。


基本的な動き

価格から一番遠いポジションを利益が出ているポジション全体で相殺する感じです。
ポジションが一つになったら、トレイリングで追っかける感じです。

いろいろ試してみてください。


でわ、このへんで。

タグ

2008年5月26日|コメント (11)トラックバック (0)

カテゴリー:MetaTrader EA

PipShakerV4誕生!!

PipMakerはポジション同士のチームワークで利益を上げていきます。
これは、最大の特徴で強みですが、場合によっては弱点でもあります。

弱点をカバーするために、保有可能ポジション数を少なくすると、
かえってチームワークが機能しなくなり利益が出ません。

なので、ある程度ポジション数は保有できるように、資金量が必要です。
ですが、Micro Lot(0.01ロット)単位なら、必要資金も10分の1になるのでPipMakerを使うには向いているかと思います。


今回は、PipMakerを改造して、『PipShaker』というものを作ることに成功しました!


Micro Lot最少単位での取引(1999~2007)

PipShakerV2の1999-2007年バックテスト結果

9年間での最大ドローダウンが$651.55なので、Micro Lotでも最低資金数十万円は必要のようですね!

さらに、年末の仕掛け的な動きにダマされることが多いようなので、
12月はお休みする『PipShakerV4』を作りました。

リスクを大きめにとって複利での1年ごとのバックテスト結果↓


1999年
PipShakerV4の1999年バックテスト結果年利:188%


2000年
PipShakerV4の2000年バックテスト結果年利:442%


2001年
PipShakerV4の2001年バックテスト結果年利:167%


2002年
PipShakerV4の2002年バックテスト結果年利:242%


2003年
PipShakerV4の2003年バックテスト結果年利:1590%!


2004年
PipShakerV4の2004年バックテスト結果年利:3429%!!


2005年
PipShakerV4の2005年バックテスト結果年利:1572%!


2006年
PipShakerV4の2006年バックテスト結果年利:270%


2007年
PipShakerV4の2007年バックテスト結果年利:48%^^;


早速、デモ開始です。


でわでわ。

タグ

2008年4月16日|コメント (12)トラックバック (0)

カテゴリー:MetaTrader EA

PipMakerを改造

今回は、PipMakerを改造したもののバックテストをアップしたいと思います。

改造した点

トレンド方向へ動いた時の無駄を無くす等、細かなところを効率化しました。
(トレイリングなど)

常にポジションを持っているのではなく、出来るだけ損切りをしなくてすむような状況を狙い撃ちして、ポジションをとるようにしました。
(フィルタをつけました)


パラメータは同じで、最少ロットでテストしました。

→EURUSDのテスト結果

→USDJPYのテスト結果


まだまだ、良くなりそうですね!
もう少し、研究を続けたいと思います!

また、PMsimpleのパラメータを説明しますね。
MaxLotSize 最大ロット数
LotSize 最少ロット数
Lotincrement 増加ロット数
ProfitTarget 目標利益
TrendProfitTarget トレンド方向の目標利益
Spacing 買い増し売り増しするときの必要ピプス
TrendSpacing トレンド方向のSpacing
TrendTimeFrame 移動平均の使用時間足
TrendPeriods 移動平均の計算期間

といった感じです。
PipMakerV9-1には、ポジションサイジングなどのパラメータがありますがややこしくなってしまいますので、
無くしました^^;


でわこのへんで。

タグ

2008年4月 7日|コメント (15)トラックバック (0)

カテゴリー:MetaTrader EA

聖杯EAの原石の原石!?PipMaker

前回紹介しました、PipMakerですが、エラーが出てしまうといった報告がありました。

まだ、原因が分かってませんが、PipMakerV9-1のいろいろな機能を削って骨の部分だけのものを作りました。

PMsimple.zip(mq4ファイル)

また、報告お願い致しますm(..)m

タグ

2008年3月28日|コメント (20)トラックバック (0)

カテゴリー:MetaTrader EA

聖杯EAの原石!!PipMaker

http://www.forex-tsd.com/expert-advisors-metatrader-4/8126-pipmaker-v1-price-action-based-ea.html

で、無料公開されているEA、PipMakerV9-1をデモ取引で試してみました!

PipMakerV9-1.zip(mq4ファイル)


ものすごい勢いで残高が増えて行きます。
デモで体験してみてください!

バックテスト結果を見ると、時々塩漬け状態になるポジションが発生しますが、他のポジションで相殺する感じですね。ポジション同士のチームワークで勝ち続けるシステムです。なので、ある程度の残高が必要になります。

しかし、相殺できないときがありドローダウンが大きくなりすぎると破産します。
そうならないために、掲示板ではいろいろなバージョンがありますが、PipMakerV9-1にランダムエントリーでも利益を出すあのトレイリング(日足ベース14日ATRの三倍のストップ)を付け加えてみました!

PipMakerV9-1トレイリング(日足ベース14日ATRの三倍のストップ)

2000年から2007年のUSDJPY1分足(データはMeta Quates)でのバックテストのグラフです。
(1分足なのでModelling Qualityは25%です)


http://codebase.mql4.com/en/2595
のような1分足のバックテストの特異性を利用したものではないです^^;


8年間で数回(数年に1度の割合)、数ヵ月分の大きな損失が発生しました。

まだ、コードをしっかりと解読していないので、なんともいえませんが、
ほとんどの通貨ペア、時間足で有効なので、
ポジションサイズ、塩漬けの相殺方法または損切り方法次第で最強の聖杯になると思います。

今後、PipMakerのコード解読、戦略研究をしていきたいと思います!


でわ、このへんで。

ありがとうございます。

タグ

2008年3月26日|コメント (28)トラックバック (0)

カテゴリー:MetaTrader EA

マネーマネジメント

今回も、前々回同様にエクセルを使って、複利と単利の利益率とドローダウンの比較が出来るものを作りました!

compound-interest.zip(エクセルファイル「複利と単利の利益率とドローダウンの比較」)


黄色いセルにそれぞれ、

システムの勝率
1取引あたりのリスクに対する利益の比率
1取引あたりの資産に対するリスクの比率
(単利にはリスクの値そのものを入力)
初期資産

を入力します。

すると、取引1000回分の勝敗が勝率を元にランダムに決定されます。

そして、その取引1000回分の勝率と、複利単利それぞれの利率、最大ドローダウン、期待値が計算されます。

設定変更や、空いているセルにアクションを起こす度に再計算されます。

同じ設定で、何度も再計算したときに1度でも利率が-100%になってしまったら、破産リスクがあるということになります。


いろいろと、試してみてくださいね!


でわ、このへんで。


応援お願いします!
→FXシステムトレード派
→rank応援クリック
→人気ブログランキング

利益を出すランダムエントリーシステム!?

魔術師たちの心理学 ― トレードで生計を立てる秘訣と心構え

新版 魔術師たちの心理学―トレードで生計を立てる秘訣と心構え

の中で、紹介しているトム・バッソが行なったランダムエントリーの
実験
の一部を再現してみようかと思います。

今回は、マネーマネジメントを除いた、
・ランダムエントリー
・3倍のボラティリティ・トレイリングストップ

を再現してみましょう!


まずは、パラメータ用の変数を宣言します。

extern int ATRperiod=10;
extern double stoplevel=3;

ATR(average true range)の期間と、
3倍という部分を変えられるようにしました。


つぎに、

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

乱数を使うときにはMathSrand関数で始まりをセットするのがお決まりのようです。


int start()
{

スタート関数の中身を書いていきましょう!


double atr3=iATR(NULL,0,ATRperiod,0)*stoplevel;

まずは、iATR関数を使って、ATRのstoplevel倍の値を
atr3という小数変数に代入するという文です。


つぎに、

if(OrdersTotal()<1)
{
int sign = MathRand() % 2; //0 or 1
if(sign==0)
OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, Ask-atr3, 0, "ATR3", 1000, 0, Blue);
if(sign==1)
OrderSend(Symbol(), OP_SELL, 0.1, Bid, 3, Bid+atr3, 0, "ATR3", 1000, 0, Red);
}

として、ポジションが無いときにしてもらうことを書きます。
今回は、このEA以外での取引はしないという前提で書きますね。

内容は、

もし、ポジションや注文中のものが、1より小さい(0の)場合、
乱数を2で割った時の余りをsignという整数変数に代入します。
もし、signが0のとき
買い注文(ストップをAsk-atr3に)します。
もし、signが1のとき
売り注文(ストップをBid+atr3に)します。


といった感じです。
これで、買いか売りかは、半々で決められますね!


つぎに、

else
{
OrderSelect(0, SELECT_BY_POS, MODE_TRADES);

として、ポジションがあるときにしてもらうことを書きます。

内容は、

それ以外の(ポジションや注文中のものがある)場合、
そのポジションを選択します。


今回は、一度に複数のポジションを持つことがないので、インデックスは
常に0ということになりますね。


次に

if(OrderType() == OP_SELL)
{
if(OrderStopLoss() > Ask + atr3)
{
OrderModify(OrderTicket(), OrderOpenPrice(), Ask + atr3, OrderTakeProfit(), 0, Purple);
return(0);
}
}

とします。

内容は

もし、そのポジションが売りの場合、
もし、ストップが現在の買値+ atr3 より大きい時は、
注文変更(ストップを Ask + atr3にする)
終了


といった感じです。

買値やatr3の値が有利に動いたときに、ストップを引き下げていく感じですね。


つぎに、


if(OrderType() == OP_BUY)
{
if(OrderStopLoss() < Bid - atr3)
{
OrderModify(OrderTicket(), OrderOpenPrice(),Bid - atr3, OrderTakeProfit(), 0, Yellow);
return(0);
}
}
}

return(0);
}

として、ポジションが買いの場合も同様にします。

そして、start関数を終了させます。


これでランダムエントリーシステムの完成です!


早速、バックテストをしてみたのですが、
ATRの期間を14くらいにするとよさそうな感じでした。

また、取引機会を増やそうと1時間足で試してみましたが、
ATRの3倍だとすぐにノイズにやられてしまうので、
4.5倍あたりがよさそうな感じでした。


トレンドフォローのストップの目安になりそうですね!


でわ、今回はこのへんで。


応援お願いします!
→FXシステムトレード派
→rank応援クリック
→人気ブログランキング

ポジションサイジングについて

今回は、ポジションサイジングについてのお話です!

エクセルで勝敗を自由に決められるドル円のバーチャル取引で
資金の推移がわかるものを作ってみました!

まずは、ダウンロードしてみてください。

position-sizing-test.zip(エクセルファイル「PSに対する資金の推移」)

使い方は
黄色くなっているセルを自由に設定します。

まずは、1ドルあたりいくらかを入力します。
資金と書いてある下には、初期資金、右には、取引一回あたりの資金配分率を設定します。

レバレッジと書いてある下には、配分された資金の何倍の取引をするかを入力します。
すると、その列には、何万通貨取引するのかが表示されます。

そして、リミット、ストップ、スプレッドを設定します。
この3つから、値動きがランダムウォークとした場合の勝率理論値が
計算されます。

仮(0=利,1=損)と書いてある列に、自由に勝敗を書き込んでいきます。
利食いしたときは「0」、損切りになってしまったときは「1」と入力します。

仮取引勝率の右のセルに30回の取引の勝率が表示されます。
勝率理論値と仕掛けの優位性を考慮して妥当な仮取引勝率にしてみてください。

グラフは、トレードごとの資金の推移です。

その下には、資金配分とレバレッジでテーブル機能を使い、
最終資金が算出されます。


魔術師たちの心理学 ― トレードで生計を立てる秘訣と心構え

のなかで説明されている、ポジションサイジングの話や、雪合戦の話、確率を味方につけるなどなど、
エクセルで実際に設定してみると分かり易いかもですね!

この本の中にも、ランダムエントリーに勝る仕掛けのシステムはほとんど存在しないと書いてあります。
勝率理論値と仮取引勝率の差を広げすぎると信頼性が低下していまいますので、注意してくださいね!

まだ、読んだことがない方は、
今年、新版が出たのでこちらの方がいいかもですね!

新版 魔術師たちの心理学―トレードで生計を立てる秘訣と心構え


でわ、今回はこの辺で。

応援ありがとうございます!
→FXシステムトレード派
→rank応援クリック
→人気ブログランキング

コメントの不具合

昨日いただいたコメントがブログに反映されないといった不具合が生じております。

現在サーバーサイドに問い合わせ中なので記事で紹介させていただきたいと思います。


さかやんさん
あの田平さんのロジックを自動売買化されたのですね? このソースは公表されないのでしょうか?

そうですね^^;
田平さんのロジックは中・長期取引になっていて取引回数が非常に少なく自動売買にしなくても大丈夫そうでした。
でも、短期売買にも応用できる部分がありますので、参考になる基本的な手法だと思います。
ロジックの公開は著作権の問題もございますので控えたいと思います。
ゴメンなさい^^;


h-riverさん
こんにちは 今日はじめてこちらのブログを拝見しました。 さて、わたしはMetaTrader4での取引を始めようかと考えています。なかでもMulti_Lot_Scalperによる自動売買にかなり興味があります。 ひとつ不明な点があるので、教えてください。 Multi_Lot_Scalperは、日本円口座にて行おうと思っていますが、これをそのまま使用しても大丈夫なのでしょうか? おそらくオリジナルはドル、またはユーロなど日本円口座以外を想定しているかと思いますが、日本円口座ではじめる場合は、なにか変更しなければいけないことがあるのでしょうか? とても初歩的な質問ですいませんが、 よろしくお願いいたします。

こんにちわ。
Multi_Lot_ScalperをEURUSDの4時間足、日本円口座で取引するという前提で
オリジナルのコードを見ていきましょうか。

if(AccountisNormal == 1)
if(mm != 0)
lotsi = MathCeil(AccountBalance()*risk/10000);
else
lotsi=Lots;
else
// then is mini
if(mm != 0)
lotsi = MathCeil(AccountBalance()*risk / 10000) / 10;
else
lotsi = Lots;

ここで、ロット数が決まるわけです。
パラメータのAccountisNormalが1の場合でmmが0ではないとき
ロット数は口座残高×risk÷10000
mmが0のときロット数はパラメータのLots
パラメータのAccountisNormalが1ではない場合でmmが0ではないとき
ロット数は口座残高×risk÷10000÷10
mmが0のときロット数はパラメータのLots

ここで決まったロット数というのは第一取引のロット数です。
このシステムはナンピンシステムなので
仮に0.1ロット(1ロット=10万通貨なのでこの場合1万通貨)と計算された場合、
次は0.2ロット、その次は0.4、0.8、1.6、3.2ロットとなって行きます。
MaxTradesの数が7だとすると合計12.7ロットになり、第一取引のロット数の127倍の通貨で取引することになります。

例えば最大レバレッジ100倍、残高100万円、EURUSDで取引するとして、第一取引のロット数を0.1ロットになるようにした場合、
第一取引の必要証拠金は現在で1万6000円前後。5個目までの合計ロット数が3.1ロットなので、必要証拠金は約50万円。
ナンピンピプスを10ピプスに設定したとき、この時点での含み損は約6万円。20ピプスにしたときはその倍の約12万円。
6個目は証拠金不足でオリジナルのシステムでは取引しないようになってます。

このようなシステムということは十分にご理解ください。

ということで、
口座残高100万円でAccountisNormal が 1 のとき risk が 10 で
第一取引のロット数が0.1になるように変えてみましょうか。

lotsi = MathCeil(AccountBalance()*risk/10000);

のところを

lotsi = NormalizeDouble(AccountBalance()*risk/100000000,1);

ですね。
残高×リスクが1000万になるわけですから、1億で割ってあげれば0.1になりますね!

AccountisNormal が 1 以外のときのほうは10億で割ってあげましょうか。

mmが0のときは、ロット直接入力なのでそのままでいいですね。


一応、Multi_Lot_Scalperの改造版MetatoreLotScalperV2に口座切り替え機能を付け加えたのでアップしますね!

MetatoreLotScalperV3.zip

常にポジションを持つバージョン
MetatoreLotScalperV4.zip

ご使用は自己責任でお願い致します。

他に不明な点がありましたら、聞いてくださいね!


jpyuserさん
VolAve今月100ピプス行きましたね! ありがとうございます!

VolAveの調子がよくてよかったです^^;
実は、MetatoreADXというEURUSD5分足使用のEAのダウンロードリンクを3日前まで設置していましたが気づきましたでしょうか?
そちらは、まだデモ検証段階ですが今月は200ピプス取れてます。
また、プレゼント企画が出来そうです!

2008年1月28日|コメント (17)トラックバック (0)

カテゴリー:その他

Multi_Lot_Scalperの改造

今回も、Multi_Lot_Scalperの解読のつづきです。

前回作ったものを、少し改良しました!

MetatoreLotScalperV2.zip(mq4ファイル)


今回の改良点

このシステムは、資産が多ければ多いほど有利なシステムなので、
ロット数を少なめにするようにしました。(ドル口座での計算です)

手仕舞いしたバーでは取引しないようにし、
資産のパーセンテージで利食い、損切りできるようにしました。

手仕舞いしたバーでも取引するバージョン
MetatoreLotScalperV4.zip(mq4ファイル)

パラメータで

ProfitPer

は含み益が資産の何%に達したら利食いするという値。

LossPer

は含み損が資産の何%になったら損切りするという値です。

Pips

は何ピプス損失方向に動いたらナンピンするという値です。

xlot

はナンピン時のロット数を、前回の何倍にするかという値です。


シグナルの部分はそのままなのでフィルタをつけるなどして試してみてくださいね。

シグナルはMACDなので、フィルタはストキャスなどのオシレーター系が良いかと思います。


今回は、コードの説明は無いですが、気になる部分などありましたらコメントしてくださいね!


でわ、手短ですがこのへんで^^;


応援お願い致します!
→FXシステムトレード派
→rank応援クリック
→人気ブログランキング

タグ

2008年1月27日|コメント (10)トラックバック (0)

カテゴリー:MetaTrader EA

Multi_Lot_Scalperの解読4

今回はMulti_Lot_Scalperの解読の続きを見ていきましょうね!


続きはここから

Profit = 0;
LastTicket = 0;
LastType = 0;
LastClosePrice = 0;
LastLots = 0;


あれれ?
start関数の中で初めて出てきましたね。

ここで、0を代入するってことは特に記憶用ではなさそうですね^^;


つぎを見てみましょう。

//----
for(cnt = 0; cnt < OrdersTotal(); cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
//----
if(OrderSymbol() == Symbol())
{

です。
何回も出てきているお決まりのパターンなので、もうわかりますよね?

インデックス0のものから順に実行していくやつですね。


でわ次。


LastTicket = OrderTicket();
//----
if(OrderType() == OP_BUY)
LastType = OP_BUY;
//----
if(OrderType() == OP_SELL)
LastType = OP_SELL;
LastClosePrice = OrderClosePrice();
LastLots = OrderLots();


です。内容は

LastTicketに選択したポジションの注文番号を代入。
もし、ポジションが買いなら、LastType に OP_BUY を代入。
もし、ポジションがうりなら、LastType に OP_SELL を代入。
LastClosePrice に今ポジションを手仕舞いする場合の値を代入。
LastLots にポジションのロット数を代入。

です。
for文を閉じた後には、最後に代入されたものが残るわけですね。


次見てみましょうか。


//----
if(LastType == OP_BUY)
{
if(OrderClosePrice() < OrderOpenPrice())
Profit = Profit - (OrderOpenPrice() - OrderClosePrice())*OrderLots() / Point;
//----
if(OrderClosePrice() > OrderOpenPrice())
Profit = Profit + (OrderClosePrice() - OrderOpenPrice())*OrderLots() / Point;
}
//----
if(LastType==OP_SELL)
{
if(OrderClosePrice() > OrderOpenPrice())
Profit = Profit - (OrderClosePrice() - OrderOpenPrice())*OrderLots() / Point;
//----
if(OrderClosePrice() < OrderOpenPrice())
Profit = Profit + (OrderOpenPrice() - OrderClosePrice())*OrderLots() / Point;
}
 }
}

です。
内容は、

もし、LastType が OP_BUY の場合、
もし、現在の売値がエントリー値より小さいとき、
Profit に 「Profit - (エントリー値 - 現在の売値)* ロット数のピプス表示」を代入。
もし、現在の売値がエントリー値より大きいとき、
Profit に 「Profit + (現在の売値 - エントリー値)* ロット数のピプス表示」を代入。

もし、LastType が OP_SELL の場合、
もし、現在の買値がエントリー値より大きいとき、
Profit に 「Profit - (現在の買値 - エントリー値)* ロット数のピプス表示」を代入。
もし、現在の売値がエントリー値より大きいとき、
Profit に 「Profit +(エントリー値 - 現在の買値) * ロット数のピプス表示」を代入。

です。

なんだか、遠回りしてるような気がしますが^^;
Profit には、合計損益が代入されていることになります。


でわ、次です。

Profit = Profit*PipValue;
text2 = "Profit: $" + DoubleToStr(Profit,2) + " +/-";

です。内容は

Profit に Profit * PipValue を代入する。
text2 に 「Profit: $ 」と Profit の小数点以下2ケタまでを文字列にしたものと「 +/-」を
並べたものを代入する。

といった感じです。

ここで、DoubleToStrは小数を文字列に変換するときに使います。この場合は、小数点以下3桁目を
四捨五入した数字を文字列にしてあります。

パラメータのPipValueは損益をドルに換算するときに使うみたいですね。
これは、パラメータでそのつど変更するよりもプログラムのなかで計算した方が
よさそうな気がしますが^^;


でわ、次見てみましょう。

//----
if(OpenOrders >= (MaxTrades - OrderstoProtect) && AccountProtection == 1)
if(Profit >= SecureProfit)
{
OrderClose(LastTicket, LastLots, LastClosePrice, slippage, Yellow);
ContinueOpening = False;
return(0);
}


です。内容は

もし、OpenOrders がMaxTrades - OrderstoProtect 以上で AccountProtection が1の場合
もし、Profit が SecureProfit以上の時
取引番号LastTicketのものを手仕舞いにして、
ContinueOpening を False にする。
そして、終了。

といった感じです。

MaxTrades,OrderstoProtect,AccountProtection,SecureProfitの4つはパラメータ用の変数ですね。

条件が満たされて、合計利益がSecureProfit以上になったら、手仕舞いにする感じですね。
ここで一つ手仕舞いされると、前に出てきたコードで全てのポジションを手仕舞いにするという
ところにたどり着くわけですね。


でわ、次です。

//----
if(!IsTesting())
{
if(myOrderType == 3)
text="No conditions to open trades";
else
text=" ";
Comment("LastPrice=", LastPrice, " Previous open orders=", PreviousOpenOrders,
"\nContinue opening=", ContinueOpening, " OrderType=", myOrderType, "\n",
text2, "\nLots=", lotsi, "\n", text);
}

です。内容は

もし、テストではない場合、
もしmyOrderType が3ならば、textに「No conditions to open trades」を代入。
その他ならば、textに「 」を代入。
チャートに
「LastPrice=」 LastPriceの数値 「 Previous open orders=」 PreviousOpenOrdersの数値 改行
「Continue opening=」 ContinueOpeningの真偽 「OrderType=」 myOrderTypeの数値 改行
text2の文字列 改行
「Lots=」 lotsiの数値 改行
textの文字列
を表示させる。

といった感じです。

知りたい情報をチャートに表示させるときは、Commentを使いますね。


でわ、次です。


//----
if(myOrderType == 1 && ContinueOpening)
{
if((Bid - LastPrice) >= Pips*Point || OpenOrders < 1)
{
SellPrice = Bid;
LastPrice = 0;
//----
if(TakeProfit == 0)
tp = 0;
else
tp = SellPrice - TakeProfit*Point;
//----
if(InitialStop == 0)
sl = 0;
else
sl = SellPrice + InitialStop*Point;


です。内容は

もし、myOrderType が1で ContinueOpening がtrueの場合
もし、現在の売値 - LastPrice が Pipsピプス以上、または OpenOrders が1より小さい(0の)時、
SellPrice に現在の売値を代入。
LastPrice に0を代入。
もし、TakeProfit が0のとき、tp に0を代入。
その他の時は、tp に SellPrice から TakeProfitピプス引いた値を代入。
もし、InitialStop が0のとき、 sl に0を代入。
その他の時は、 sl に SellPrice と InitialStopピプスを足した値を代入。

といった感じです。

前回のエントリー値よりPipsピプス以上値上がりした時か、ポジションが無いときに
売りポジションを持つときの利食い値、損切り値を計算する感じですね。


そして、

//----
if(OpenOrders != 0)
{
mylotsi = lotsi;
//----
for(cnt = 1; cnt <= OpenOrders; cnt++)
if(MaxTrades > 12)
mylotsi = NormalizeDouble(mylotsi*1.5, 1);
else
mylotsi = NormalizeDouble(mylotsi*2, 1);
   }
   else
   mylotsi=lotsi;


です。内容は

もし、OpenOrders が0じゃない場合
mylotsi に lotsiを代入。
cntが1から OpenOrders の値の数値以下の間、次のことを実行して
cntに1を足すというのを繰り返す。
もし、MaxTrades が12より大きいときは mylotsi に mylotsi の1.5倍を小数点以下1桁にしたものを
代入。その他のときは、 mylotsi に mylotsi の1.5倍を小数点以下1桁にしたものを代入。

その他(OpenOrders が0)の場合
mylotsi に lotsi の値を代入。

という感じです。

ここは、ポジションサイジングですね。
MaxTrades が 12以下を見てみると
ポジションが1つある場合は、ロット数が2倍、
ポジションが2つある場合は、ロット数が2*2の4倍、
ポジションが3つある場合は、ロット数が4*2の8倍。
という感じです。

で、ポジションが無いときは、lotsiをそのまま代入といった感じですね。


でわ次。


  //----
if(mylotsi > 100)
mylotsi = 100;
OrderSend(Symbol(), OP_SELL, mylotsi, SellPrice, slippage, sl, tp, NULL, 0, 0,
Red);
return(0);
}
}

です。内容は

もし、mylotsi が100より大きい時はmylotsi に100を代入。
設定した内容で売り注文を出す。
で、終了。

といった感じです。

ロット数の制限を付け加えてますね。
OrderSend のカッコ内の項目も変数に代入されている値を使っています。


そして、最後


if(myOrderType == 2 && ContinueOpening)
{
if((LastPrice-Ask) >= Pips*Point || OpenOrders < 1)
{
BuyPrice = Ask;
LastPrice = 0;
//----
if(TakeProfit == 0)
tp = 0;
else
tp = BuyPrice + TakeProfit*Point;
//----
if(InitialStop==0)
sl = 0;
else
sl = BuyPrice - InitialStop*Point;
//----
if(OpenOrders != 0)
{
mylotsi = lotsi;
for(cnt = 1; cnt <= OpenOrders; cnt++)
if(MaxTrades > 12)
mylotsi = NormalizeDouble(mylotsi*1.5, 1);
else
mylotsi = NormalizeDouble(mylotsi*2, 1);
}
else
mylotsi = lotsi;
//----
if(mylotsi > 100)
mylotsi = 100;
OrderSend(Symbol(), OP_BUY, mylotsi, BuyPrice, slippage, sl, tp, NULL, 0, 0,
Blue);
return(0);
}
}
//----
return(0);
}

です。今度は買いの注文です。
内容は、売り注文の時と同じですね。

そして、start関数も終了っと。


これで全部です。なかなか分かりづらいですよね^^;

そこで、余分な情報などを削除して、取引部分を再構築してみました!

変数名やコード配置などの変更はありますが、まったく同じ取引をするものを作りました。
ブロックごとに内容をメモしてあるので参考にしてください。

しかし、このままではマネーマネジメントの部分や
損失を抱え込んでしまうなどの難ありなので、
今後改良していきたいと思います。

でわ、ダウンロード

その前に
応援よろしくお願いいたしますm(..)m
→FXシステムトレード派
→rank応援クリック
→人気ブログランキング


MetatoreLotScalper.zip(mq4ファイル)

タグ

移動平均の交互売買の方法

今回は、xyz__さんからの質問がございましたので、
臨時記事といたしまして、

1.移動平均を上(下)に超えた直後に買い(売り)ポジションを取る。
2.買い(売り)ポジションがある場合は
ポジションを取らない。要はポジションは常に1個
3.移動平均より上(下)でポジションをとった場合は連続でポジションを同じ方向にはとらない。要は買い→売り→買い→売り・・・の法則でのみ
4.買いのポジションで決済されずに売りのポジションを持つ場合は買いを決済して売り
のポジションをもつ

というものを作りましょうか。


まずはパラメータです。

//利食い損切りピプス
extern int TakeProfit = 10;
extern int StopLoss =10;
//ロット数
extern double lots=0.1;
//移動平均の計算期間
extern int maPeriod = 21;

後から設定できる変数ですね。


次に記憶用の変数を宣言します。

int bar,LastType;

いつものように、一つのバーで1回までというようにしたいので
バーの番号を記憶する整数変数 bar と、
買い→売り→買い→売りを交互に注文することを可能にするため
最後におこなった注文を記憶する LastType という変数です。

でわ、
int start()
{
の中身を見ていきましょう!

最初に移動平均線の値を計算します。


//現在の移動平均線の値
double ma0 = iMA(NULL,0,maPeriod,0,MODE_SMA,PRICE_CLOSE,0);
//1つ前の移動平均線の値
double ma1 = iMA(NULL,0,maPeriod,0,MODE_SMA,PRICE_CLOSE,1);


ma0 , ma1 という小数変数を宣言しながら、移動平均線の値を代入しています。
このように変数が初めて出てくるところで宣言してあげても大丈夫なんですね。

今回は、【直後】というキーワードで確定前の一瞬でも超えた時点で
シグナルを出すようにしたため、現在動いている移動平均を使っています。
クロスが確定したときにシグナルを出したいときは、
iMA のカッコ内の最後の数字を1と2にして、
1つ前のバーの移動平均の値と2つ前のバーの移動平均の値を使えばいいですよね。


でわ、つぎにシグナルを出したいと思います。

//シグナル
if(Close[1]<ma1 && Close[0]>ma0) int sign=1;
if(Close[1]>ma1 && Close[0]<ma0) sign=-1;

もし、1つ前のバーの終値が移動平均値がより小さくて、かつ、
今の値が移動平均値より大きい場合は、整数変数 sign に1を代入。
もし、1つ前のバーの終値が移動平均値がより大きくて、かつ、
今の値が移動平均値より小さい場合は、整数変数 sign に-1を代入。

これで、クロスの条件が表現できますね。

1とか-1は勝手に取り決めたものですので、自由です^^;
MT4の取り決めと合わせる場合は買いが0売りが1となると思いますが、個人的に分かり易いものでいいと思います。

if文などの条件内の実行が1行の場合は{}は必要ないですね。


でわ、次です。


// オーダーチェック(ポジションなどのデータ)
int CurrentPosition=-1;
for(int cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS);
if(OrderMagicNumber() == 123 && OrderSymbol() == Symbol()) CurrentPosition=cnt;
}

この辺は、【完全自動売買への道のり】で詳しく説明してあると思うのでさらっと行きます。

整数変数 CurrentPosition の宣言で初期値は-1です。
cntが0からポジション総数の数値より小さいうちは{}内を実行しcntに1を足すというのを繰り返す。

インデックスcntのポジションを選択
もし、マジックナンバーが123でかつ、通貨ペアがチャートの通貨ペアと同じなら CurrentPosition にcntの数値を代入する。

と言った感じです。
ここで、マジックナンバーと通貨ペアを照合することによって
他のEAでおこなっている取引をカウントしない。
同じEAでおこなっている他通貨での取引をカウントしない。
という効果があります。

そして、照合した結果、マッチするもののインデックスを CurrentPosition に
代入するといった感じになります。


でわ、次行きましょう。

// ポジションチェック ポジション無し
if(CurrentPosition == -1)
{

です。
前の照合結果、CurrentPosition には何も代入されずに初期値のままのときという感じですね。
なので、【このEAでのこの通貨ペアはもっていない場合】ということになります。


//買い条件
if(bar!=Bars && LastType!=1 && sign==1)
{
//買いポジションを取る
int 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;
}
}

もし、記憶用の変数 bar の値が今のバーの番号と違って、
記憶用の変数 LastType が1じゃなくて、
sign が1の場合は
()内の条件で買い注文を出しつつ、整数変数 Ticket に注文番号を代入する。
そして、注文番号が0より大きい(注文が成立した)とき
barに現在のバーの番号を代入。
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
{

です。

if(CurrentPosition == -1)のカッコを閉じてelseということは CurrentPosition が -1以外の場合、
すなわち【このEAでのこの通貨ペアはもっている場合】ということになります。


さてここからポジション有りの場合の実行コードになります。


//ポジションの選択
OrderSelect(CurrentPosition,SELECT_BY_POS);

持っているポジションの情報を知りたいときにはまずポジションの選択をしてあげなければいけません。
ここで生きてくるのが先ほどのfor文で代入されたインデックスです。
今、CurrentPositionにはfor文で照合にヒットしたインデックスが代入されているので、
そのインデックスのポジションを選択してあげるわけです。


次に、
//もし買いポジションで売りシグナルがでたら
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;
}
}

内容は、
もし選択されたポジションが買いで、signが-1の場合
選択されたポジションを手仕舞い。
そして、売り注文を出す。
注文成立したときbarに今のバーの番号、LastTypeに-1を代入。

といった感じです。

この取引のシグナルは一つ前のバーでsignが1になるか-1になるか
決定しているので、
同じバーで反対のシグナルが出ることがありません。
もし、同じバーで反対のシグナルが出るようなシステムでも同じバーでは複数回取引をしないという条件にする場合は、ここの条件でもbar!=Barsというものを付け加えなければなりません。


//もし売りポジションで買いシグナルがでたら
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);
}

elseのカッコを閉じてあげて、start関数を終了させます。


応援お願いします!
→FXシステムトレード派
→rank応援クリック
→人気ブログランキング


test10.zip(mq4ファイル)のダウンロード


でわ、今回はこの辺で。

Multi_Lot_Scalperの解読3

さあ、今回も続きを見ていきましょう!


// if we have opened positions we take care of them
for(cnt = OrdersTotal(); cnt >= 0; cnt--)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
//----
if(OrderSymbol() == Symbol())
{
if(OrderType() == OP_SELL)
if(TrailingStop > 0)
if(OrderOpenPrice() - Ask >= (TrailingStop + Pips)*Point)
if(OrderStopLoss() > (Ask + Point*TrailingStop))
{
OrderModify(OrderTicket(), OrderOpenPrice(),
Ask + Point*TrailingStop, OrderClosePrice() -
TakeProfit*Point - TrailingStop*Point, 800, Purple);
return(0);
}
if(OrderType() == OP_BUY)
if(TrailingStop > 0)
if(Bid - OrderOpenPrice() >= (TrailingStop + Pips)*Point)
if(OrderStopLoss() < (Bid - Point*TrailingStop))
{
OrderModify(OrderTicket(), OrderOpenPrice(),
Bid - Point*TrailingStop, OrderClosePrice() +
TakeProfit*Point + TrailingStop*Point, 800, Yellow);
return(0);
}
}
}

ここを一気に見てみましょうか。

内容は
//もし保持ポジションがあるならそれらを処理します。
cnt がポジション数の数値から0以上の間は、{}を実行して cnt から1を引くというのを繰り返す。

インデックスcntのポジションを選択。
もしその通貨ペアがチャートの通貨ペアと同じ場合、

もしオーダータイプが売りの時で、
もし TrailingStop が0より大きい時で、
もしエントリー値から現在の買値を引いた値より(TrailingStop + Pips)ピプスの方が小さいか等しい時で、
もし損切り値が現在の買値にTrailingStopピプス足した値の方が大きいなら、
オーダー変更
損切り値を現在の買値にTrailingStopピプス足した値に。
利食い値を現在の買値からTakeProfitピプスとTrailingStopピプスを引いた値に。
有効期限は800秒。
矢印を紫色に。
で、終了。

もしオーダータイプが買いの時で、
もし TrailingStop が0より大きい時で、
もし現在の売値からエントリー値を引いた値より(TrailingStop + Pips)ピプスの方が小さいか等しい時で、
もし損切り値が現在の売値からTrailingStopピプスを引いた値の方が小さいなら、
オーダー変更
損切り値を現在の売値からTrailingStopピプス引いた値に。
利食い値を現在の売値にTakeProfitピプスとTrailingStopピプスを足した値に。
有効期限は800秒。
矢印を黄色に。
で、終了。


という感じです。
とてもややこしいのですが、一言でゆうとトレーリングストップですね^^;

関数Pipsは、トレイリングストップを開始するのをPips分だけ遅らせるといった感じですね。

しかし、このままだと少し変わった取引になります。

初期値の損切り値0なのでそのままで考えてみましょう!

損切り値0ということはトレイリングストップ(利益確定のストップから)が発動するまでは損切りはしないことになります。


まずは、ポジションが買いの場合を考えてみましょう。

値が利益方向に(TrailingStop + Pips)ピプス上がったとき、
今の値よりTrailingStopピプス下に損切り値を持ち上げます。
と同時に、利食い値も今の値より(TakeProfit + TrailingStop)ピプス上に持ち上げます。
上がれば上がるほど利食い損切りともに上がっていきます。
そして、値が下がっているときは利食い損切りともに動かずといった感じです。
なので、買いポジションに関しては常に利確後の損切りで、
利食い値は関係ないということになりますね。
(1tickで利食い値を超えない限り)

次に、ポジションが売りの場合を考えてみましょう。

if(OrderStopLoss() > (Ask + Point*TrailingStop))という条件がありますが、
OrderStopLoss()は損切り値のことで0ですね。
なのでトレイリングストップが発動せず売りポジションには損切り値は発生しません。
なので、売りポジションに関しては利食い値まで持ち続ける感じですね。

もし、損切り値0のときもトレイリングストップを発動させる場合は、

if(OrderStopLoss() > (Ask + Point*TrailingStop) || OrderStopLoss()==0)

みたいな感じで書くと良いかと思います。

また、損切り値を設定した場合は、売り買い共に利食い値は関係なくなりますね。


モデル:Control points で利益が出ているような結果になるのは、
1tickでガツンと来るからですね^^;


まだまだ、先がありますが今日はこの辺で。

応援よろしくお願い致します!
→FXシステムトレード派
→rank応援クリック
→人気ブログランキング

タグ

Multi_Lot_Scalperの解読2

今回は、前回のMulti Lot ScalperというEAのコードの解読の続きです。

ダウンロード元はこちら↓
http://codebase.mql4.com/en/619


でわ、早速見ていきましょう!

//----
if(PreviousOpenOrders > OpenOrders)
for(cnt = OrdersTotal(); cnt >= 0; cnt--)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
mode = OrderType();
//----
if(OrderSymbol() == Symbol())
{
if(mode == OP_BUY)
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slippage, Blue);
//----
if(mode == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slippage, Red);
return(0);
}
}
PreviousOpenOrders = OpenOrders;

です。内容は

もし PreviousOpenOrders が OpenOrders より大きい場合、
cnt が所持ポジション数の数値から0以上の間は{}内を行い1を引くというのを繰り返す。

インデックスcntのポジションを選択。
mode にそのポジションのオーダータイプ(この場合成行き売りor成行き買い)を代入。
もし、そのポジションの通過ペアと現在のチャートの通貨ペアが同じ時、
もし、mode が OP_BUY ならば、手仕舞い。(矢印は青色)
もし、mode が OP_SELL ならば、手仕舞い。(矢印は赤色)
終了。

PreviousOpenOrders に OpenOrders の値を代入。


といった感じです。

最後の PreviousOpenOrders = OpenOrders; で記憶用変数 PreviousOpenOrders には
現在のポジション数が代入されていますが、
その手前までは変数名どおり記憶されている「以前のポジション数」ということになりますね。

なので、何らかの形(利食いや損切り、手仕舞いなど)でポジション数が減った時は、
PreviousOpenOrders > OpenOrders の条件に当てはまりますね。

そして、インデックスの大きい方から選択して、同じ通貨ペアがあったら手仕舞いして終了。
(実際はインデックスは0から割り当てられているので、インデックス OrdersTotal()-1 というものから実行されます)

ここで、mode を使ってオーダータイプを振り分けているのは
手仕舞いの矢印の色を区別したいからですね^^;
変数 mode の宣言を見て分かるように、 OP_BUY や OP_SELL は人には文字列のようにみえますが、
コンピュータ(MT4)は0や1といったように整数として認識しています。

ここで、一つのポジションが手仕舞いされたら return(0); によって
一旦、 int start の実行は終了です。

また、新たにint start が実行された時、同じ通貨ペアがあった場合はここでまた手仕舞いです。
これを同じ通貨ペアが無くなるまで繰り返すわけですね!

そして、同じ通貨ペアが無くなって PreviousOpenOrders = OpenOrders; までたどり着きます。
この繰り返しの後は PreviousOpenOrders , OpenOrders ともに0となるわけです。


でわ、次を見てみましょう!


//----
if(OpenOrders >= MaxTrades)
ContinueOpening = False;
else
ContinueOpening = True;


です。内容は

もし、OpenOrders が MaxTrades 以上の場合、
ContinueOpening に False を代入。
そうでない場合、
ContinueOpening に True を代入。


です。
ポジションの数を見て、追加エントリー可能かどうかを ContinueOpening に教えてあげてる感じですね。


次を見ましょうか。


//----
if(LastPrice == 0)
for(cnt = 0; cnt < OrdersTotal(); cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
mode = OrderType();
//----
if(OrderSymbol() == Symbol())
{
LastPrice = OrderOpenPrice();
//----
if(mode == OP_BUY)
myOrderType = 2;
//----
if(mode == OP_SELL)
myOrderType = 1;
}
}

です。内容は

もし LastPrice が0の場合、
cnt が0から OrdersTotal() より小さい間、{}を実行し cnt に1を足すということを繰り返す。

インデックス cnt のポジションを選択し、
mode に オーダータイプを代入。
もしその通貨ペアがチャートの通貨ペアと同じなら、
LastPrice に選択されたポジションのエントリー値を代入。
もし mode が OP_BUY なら、 myOrderType に2を代入。
もし mode が OP_SELL なら、 myOrderType に1を代入。


といった感じです。

ここでは、インデックス0のものから、 LastPrice , myOrderType に数値を代入しますが、
更に次のインデックスのものがある場合は、数値を上書きする感じですね。
そして、最後にエントリーしたポジションのデータを残す感じです。

これは、cnt を OrdersTotal()-1 からはじめて、通貨ペア確認のif文の閉じカッコの前で、
break;(←繰り返し終了の命令文)と入力しても同じですね。


次いってみましょう!


//----
if(OpenOrders < 1)
{
myOrderType = 3;
//----
if(iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, MODE_MAIN, 0) >
iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, MODE_MAIN, 1))
myOrderType = 2;
//----
if(iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, MODE_MAIN, 0) <
iMACD(NULL,0,14,26,9,PRICE_CLOSE, MODE_MAIN, 1))
myOrderType = 1;
//----
if(ReverseCondition == 1)
if(myOrderType == 1)
myOrderType = 2;
else
if(myOrderType == 2)
myOrderType=1;
}

です。内容は

もし、OpenOrders が1より小さい(0の)場合、

一旦、 myOrderType に3を代入。
もし、現在のMACD(14,26)が一つ前のバーのMACD(14,26)より大きい時は、
myOrderType に2を代入。
もし、現在のMACD(14,26)が一つ前のバーのMACD(14,26)より小さい時は、
myOrderType に2を代入。
もし、ReverseCondition が1の場合で、
もしmyOrderType が1のとき、myOrderType に2を代入。
その他の場合で
もしmyOrderType が2のとき、myOrderType に1を代入。


という感じです。

先ほどは、持っているポジションのうち最後にエントリーしたもので myOrderType を決定しましたが、
今回は、ポジション無しの場合の myOrderType 決定方法ですね。

myOrderType はMACDが上向きなら2、下向きなら1、
また ReverseCondition が1の時はその逆にする、といった感じです。

またまた重要っぽい変数が出てきましたね! LastPrice , myOrderType も戦略材料っぽいですね!


ワクワクしてきたところですが、今回はこの辺で。

次回もこの続きです。


応援お願いいたします!
→FXシステムトレード派
→rank応援クリック
→人気ブログランキング


ps

メルマガ第1号は今月15日朝発行です!

タグ

Multi_Lot_Scalperの解読1

今回は、Multi Lot ScalperというEAのコードを見ていきましょうか。

ダウンロード元はこちら↓
http://codebase.mql4.com/en/619


まずは、どんなパラメータがあるかサラッと見ましょう!

extern double TakeProfit = 40;
extern double Lots = 0.1;
extern double InitialStop = 0;
extern double TrailingStop = 20;
extern int MaxTrades = 10;
extern int Pips = 15;
extern int SecureProfit = 10;
extern int AccountProtection = 1;
extern int OrderstoProtect = 3;
extern int ReverseCondition = 0;
extern double EURUSDPipValue = 10;
extern double GBPUSDPipValue = 10;
extern double USDCHFPipValue = 10;
extern double USDJPYPipValue = 9.715;
extern int StartYear = 2005;
extern int StartMonth = 1;
extern int EndYear = 2006;
extern int EndMonth = 12;
extern int EndHour = 22;
extern int EndMinute = 30;
extern int mm = 0;
extern int risk = 12;
extern int AccountisNormal = 0;

変数名で役割がなんとなく分かるものとそうでないものがありますが、
先に進めば役割が分かってきますので、サラッとみます^^;

記憶用の変数もサラッ!と見ましょう。

//----
int OpenOrders = 0, cnt = 0;
int slippage = 5;
double sl = 0, tp = 0;
double BuyPrice = 0, SellPrice = 0;
double lotsi = 0, mylotsi = 0;
int mode = 0, myOrderType = 0;
bool ContinueOpening = True;
double LastPrice = 0;
int PreviousOpenOrders = 0;
double Profit = 0;
int LastTicket = 0, LastType = 0;
double LastClosePrice = 0, LastLots = 0;
double Pivot = 0;
double PipValue = 0;
string text = "", text2 = "";


今のところは、「こんな変数をここで宣言しているんだな~」程度で
良いかと思います。


でわ早速 int start() の中身を見ていきましょう!


if(AccountisNormal == 1)
if(mm != 0)
lotsi = MathCeil(AccountBalance()*risk/10000);
else
lotsi=Lots;
else
// then is mini
if(mm != 0)
lotsi = MathCeil(AccountBalance()*risk / 10000) / 10;
else
lotsi = Lots;
//----
if(lotsi > 100)
lotsi = 100;

個人的にはif文が重なるときは{}があったほうが見やすいのですが^^;

内容は

もし AccountisNormal が1の時で
mm が0ではない場合
lotsi に口座残高* risk /10000 の小数点以下切り上げを代入。
その他(mm が0)の場合
lotsiにLotsを代入。

//ミニの場合
その他の( AccountisNormal が1ではない)時で
mm が0ではない場合
lotsi に口座残高* risk /10000/10 の小数点以下切り上げを代入。
その他(mm が0)の場合
lotsiにLotsを代入。

もしlotsi が100より大きい時
lotsiに100を代入。


という感じです。

ここで MathCeil() はカッコ内の数値を小数点以下繰り上げといった感じです。
繰り上げなので、数値がマイナスの時、たとえば-2.999の時は-2に繰り上がります。

あと、変数 mm はマネーマネジメントのイニシャルという感じですね。

mmをオン(0以外)にした場合、lotsi をロット数にするには大きい感じがしますね。


でわ、次を見てみましょう。


OpenOrders = 0;
//----
for(cnt = 0; cnt < OrdersTotal(); cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
//----
if(OrderSymbol() == Symbol())
OpenOrders++;
}


です。内容は

念のため OpenOrders を0にしておいて、

cnt が0から オーダー(この場合は所持ポジション)の総数より小さい内は
{}内を行い cnt に1を足すということを繰り返します。

インデックス cnt のポジションを選択し
もしその通貨ペアが現在のチャートの通貨ペアと同じ場合
OpenOrders に1を足す。


といった感じです。

所持ポジションのうち現在のチャートの通貨ペアの数を OpenOrders で表す感じですね。


続いて


//----
if(OpenOrders < 1)
{
if(TimeYear(CurTime()) < StartYear)
return(0);
//----
if(TimeMonth(CurTime()) < StartMonth)
return(0);
//----
if(TimeYear(CurTime()) > EndYear)
return(0);
//----
if(TimeMonth(CurTime()) > EndMonth )
return(0);
}


ですが、内容は

もし OpenOrders が1より小さい(0の)場合で、

もし、現在の年が StartYear より小さい時、終了。
もし、現在の月が StartMonth より小さい時、終了。
もし、現在の年が EndYear より大きい時、終了。
もし、現在の月が EndMonth より大きい時、終了。


といった感じです。

これは、ちょっと気になりますね・・・。
このままだと、たとえば
StartYear = 2005
StartMonth = 10
EndYear = 2007
EndMonth = 8

とした場合、現在の月が10月より小さい場合は、終了。
現在の月が8月より大きい場合は、終了。
ということは、いつでもここで終了ということになってしまいます。

何年何月~何年何月までというような条件を作る時は

if(TimeYear(CurTime()) < StartYear)
return(0);
//----
if(TimeMonth(CurTime()) < StartMonth && TimeYear(CurTime()) == StartYear)
return(0);
//----
if(TimeYear(CurTime()) > EndYear)
return(0);
//----
if(TimeMonth(CurTime()) > EndMonth && TimeYear(CurTime()) == EndYear)
return(0);

とするとできますね。
今回の条件はまた別の意味があるかもしれませんので
先に進みましょうか^^;


続いては、


//----
if(Symbol() == "EURUSD")
PipValue = EURUSDPipValue;
//----
if(Symbol() == "GBPUSD")
PipValue = GBPUSDPipValue;
//----
if(Symbol() == "USDJPY")
PipValue = USDJPYPipValue;
//----
if(Symbol() == "USDCHF")
PipValue = USDCHFPipValue;
//----
if(PipValue == 0)
{
PipValue = 5;
}


です。

内容は、

もし現在のチャートの通貨ペアがEURUSDの時、PipValue に EURUSDPipValue を代入。
(後の3つも同じ感じ)
もし PipValue が0の時、PipValue に5を代入。


といった感じです。
PipValue が0の時というのは、PipValue に何も代入されていなくて
初期値のままか、0が代入された時というわけですね。
もし PipValue が正の数じゃないとマズい時はif(PipValue <= 0) とした方がいいかもですね。

それにしても、PipValue は何に使うんでしょうね。ワクワクしますね!


このワクワクは、次回まで持ち越しましょうか。

でわ、今回はこの辺で。


応援ありがとうございます!
→FXシステムトレード派
→rank応援クリック
→人気ブログランキング


ps
メルマガ登録ありがとうございます。
まだ、第1号を発行してないのですが、登録数にビックリしています^^;
第1号は来週あたりを予定しております。お楽しみに!

タグ

メルマガ配信のお知らせ

お待たせ致しました!

メルマガ配信の準備が整いました!!

受信希望の方は、右サイド中間にあるメルマガ登録・解除という枠で
メールアドレスを入力し送信ボタンを押してください。

メルマガ発行周期は不定期です。
主な内容は、
●最近の研究内容について
●プレゼント企画告知やヒント、予告など
です。

(2008.1.9以前に登録された方もお手数ですがもう一度登録手続きをお願いいたしますm(..)m)


バックナンバーは第1号のみ閲覧可能となっております。

ご登録お待ちしております!


応援ありがとうございます!
→FXシステムトレード派
→rank応援クリック
→人気ブログランキング


ps
優良ルールMaDoの改良・最適化完了しました!
詳細はメルマガで報告いたします!

2008年1月10日|コメント (10)トラックバック (0)

カテゴリー:その他

メルマガに関するお詫び


先日より、メルマガ読者募集をしておりましたが、
私の不備により、メルマガ消滅してしまいました。
メルマガ登録してくださった方々、本当に申し訳ございませんm(..)m

再度、メルマガ申請しておりますので、メルマガ発行許可がおりました際は、
お手数ですがもう一度登録をお願いいたします。


ps
VolAveP2008_1は正常に取引しておりますか?
メルマガでは、去年約20%の利益を上げたMaDoのダウンロードを考えております。

2008年1月 9日|コメント (7)トラックバック (0)

カテゴリー:その他

NewNice戦略トレンド編

今回は、ブログ読者様の幸さんのアイデアをMetaboNewNiceに付け加えてみましょう!

幸さんのアイデア
①100日、300日平均移動線とボリンジャー20日線が同じ方向のみエントリー。
②20日線の角度により、エントリーするか見送りか決める。

ここで、 ②の20日線の角度というのは、表示中のチャートの縦幅によって変わってしまうので、20日線の増減で計るようにしましょうか。

使うコードは、
まずは、パラメータ

extern double MA20upPips=0.1;
extern double MA20downPips=0.1;

として、20日線が一つ前のバーで何ピプス以上動いたらシグナルを出すのかという条件の数値です。

次に

//トレンド用の計算
double ma1001=iMA(NULL,0,100,0,MODE_SMA,PRICE_CLOSE,1);
double ma1002=iMA(NULL,0,100,0,MODE_SMA,PRICE_CLOSE,2);
double ma3001=iMA(NULL,0,300,0,MODE_SMA,PRICE_CLOSE,1);
double ma3002=iMA(NULL,0,300,0,MODE_SMA,PRICE_CLOSE,2);
double ma201=iCustom(NULL,0,"Bollinger Bands - Fibonacci Ratios",0,1);
double ma202=iCustom(NULL,0,"Bollinger Bands - Fibonacci Ratios",0,2);

double ma20updown=(ma201-ma202)/Point;

です。
上から、100日線の一つ前の値と、二つ前の値、300日線の一つ前の値と、二つ前の値、
ボリンジャーの真ん中の線の一つ前の値と、二つ前の値。

そして、ボリンジャーの真ん中の線が何ピプス動いたかを計算します。
ここで、ma20updownの値がプラスなら増、マイナスなら減ということになりますね。

これを、買い条件の前あたりに記入して計算してもらいましょう。


そして、

//買い条件
if(STC[2]<5 && STC[1]>5 && ma1002<ma1001 && ma3002<ma3001 && ma20updown>MA20upPips)
{

//売り条件
if(STC[2]>95 && STC[1]<95 && ma1002>ma1001 && ma3002>ma3001 && -1*ma20updown>MA20downPips)
{

というように前回の条件に&&を使って足してあげましょう。
売り条件の最後の-1*ma20updown>MA20downPips
MA20downPipsよりma20updownのほうが大きく減った場合、という意味ですね。

トレンド方向のみのエントリーのコードは以上を付け足せばOKです。

MetaboNewNiceTrend.zip(mq4ファイル)


今回私がバックテストした結果、有効なパラメータ、通貨や時間足などを見つけることができませんでした。

もし、有効なものが見つかりましたら教えてくださいね^^;


でわ、今回はこの辺で。


応援ありがとうございます!
→FXシステムトレード派
→rank応援クリック
→人気ブログランキング


ps
メルマガはじめました!
有益情報を配信したいと思います。
メルマガ読者限定プレゼント企画も考えています。
よろしくお願いいたしますm(..)m

タグ

2008年1月 6日|コメント (5)トラックバック (0)

カテゴリー:MetaTrader EA

zyx40さんのルール検証3

今回は、zyx40さんのルール検証の続きです。


通貨ペアEURUSDで一時間足(H1)で
zyx40さんのパラメータ
TakeProfit_L=40;
StopLoss_L=134;
TakeProfit_S=26;
StopLoss_S=216;
TradeTime=18;
lot=4;
Orders=3;
MaxOpenTime=168;

を固定し t1, t2, delta_L, delta_S を調べてみました。
(ODLの過去データで検証)

zyx40-2007-10-12.zip(Excelファイル)

やはり、zyx40さんのアイデア部分がないため、同じ動きのものはないようですね^^;


今回はチャンピオンシップのため、大きめのリスクで運用されたと思います。
なので、レバレッジ10倍という条件で2007年のデータで最適化をしてみました。

パラメータ
Leverage=10;
TradeTime=18;
Orders=3;

は固定です。

Zyx40F.zip(mq4ファイル)

zyx40-2007.zip(Excelファイル)


結果から、
取引回数 100回以上
最大ドローダウン 20%以下

というフィルタをかけると7つほどデータが残りました。

プロフィットファクター上位は
TakeProfit_L=44,
StopLoss_L=85,
TakeProfit_S=5,
StopLoss_S=166,
t1=18,
t2=11,
delta_L=15,
delta_S=15,
MaxOpenTime=36,


TakeProfit_L=5,
StopLoss_L=50,
TakeProfit_S=5,
StopLoss_S=114,
t1=9,
t2=1,
delta_L=2,
delta_S=18,
MaxOpenTime=82,

でした。


傾向としては
利食い幅は買いの方が大きい
損切り幅は売りの方が大きい
値動き幅は買いの方が敏感

というような感じです。

これは、2007年は値上がり状態だったので当然ですね。


パラメータが多い分、カーブフィッティングになり易いですが、
ある程度の将来の値動きが予測できる場合は有効かもしれません。

そこのところは、裁量が必要かと思います。


今回はこの辺で。

次回は、MetaboNewNice戦略研究について書こうかと思ってます。


皆様の応援のおかげで→FXシステムトレード派1位になっております!

応援ありがとうございます!
→FXシステムトレード派
→rank応援クリック
→人気ブログランキング

タグ

2008年1月 3日|コメント (4)トラックバック (0)

カテゴリー:MetaTrader EA

プレゼントに関するお知らせ

明けましておめでとうございます!


さて、新年一回目の記事は年越し&お年玉プレゼント終了のお知らせと
今後の記事の予告です。


去年12月29日より始まりました年越し&お年玉プレゼント企画は
明日1月3日夕方頃に終了とさせていただきます。
ダウンロードされてない方は急いで見つけて下さいね!

今回たくさんの反響がありましたので、またプレゼント企画をやりたいと思います!!
次回は、予告なしでまた隠れたダウンロード先を設置いたします。
設置時間は24時間ほどと考えています。お楽しみに!


今回のプレゼントVolAveP2008_1.ex4 の説明をもう一度いたします。


VolAveP2008_1.ex4の説明

利益を保証するものではありません。
取引は、自己責任でお願いいたします。

有効期限は2008年1月末までです。
USDJPYの一時間足を使います。
損小利大ではありません。
損少々利多を目指しております。
統計データに基づいた小さな波をキャッチ。
10ピプスをきっちりゲットを目指します。
取引頻度は平均1回/1日。取引無しの日が続く事もあります。
複利・単利を選べます。(複利はレバレッジ10倍)
コツコツ型ですので、爆発的な利益は望めません。


今後の記事

zyx40さんの戦略研究報告
MetaboNewNice戦略の研究報告
最近気になるブログ人気FXブログランキング現在1位の戦略研究報告

を予定しております。
また、質問・要望などございましたらぜひコメントまたはメールでお願いします。


応援ありがとうございます!
→FXシステムトレード派←現在1位
→rank応援クリック
→人気ブログランキング

2008年1月 2日|コメント (3)トラックバック (0)

カテゴリー:その他

緊急告知!

お年玉企画前倒し?!

日ごろの感謝の気持ちとして、クリスマスプレゼント企画に引きつづき、
お年玉企画をと考えていましたが、スケジュールの関係で日程前倒し、企画変更です。

今回は、年越し&お年玉プレゼントとして、
前回と同様、VolAveP2008_1.ex4 をプレゼント!

前回ダウンロードできなかった方は、是非ダウンロード・リンクを見つけてくださいね!
(リンク元は前回とは違う場所にしました^^;)


VolAveP2008_1.ex4 の説明

まずはじめに
VolAveP2008_1.ex4は利益を保証するものではありません。
取引は、自己責任でお願いいたします。


MetaTrader4のExpert Advisor としてご利用いただけます。
ダウンロード先は、こちらの記事でご確認ください。

有効期限は2008年1月末までです。
USDJPYの一時間足を使います。


特徴
VolAveは損小利大ではありません。
損少々利多を目指しております。
統計データに基づいた小さな波をキャッチ。
10ピプスをきっちりゲットを目指します。
取引頻度は平均1回/1日。取引無しの日が続く事もあります。
複利・単利を選べます。(複利はレバレッジ10倍)
コツコツ型ですので、爆発的な利益は望めません。


その他、質問や感想などコメントお待ちしております(^0^)/

応援ありがとうございます!
→FXシステムトレード派
→rank応援クリック
→人気ブログランキング

2007年12月29日|コメント (21)トラックバック (0)

カテゴリー:その他