2015年5月22日金曜日

MT4プログラムの小ネタ CArrayDoubleのバグ

昨日はFX-ONの営業担当者様とお話しする機会があり、作成中のEAについてアドバイスを頂くことができました。貴重なお時間ありがとうございます。

頂いたアドバイスを元に最終調整中です。来週ぐらいに登録予定ですので、登録されましたら是非皆様お試しください。

さて、今日は久しぶりに小ネタです。本当に小ネタです(笑)
MQL4についてきているCArrayDoubleクラスですがMinimumとMaximumにバグがあります。
内部で使用しているArrayMinimumとArrayMaximumの引数ですが、下記の通りです。
int  ArrayMaximum(
const void&   array[],             // 対象配列
int           count=WHOLE_ARRAY,   // 確認エレメント数
int           start=0              // 開始インデックス
);


ところがCArrayDoubleではこのように使用されており引数の意味とあっていません。
//+------------------------------------------------------------------+
//| Find minimum of array                                            |
//+------------------------------------------------------------------+
int CArrayDouble::Minimum(const int start,const int count) const
{
//バグ!
return(ArrayMinimum(m_data, start, count));
}

正しくはこのようになります。

//+------------------------------------------------------------------+
//| Find minimum of array                                            |
//+------------------------------------------------------------------+
int CArrayDouble::Minimum(const int start,const int count) const
{
//バグ!
return(ArrayMinimum(m_data, count, start));
}
//+------------------------------------------------------------------+
//| Find maximum of array                                            |
//+------------------------------------------------------------------+
int CArrayDouble::Maximum(const int start,const int count) const
{
//バグ!
return(ArrayMaximum(m_data, count, start));
}


まぁわかっていて逆に渡すというのもありなのですが、やっぱり気持ち悪いので元コードを修正して使用しています。

2015年5月21日木曜日

心理の揺れ動きをみる! MT4インジケータ 移動平均かい離率


昨日の記事はあまり人気がありませんでしたねー。
私としては、EURUSDが前の日と逆に取引するだけでトータル+とか結構衝撃だったのですが・・・。タイトルがだめだったのかなぁとタイトル変えてみました(笑)
EURUSD 日足逆張りだけで+って知ってました? EAを使って検証する。

昨日の検証から1日スパンでは投資家みなさんの心理状況が影響するという仮定します。

みなさんが良く参考にしているのはやはり移動平均です。

移動平均からどんどん価格が離れていった場合、どう思うでしょう?そろそろ手じまいしておこうかな?とかもうそろそろ反転しそうかな?と思う人が増えていくと思いませんか?
そんな集団心理状況が分かりやすく表現されたのが移動平均かい離率だと思っています。

かい離率.PNG

移動平均かい離率もダイバージェンス現象の発生に着目です。赤枠で囲った部分ですが、価格の上値は更新しているのにかい離率は右下がりになっています。移動平均に対して買い進む人が少なくなっている状況が表れていると思われます。このような場合そろそろかな?と思っている人が増えているという集団心理状況の変化と考えています。

さて定番の移動平均かい離率・・・。当然MT4にあるだろうと思ってたら標準になくてショックです。まぁさすがにこのインジケータは少し探せばすぐ入手可能ですが、作ったところであっという間なのもありますし、この後少し改造したいと考え自作しました。

//------------------------------------------------------------------
// 移動平均かい離率

#property copyright "Copyright 2015,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_separate_window

//バッファーを指定する。
#property indicator_buffers 1

//プロット数を指定する。
#property indicator_plots   1

// かい離率
#property indicator_label1  "LINE1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

// 入力パラメータ 移動平均期間
input int Period = 21;
// 入力パラメータ 移動平均モード
input ENUM_MA_METHOD MaMethod = MODE_SMA;
// 入力パラメータ 対象価格
input ENUM_APPLIED_PRICE MaPrice = PRICE_CLOSE;

// バッファー
double lineBuffer[];

