あれですね。


さっきのブログを書いてるうちに気づいたんですが。


重要なところに間違いがありましたね。


その箇所というのは、


//もし買いポジションだったら
if(OrderType()==OP_BUY)
{
//変動幅が目標pipsより大きくなったらストップロスをあげる
if(Open[0] - Close[0] > EL * Point)
{
OrderModify(OrderTicket(), OrderOpenPrice(),Close[0] - SL * Point, OrderTakeProfit(), 0, Yellow);
return(0);
}
}


ココ!


これだと買いポジションなのに値が下がったら、


ストップロスを上げる感じになっちゃいますね。汗


しかし、このシステムでも利益が出てるって、


一体どうなってるのやら・・・。


正しくは


//もし買いポジションだったら
if(OrderType()==OP_BUY)
{
//変動幅が目標pipsより大きくなったらストップロスをあげる
if(Close[0] - Open[0] > EL * Point)
{
OrderModify(OrderTicket(), OrderOpenPrice(),Close[0] - SL * Point, OrderTakeProfit(), 0, Yellow);
return(0);
}
}


こうすれば買いポジションで値が上がったときストップロスが


上がるようになります。(売りポジションのトコも逆にしてください)


そして前々回のブログで利益の推移を表したグラフを


あげていましたが、直したことでこうなりました!



EA倉庫

ちなみに下のが訂正前

EA倉庫

あんまり変わってないじゃん!苦笑


でも利益は少し良くなってる・・・。


ということで、何かココ間違ってね?


てなトコあったらご連絡お待ちしております!





資産運用を学ぶなら!投資教育のリーディングカンパニー
日本ファイナンシャルアカデミー

今日は前回のStrawberryMACDのソース解説です。


変数宣言などありきたりなとこは省きつつ説明したいと思います。


まずはソースを軽く見てください!


------------------------------------------------------
//MACDのメインの日数
extern int mdf = 9;
//MACDのシグナルの日数(
extern int mds = 18;
//MACDの平均線の日数
extern int mdsma = 9;
//ストップロス幅
extern int SL = 50;
//エレベーター幅
extern int EL = 50;
//ロット数
extern double lots = 0.1;

