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

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

 

著書のご紹介

2012年12月04日(火)

ATC(自動売買コンテスト)から [シストレ一般]

前回紹介したMQL4、MQL5コミュニティサイトの「Championship」のリンクをクリックすると、「Automated Trading Championship」というサイトが現れます。

ここは、MetaQuotes社が主催しているEAの自動売買コンテストのサイトです。

2006年から開催されており、当初はMQL4のEAのコンテストでしたが、2010年よりMQL5のEAのコンテストになっています。

このサイトではEAのコンテストの統計的なデータを見ることができます。

まずは参加者数の推移ですが、

2006年 258
2007年 603
2008年 705

2010年 314
2011年 395
2012年 451

となっています。

2007年、2008年とMT4の普及に合わせて参加者数は急増していますが、その後、MT5をリリースし、2009年は、MQL4からMQL5への移行期間ということで開催されませんでした。

MQL5のEAに対象を変更して2010年に再開されましたが、まだMQL4の頃の参加者数には達していません。MT5の普及がそれほど進んでいないためだと思われます。

またこのサイトでは、トップ画面でEAのトップ10の資産曲線のグラフを見ることができます。

数ヶ月で資産が何倍にも増えているEAに目がいきがちですが、そういう少数のデータは、ばらつきも大きいので統計的にはあまり参考になりません。

参考になりそうなのは、以下の毎回定期的に掲載されている記事です。

2012年 http://championship.mql5.com/2012/en/news/188
2011年 http://championship.mql5.com/2011/en/news/108
2010年 http://championship.mql5.com/2010/en/news/44
2008年 http://championship.mql4.com/2008/news/455
2007年 http://championship.mql4.com/2007/news/278
2006年 http://championship.mql4.com/2006/news/63

だいたいコンテスト開始から1ヶ月後の結果について色々なデータを掲載しています。

これらのページで最初に表示されるグラフは、1ヶ月後に勝っているEAと負けているEAの割合です。

FXってゼロサムだから半分くらいは勝っていると思うかもしれませんが、実際には負けている方が多く、勝っているEAは全体の30%から40%程度しかありません。

スプレッドのコストでマイナスサムになるので、ランダムにトレードしても半分以上は負けるのですが、それとそう変わりない結果となっています。

他に、トレード対象の通貨ペアのデータが色々と掲載されています。

年によって多少異なりますが、毎回、EUR/USDのトレードが圧倒的に多いことがわかります。これは現実のトレードの傾向と同じです。

さらに複数の通貨ペアの割合などのデータもあります。興味のある方は色々と調べてみるとよいでしょう。

Posted at 17時45分 パーマリンク


2012年11月26日(月)

MQL4/MQL5コミュニティ [MetaTrader4]

プログラミングに関する記事が続いたので、年末に向けて非プログラミングの記事でも。

MT4、MT5ユーザーでお気づきの方も多いと思いますが、MT4、MT5の画面の右上の方に「4」「5」と書かれたボタンがあります。

画像(136x104)
画像(141x113)

押してみればわかると思いますが、それぞれ、MQL4、MQL5のコミュニティサイトがお使いのウェブブラウザ上で開きます。

これらのサイトはMetaQuotesが運営しているものなので、怪しいものではありません。

また、MT4、MT5ではヘルプメニューからもこのサイトに飛ぶことができるようになっています。

ただし、MT4からは、MQL4、MQL5両方のサイトへ飛べますが、MT5からはMQL5のサイトにしか飛べません。MT4からMT5への移行は推奨するが、MT5からMT4へは戻るな、ということでしょうか(笑)

さて、これらのサイト、基本的に英語なのでちょっととっつきにくいかもしれませんが、ページ上部のリンクがメニュー代わりになっています。

MQL4の場合、以下のような内容が掲載されています。

Documentation - MQL4の関数のレファレンスです。
Book - MQL4のプログラミングのテキストです。
TA - テクニカル分析に関する記事です。
Code Base - MQL4のプログラム色々です。
Articles - MT4の使い方色々です。
Jobs - MQL4のプログラムを作って欲しい人と作る人を仲介する場所です。
Championship - MT5の自動売買のコンテストサイトです。
Forum - MT4の様々なテーマについて質問・回答や議論を行う場所です。

一方、MQL5コミュニティの方は以下のような内容になっています。

Docs - MQL5の関数のレファレンスです。
Code Base - MQL5のプログラム色々です。
Articles - MT5の使い方色々です。
Championship - MT5の自動売買のコンテストサイトです。
Jobs - MQL5のプログラムを作って欲しい人と作る人を仲介する場所です。
Market - MQL5のプログラムを配布・販売する場所です。
Signals - MT4、MT5で利用できるシグナルのサイトです。
Forum - MT5の様々なテーマについて質問・回答や議論を行う場所です。

