2008年5月の記事一覧

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


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

タグ

2008年5月31日|コメント (1)

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

サイコロジカルライン


前回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逆引き大全集】

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


でわ、このへんで!

2008年5月27日|コメント (9)

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

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)

カテゴリー:MetaTrader EA