完全自動売買への道のりのメニューは右サイドにあります→

2008年06月01日

PipSHakerのアルゴリズム2


今回は、前回のつづきです。


でわ、さっそく

オーダー部分です。

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 以上のとき、
 それをクローズ。

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

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

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

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

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


といった感じです。

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


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

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

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


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

void CloseWin()

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

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


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

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


でわ、このへんで。
posted by 慶次 at 19:41 | Comment(15) | PipMaker戦略研究
Ranking of FX→ FXシステムトレード派 人気ブログランキング 人気fxブログランキング

2008年05月31日

PipSHakerのアルゴリズム1


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



まずは、パラメータですが、内容は

http://samuraifx.seesaa.net/article/98000697.html

こちらの記事で確認してください。


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を決定します。


今日は、このへんで。
次回は、この続きでオーダーの部分からです。
posted by 慶次 at 19:40 | Comment(1) | PipMaker戦略研究
Ranking of FX→ FXシステムトレード派 人気ブログランキング 人気fxブログランキング

2008年05月27日

サイコロジカルライン

前回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.mq4ダウンロード


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

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



EAの作り方

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

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

double psycho;
/* for(i=SignalTiming; iClose[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.mq4ダウンロード


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

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



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


でわ、このへんで!
posted by 慶次 at 16:16 | Comment(2) | スキルアップ
Ranking of FX→ FXシステムトレード派 人気ブログランキング 人気fxブログランキング

2008年05月26日

PipShakerOne


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

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


→PipShakerOne.ex4


パラメータ

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

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

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

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

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

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


使用上の注意

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


基本的な動き

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

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


でわ、このへんで。
posted by 慶次 at 09:22 | Comment(11) | PipMaker戦略研究
Ranking of FX→ FXシステムトレード派 人気ブログランキング 人気fxブログランキング

2008年04月16日

PipShakerV4誕生!!



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

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

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


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


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

StrategyTester(PSV21999-2007m).gif



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



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

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


1999年
StrategyTester(PSV41999m2000).gif年利:188%


2000年
StrategyTester(PSV42000m2000).gif年利:442%


2001年
StrategyTester(PSV42001m2000).gif年利:167%


2002年
StrategyTester(PSV42002m2000).gif年利:242%


2003年
StrategyTester(PSV42003m2000).gif年利:1590%!


2004年
StrategyTester(PSV42004m2000).gif年利:3429%!!


2005年
StrategyTester(PSV42005m2000).gif年利:1572%!


2006年
StrategyTester(PSV42006m2000).gif年利:270%


2007年
StrategyTester(PSV42007m2000).gif年利:48%^^;


早速、デモ開始です。


でわでわ。
posted by 慶次 at 11:38 | Comment(12) | PipMaker戦略研究
Ranking of FX→ FXシステムトレード派 人気ブログランキング 人気fxブログランキング

2008年04月07日

PipMakerを改造



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

改造した点

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

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


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

→EURUSDのテスト結果

→USDJPYのテスト結果


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



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

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


でわこのへんで。
posted by 慶次 at 10:04 | Comment(15) | PipMaker戦略研究
Ranking of FX→ FXシステムトレード派 人気ブログランキング 人気fxブログランキング

2008年03月28日

聖杯EAの原石の原石!?

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

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

→PMsimple.mq4ダウンロード

また、報告お願い致しますm(..)m
posted by 慶次 at 19:10 | Comment(16) | PipMaker戦略研究
Ranking of FX→ FXシステムトレード派 人気ブログランキング 人気fxブログランキング

2008年03月26日

聖杯EAの原石!!

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

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

→PipMakerV9-1.mq4ダウンロード


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

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

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

TesterGraph(PM9TR3).gif

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


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


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

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

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


でわ、このへんで。

ありがとうございます。
posted by 慶次 at 09:14 | Comment(19) | PipMaker戦略研究
Ranking of FX→ FXシステムトレード派 人気ブログランキング 人気fxブログランキング

2008年02月18日

マネーマネジメント

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

→ht1000.xlsダウンロード


黄色いセルにそれぞれ、

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

を入力します。

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

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

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

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


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


でわ、このへんで。


応援お願いします!
→FXシステムトレード派
→rank応援クリック
→人気ブログランキング
posted by 慶次 at 11:21 | Comment(15) | スキルアップ
Ranking of FX→ FXシステムトレード派 人気ブログランキング 人気fxブログランキング

2008年02月11日

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

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

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

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

今回は、マネーマネジメントを除いた、
・ランダムエントリー
・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応援クリック
→人気ブログランキング
posted by 慶次 at 14:51 | Comment(9) | テクニカル検証
Ranking of FX→ FXシステムトレード派 人気ブログランキング 人気fxブログランキング