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);
}