逆張りナンピンEAをつくる(5)
今回も逆張りナンピンEAーナンピン丸ーを作っていく。
大筋づくり
前回は調査に時間を取りすぎたので、まずはしっかりコードを書いていく。
大筋は以下の通り
void OnTick()
{
if(IsNewBar())
{
OnNewBar();
}
}
void OnNewBar()
{
if(ShouldOrder())
{
Order();
UpdatePositions();
}
if(ShuoldCutLoss())
{
CutLoss();
}
return;
}
・確定したローソク足が増えていないときは何もしない
・注文するべきかを判断し、注文する。注文後、すべてのテイクプロフィットを更新する。
・損切りをするべきかを判断し、損切りする。
bool IsNewBar()
新しいローソク足が発生したかどうかを以下の記事を参照しつつ、汎用性を削ってすっきり実装した。
bool IsNewBar()
{
static datetime lastbar_time = 0;
bool is_newbar = false;
int period_seconds = PeriodSeconds(_Period);
datetime newbar_time = TimeCurrent() / period_seconds * period_seconds;
if(lastbar_time == 0 || lastbar_time < newbar_time)
{
is_newbar = lastbar_time < newbar_time;
lastbar_time = newbar_time;
}
return is_newbar;
}
static 修飾子を使って、lastbar_time を保持しつつ現在のバーの時間を計算して比較する。現在の時間軸 (_Period) を用いてバーが存在するかどうかを判断する。
bool ShouldOrder()
トレンドと確定したローソク足の終値、現在のポジションを加味して注文をするべきかどうかを判断する。
if(IsStrongTrend())
{
Print("The trend is too strong");
return false;
}
トレンドが強い場合はオーダーはしない。トレンドの強さの判定は以下の通り
const int ADX_STRONG_LINE = 30;
bool IsStrongTrend()
{
//-- Use the latest fixed ADX value
return adx_buffer[1] >= ADX_STRONG_LINE;
}
ローソク足と同様に確定したADXの値を使ってトレンドの強さを判断する。今回は30以上になったときはトレンドが強いと判断する、
if(position_info.Select(_Symbol))
{
close_price = close_buffer[1];
order_price = position_info.PriceOpen();
position_type = position_info.PositionType();
//-- Small price difference
if(
(position_type == POSITION_TYPE_BUY && close_price < order_price - order_unit)
|| (position_type == POSITION_TYPE_SELL && close_price > order_price + order_unit)
)
{
Print("The price difference is small");
return false;
}
}
すでにポジションが存在する場合は、ナンピンするか否かを判断する。
終値と最新のポジションの種別と価格差を使って十分な価格差が存在しているかを確認する。ロングポジションがあるときに十分に価格が下がっていないとナンピンはしない。ショートの場合は逆。
最後に
今回は大筋の設計と新規バーの検知、注文するかどうかの判断をするところまでの実装をした。
残りは
・注文
・注文後のテイクプロフィットの更新
・損切りの判断
・損切り
の実装をする。
この記事が気に入ったらサポートをしてみませんか?