PipSHakerのアルゴリズム2

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()関数を作っています。

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


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

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


でわ、このへんで。

タグ

2008年6月 1日|コメント (17)

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

コメント (17)

なかなかソースを見る時間がなかったのですが、説明文と並べて一通り眺めさせていただきました。

自分の理解力では、まだ理解出来ない部分が多々あります。

買い売り共に、それぞれ最大で2つづつボジションをとって、利益で損失を相殺する感じなんですかね?

利益が出ない場合はストップロスまで保有するんですよね?

RefreshRate()と言う関数と、CloseWin()関数でif(OrderCloseTime()==0)とあるのは何をしているのでしょうか?

あと、バックテストを行うと1日分しか行わないのは何故でしょうか?

あれこれ聞いて、すいませんm(__)m

投稿者:えぎ |2008年6月 8日 17:56

えぎさん

こんばんは。
RefreshRate()とif(OrderCloseTime()==0)は
PipMakerV9-1の流れをそのまま使っています。
詳しくは分かりませんが、
RefreshRate()はレートの再読込み、
if(OrderCloseTime()==0)は、まだクローズされていないことを確認しております。

無くてもバックテストでのパフォーマンスは変わりませんが、if(OrderCloseTime()==0)をなくした場合、時々エラー表示があるので、一応つけているといった感じです^^;

PipShakerの取引方法はリスクが高く、
PipShakerOneは、エントリ→ポジションが無くなったら終了という1回こっきりのEAにしてあります。

//TrendSign

のブロックの

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

の部分のエントリ条件を変えると、
取引を続けるEAに改造できるかと思います。


また、気づいた点とかございましたら、何でもいってくださいね!

投稿者:慶次 |2008年6月 8日 19:47

早速のご返答、ありがとうございます。

なるほど。
if(OrderCloseTime()==0)は、まだクローズされていないこと、ですか。
なるほどなるほど。


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

上記は最初のエントリーのときの判断ですよね?
で、2度目以降のエントリーは移動平均で・・・と思っていたのですが、違うのですか?
最初のエントリーのみランダム的に買いか売りかを選んでエントリーし、その後は移動平均でエントリーシグナルを得てポジションを持つものだと思っていました。

・・・どうもまだ理解出来ていないようです・・・。

投稿者:えぎ |2008年6月 9日 00:22

えぎさん

おはようございます。

ポジションがあるときのエントリーは移動平均で・・・といった感じです。

保有ポジションが無くなったら、また最初の条件のところで判断する感じですね!

PipShakerOneは、パラメータでエントリの条件を設定していますが、それを変更し、
trade1==false
という条件も無くせば、次のエントリもするようになるかと思います。

投稿者:慶次 |2008年6月 9日 08:01

おはようございます。

ポジションがあるときのエントリーは移動平均なのに、最初のエントリーがランダムエントリーなのは何か理由があるのでしょうか?
最初のエントリーも移動平均にしたら、エントリーの条件がひとつになるのでロジック的にスッキリするのでは?
と考えたのですが、これも素人考えですかねw
なにか理由があるのであれば、まさに素人丸出しで恥ずかしい限りですが・・・w

投稿者:えぎ |2008年6月 9日 08:08

えぎさん

PipShakerV4では、エントリーは移動平均とその他フィルタを用いてエントリしています。
しかし、リスクが大きい取引方法ですので、
単発バージョンを作ったという感じです^^;

投稿者:慶次 |2008年6月 9日 09:43

なるほど…。

と言うことは、通常バージョンは常にポジションをとり続ける訳ですね?
では、取引する時間帯を決めてみたり、取引の条件を絞り込んだりしたら、ほどほどの頻度の取引量でエントリーやエグジットを行いませんかね?

素人な意見ですが(笑)。

投稿者:えぎ |2008年6月 9日 13:32

えぎさん

そういうことです!

投稿者:慶次 |2008年6月 9日 15:12

では、自分もソースを元にイジらせていただこうと思います。

自分の技術力で出来るか、が問題ですね(・∀・)

投稿者:えぎ |2008年6月 9日 17:14

久しぶりに書き込みさせていただきます。

楽しみに拝見させていただいているのですが,知らぬ間に頭をかかえることが多くなってきてます(笑)

質問なのですが,一定期間(20日程度)におけるEAの損益を取得する関数というのは作ることが可能でしょうか?

該当口座の全損益を取得する方法はあると思うのですが,一定期間の損益を取得するとなると,検討がつかなくなっています。

もし可能でしたら,どんな風になるのか教えていただけると非常にありがたいのですが・・・。

図々しいお願いになると分かっていますが,よろしくお願いします。

投稿者:simanamio |2008年6月11日 17:23

simanamioさん

おはようございます。

チョット調べてみますので、少しお待ちくださいね!
また、具体的に例えばどんな状況で使う感じなのか教えていただければ、イメージしやすいかと思いますので、よろしくお願い致します^^;

投稿者:慶次 |2008年6月12日 08:49

こんばんわ 
いきなりのお願いをしてしまい,申し訳ありません。

