基礎から学ぶシステムトレード
シストレブログ人気ランキング  

シストレ徹底攻略シストレマスターへの道ワールド・トレーディング・エッジ基礎から学ぶシステムトレードシストレニュースシストレツールシストレナビTOPへ

 

2010年06月14日(月)

ランダムウォークとランダムトレード(4) [ランダムウォーク]



前回、MQL4のプログラムで乱数列を発生させる方法を紹介しました。

乱数列を使うとランダムウォークが作れるのですが、MT4でランダムウォークを作っても面白くないので、ここではトレードをランダムに行うランダムトレードをプログラムしてみます。

ランダムトレードといっても色々と考え方があると思いますが、今回は簡単に次のようなルールにします。

各バーの始値で買うか、売るかをランダムに決めトレードを行い、終値で決済する。

この程度の売買ルールであれば、EasyLanguageだったら簡単に書けると思うのですが、MQL4ではちょっと厄介になります。

まずは、各バーの始値で売買オーダーをランダムに送信するところだけをEAとしてプログラムしてみます。バックテストできるだけの簡易版です。
extern int Magic = 12345678; // マジックナンバー
extern double Lots = 0.1; // ロット数
extern int Slippage = 3; // スリッページ

// 初期化関数
int init()
{
MathSrand(GetTickCount());
}

// スタート関数
int start()
{
// 新しいバーの始値でオーダー
if(Volume[0] == 1)
{
int signal = MathRand() % 2;

// 買いオーダー
if(signal == 1)
{
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic);
}
// 売りオーダー
else
{
OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic);
}
}

return(0);
}

ここで、前回紹介したMathRand()、MathSrand()について説明しておきます。

MathSrand()はプログラムの最初に1回だけ実行すればよいので、EAの場合、init()関数で実行します。

MathRand()では2で割った余り、つまり、0か1をランダムで求めます。このシステムでは必ず買いか売りかを実行するので、1を買い、0を売りにしています。

ただ、このままでは決済の条件が書かれていないので、正しく動作しません。

決済のためには、現在ポジションがあるかどうかをチェックしてポジションを決済する必要があります。

ここでは、それぞれの機能を次のような関数として書いておきます。

// 現在のポジションのロット数(+:買い −:売り)
double MyCurrentOrders()
{
double lots = 0.0;

for(int i=0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS) == false) break;
if(OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;

if(OrderType() == OP_BUY) return(OrderLots());
if(OrderType() == OP_SELL) return(-OrderLots());
}
return(lots);
}

// オープンポジションの決済
void MyOrderClose()
{
for(int i=OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS) == false) break;
if(OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;

if(OrderType() == OP_BUY || OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage);
}
}

これらの関数を使うと、決済を加えたstart()関数は次のように書くことができます。
// スタート関数
int start()
{
// 新しいバーの始値でオーダー
if(Volume[0] == 1)
{
int signal = MathRand() % 2;
double pos = MyCurrentOrders();

// 買いオーダー
if(signal == 1)
{
if(pos < 0) MyOrderClose();
if(pos <= 0)
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic);
}
// 売りオーダー
else
{
if(pos > 0) MyOrderClose();
if(pos >= 0)
OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic);
}
}

return(0);
}

プログラムの流れとして、まず、posという変数に現在のポジションを求めます。これは、買いポジションの場合プラス、売りポジションの場合マイナスの値となっています。

そして、signal=1、つまり買いシグナルの場合、売りポジションがあれば、一旦ポジションをクローズし、買いオーダーを送信します。ポジションがない場合には買いオーダーだけ送信します。また買いポジションがある場合は同じシグナルなので何もしません。

逆に売りシグナルの場合、既に買いポジションがあれば、ポジションをクローズし、売りオーダーを送信します。ポジションがない場合には売りオーダーだけ送信します。同様に売りポジションがある場合は同じシグナルなので何もしません。

もちろん、こんなランダムにトレードするシステムで勝てるわけはありません。売買スプレッドもコストとなるので、だいたいは負けます。但し、たまにはこのように勝てる場合もあります。

画像(450x111)・拡大画像(800x198)

でも、これはたまたまです。どれくらいたまたまなのかについてはまた次回。


>>“基礎から学ぶシステムトレード”全記事バックナンバーはこちらから




Posted at 18時51分


ページのトップへ ページのトップへ

Sponsor AD

2010/6

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      

プロフィール

豊嶋久道

2003年よりFX取引を始め、システムトレードの道へ。最近ではFXオプション取引も含めたトレーディングシステムの研究を行っている。システムトレードを基礎から正しく理解するための情報を発信する予定。

PHOTO

ランダムウォークとランダムトレード(5)

ランダムウォークとランダムトレード(5)

カテゴリーリスト

最近の記事

検索


当サイトコメントについて

当コメントは情報提供のみを目的として作成されたものであり、投資に関してはご自身でご判断くださいますようお願い致します。また、当資料は著作物であり著作権法により保護されております。無断で全文または一部を転載することはできません。

RSS1.0

[Login]


powered by a-blog
Copyright (C) 2008 PhiConcept,Inc. All rights reserved.