初心者向けの内容からマニア向けの内容まで幅広いユーザー層に対応しています。

日本のMT4のブログなどでも、このコミュニティの記事をネタにしているサイトもよく見かけます。

このブログでも、いくつか紹介していきたいと思います。

Posted at 15時42分 パーマリンク


2012年11月19日(月)

MQL4/MQL5のオーダー関数(5)〜OrderSend()直後の処理 [MQL5]

今回はOrderSend()関数でオーダーを送信した直後の処理についてみていきます。

まずは、MQL4の場合、

   int magic = 1000;
double lots = 0.1;
int slippage = 20;
OrderSend(Symbol(), OP_BUY, lots, Ask, slippage, 0, 0, "", magic);

double pos = 0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
if(OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
pos = OrderLots();
break;
}
Print("pos=", pos);

のように成行買いオーダーを送信した直後に、約定したオーダーのロット数を取得するコードを実行すると、ちゃんと「pos=0.1」と表示されます。

以前はこのケースだと、オーダーが約定する前にロット数を取得しようとして、「pos=0」と表示されたような気がしたのですが、それは気のせいだったのか、今はOKのようです。

また、OrderSend()は戻り値としてオーダーのチケット番号を返すので、次のように記述すると、そのチケット番号からオーダーの情報を取得することができます。

   int magic = 1000;
double lots = 0.1;
int slippage = 20;
int ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, slippage, 0, 0, "", magic);

double pos = 0;
if(OrderSelect(ticket, SELECT_BY_TICKET)) pos = OrderLots();
Print("pos=", pos);

この場合も「pos=0.1」と表示され、約定した情報が取得できています。

一方、MQL5の場合、以下のコードのようにOrderSend()の直後にポジションのロット数を取得する関数を実行したとします。

   MqlTradeRequest request={0};
MqlTradeResult result={0};
MqlTick tick;
SymbolInfoTick(_Symbol, tick);
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = 0.1;
request.price = tick.ask;
request.deviation = 20;
request.type = ORDER_TYPE_BUY;
request.type_filling = ORDER_FILLING_FOK;

OrderSend(request,result);

double pos = 0;
if(PositionSelect(_Symbol)) pos = PositionGetDouble(POSITION_VOLUME);
Print("pos=", pos);

ここでオーダーが約定していれば「pos=0.1」と表示されるはずですが、ほとんどのケースで「pos=0」と表示されます。

ところが、OrderSend()の後に「Sleep(1000)」などを入れて時間(ここでは1秒)をおけば、「pos=0.1」と表示されるケースが増えてきます。

つまり、オーダーの約定の情報がPositionSelect()で取得できるポジションの情報に反映するまでに時間がかかっているということのようです。

ただ、1秒おけば確実かどうか保証できないので、どのくらい時間をおけばよいのか悩ましいところです。

この悩ましい判断を避けるために、OrderSend()に渡すresult というパラメータの戻り値を利用する方法があります。

resultは、MqlTradeResult型の構造体であり、以下のように定義されています。

struct MqlTradeResult
{
uint retcode;
ulong deal;
ulong order;
double volume;
double price;
double bid;
double ask;
string comment;
};

それぞれのメンバーの意味は以下の通りです。

retcode 処理結果を表すコード
deal 約定結果のチケット番号(成行注文の場合)
order 注文結果のチケット番号(待機注文の場合)
volume 売買ロット数
price 売買価格
bid 現在の売値
ask 現在の買値
comment 業者のコメント

ここで、result.retcode が 10009(TRADE_RETCODE_DONE) を返せば、注文の執行は成功したと判断できます。なので、

   OrderSend(request,result);
double pos = 0;
if(result.retcode == TRADE_RETCODE_DONE) pos = result.volume;
Print("pos=", pos);

のように記述すると、OrderSend()の直後でも「pos=0.1」と表示されます。

ただし、result.volumeは、あくまでこのオーダーの約定情報です。通貨ペア毎に合算されたポジションの情報とは違うので注意が必要です。

Posted at 16時39分 パーマリンク


過去の記事へ

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

Sponsor AD

シストレナビモバイル

シストレナビモバイル
ケータイでバーコードを読み取りアクセス(詳細はこちら

プロフィール

豊嶋久道

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

活動状況・Website

ToyolabFX
Toyolab FX-手ぶらで為替取引
FXトレーディング研究所。
FXメタトレーダー入門
FXメタトレーダー入門
最先端システムトレードソフト使いこなし術。
FXメタトレーダー実践プログラミング
FXメタトレーダー実践プログラミング
システム開発過程を段階的に学ぶ。

2012/12

            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 31          

PHOTO

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

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

カテゴリーリスト

最近の記事

スポンサードリンク

検索


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

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

RSS1.0

[Login]


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