//------------------------------------------------------------------
//初期化
int OnInit()
{
// 短縮名を設定
string shortName = "KAIRI (" +  IntegerToString(Period) +")";
IndicatorShortName(shortName);

SetIndexBuffer(0, lineBuffer);
SetIndexDrawBegin(0, Period);

return(INIT_SUCCEEDED);
}

//------------------------------------------------------------------
//計算イベント
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[])            //スプレット
{
for( int i = rates_total - prev_calculated - 1 ; i >= 0; i-- )
{
double maValue = iMA(NULL, PERIOD_CURRENT, Period, 0, MaMethod, MaPrice, i);
if( maValue != 0 )
{
lineBuffer[i] = close[i] / maValue * 100 - 100;
}
}

return(rates_total - 1);
}



2015年5月20日水曜日

EURUSD 日足逆張りだけで+って知ってました? EAを使って検証する。

FXの世界でよく聞くランダムウォーク理論
ざっくり行くと相場の世界は予測がつかないっていう例なのです。信じない!という人と信じる!っていう人がいます。

ランダムではないと仮定すると取引の方向性が定まるとそちらに移動していくことが多いと考えられます。
ランダムだとすると予測がつかないはずです。さて実際のところどうでしょうか?

ものすごく簡単に週足ベースで、前の週が下げなら下げ、次の週が上げなら上げにかけて取引するEAでバックテストを実行してみました。

2005/4/1-2015/4/30 EURUSD 日足
週順張り.gif
総損益 3805.10 総利益 37499.70 総損失 -33694.60
プロフィットファクター 1.11 期待利得 7.36
絶対ドローダウン 2541.00 最大ドローダウン 3288.10 (25.58%) 相対ドローダウン 25.58% (3288.10)
総取引数 517 ショートポジション(勝率%) 262 (53.05%) ロングポジション(勝率%) 255 (51.76%)
勝率(%) 271 (52.42%) 負率 (%) 246 (47.58%)
最大 勝トレード 1396.00 負トレード -636.40
平均 勝トレード 138.38 負トレード -136.97
最大 連勝(金額) 12 (1006.60) 連敗(金額) 9 (-1215.90)
最大化 連勝(トレード数) 1692.00 (7) 連敗(トレード数) -1646.00 (8)
平均 連勝 2 連敗 2

勝ってますね。その上、連敗する期間としない期間が割とはっきりしています。週ベースだと足の生成にある程度の法則性が見て取れるという可能性は高いと考えています。

では日足ではどうでしょうか?
2005/4/1-2015/4/30 EURUSD 日足
日順張り.gif
うん。ぼろぼろです。論外です。しかし順張りで-なら逆張りでは+ってこと?

2005/4/1-2015/4/30 EURUSD 日足
日逆張り.gif
総損益 3589.20 総利益 81798.90 総損失 -78209.70
プロフィットファクター 1.05 期待利得 1.38
絶対ドローダウン 3225.20 最大ドローダウン 4457.00 (39.68%) 相対ドローダウン 39.68% (4457.00)

総取引数 2602 ショートポジション(勝率%) 1302 (51.61%) ロングポジション(勝率%) 1300 (52.23%)
勝率(%) 1351 (51.92%) 負率 (%) 1251 (48.08%)
最大 勝トレード 658.90 負トレード -460.00
平均 勝トレード 60.55 負トレード -62.52
最大 連勝(金額) 9 (240.00) 連敗(金額) 8 (-428.00)
最大化 連勝(トレード数) 1305.90 (2) 連敗(トレード数) -1402.00 (5)
平均 連勝 2 連敗 2

・・・・・どーいう理屈かはわかりませんが、EURUSDの日足は前の日と逆方向に動く可能性が高いことが結果から受け取れます。
ちなみにこのプログラム4時間足以下どんな設定でも0に沈みます。

週足 方向性通りに移動する可能性が高い
日足 方向性とは違う方向に移動する可能性が高い。
時間足 方向性はない。

以上を踏まえて私なりの推論はこうです。
週スパンでは、対象国同士の通貨需要による価格が反映されている。
日スパンでは、買・売の心理状況の推移が反映されている。
��時間足以下では、ランダム

さて、皆様はどう思いますか?