実は,ブログ中の記事に紹介されていた「ランダムエントリー」を調べていて,非常に強いショックを受けました。仕掛けよりも,損切りの設定やポジションサイジングの方が重要。ということかなと思いました。 

 多くのEAでは,次の視点からマネージメント機能を付加しているようです。
 1 証拠金の何パーセントをリスクにさらすか
 2 直近のトレードで連続してn回負けたらロット数を下げる


ではEAの損益カーブをもとにしてポジションサイジングをすることができるとしたら,どうなるんだろう?というのが疑問の発端です。

一定期間におけるEAの収益をもとに「n日前の元本に対する,本日までn日間の損益」を指数として算出することができれば,次のような資金管理をすることが可能になるかと思います。
 ・ 一定のドローダウンをしていることをエントリーの条件にする(逆バリ思考)。
 ・ EAの損益カーブが右肩上がりの場合のみトレードする(順バリ思考)。
 ・ 損益指数が一定以上の場合はいったん手じまいする。
 
 マルチロット系ではなく,トレンドフォロー・カウンタートレード用のマネージングになるかと思いますが,発想の是非を含めて意見やお知恵を拝借できたら幸いです。

投稿者:simanamio |2008年6月12日 22:18

simanamioさん

こんばんわ。

そうなると、やはり変数または、ファイルで
仮取引履歴を作り、そこから損益カーブを導き出す感じですかね。

確率論で行くと、
過去の勝敗によって次の取引の勝率が変わることは無いらしいのですが、
システムの調子に偏りがあるのならば、有効かもですね!

投稿者:慶次 |2008年6月13日 19:44

慶次さん

>変数または、ファイルで仮取引履歴を作り・・・
 
 やはりそれ以外の方法はないみたいですネ
 外部データを参照するようなEAともなると,MT4偏差値の低い僕には,もはやお手上げです(>_<)

 エクセルだと期間中のドローダウンや損益指数を出すことはそれほど難しい作業ではないのですが,MT4・VT・エクセル,いずれも得意な分野があるということみたいですね。


>過去の勝敗によって次の取引の勝率が変わることは無いらしい・・・

 そう言われてみると,統計学上はそうなるように思います。
 だとすると有効性に疑問が沸いてきました(あらら・・)

 ちなみにエクセルで作ったシステムについて,「損益指数が一定値以下になった場合にのみトレードを開始する」という条件を手作業で実施したところ,トレード回数は減少,最大DDは減少,トータル収益は多少増といった現象が見られました。

複利運用する場合,「最大DDの減少」は非常においしいテーマになると思っているので,今回書き込みをさせていただいたような感じです。

 ただ,その結果も,ロジックが違うシステムで実験すると違う結果を出すかも知れません。お手を煩わせる前に,もう少し手作業で実験してみないといけませんね。

 場合によっては,「「MT4のバックテストデータをエクセルに渡して手作業で分析する」方法を効率化する。」というのもありかも知れませんし,いろいろやってみて,何か気づいたことがあったら,書き込みさせていただきたいと思ってます。

投稿者:simanamio |2008年6月14日 19:32

simanamioさん

おはようございます。

最大DDは減少,トータル収益は多少増は魅力的ですね!

MT4のバックテストデータをエクセルに渡して手作業で分析する方法はとても有効ですよね!EAでコード化して出力するより、分かりやすく融通が利くので私もそうしてます。

良い結果が出るといいですね!応援してます!

投稿者:慶次 |2008年6月15日 09:05

御無沙汰しています!

最近の調子は、いかがですか!

私は10point3の改良と、逆張スキャルと、トレンド系デイトレの3本立てで研究しています。

PipShakerの調子はいかがですか!

0.01Lotでしたら損切りせずに耐えられそうな感じもしますが、損切りを積極的にすべきかが研究課題になりそうですね。。

良い結果が出ることをお祈りしています! (^-^)

最近、Bogie等のニューラルネットワーク系を研究されている方がいると思いますが、慶次さんは、どう思われますか。

詳しいことは把握していないのですが、過去のデータを分析して未来を予測?しているのかと思ったのですが。。

トレンドの流れに乗っていくより効率的なのかな?と思っているのですが、うまく対応しているのでしょうか。。

最新のトレード法を研究することは良いことですよね!

良い情報がありましたら交換しあえると幸いです! 

それには、私も勉強しなくては。。(^-^)

投稿者:マーサー |2008年7月 9日 16:11

マーサーさん

おひさしぶりです!

去年のEAチャンピオンシップでトップがニューラルネットワーク系のEAでしたので、注目がされているのでしょうか^^;

PipShakerは、前に作ったEAでQQEを使ったものが順調に利益が出ているようです。

逆張りでは、最近出た商材の体験版で解析を試みていますが、ロジックはわからないですーー;

研究がんばりましょうね!

投稿者:慶次 |2008年7月10日 09:00

コメントを投稿する

(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)






画像の中に見える文字を入力してください。

Captchaの認証で入力ミスがありますと、コメントが消えてしまいますのでご注意ください。
コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。