今日は前回の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ができるよう研究に励みますので
皆さんもグッドラック!
資産運用を学ぶなら!投資教育のリーディングカンパニー
日本ファイナンシャルアカデミー
