FXやその他投資についてのつれづれです
× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
こんにちは。(*'-')
2週間ぶりに仕事が休めたので久々にMT4いじりました(;'-') さて、今回のEA改造はというと 121証券みたいに20Pip以内の指値ができない対応として 注文も決済も成行でできるように改造しましたよ これができると、1Pipの利益でも決済することができて高い勝率を 期待するのです(・∀・) ソースファイルはこちら→ダウンロード(mq4) ソースの解説は・・・ 今回いじりすぎて、どこが変わったか忘れちゃったからなし!(・∀・) けっこう大変だったんですよ。今回ヽ(´Д`;)ノ だから今回なし! というわけでいつものパラメータでまずはバックテストを(・∀・) いつもの曲線とほぼ同じ曲線が出ていますね(*'-')b でもこれ、1000ドル近く低いんですよねぇ・・・ まあ、細かいことは気にしない!(・∀・) さて次は本命の1Pip取りいってみましょうか なんという右肩下がり(´・ω・`) 中身を細かく見てみると、典型的な小利損大状態でした。 頭で考えるのと現実はなかなか一致しないものですね(*'-') PR
こんばんは(*'-')
今回はEAによくついている機能のマネーマネージメント(MM)を追加してみました。 あとは、マジックナンバーを判定して自分のエントリーだけを操作するようにしてみましたよ(・∀・) 対応したソースはこちら→ダウンロード(mq4) MM機能の実現にむけて、いくつかフリーで出ているEAを調べてみました。 いくつかのEAでは、口座残高に対していくつレバッジをかけるかでロット数を 決定していたので、私もそれで実装してみましたよ。 上から順に変更部分の解説 まずは外部パラメータの追加です --------------------------------------------------- // マジックNo extern int iMagicNo = 307004; //マネーマネージメント用 extern bool bMM = false; extern int iRisk = 1; extern double dVs_Usd = 0.01; extern double dMax_Lots = 50.0; extern double dMin_Lots = 0.1; --------------------------------------------------- マジックNoは、「このEAが出した注文はこれですよ」ってのを特定するID みたいなものですね。これを判定して自分が出した注文か特定するようにします(・∀・) MM用としては、まずMM機能を使うかどうかのフラグをbMMとして宣言します つきのiRiskは、1万ドルに対してレバッジをいくつにするかの数値です 口座残高が1万ドルでiRiskが1のときに0.1ロットの注文をだすんですね。 dVs_Usdってのは・・・私は121証券に口座があって、そこでは円口座なわけです でも、MT4対応の業者は海外でドル建ての口座になるので、ロジック変更無しで 対応したいなと思って追加しました。1ドルに対しての比率を入れます。 円建て口座の場合は0.01くらいにしておくと、100万円で0.1ロットになるようにします また、ドル建て口座の場合は1にしておきます dMax_Lotsと、dMin_Lotsはそれぞれ名前のとおり、これ以上(以下)になったら そこまでに収めるための値です 次に、計算したロット数を格納するを内部変数にします --------------------------------------------------- //ロット数(実態) double dEntry_Lots=0.1; --------------------------------------------------- MMで計算したロット数を格納します。 詳しくはロジックで('∇') MM機能を呼び出すロジックの追加です --------------------------------------------------- //ロット数の計算 MM(); --------------------------------------------------- まあ、関数の名前のセンスはあれですが、MM自体を関数化したのでねw 注文時のパラメータ変更 --------------------------------------------------- OrderSend(Symbol(), OP_BUYSTOP, dEntry_Lots, Ask + dEntryPip, iSlip, dStopOrder, dLimitOrder, "売り注文", iMagicNo, 0, CLR_NONE); --------------------------------------------------- ここで外部パラメータのiMagicNoを使用します。 また、dLotsからdEntry_Lotsへ変更しています。 次にマジックNoでの判定を追加です --------------------------------------------------- bool bSelected = OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(bSelected == true && OrderMagicNumber() == iMagicNo){ --------------------------------------------------- 注文を特定するロジック(トレーリングストップや、クローズ処理など) でOrderSelect後にOrderMagicNumber()と、注文を出したときのiMagicNo が一致するかどうか判定を追加しています 最後にMM機能の関数を追加です --------------------------------------------------- double MM(){ if(bMM == true){ dEntry_Lots = AccountEquity()*dVs_Usd/100000*iRisk; dEntry_Lots = MathMin(dMax_Lots,MathMax(dMin_Lots,dEntry_Lots)); dEntry_Lots = NormalizeDouble(dEntry_Lots,1); }else{ dEntry_Lots = dLots; } return(dEntry_Lots); } --------------------------------------------------- 関数の最初でMM機能を使うかどうか判定します。 使わなければ、外部パラメータのdLotsを使用します MMを使う場合、まずAccountEquity()で口座残高を取得します 口座残高をドルだとどれくらいになるかdVs_Usdで計算します。 あとはそれを10万で割って(1万ドルで0.1ロットになるように)からiRiskを掛ければ、 基本的なロット数が出てきます 2行目ではMathMaxを使って、計算して出た結果か、最小ロット数か大きいほうを出しています 口座残高が1万円とかだと0.001ロットになるので、そういう場合は0.1ロットになります 次にMathMinをつかって、最大ロット数と比較し、小さい方を出しています。 3行目では、計算で出すと0.113とかになってしまうので、小数第1位で 四捨五入しています で、結果をdEntry_Lotsに格納して、いざトレードのときのロット数にしているわけですね(・∀・) このEAでMM機能をONにしてiRisk を1に設定してバックテストしました 下の緑の線はロット数を意味してるのですが、後半で長くなっていますね 15000ドルを超えたところで見事に0.2ロットでエントリーしていますヽ( ゚∀゚)/ めでたく機能追加完了(・∀・) 次はどんな機能を追加しましょうかねぇ・・・(*'-')
こんにちは(*'-')
前回のエントリーで今まで作っていた定時時間売買EAはクロス円でしか 使えないことが判明しました(;'-') そんなわけでその対応です(・∀・) 対応したソースはこちら→ダウンロード(mq4) 変更した部分の解説です まずはdouble型でextern宣言していた エントリーするPipとリミットとストップ値を int型で宣言しなおしました(EAの起動パラメータですしね) ----------------------------------------------------- //エントリーするPip //extern double dEntryPip=0.2; extern int iEntryPip=20; //リミットとストップ値 //extern double dLimit=0.2; //extern double dStop=0.2; extern int iLimit=20; extern int iStop=20; ----------------------------------------------------- 元のdouble型の変数をextern宣言をはずして 宣言しなおしました ----------------------------------------------------- //エントリーするPip(実態) double dEntryPip=0.0; //リミットとストップ値(実態) double dLimit=0.0; double dStop=0.0; ----------------------------------------------------- で、init関数の中で、EAか稼動しているチャートの1Pipの単位と extern宣言した値を掛け算すると、期待通り20Pip分の数値が取れます ----------------------------------------------------- dEntryPip = iEntryPip * Point; dLimit = iLimit * Point; dStop = iStop * Point; ----------------------------------------------------- EAが稼動しているチャートの1Pipの単位はMT4の宣言済み変数のPoint ってやつに格納されています。ドル円なら0.01が、ユロドルなら0.0001が 入ってるのですね なんと、今回の修正はこれだけ!(・∀・) (初めからそう作っておけばこのエントリーいらないんじゃないか? というツッコミは無しで・・・(;'-')ダッテシラナカッタシ・・・) ちゃんと動くか検証として、ポン円の一番PFの高かったパラメータでテスト実施 ほらほら、ちゃんと同じような結果がでていますよヽ( ゚∀゚)/ さて、それでは本命のユロドルでバックテスト開始! はうあっΣ( ̄ロ ̄) なんとも見事な負けっぷりだ・・・ ま、まあユロドルとかにも対応できたのでOKですね(*'-')b
こんばんは(*'-')
前回作成したGBPJPY14時エントリーEAにトレーリングストップ機能を追加しました (ついでに、いくつかの設定値をパラメータ化しました) ソースファイルはこれです→ ダウンロード(mq4) EAのパラメータ化は、関数の外に変数を定義して、先頭に extern とつけると、実行時のダイアログにパラメータとして表示されるようになります。 今回パラメータ化したのは ・エントリー時分 ・クローズ時分 ・エントリーするための設定Pip ・リミット値 ・クローズ値 ・スリップページ数 ・ロット数 をパラメータ化しました。 これでバックテストなどをするときにいちいちソースを書き換えて再コンパイル しなくてすむようになります。 次に本題のトレーリングストップ機能ですが、再利用しやすいように 関数化しました。(・∀・) int TralStop() て関数がそれです。 ロジックの解説としては、まずポジションを持ったオーダーを特定します ここはクローズのロジックと同じですね ポジションを持ったオーダーを特定したらトレールするかしないかの判定です 私が理解しているトレールの動作は 「含み益状態のときに、ストップ注文を含み益中の最高値-トレール幅に設定する」 ということなので、まずポジションが含み益状態か判定しています。 これで前半部分はOK 後半の部分は、注文が通った後の最高値を記録していくのは 現在の売値(買値)とストップ値の差がトレール幅を上回ったら、トレール幅におさまる ようストップ値を変更するということにしておきましょう 条件がそろったら、OrderModify関数でストップ値のみ変更して注文をだしております。 ちなみに、この関数をほかのEAに移植するばあい、 extern double dStop=0.2; の変数も一緒にもっていけば移植可能になります。 (この関数自体に改善の余地はたっぷりありますけどねw) これらの追加変更によって、メインのロジックも少し手をくわえました。 まずはトレールする/しないを判定するためのフラグを追加して フラグがtrueだったらトレーリングストップの関数を呼び出します (Tick単位でトレールロジックは稼動するわけですね) また、このEAの参考になったルールではリミット値は設定しないことになっているので dLimitが0だったときはリミット値をつけないように変更しております。 (ついででストップ値もやっちゃいました) トレーリングストップ機能をONに、リミットの設定なしで、前回と同じ条件で バックテストをしてみると・・・・ やっぱり右肩下がり(´・ω・`) でも前回と違って多少持ち直してる部分がでていますね。 とりあえず機能は追加できたのでこのあたりで・・・ 次回は、また機能追加か、このEAで勝てる設定の探りをやってみたいと思います(*'-')
こんばんは(*'-')
とうとう、実際に売買を行うEAを作成しました。 売買ルールの元ネタは某巨大掲示板に乗っていたこんなルールです。 ---------------------------------------------------------------------------------------- んじゃ晒すよ。 前スレから起点から逆指値で注文してリミット10ストップ40ってやり方について調べてたじゃん。 あのやりかたの変型版なんだけど。やり方としては、まず ペアはポン円。起点とする時間は日本時間の14時。14時に逆指値で上下20ピピにLSの注文を入れる。 それで、肝心なのがリミットとストップは入れないこと。っていうかトレールを使う。つまり、利はなるべく伸ばそうってこと。 1時間足のデータ見てると動くときはものすごい勢いで動いてるのがわかったからそういうときに10ピピだともったいないしね。 トレールは最初は25でじょじょにあげていく。 起点が210円だとしたら210.2にLの注文を入れて、トレールは25ピピ。210.55を超えたらトレール30ピピ。 210.70を超えたらトレール35ピピ、210.75以上はトレール40ピピ。 高値からトレール分下がったらストップになる。つまり、負けの場合20でエントリーされて1ピピも上がらずに25下がった場合でスプ入れて-30ピピ。 30まで上がって05まで下がった場合スプ入れて-20ピピの負けになる。 このトレールの数字とか時間、ペアには特に理由があって設定したわけじゃないけど、とりあえずこれで2008年の1月~6月まで1時間足で見てみた。 1月。22日でL19回、S22回エントリー。同値撤退以上の回数がL9回で合計154ピピ。Sが13回で480ピピ。1月トータルで634ピピ 2月。21日でL18回、S18回エントリー。同値撤退以上の回数がL5回で合計-68ピピ。Sが11回で444ピピ。2月トータルで376ピピ 3月。21日でL19回、S18回エントリー。同値撤退以上の回数がL9回で合計32ピピ。Sが5回で-119ピピ。3月トータルで-87ピピ 4月。22日でL19回、S19回エントリー。同値撤退以上の回数がL6回で合計23ピピ。Sが11回で316ピピ。4月トータルで339ピピ 5月。22日でL19回、S18回エントリー。同値撤退以上の回数がL10回で合計274ピピ。Sが8回で-1ピピ。5月トータルで273ピピ 6月。21日でL15回、S17回エントリー。同値撤退以上の回数がL2回で合計-142ピピ。Sが10回で606ピピ。6月トータルで466ピピ 半年合計でLが109回エントリー中41回プラス。合計273ピピ Sが112回エントリー中58回プラス。合計1728ピピ こんな感じの結果です。1月平均300ピピほどでした。 1時間足での検証なので、見えない部分もあり、本当はストップに刈られていたりもあるかもしれないですが。 トレール幅などは適当に決めたので変えれば結果はもっと良くなるかもしれないし、悪くなるかもしれません。 そして、トレールの幅をじょじょに上げていくため、エントリー中はチャートをずっと見て自分で変えていかないといけません。めんどいですが ご意見、質問などあればどんどんどうぞ。 おそらくこれだと思う。俺もこれで今勝ててる ---------------------------------------------------------------------------------------- つまりポン円で日本時間の14時の価格から+-20Pipずつにストップで売買注文を出す というルールですね (トレーリングストップも機能として必要だけど、それは後回しということで・・・) このルールを元にEAを作成しました ソースはこれ→ダウンロード(mq4) これをつかって、ポン円の15分足をつかって2007年1月1日から2008年12月31日までの バックテストをしてみましたよ。 結果はこれ↓ ん~。 見事な右肩下がり(´Д`;)ヾ 次からは、このEAを元にして、トレーリングストップとか色々な機能を付加していきたいと思います(*'-') |
カレンダー
カウンター
プロフィール
投資は自己責任・自己判断で実施するようお願いいたします。
ここの情報を見て損失が発生しても責任は負えませんのでご注意してください
HN:
Aki
性別:
男性
最新コメント
[06/06 fxjol]
[02/18 FXに人生を賭ける男]
[01/01 Aki]
[01/01 Aki]
[12/31 FXに人生を賭ける男]
最新記事
ブログ内検索
最新トラックバック
アクセス解析
|