Sasahiko’s diary

FX自動売買EA開発者/GOLDでの取引をLIVE配信中

FX自動売買EAを実装してみよう9(MACD ver3)

概要

この記事では,FX自動売買初心者向けに実装の解説します。

EAの実装をしたことない方から基本を振り返りたい方へ向けた記事となります。

※FXでの取引は自己責任となります。ご了承ください。

 

FX自動売買の振り返り

FX自動売買の始め方について数本の記事で解説をしてきました。

FX自動売買EAの始め方(初心者用) - Sasahiko’s diary

最低限のコード実装について(FX自動売買EAを実装してみよう2(最短コード実装) - Sasahiko’s diary)の解説やバックテストの見方について解説をしました。

今回の記事ではMACDを使ったEAを改善していきます!

 

前回に実装したコード

買い注文条件:MACD<0&&MACDとシグナルがゴールデンクロス&保持ポジション0

決済条件:MACDがシグナルを下回った&保持ポジション1

(売り注文も同様に行う)

 

前回のコードの取引結果(USD/JPY)

取引結果を以下に示します。前回よりも取引回数が増えた分,負け分が大きくなってしまいました。

f:id:Sasahiko:20210803083416p:plain

 

前回のコードの問題点

前回のコードでは,MACDの正負とクロスのみで判定をしていました。

しかし,MACDとシグナルが均衡している状況では,注文と利確を繰り返すことになります。(実際,上図ではそのようになっている。)

 

今回実装するコード

前回コードとの相違点は以下となります。

1.決済条件をクロスではなく,金額で行う

2.注文ロット数はMACDの変化量と比例させる

3.マーチンナンピンを入れてみる

上記を考慮したコードは以下になります。

#property copyright "Copyright 2021, Sasahiko 2021.07.21"
#define MAGIC 0001
int _,f=0, Ticket = 0;
double lots = 10;
double S1,S2,M1,M2,ask,bid,v1,v2,t,s;

void OnTick(){
ask = MarketInfo(Symbol(),MODE_ASK);
bid = MarketInfo(Symbol(),MODE_BID);
S1 = iMACD(NULL,PERIOD_M15,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
S2 = iMACD(NULL,PERIOD_M15,12,26,9,PRICE_CLOSE,MODE_SIGNAL,2);
M1 = iMACD(NULL,PERIOD_M15,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
M2 = iMACD(NULL,PERIOD_M15,12,26,9,PRICE_CLOSE,MODE_MAIN,2);
s = fabs(M1-M2);
if(f==0){
if(S1<M1 &&M1<0 &&M2<S2){
t=TimeCurrent();
v1=ask;
f+=1;
Ticket = OrderSend(Symbol(),OP_BUY,lots*s,Ask,0,0,0,NULL,MAGIC);
}
if(0<M1 &&M1<S1 &&S2<M2){
t=TimeCurrent();
v1=bid;
f-=1;
Ticket = OrderSend(Symbol(),OP_SELL,lots*s,Bid,0,0,0,NULL,MAGIC);
}
}
if(0<f){
if(f<5&&int(TimeCurrent()-t)>60*15&& S1<M1&& M1<0&& M2<S2){
t=TimeCurrent();
v1+=ask;
f+=1;
Ticket = OrderSend(Symbol(),OP_BUY,lots*s*f,Ask,0,0,0,NULL,MAGIC);
}
if(f*bid-v1<-5.0||0.1<f*bid-v1){f=0;Close_all();}
}
if(f<0){
if(-5<f&&int(TimeCurrent()-t)>60*15&&0<M1 &&M1<S1 &&S2<M2){
t=TimeCurrent();
v1+=bid;
f-=1;
Ticket = OrderSend(Symbol(),OP_SELL,lots*s*(-f),Bid,0,0,0,NULL,MAGIC);
}
if(v1+f*ask<-5.0||0.1<v1+f*ask){f=0;Close_all();}
}
}


void Close_all(){
for(int i=OrdersTotal()-1;i>=0;i--){
if(OrderSelect(i,0) == True){
_ = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),20);
}
}
}

 

バックテスト結果

f:id:Sasahiko:20210804084622p:plain

やはり,負けてしまいますね…

ネットを調べてみると,MACD単体ではきついようです…

もし,良い方法があれば教えてください!

 

以上,MACDの実装でした!!

お疲れ様でした!

 

まとめ

今回はMACDの実装改善に挑戦しました!

やはり損失ばかりになってしまいました…

次回は他のコードを試していきます!

 

twitter笹彦 fx自動売買EA開発者 (@trader_brothers) | Twitter

Instagramhttps://www.instagram.com/fxtrader_sasahiko/

YouTube笹彦(FX Trader Sasahiko) - YouTube

tiktokhttps://www.tiktok.com/@fx_eatradersasahiko