int init(){
//----

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

int deinit(){
//----

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

int start(){
//----
//変数宣言
double SL_A,SL_B,TP_A,TP_B;
double MACD_f,MACD_s;
int CurrentPosition;

//MACDのメイン
MACD_f = iMACD(NULL,0,mdf,mds,mdsma,PRICE_CLOSE,MODE_MAIN,0);
//MACDのシグナル
MACD_s = iMACD(NULL,0,mdf,mds,mdsma,PRICE_CLOSE,MODE_SIGNAL,0);

if(OrdersTotal()<1){
//もしMACDがゴールデンクロスしたら買い
if(MACD_f < MACD_s){
SL_A = Ask - SL * Point;
OrderSend(Symbol(), OP_BUY, lots, Ask, 3, SL_A, 0, "Buy", 0, 0, Blue);
return(0);
}
//もしMACDがデッドクロスしたら売り
if(MACD_f > MACD_s){
SL_B = Bid + SL * Point;
OrderSend(Symbol(), OP_SELL, lots, Bid, 3, SL_B, 0, "Sell", 0, 0, Blue);
return(0);
}
}
else{
//ポジションの選択
OrderSelect(CurrentPosition,SELECT_BY_POS);

//通貨ペアの確認
if(Symbol() == OrderSymbol())
{
//もし買いポジションだったら
if(OrderType()==OP_BUY)
{
//変動幅が目標pipsより大きくなったらストップロスをあげる
if(Open[0] - Close[0] > EL * Point)
{
OrderModify(OrderTicket(), OrderOpenPrice(),Close[0] - SL * Point, OrderTakeProfit(), 0, Yellow);
return(0);
}
}

//もし売りポジションだったら
else if(OrderType()==OP_SELL)
{
//変動幅が目標pipsより大きくなったら利確をあげる
if(Close[0] - Open[0] > EL * Point)
{
OrderModify(OrderTicket(), OrderOpenPrice(), Close[0] + SL * Point, OrderTakeProfit(), 0, Purple);
return(0);
}
}

}
}


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

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


ソースはこんな感じになるんですが、


//MACDのメイン
MACD_f = iMACD(NULL,0,mdf,mds,mdsma,PRICE_CLOSE,MODE_MAIN,0);
//MACDのシグナル
MACD_s = iMACD(NULL,0,mdf,mds,mdsma,PRICE_CLOSE,MODE_SIGNAL,0);


まずこの部分でMACDのメインとシグナルの計算をしてます。

「mdf,mds,mdsma」この部分は一番上で宣言している変数なので、

期間を変えたりしたい人は一番上の数値を変えるだけでいいです。

MACDは元々関数があるので、自分で関数を作らなくていいので

楽ですね~。


そして次に売買の命令を出すトコですね


if(OrdersTotal()<1){
//もしMACDがゴールデンクロスしたら買い
if(MACD_f < MACD_s){
SL_A = Ask - SL * Point;
OrderSend(Symbol(), OP_BUY, lots, Ask, 3, SL_A, 0, "Buy", 0, 0, Blue);
return(0);
}


ここではまず「if(OrdersTotal()<1)」ポジションを持っているか

確認してます。これをやらないとMACDがゴールデンクロスより上の

とき足ができるたびに毎回買い注文しちゃいます。(ゴールデンクロス

をした瞬間だけ買い注文をすることもできますが、自分の場合は

トレンドが転換する瞬間よりもトレンドの波に乗っているときに売買

するほうが好きなのでこうなってます。)


そして「if(MACD_f < MACD_s)」っていうとこでMACDが

ゴールデンクロスしたら買い注文に入ります。


ちなみに買い注文の前に「SL_A = Ask - SL * Point;」というのが

ありますが、これはストップロスの値を計算しているだけです。

ここで計算しなくても「Ask - SL * Point;」を次の命令のSL_A

ところにいれれば変わりないですが、EA作成中この変数を

よく変える場合はこうしたほうが、いちいちコピペなどの面倒が

ほんとに微妙ですが少なくなる場合があるので自分はこうしてます。


そして「OrderSend(Symbol(), OP_BUY, lots, Ask, 3, SL_A, 0, "Buy", 0, 0, Blue);」というところで買い注文ですね。

ここではロットは上のところで宣言した「0.1」が入るはずです。

「SL_A」は今説明したストップロスの値が入ります。

設定では「50」になっているので注文するタイミングの

ASKの50pips下にストップロスを置くことになります。

テイクプロフィットは「0」です。なぜなら前回のブログで話したように

利益をどこまでも追求するエレベーターのシステムのため、

一回上がったらストップロス自体がテイクプロフィット

になるからです。


注文のところはこんなところでしょうか。売りの説明は買いと

一緒なので省かせていただきます。


次にエレベーター部分ですね。どちらかというとMACDのとこより

ここのが重要ですね。

正直買うタイミングはMACDじゃなくとも、ランダム買いで

利益とれるかもしれないですね。


if(OrderType()==OP_BUY)
{
//変動幅が目標pipsより大きくなったらストップロスをあげる
if(Open[0] - Close[0] > EL * Point)
{
OrderModify(OrderTicket(), OrderOpenPrice(),Close[0] - SL * Point, OrderTakeProfit(), 0, Yellow);
return(0);
}
}


まず買いポジションで「if(Open[0] - Close[0] > EL * Point)」

ですが、この「Open[0] - Close[0]」「今回の始値-終値」

つまりひげ部分を除いて値が動いた幅がということです。

そして「> EL * Point」エレベーターの幅より大きい場合

になります。つまり、「今回動いた幅が50pips以上なら」次の

注文を変える命令に移ります。

「OrderModify(OrderTicket(), OrderOpenPrice(),Close[0] - SL * Point, OrderTakeProfit(), 0, Yellow);」

この「OrderModify」ていうのはClose( )とは違いすでに持って

いるポジションの注文を変える命令です。

ここでは「Close[0] - SL * Point」だけ注目してもらえばいいです。

他は前の注文と一緒になるだけですから~。この変数はといいますと、

「今回の終値より50pip下にストップロスを設定する」ということに

なります。つまり、値が上がった分ストップロスの値もいっしょに

上がっていくわけです。

(今回もポジションが売りだった場合は買いと同じなので省きます)

というわけで、ソースの説明は以上!



こうやって見るとめちゃくちゃシンプルなプログラムですね~汗


このEAは波に乗るまでひたすらストップロスし続けるので、

もっとガシっと波に乗れるようにすれば、バシッと稼いでくれる

EAになると思うので、皆さんも改良してみてください。

(そして完成したら見せてください・・・ボソ)


では自分はもっといいEAができるよう研究に励みますので

皆さんもグッドラック!





資産運用を学ぶなら!投資教育のリーディングカンパニー
日本ファイナンシャルアカデミー

現在作成中のEA「StrawberryMACD」です。


売買システムは言いますと

(まあ名前を見れば分かると思いますが・・・)


ポジションを持っていないとき、MACDのメインが


シグナルより上なら買い。下なら売り。


という至ってシンプルなもの。


EAをある程度知っている人なら分かると思いますが、


これだけでは利益が出るわけ無いですよね。


自分はこれに


ストップロスをエレベーター式に上げていくシステム


を追加しました。


つまり、買いポジションを持ったとき、もし終値が前より


大きくなったらストップロスを上げていく。といった感じです。


こうすることで一回上がったらそれ以下の損害は出ませんし、


上がるとこまでとことん利益を取りにいきます。


このシステムは結構使われているシステムのひとつですが、


自動売買に組み込むことで24時間監視し、


注文内容をその都度勝手に変更していってくれるので、


システムをいかんなく発揮できていると思います。


ちなみにバックテストでは次のようになりました。



EA倉庫

稼ぐときはめっちゃ稼ぎまっせ!といった感じですね。


ただ2000年5月から2010年5月までのバックテストでしたが、


Total net profitが4724.05しかないです。


これも稼ぐまでちょこちょこと資産を削られていくのが


原因と思われるので、課題としては


「トレンドを掴む」、「削られる量を減らす」


を次のEAまでに改善したと思います。


次回ソースコードをアップ&ちょこっと解説したいと思います。


では、グッドラック!