プログラムはこちら。
週順張り
//------------------------------------------------------------------
//サンプル EA2
#property copyright "Copyright 2015,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict

#include 

//入力パラメータ マジックナンバー 他のEAと当らない値を使用する。
input int   MagicNumber = 37851550;

//入力パラメータ 売買ロット
input double Lot = 0.1;

//入力パラメータ 最大ポジション数
input int MaxPosition = 1;

//入力パラメータ 許容スリップページ(pips)
input uint Slippage = 10;

// トレード補助クラス
CTradingWrapper *m_wrapper;

//------------------------------------------------------------------
//初期化
int OnInit()
{
m_wrapper = new CTradingWrapper(Symbol(), MagicNumber, MaxPosition, 20);

return(INIT_SUCCEEDED);
}
//------------------------------------------------------------------
//終了処理
void OnDeinit(const int reason)
{
delete m_wrapper;
}
//------------------------------------------------------------------
// 気配値表示処理
void OnTick()
{
static ENUM_TIMEFRAMES target = PERIOD_W1;
static datetime before = iTime(Symbol(), target, 0);

datetime current = iTime(Symbol(), target, 0);

if( before == current )
{
return ;
}
before = current;

double open = iOpen( Symbol(), target, 1);
double close = iClose( Symbol(), target, 1);

int cmd = OP_NONE;

if( open > close ) cmd = OP_SELL;
if( close > open ) cmd = OP_BUY;

m_wrapper.CloseOrderAll(Slippage);
m_wrapper.SendOrder(cmd, Lot, 0, Slippage, 0, 0);
}


日逆張り(変更箇所のみ)
//------------------------------------------------------------------
// 気配値表示処理
void OnTick()
{
static ENUM_TIMEFRAMES target = PERIOD_D1;
static datetime before = iTime(Symbol(), target, 0);

datetime current = iTime(Symbol(), target, 0);

if( before == current )
{
return ;
}
before = current;

double open = iOpen( Symbol(), target, 1);
double close = iClose( Symbol(), target, 1);

int cmd = OP_NONE;

if( open > close ) cmd = OP_BUY;
if( close > open ) cmd = OP_SELL;

m_wrapper.CloseOrderAll(Slippage);
m_wrapper.SendOrder(cmd, Lot, 0, Slippage, 0, 0);
}


2015年5月19日火曜日

MT4 EAアルゴリズムを考える。 実はかなり優秀かも! S/Rオシレータを検証してみた。

2015/12/4追記
あらためていろんな会社のデータで試してみると、+になりませんでした。とんとんぐらい。

さて現在苦労中の逆張りEAです。
逆張りは基本買われすぎ売られすぎをベースにします。最初ストキャスで実装していたのですが、どうしても+になりません。+-0がいいところです。

そこで、他のオシレータを検証しています。逆張りといえば以前紹介した「相場は重力に縛られるのか?S/Rオシレータを作ってみた。」があります。記事内ではトレンド時に連続して損をするという事を書きましたが、実際はどうなのでしょうか?

EAに単純に組み込んで検証してみました。

2010/4/1~2015/4/30 EURUSD 15分足
WSRO逆張り.gif
総損益 3570.00 総利益 46815.00 総損失 -43245.00
プロフィットファクター 1.08 期待利得 1.20
絶対ドローダウン 380.00 最大ドローダウン 1162.80 (10.19%) 相対ドローダウン 10.19% (1162.80)

総取引数 2985 ショートポジション(勝率%) 1431 (33.26%) ロングポジション(勝率%) 1554 (32.50%)
勝率(%) 981 (32.86%) 負率 (%) 2004 (67.14%)
最大 勝トレード 300.00 負トレード -100.00
平均 勝トレード 47.72 負トレード -21.58
最大 連勝(金額) 8 (316.70) 連敗(金額) 18 (-590.60)
最大化 連勝(トレード数) 436.50 (3) 連敗(トレード数) -590.60 (18)
平均 連勝 2 連敗 3

