逆張りナンピンEAをつくる(4)
今回も引き続き逆張りナンピンEAを作る。
散歩会議
座ってると頭が動かないのと、運動不足対策に散歩しながら今回の作業について考える。散歩前に考える項目を振り返る。
特に、何をするのかの洗い出しとそれの優先順位を決めて今回の集中力の持つ範囲で価値のある量の作業をする。
・コードレベルのリファクタリング
・ADXを用いた動作条件の設定
・動作単位を tick からローソク足の確定に買える
・損切りの必要性と実装方法を考える
・利確の価格の更新、ポジションごとに利確の価格を調整
今、思いつくのはこの辺りだからそれらの詳細と優先順位を考える。
会議の結果
各処理を関数に分けて中身を実装しないけど外枠だけ作っていく感じで全体を先に作る。実装が簡単そうなやつから作っていくでいいかな?と思ってる。
終値を採用して、損切りや注文を判断するのは突然の価格の変化に踊らされないようにするために重要だという認識になった。
利確(テイクプロフィット)に関しては何であろうがその価格で利確したいので、がっしりしていったらいいので、可能な範囲で注文のテイクプロフィットは設定・更新していくべきだと思う。
ナンピン丸
今回作ってる逆張りナンピンEAは「ナンピン丸(NampinMaru)」という命名をした。特に意味はないけど、なんとなくここで紹介しとく。
ちなみに船につける「~丸」について豆知識
もともと自分のことを「麿」と言っていたのが、のちに、「柿本人麿」のように敬愛の意味で人につけられるようになり、それがさらに愛犬や刀 など愛するもの・愛用するものに広く転用されました。その「麿」がやがて「丸」に転じ、船にもつけられるようになったという説です。
関数名について
もともとのテンプレートに書かれているコードの関数名が PascalCase なのを見るとMQL5では関数名を PascalCase で書くことが一般的で、変数名は snake_case で書くのでいいっぽい。
もともと、C++を元に作られた言語って書いてあったからGoogleのC++のスタイルガイドを見ながら書いていたけど、MQLはそのあたりは踏襲してないみたい。
新規バーの検出
新規バーの検出について調べた。`
上の記事によると、基本的には以下のようなコードで事足りるけど、一回の tick 内で複数回呼ばれたときに誤作動する場合があるらしい。
bool isNewBar()
{
//--- memorize the time of opening of the last bar in the static variable
static datetime last_time=0;
//--- current time
datetime lastbar_time=SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);
//--- if it is the first call of the function
if(last_time==0)
{
//--- set the time and exit
last_time=lastbar_time;
return(false);
}
//--- if the time differs
if(last_time!=lastbar_time)
{
//--- memorize the time and return true
last_time=lastbar_time;
return(true);
}
//--- if we passed to this line, then the bar is not new; return false
return(false);
}
前回の tick 時の最新のローソク足の時間を last_time で記憶しておく。そのために変数宣言時に static 修飾子がついている。
なので最終的に以下の通りに実装できるように記事の中では紹介されている。
void OnTick()
{
//---
int period_seconds=PeriodSeconds(_Period); // Number of seconds in current chart period
datetime new_time=TimeCurrent()/period_seconds*period_seconds; // Time of bar opening on current chart
if(current_chart.isNewBar(new_time)) OnNewBar(); // When new bar appears - launch the NewBar event handler
}
//+------------------------------------------------------------------+
//| New bar event handler function |
//+------------------------------------------------------------------+
void OnNewBar()
{
PrintFormat("New bar: %s",TimeToString(TimeCurrent(),TIME_SECONDS));
}
OnTick 内で isNewBar() を呼び出して true なら、OnNewBar() を呼び出すという流れ。
上の記事をある程度読み解いていく過程で何を議論しているのかわからなくなってきた。しかも、今回の実装ではここまで丁寧に実装するべき部分でもないことに気づいた。深堀はせずに、単純な構造で実装しようと思う。
終わりに
今回はここで終わり。想定よりも時間をたくさん使ってしまった。全体の実装をもっと繰り返して無駄なこだわりをしないように精度を上げていく必要がある。
次回はもっと素早く質よりも、完成を目指して素早く実装したい。
この記事が気に入ったらサポートをしてみませんか?