一応最低限のMT4の実装について確認できたと思ったので、使えるEA作成に向けていろいろ試行錯誤をしていきたいと思います。
EAに求める要件
個人的な理想のEA像は現時点では以下を考えています。
- エントリーの方向(買いか売りか)をできる限り適切に
- トレンド系インジケータでトレンドを適切に評価する(レンジの場合は売買しない)
- オシレータ系インジケータでエントリー時期を見極める
- 損切、利確の幅を値動きに合わせて適切に設定する
- 値動き幅をうまく評価する
- 異常事態(急変動)には確実に対応できるようにする
- これはエントリー時に必ず損切設定を入れることにする。
- 口座残高を配慮する。
- 口座残高に合わせてLotを比例で上げるのは良くないけれど、少しは上げていきたい。逆も同様。
3や4はおそらくそれほど難しいことではないですが、まずは1と2でしょう。
もしこのブログを見ていただいている方で、考慮すべき要素が他にもあればぜひ教えてほしいです。
オリジナルのインジケータを作ってみました
上記のことを考えつつ、素人的に思いついたインジケータを作ってみたのが以下です。
これは以下の要素を表示しています。
なんちゃってサポートライン、レジスタンスライン
値が上げ下げしている際は、前回の底値、天井値は一つの指標になると思います。そのため、底値、天井値をキープするインジケータを作りました。
ただ、その値をそのまま維持し続けると1ドルが130円だったり80円だったりした値を維持し続けて今の相場では全然使えないので、一定の寄与率で現在の値に近づいていくようにしています。
上記は99%が最高値・最低値の値を維持して、1%が現在の値としています。式に書くとこんな感じ。
現在のインジケータ値=1つ前のインジケータ値×0.99+1つ前の値×0.01
ちなみに0.999と0.99と0.9を表示するとこんな見た目になります。なんちゃってトレンドラインならこれでもある程度役に立ちますかね。
なんちゃってオシレータ系売買ポイント
上記の青矢印、赤矢印はエントリーポイントです。エントリーポイントのルールはシンプルで以下の通り
- 前々回最高値を更新するも前回最高値とならなかった場合売りエントリー
- 前々回最低値を更新するも前回最低値とならなかった場合買いエントリー
矢印の位置的にはかなり期待できる感じがしますが、これでバックテストをするとどんな感じになるでしょうか。
次回試してみたいと思います。
今回のインジケータのソースコード
//+------------------------------------------------------------------+
//| FXind_maxmine_line.mq4|
//| Copyright (c) 2021, Langtainment |
//| https://tsunagaru-info.com/dr |
//+------------------------------------------------------------------+
#property copyright "Copyright (c) 2021, Langtainment"
#property link "https://tsunagaru-info.com/dr"
#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Yellow
#property indicator_color4 Green
#include <stdlib.mqh>
//Unique Parameters
extern double rate = 0.9; // parameter 1
//indicator Buffers
double BufMax[];
double BufMin[];
double BufBuy[];
double BufSell[];
//+-----------------------------------------------------------------------------------------------------------------------------+
//| |
//| Onnit() works at the time of EA application, time step change, property change, and MT4 restart, as initialization process. |
//| |
//+-----------------------------------------------------------------------------------------------------------------------------+
int OnInit()
{
//allocate indicator buffer
SetIndexBuffer(0, BufMax);
SetIndexBuffer(1, BufMin);
SetIndexBuffer(2, BufBuy);
SetIndexBuffer(3, BufSell);
//Setting Indicator Label
SetIndexLabel(0, "BufMax");
SetIndexLabel(1, "BufMin");
SetIndexLabel(2,"BuySignal");
SetIndexLabel(3,"SellSignal");
//Setting Indicator Style (Buy Signal)
SetIndexStyle(2, DRAW_ARROW, STYLE_SOLID, 1, Blue);
SetIndexArrow(2,233);
//Setting indicator style (Sell signal)
SetIndexStyle(3, DRAW_ARROW, STYLE_SOLID, 1, Red);
SetIndexArrow(3,234);
return(0);
}
//+--------------------------------------------------------------------------------------------------------------------------------------+
//| |
//| OnCalculate() works at the timing when the rate of the currency pair on the chart you applied is delivered, as the main processing. |
//| |
//+--------------------------------------------------------------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
int i; //counter
int end_index = Bars - prev_calculated; // Get bar count (uncalculated)
for(i = end_index -1 ; i >=0 ; i-- ) {
if(BufMax[i+1] <= high[i]){
BufMax[i] = high[i];
}
else
{
BufMax[i] = BufMax[i+1] * rate + high[i] * (1.0 - rate);
}
if(BufMin[i+1] >= low[i])
{
BufMin[i] = low[i];
}
else
{
BufMin[i] = BufMin[i+1] * rate + low[i] * (1.0 - rate);
}
}
if (prev_calculated == 0) end_index -= 3;
for(i = end_index -1 ; i >=0 ; i-- )
{
//Sell Signal
BufSell[i] = EMPTY_VALUE;
if(BufMax[i+1] < BufMax[i+2] && BufMax[i+2] > BufMax[i+3])
{
BufSell[i] = Open[i];
}
//Buy Signal
BufBuy[i] = EMPTY_VALUE;
if(BufMin[i+1] > BufMin[i+2] && BufMin[i+2] < BufMin[i+3])
{
BufBuy[i] = Open[i];
}
}
//Return value setting: passed to the value of prev_calculated the next time the OnCalculate() is called.
return( rates_total );
}
コメント