アメリカ時間終了後、日本時間開始までは取引しないフィルタを組み込んでいます。
また15分足の状態を5分足で判断して取引しています。
サポートとレジストが100の状態からレジストが下がり始めた時点で売り
サポートとレジストが0の状態からサポートが上がり始めた時点で買い
利食いはその反対売買
サポートとレジストが100になったら売り玉を損切
サポートとレジストが0になったら買い玉を損切

というロジックです。

・・・・・。お・・おお?想像以上に+です。
逆張りのオシレータで私の知る限り単純にシグナル通り売買して+になる事はほとんどありません。S/Rオシレータ恐ろしい子です。
強いトレンド時に大きなドローダウンを受けますが、それさえ回避できればかなり使えそうな予感がします。

サポートラインの突破とレジストラインの突破というは、やっぱり重要な指標ということが分かります。

ちょっとこれベースで逆張りを考えようかなと思案中です。
平均2連勝しているので、勝ったらロット倍、2回勝or負けるで、また半分っていう戦略でドローダウンを少なくできるかな?

2015/07/27 S/RオシレータをFX-ONのサイトでアップしています。コンパイルが面倒な方はこちらでどうぞ。
抵抗線支持線の突破具合をオシレータ化
S/Rオシレータ
S/Rオシレータ | fx-on.com


2015年5月18日月曜日

MT4 自作EAの紹介 トレンドフォロー型 デイトレードEA Gewinn2

MT4プログラムを初めて、やっとそれっぽいEAを開発しました^^

EURUSDにおけるトレンドフォロー型のEAです。

買1ポジション 売1ポジションを取ります。
シグナルが交差した時点では両建てを行う可能性があります。
5分足の確定値で取引を行います。15分足と1時間足の状態をみてトレンドを判断したら取引開始です。

最大24時間ポジションを保有します。
週末は必ずポジションを決済します。
アメリカ時間終了後~日本時間開始までは新しいポジションはとりません。

評価損を抱えないようにするため、判断した方向と反対に動いたら早めに損切します。何度もチャレンジして最終的に大きな価格変動をとるという思想です。そのため勝率は30%程度です。
このあたりは、パラメータ調整で評価損を許可することもできるように作成しています。

0.1ロットでの2005/4~2015/4 バックテスト結果はこのようになりました。

一旦の完成版.gif

パラメータを利益が最大になるように調整した場合は、下記のバックテスト結果となっています。
総損益 11155.00
総利益 46762.10
総損失 -35607.10
プロフィットファクター 1.31
期待利得 3.61
絶対ドローダウン 602.40
最大ドローダウン 1201.40 (8.68%)
相対ドローダウン 8.68% (1201.40)
総取引数 3089 ショートポジション(勝率%) 1580 (28.42%)
ロングポジション(勝率%) 1509 (28.89%)
勝率(%) 885 (28.65%) 負率 (%) 2204 (71.35%)
最大 勝トレード 300.00 負トレード -30.00
平均 勝トレード 52.84 負トレード -16.16
最大 連勝(金額) 6 (133.40) 連敗(金額) 24 (-339.70)

2014/1~2015/4までのグラフはこちら
一旦の完成版2014.gif

ドローダウンが大きいタイミングがありますが、天井付近で価格が暴れるときに損を出す傾向になります。両建てを禁止する設定をすると最大ドローダウンを900程度まで減らすことは可能ですが、利益も1000ほど減ります。悩ましいですね。
結局のところトレンド出だしを取り逃しているためなので、ここは諦めて、逆にトレンドが出ていない相場の時に儲けが出せるようなEAを別途開発して組み合わせで運用することを考えています。

基本1ポジションの低ポジションEAとしては、そこそこできたのではないかなぁとおもっているのですがどうでしょうか?

なお、もう少し調整したらFX-ONサイト様に登録予定です。

ちなみにGewinn1が逆張り、Gewinn2が順張りで作成しているのですが、逆張りは難しいですね。まだ右肩上がりのグラフを描画できるところまでたどり着いていません。順張りでは利益が重要ですが、逆張りでは勝率が重要のようです。Gewinn2と組み合わせることができるように調整したいですね^^