« 2005年05月 | メイン | 2005年07月 »

2005年06月29日

為替ロボットの作り方(FXCM用) プログラミング

【プログラミングをする】

式化したルールを、MetaQuoteLanguageⅡ(MQLⅡ)という言語でプログラミングしましょう。

MQLⅡについてはMQLⅡのページで少しずつ説明をしていきますので、ここではこんな感じのものかというのをつかむ程度でいいと思います。

プログラミングはSBFXのMetaEditorで行います。
SBFXのTools > MetaQuotes Language Editor からエディターを立ち上げ、 File>Newから新規エキスパートを作成して下さい。
(詳しくは「MetaEditor入門」)

以下のように記入します。

*1 長期線と短期線の期間を変更できるよう、「defines:」で、MALongPeriod(長期期間),MAShortPeriod(短期期間) という定数をセットしました。こうしておくと、後から期間を変更するのが容易になります。
*2 自分で決める変数(定数以外)は全て、「var:」で宣言しておく必要があります。(まとめて宣言する場合は「vars:」「( )」内は初期値でこれにより数値変数か文字列変数かが決定)参考:MQLⅡ簡易リファレンス
*3 iMA(期間,MODE_SMA,0)で現在の単純移動平均の値が出ます。最後の数字を1に変えると一本前の値、2にすると二本前の値が得られます。今回は終値ベースのため、一本前と二本前の値を使用します。
*4 close[0]で現在の値、close[1]でチャート上で1本前の終値(直近の終値)、close[2]だと2本前の終値。
*5 この部分は/*~*/で括られているので実行されません。デバッグ用に各値を出力したいときは/* */を外します。参考:MQLⅡ簡易リファレンスPrint
*6 TotalTradeは保有ポジションの数。(未約定のオーダーも含める)
ただし、異なる通貨も同時に運用していた場合、そのポジション数も全てカウントされてしまうので、現在の通貨のポジションだけを取り出して調べる。参考:If文For文
*7 OrderValue(ポジション番号,VAL_TYPE)で保有ポジションのタイプが得られる。買いはOP_BUY、売りはOP_SELL
*8 ポジションが無ければ、GC前、DC前でないかを調べて、条件が合えば注文を出す
*9 条件式は &(=and) や|(=or)で組み合わせが可能
*10 SetOrder()で売りや買い。
*11 ポジションがある場合、GC,DCでないかを調べる
*12 CloseOrder()でポジションを閉じる。

投稿者 kawarobo : 12:37 | コメント (0) | トラックバック

為替ロボットの作り方(FXCM用) 売買ルール

【売買ルールを決める】

さて、いよいよシステム作りに入ります。

この売買ルールを決める手順は成績を左右する非常に重要な部分ですが、
まだ「これだ!」という投資手法が決まっていなければ、人から聞いたり、
本で見た方法、ふと思いついたものをどんどん試してみるほうが面白いと思います。
それで見込みがありそうなら、さらに磨いていけば良いでしょう。


 [採用ルール概要]
ここでは、以前ファンドマネージャーをされていたある方がちらりとおっしゃっていた、移動平均を使う手法を試してみることにします。

それは、基本中の基本、移動平均の長期線、短期線のゴールデンクロス(GC)とデッドクロス(DC)に多少手を加えるもので、GCDCになる少し前に仕掛けて、GC,DCになった時点で手仕舞うというやり方です。

GCやDCになる少し前」というのは具体的に言うと、直近の終値が短期線と長期線の間に入り込んだ時です。

ただそれだけだと『だまし』が非常に多くなるので、様子を見て一工夫が必要だとのことでした。
様子見や工夫の仕方が思いつかないので、とりあえずどのくらいだまされるものか、やってみてそれから考えることにしましょう。


 [ルールの式化]
ルールが決まったところで、プログラミングしやすいよう、式に置き換えてみます。

まず、GCやDCは以下のように定義してみました。
GC:短期線<長期線の状態から、長期線≦短期線になったとき
DC:長期線<短期線 〃  短期線≦長期線 〃

「GCやDCになる少し前」は、このようにします。
GCになる前:時価<短期線<長期線の状態から、短期線≦時価<長期線になったとき
DCになる前:長期線<短期線<時価 〃 長期線<時価<短期線 〃

(短期線、長期線は終値ベースの単純移動平均。時価は直近の終値)

そしてルールはこうなります。

  • GCになる前」が発生したら買い
  • DCになる前」が発生したら売り
  • 買いや売りの保有するポジションは1つまで。
     (ポジション保有時に再度買いや売り条件が発生しても無視する)
  • GCまたはDCが発生時、ポジションを保有していたら全て閉じる


投稿者 kawarobo : 09:48 | コメント (3) | トラックバック

2005年06月28日

為替ロボットの作り方(FXCM用) はじめに

それでは為替ロボット、略してカワロボを作ってみましょう。
ここでは、FXCMのデモ口座でカワロボの運用を開始するまでの手順を紹介します。

【ながれ】

  1. 売買ルール(戦略)を決める
  2. プログラミングをする
  3. バックテストをして戦略を調整する
  4. 運用開始

【用意するもの】

以下のソフトをダウンロード、インストールして下さい。
全てフリーソフトです。

HyperOrder(以下、HO)はダウンロード前にフォーラムへの登録(無料)が必要です。HOダウンロード手順

BlackJumboDog はリンク先一番下の「BlackJumboDog イントラネット用簡易サーバ 3.8.3」をダウンロードして下さい。

HOはメールサーバからメールを受信し、そのメールの内容に沿ってFXCMにオーダーを自動的に出す機能を持っています。
売買シグナル発生時にSBFXがメールを送り、HOで受信して売買注文を実行します。
BlackJumboDogはメールサーバーとして、SBFXとHOの仲介をしてもらいます。

*現在、SBFXより高機能な
  MetaTrader4 http://www.metatrader4.com/(以下、MT4)
というフリーソフトがありますが、バックテスト機能がまだ使えません。
MT4のバックテスト機能が使えるようになり次第、SBFXと入れ替える予定です。
(MT4はSBFXの元?となっているMetaTrader3の後継です。そのため画面構成や使い方はSBFXと非常によく似ています。
また、MT4にはシグナルをメールで送信する機能があり、売買シグナルをメール配信したり、
モブログで売買履歴を公開したりという使い方もできます。
早くバックテストができるようになるといいのですが。。)


【前準備】

取引に使用するFXCMのデモ口座を作っておきます。
こちらのページから登録しますとIDとパスワードがメールで届きます。


投稿者 kawarobo : 00:47 | コメント (0) | トラックバック

2005年06月27日

SBFXとHyperOrderの連携方法

これまで、FXCMの取引を自動化するには
MetaTrader4HyperOrder
の組み合わせを使うことにしていましたが、
SBFXHyperOrder
の組み合わせでも使える方法がわかりました。

詳しくは為替ロボット入門で書いていきますが、
SBFXのファイル読み書き機能を使って、メールサーバーの受信ボックスに直接、
メールを書き出すという方法になります。

これまではSBFXはテスト用、MT4が本番用と考えていましたが、
MT4のバックテスト機能が実装されるまでは

MT4でもバックテストできるようになりました。更新記事


SBFXをメインにする方向で行きたいと思います。


投稿者 kawarobo : 20:09 | コメント (0) | トラックバック

2005年06月26日

当面は・・

当サイトは現在のところ、内容の更新や準備に手一杯のため、
コメントや質問をいただきましてもリアクションできない場合があります。
スルーしてもどうか怒らないで下さい。。
(文章を書くのが驚くほど遅く、負担が大きいもので。。
 全て目は通して、新しい記事の参考にさせていただきます。)

リンクやトラックバックは大歓迎です!
リンク報告なんてものは不要です。
勝手にどんどん、貼っていただけると嬉しいです。


投稿者 kawarobo : 23:59 | コメント (0) | トラックバック

2005年06月24日

為替ロボット こちらです

livedoorからの引越しが終わりまして、当サイトが為替ロボット公式サイト(?)
になりました。
kawarobo.com 為替ロボット研究所

しばらくはlivedoor版為替ロボットのほうも平行して更新していくつもりです。
よろしくお願いします。

*「為替ロボット」で検索してみるとリンクを貼ってくださっているサイトが
いくつか見つかりました。 大変嬉しいです!
最近はブローカー側でもシステム売買のセミナーを行ったり、雑誌でも
システムトレーディングについて取り上げられることが多くなったようなので、
注目度アップを狙いたいところです。


投稿者 kawarobo : 18:01 | コメント (0) | トラックバック

2005年06月16日

トレイリングストップ(Trailing Stop)

FXCMなどのブローカーで採用されているトレイリングストップ(トレーリングストップ)機能について。

トレイリングは「追いかける」の意味。ストップ値が追いかけてくる。

時価での利益が一定値に達する度にストップ値を自動的に引き上げる(売りポジの場合は引き下げ)仕組み。

これにより、オーダーしたまま放置していてもある程度の利益を確保できるようになります。
(リミット達成ぎりぎりまで行ったのに値動きが反転、気がついたら儲けが0になっていた。。というのを防ぐ)

また、うまくトレンドに乗っているときは利益確定でポジションを閉じよりも、トレイリングストップを使って様子見するほうが、結果的に利益が大きくなる可能性があります。

例:

 EURUSD 1.2500で買い。ストップは1.2400、TrailingStopは50pipsの場合、

1.2500 + 50pips = 1.2550に達したら、ストップが自動的に50pips引き上げられて1.2450になる。

 それ以降も50pips上がるごとにストップも50pips引き上げられる。
 一度引き上げられたストップを下げることはしない。


投稿者 kawarobo : 02:54 | コメント (0) | トラックバック

2005年06月15日

期間とシフトの単位(Bar)

移動平均などで期間を指定する場合、その単位は、チャートのBar1本分の時間。

 1時間足チャートならBar1本(ロウソク足1本)は1時間
 日足なら1本1日
 30分足なら1本30分。

iMA(5,MODE_SMA,0)とした場合、Bar5本分の移動平均となるので、チャートが日足なら5日移動平均になり、チャートが1時間足なら5時間移動平均になる。

シフトは指定したBar数ぶん前の値を得たい時に利用する。

・チャートが日足の場合
i=iMA(5,MODE_SMA,0) iは5日移動平均の現在値。(当日~4日前の平均値)
i=iMA(5,MOde_SMA,1) iは5日移動平均、前日の値(1日前~5日前平均値)

・チャートが30分足の場合
i=iMA(5,MODE_SMA,1) iは150分移動平均(30分×5)、30分前(30分×1)の値(30分前~150分前の平均値)


投稿者 kawarobo : 05:21 | コメント (0) | トラックバック

iMACD (MACDチャートの各値を得る)

MACDの各値を返す。
MACDについては 検索:「MACD

書式:

iMACD(短期,長期,シグナル,モード,シフト);

 短期、長期、シグナル=期間。単位はチャートの時間単位による。
 モード=MODE_MAINでMACD値、MODE_SIGNALはシグナル。
 シフト=指定した数(Bar数)ぶん前の値を得る。
 *期間とシフトについて

例:
 MacdCurrent=iMACD(12,26,9,MODE_MAIN,0);// 現在のMACD値
 MacdPrevious=iMACD(12,26,9,MODE_MAIN,1);// 一つ前のMACD値
 SignalCurrent=iMACD(12,26,9,MODE_SIGNAL,0);//現在のシグナル値
 SignalPrevious=iMACD(12,26,9,MODE_SIGNAL,1);//一つ前のシグナル値


投稿者 kawarobo : 05:20 | コメント (0) | トラックバック

iMA (移動平均の算出)

移動平均の値を返す。
移動平均については 検索:「移動平均 EMA

書式:
iMA(期間,モード,シフト);

 期間=移動平均の期間。単位はチャートの時間単位による。
 モード=
   MODE_EMA 指数移動平均値
   MODE_SMA 単純移動平均、
   MODE_LWMA 線形加重移動平均
   MODE_SMMA 平滑移動平均(修正移動平均?) 
 シフト=指定した数(Bar数)ぶん前の値を得る。
 *期間とシフトについて

例:

MaCurrent=iMA(MATrendPeriod,MODE_EMA,0);// 現在のEMA値
MaPrevious=iMA(MATrendPeriod,MODE_EMA,1);// 一つ前のEMA値


投稿者 kawarobo : 05:19 | コメント (0) | トラックバック

Point(1ポイントの値を得る)

チャートのシンボル(通貨組み合わせ)の1ポイント(1pip)に相当。
 EUR/USDの場合Point=0.0001
 USD/JPYの場合Point=0.01

例:
EUR/USDの場合
 1.2100 +(20*Point) は 1.2120
USD/JPYの場合
 108.00 +(20*Point) は 108.20


投稿者 kawarobo : 04:18 | コメント (0) | トラックバック

CurTime(現在時刻)

現在の時刻を1970/1/1 00:00:00 からの経過秒数で表したもの。


投稿者 kawarobo : 04:17 | コメント (0) | トラックバック

LastTradeTime(最終オーダー時刻)

直近のオーダー時刻を1970/1/1 00:00:00 からの経過秒数で表したもの。

最後にオーダーを出してから何秒経ったかは、
CurTime(現在時刻を1970/1/1 00:00:00 からの秒数で表す)
と組み合わせて、
 CurTime -LastTradeTime
で算出される。


投稿者 kawarobo : 04:16 | コメント (0) | トラックバック

TotalTrades(ポジション数)

保有ポジションと未約定のオーダーの合計数。


注意:ポジション数、オーダー数 ≠ ロット数

保有ポジションの合計ロット数が知りたい場合はFor文とくみあわせて、

var: cnt(0),totalLots(0);
for cnt=1 to TotalTrades
{
if OrderValue(cnt,VAL_SYMBOL)!=Symbol then continue;
//別シンボルの場合は処理をスキップ
totalLots += OrderValue(cnt,VAL_LOTS);
};

のようにする。


投稿者 kawarobo : 04:15 | コメント (0) | トラックバック

OrderValue(オーダーの様々な値を得る)

保有ポジションや未約定オーダーの様々な値を得る。

書式:
OrderValue(ポジション番号,モード)

 ポジション番号=
 保有ポジションのオープン時刻(未約定の場合はオーダー時刻)の古い
 ものから順に番号が振られる(1番古いものが1)。ポジション状況など
 の変化により随時ふりなおされる。
 ⇔チケット番号(IDの役割があるので一度付いたものは変化しない)

 モード=
  VAL_TICKET   チケット番号
  VAL_OPENTIME  オープン時刻(未約定ならオーダー時刻)
  VAL_TYPE    オーダータイプ
  VAL_LOTS    ロット数
  VAL_SYMBOL   シンボル
  VAL_OPENPRICE  ポジションのオープン値
  VAL_STOPLOSS  ストップ値
  VAL_TAKEPROFIT リミット値
  VAL_CLOSEPRICE ポジションのクローズ値(?)
  VAL_COMISSION  手数料
  VAL_SWAP    スワップ
  VAL_PROFIT   利益(時価評価)
  VAL_COMMENT   コメント
  VAL_CLOSETIME  クローズ時刻(?)

(クローズ値やクローズ時刻などはポジションが閉じられるまで値が入らない。
でも閉じられたポジションはOrderValueからは呼び出せない??)

例:

Print(OrderValue(1,VAL_OPENPRICE);// 一番新しいポジションの取得値を表示

//保有ポジション(未約定オーダー含む)のチケット番号列挙
var: cnt(0);
For cnt=1 To TotalTrades
{
Print(OrderValue(cnt,VAL_TICKET) );
};


投稿者 kawarobo : 03:15 | コメント (0) | トラックバック

CloseOrder(ポジションを閉じる)

ポジションを閉じる。

書式:
CloseOrder(チケット番号,ロット数,閉じ値,スリッページ,マークの色)

 チケット番号=全てのオーダーに与えられている通し番号。
  ポジション番号と違い、一度付いたら変化しない。
  *ポジション番号pからチケット番号を得る OrderValue(p,VAL_TICKET);
 ロット数=閉じたいポジションのロット数を入力。
  ロットの一部のみ閉じることはできない。??
  *ポジション番号pからロット数を得る OrderValue(p,VAL_LOTS);
 閉じ値=クローズ価格。
  現在値と閉じ値が一致する場合にしかクローズが実行されないので、
  指値的な使い方はできない。閉じたいポジションが買いポジションな
  ら売値Bidを、売りポジならBidを指定。
 スリッページ=3で固定しておけば問題なし。
 マークの色=クローズオーダーをチャート上で表示する時の色。

例:

//保有中のポジション、未約定オーダーを全てクローズする
var: closeprice(0);
While TotalTrades>0 //Forはポジション番号の関係でややこしくなる
{
while TotalTrades>0 {
Print("tes");
if OrderValue(1,VAL_TYPE)==OP_BUY
| OrderValue(1,VAL_TYPE)==OP_BUYSTOP
| OrderValue(1,VAL_TYPE)==OP_BUYLIMIT
then closeprice=Bid else closeprice=Ask;
 //閉じ値=買いポジションならBid、売りならAsk
CloseOrder(OrderValue(1,VAL_TICKET),OrderValue(1,VAL_LOTS),closeprice,3,blue);
DeleteOrder(OrderValue(1,VAL_TICKET),Blue);//未約定オーダーならこれで削除
};


投稿者 kawarobo : 03:14 | コメント (0) | トラックバック

SetOrder(売買オーダーを出す)

売買オーダーを出す。
売買は現在のシンボルのみ。

書式:
SetOrder(タイプ,ロット数,売買値,スリッページ,ストップ値,リミット値,矢印の色)

 タイプ=
 OP_BUY 成り行き買い
 OP_SELL 成り行き売り
 OP_BUYLIMIT 逆指値買い(指値より高くなれば買い実行)
 OP_SELLLIMIT 逆指値売り(指値より安くなれば売り実行)
 OP_BUYSTOP 指値買い(指値以下で買い実行)
 OP_SELLSTOP 指値売り(指値以上で売り実行)

 売買値=指値。成り行きならAsk(買い値)やBid(売り値)を。
 スリッページ=許容スリッページ。単位はPoint。3固定で問題なし
 ストップ、リミット値=指定しないなら0
 矢印の色=チャート上に表示する時の矢印の色。英語で指定
 
例:

//成り行き買い、買い値-50pipsでストップ、リミットは無し、
//ロット数はLotsで指定されている値。矢印青色
SetOrder(OP_BUY,Lots,Ask,3,Ask - 50*Point,0,Blue);

//指値売り、売値1.2000、ストップ1.2050、リミット1.1900
SetOrder(OP_SELLSTOP,Lots,1.2000,3,1.2050,1.1900,Red);


投稿者 kawarobo : 03:13 | コメント (0) | トラックバック

Print(文字を表示する)

SBFXのJournal欄に文字列を表示する。

書式:
Print(文字列)

 文字列=文字列を直接入れるときは"でくくる("abc"でabcと表示)。
  変数はその値が表示。変数と文字列の結合も可。結合は「,」か「+」。

例:
var: i(1),j("abc");
Print(i);// 「1」
Print(j);// 「abc」
Print("i=",i);// 「i=1」
Print("i="+i);// 「i=1」
Print(i+j);// 「1abc」


投稿者 kawarobo : 03:12 | コメント (0) | トラックバック

条件式

If文While文などで使用する。
結果が真(TRUE)か偽(FALSE)となる式。

A == B AとBが等しいならTRUE、そうでないならFALSE
A > B AがBより大なら 〃
A >= B AがB以上なら  〃
A < B  AがBより小なら 〃
A <= B AがB以下なら  〃
A != B AとBが異なるなら〃

条件式どうしをand(&)やor(|)でつなげて複雑な条件式にすることもできる。
and=かつ、or=もしくは と考える。

条件式1 and 条件式2 条件式1が真 かつ 2も真ならTRUE。それ以外はFALSE
条件式1 or 条件式2 条件式1が真 もしくは 2が真ならTRUE。両方真でもTRUE

( )で括ればさらに複雑な条件式にもできる。

例:
var: i(0),j(1),k(1);
if i==j and j==k then Print("TRUE") else Print("FALSE");//結果FALSE
if (i==j and j==k) or k>i then Print("TRUE");//結果TRUE
if i==0 and ((i==j and j==k) or k>i) then Print("TRUE");//結果TRUE


投稿者 kawarobo : 02:12 | コメント (0) | トラックバック

While(繰り返し処理)

条件式が真である間、ずっと処理を繰り返す。


書式:
While 条件式 { 処理 };

はじめに条件式の真偽判定をして、真なら処理が始まる。
処理が終了した時点で再び条件式の真偽判定をして、真ならまた処理が繰り返される。
 *条件式について

制御コマンド:
Continue その回の処理をそこで中止し、次の回に進む。
Break 処理をそこで中止し、While文を抜ける。

条件式を「TRUE」に固定して、Breakと組み合わせることで
If文の入れ子の代わりにできる

例:

var: i(0),j(1),k(2);
While i==0
{ //whileスタート
Print("j="+j);
j++;
if j>10 then i=1;
};
//結果 j=1,j=2,...,j=10 まで。


i=0; j=1;
If i==0 then
{
If j==1 then
{
 If k==2 then
 {
  Print("ok");
 };
};
};
//Whileを使ってこれと同じ処理をすると・・・
While TRUE
{
if i!=0 then Break;
if j!=1 then Break;
if k!=2 then Break;
Print("ok");
Break;//無限ループにならないよう注意
};

//条件式の判定は処理開始前と終了後のみ。
//↓の例は無限ループになる
While i==0
{
i=1;
i=0;
};


投稿者 kawarobo : 02:11 | コメント (0) | トラックバック

for(繰り返し処理)

変数の値を変えながら、繰り返し処理を行う。

書式:

for 変数 = 初期値 to 最終値 { 処理 }

はじめに変数=初期値がセットされて、処理を開始。
処理が終わると変数が1増加して再び処理を繰り返す。
変数が最終値になると繰り返し終了。(最終値で処理実行後、for終了)

変数の値を減少させていきたい場合はtoの代わりにDowntoを使う。

制御コマンド:

Continue その回の処理をそこで中止し、次の回に進む。
Break 処理をそこで中止し、For文を抜ける。


例:

var: i(0);
for i=1 to 10
{ //begin
Print("i=",i);
};//end

//結果、i=1,i=2,...i=10まで順に表示される。

for i=10 Downto 1
{
Print("i="+i);
};
//結果、i=10,i=9,...i=1まで順に表示される。

for i=1 to 10
{
if i==3 then Continue;
if i==6 then Break;
Print("i=",i);
};
//結果、i=1,i=2,i=4,i=5 が表示される。


投稿者 kawarobo : 02:10 | コメント (0) | トラックバック

IF~THEN~ELSE(条件分岐)

条件にあてはまった場合に、特定の処理を実行する

書式:
If 条件式 Then 処理 (Else 処理2);

 条件式=処理を振り分けるための条件。結果が真か偽となる文。
 処理=条件式が真の場合に実行される。
 Else 処理2=条件式が偽の場合に実行される。無くても良い。
 *条件式について

例:
var: i(1),j(0),k(0);
If i==1 then j=1;
print("j="+j); //結果、j=1 が表示。

If i==2 then j=1 else j=2;
print("j="+j); //結果、j=2 が表示。

If i==1 then {
  j=3;
  k=1;
} else{
  j=0; k=0;
};
print("j="+j+",k="+k); //結果、j=3,k=1 が表示。

//If文を入れ子にすることも可
If i>0 then
if i<2 then j=4 else j=1;
else j=0;
print("j="+j); //結果、j=4 が表示


投稿者 kawarobo : 02:09 | コメント (0) | トラックバック

MQLⅡ簡易リファレンス

MQLⅡの特徴的な部分を挙げておきます。


  • 変数は使用前に宣言しておく
     var: i(0); ←( )内は初期値
     var: j(1);
     vars: i(0), j(1); のように「,」で区切って一行に書いてもOK。
     Array: i[10](0); 配列はこのように宣言。
     Arrays: i[5](3), J[10]("");

  • 文末には必ず「;」を付ける
     i=2;
     If i==2 then{ …} ;

  • IF文の「;」に注意(for文While文なども)
     If i==1 then j=1 ;
     If i==1 then j=1 else j=2 ;
     If i==1 then {
      j=1;k=1;
     }else{
      j=2;
      k=2;
     };
     for i=0 to 10 {
      ・・・
     };

  • 大文字小文字は区別されない
     変数I と変数iは同じ変数として扱われる

  • コメントは頭に「//」。または「/*」「*/」でくくる
     //ここはコメント。プログラム上では無視
     /* 複数行にまたがるときは
    このように使用 */
     
  • 文字列は「” ”」でくくる
     print(“Hello”);
     I=”test”;

  • 終了は「Exit」
     if I==”test” then Exit;

  • ExpertはTickデータ更新ごとに実行される。変数は宣言時に初期化され、以降は値が保持される
     var: i(0);
     i=i+1;
     print(i);
     //実行されるごとにiの値が増え、1,2,3,...と値が増えていく

  • 変数は初期値によって型が決まる。あとから代入しようとする値と型が一致しないと予期しない値になる。
     var:i(1),J(“test”); // iは数値、Jは文字列
     i = J;
     print(i); //結果、「test」 ではなく「0」が表示される

  • ++ や +=, *=などが使える
     i++; ⇔ i=i+1;
     i+=2; ⇔ i=i+2;
     i*=3; ⇔ i=i*3;

  • 文字列の結合は「+」
     var: I(”abc”),J(“”) ;
     J = I + ”def” ;
     Print(J); //結果、「abcdef」が表示される

その他詳細は MQLⅡ覚え書き へ


投稿者 kawarobo : 02:09 | コメント (0) | トラックバック

もくじ

MQLⅡ覚え書き もくじ


投稿者 kawarobo : 02:08 | コメント (0) | トラックバック

MACD Sampleの中身4

//print("Check: ",TotalTrades);//デバッグ用。Printは文字列を表示する
//PrintTrade(1);//デバッグ用。直近のポジション情報を表示

//ここからはポジションを閉じる条件を設定している

for cnt=1 to TotalTrades
//Forで指定回数繰り返す
//現在のポジション&未決オーダー数ぶん、以下を繰り返し実行
{ //forのはじまり
 if OrderValue(cnt,VAL_TYPE)<=OP_SELL and
  OrderValue(cnt,VAL_SYMBOL)=Symbol then

 //OrderValue=ポジションの情報を得る。
 //OP_BUY < OP_SELL < OP_BUYLIMIT < OP_SELLLIMIT < OP_BUYSTOP < OP_SELLSTOP の関係。
 //現在選択中のシンボル(通貨組み合わせ)でポジションがあるなら、の意。
 { // 2
  If OrderValue(cnt,VAL_TYPE)=OP_BUY then // 買いポジションなら
  { // 2_1
   // 現在MACDが正で、MACDがシグナルを上から下へクロスし、
   // MACD絶対値がクローズレベルを超えているなら、ポジションを閉じる
   If MacdCurrent&rt0 and MacdCurrent<SignalCurrent and
    MacdPrevious&rtSignalPrevious and
    MacdCurrent&rt(MACDCloseLevel*Point) then

   { // 2_1_1
    CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet);
    // CloseOrder=ポジションを閉じる
    Exit; //終了
   }; // 2_1_1

   // (2_1_1に当てはまらなかった場合ここに来る)
   // トレイリングストップが設定されている場合はストップ値を変更
   If TrailingStop&rt0 then
   {
// 2_1_2
    If (Bid-OrderValue(cnt,VAL_OPENPRICE))&rt(Point*TrailingStop) then
    //売値-ポジの買値>トレーリングストップ値より大なら
    { // 2_1_2_1
     If OrderValue(cnt,VAL_STOPLOSS)<(Bid-Point*TrailingStop) then
     //ポジのストップ値がまだ引き上げられていないなら
      { // 2_1_2_1_1
ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE),Bid-Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);
      //ストップ値を編集。ストップ値を引き上げる
      //ModifyOrder=オーダーを変更
      Exit;
     }; //2_1_2_1_1
    }; // 2_1_2_1
    }; // 2_1_2
  } // 2_1
  else // 売りポジションなら
  { // 2_2
  // 現在MACDが負で、MACDがシグナルを下から上にクロスし、
  // MACD絶対値がクローズレベルを超えているなら、ポジションを閉じる
   If MacdCurrent<0 and MacdCurrent&rtSignalCurrent and
    MacdPrevious<SignalPrevious and
    Abs(MacdCurrent)&rt(MACDCloseLevel*Point) then
   {
// 2_2_1
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Ask,3,Violet);
    Exit;
// 終了
   }; // 2_2_1
   // そうでないなら
   If TrailingStop&rt0 then
   //トレーリングストップ設定あればストップ値編集
   { // 2_2_2
    If (OrderValue(cnt,VAL_OPENPRICE)-Ask)&rt(Point*TrailingStop) then
    {
//2_2_2_1
     If OrderValue(cnt,VAL_STOPLOSS)=0 or
      OrderValue(cnt,VAL_STOPLOSS)&rt(Ask+Point*TrailingStop) then
     {
// 2_2_2_1_1
ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE),Ask+Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);
      Exit;
     };
// 2_2_2_1_1
    }; // 2_2_2_1
   }; // 2_2_2
  }; // 2_2
  }; // 2
}; // forの終わり
// the end.


投稿者 kawarobo : 02:02 | コメント (0) | トラックバック

MACD Sampleの中身3

//IF文による条件分岐
// その時点でのデータ数が少ない(=200より小)か、
// 目標利益幅が小さすぎる(=10pips未満)場合は終了
If Bars<200 or TakeProfit<10 then Exit;

// iMACD()でMACDチャートの各値を算出。
MacdCurrent=iMACD(12,26,9,MODE_MAIN,0);//現在のMACD値
MacdPrevious=iMACD(12,26,9,MODE_MAIN,1);// 一つ前のMACD値
SignalCurrent=iMACD(12,26,9,MODE_SIGNAL,0);//現在のシグナル値
SignalPrevious=iMACD(12,26,9,MODE_SIGNAL,1);//一つ前のシグナル値

// iMA()は移動平均MovingAverageの各値を算出
MaCurrent=iMA(MATrendPeriod,MODE_EMA,0);//現在のEMA値
MaPrevious=iMA(MATrendPeriod,MODE_EMA,1);//一つ前のEMA値

//ここからは、ポジションを持つ条件を設定している

If TotalTrades<1 then
 //TotalTrades= 保有ポジションと未約定オーダー数
 // 保有ポジションや未約定のオーダーがなければ
 // 「ここから1」~「ここまで1」を実行
 // ⇔既にポジションがある場合は実行されない
{ //ここから1
 If FreeMargin<1000 then Exit;
 // 余剰証拠金が1000未満の場合終了
// If((CurTime-LastTradeTime)<300) { Exit }
 //(↑この行は無効化されている)
 // LastTradeTime=直近のオーダー発注時刻(単位は秒)。

 If MacdCurrent<0 and MacdCurrent&rtSignalCurrent and
  MacdPrevious<SignalPrevious and
  Abs(MacdCurrent)&rt(MACDOpenLevel*Point) and
  MaCurrent&rtMaPrevious then

 // Point=1pipの値.
 // MACD現在値が0より小かつシグナルより大で、MACD過去値がシグナルより小で、
 // MACD絶対値が開始レベルポイントを超えている、
 // MA現在値がMA過去値を越えた場合
 //「ここから1_1」~「ここまで1_1」を実行

 // (=MACDが負の場合、
 // MACDがシグナルを下から上へクロスした時に、
 // MACD絶対値が十分大きく、MAが上昇中なら
 // 買いオーダー出す)
 { //ここから1_1
  SetOrder(OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,RED);
  // SetOrder=注文を出す
  // 成り行き買い注文(数量=Lots,スリッページ3,
  // ストップ=なし,リミット= 現値+TakeProfit pips)
  Exit; // 終了

 }; //ここまで1_1


 If MacdCurrent&rt0 and MacdCurrent<SignalCurrent and
  MacdPrevious&rtSignalPrevious and
  MacdCurrent&rt(MACDOpenLevel*Point) and
  MaCurrent<MaPrevious then

 //以上条件満たせば「ここから1_2」~「ここまで1_2」実行
 // (=MACDが正の場合、
 // MACDがシグナルを上から下へクロスした時に
 // MACD絶対値が十分大きく、MAが下降中なら
 // 売り。)
 { //ここから1_2
  SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED);
  // 成り行き売り注文
  //(数量=Lots,スリッページ3,
  // ストップ=なし,リミット= 現値+TakeProfit pips)
  Exit; // 終了
 }; //ここまで1_2

 // どちらの条件にもあてはまらなければ終了
 Exit;
};
//ここまで1


つづく


投稿者 kawarobo : 02:01 | コメント (0) | トラックバック

MACD Sampleの中身2

MACDサンプルのコードを見てみましょう。

~ MACD Sample.mql ~
/*[[
   Name := MACD Sample
   Author := Copyright ゥ 2002, MetaQuotes Software Corp.
   Link := http://www.metaquotes.ru
   Notes :=
   Lots := 1
   Stop Loss := 0
   Take Profit := 40
   Trailing Stop := 0
]]*/

// ↑は特殊なコメント行。デフォルトのLot数など特別なパラメをセット
//------------------------------------
//定数・変数の宣言。
//defines: やvar:に続けて宣言する.
//「,」で区切って複数まとめて宣言も可
//------------------------------------
defines: MACDOpenLevel(3),MACDCloseLevel(2);
defines: MATrendPeriod(56);

// ↑定数を列挙。プロパティ画面から値を変更できる。
// ()はデフォルト値。MQLⅡでは数字のみ。文字列は不可。
// 定数はプログラム内からの変更不可。

var: MacdCurrent(0),MacdPrevious(0);
var: SignalCurrent(0),SignalPrevious(0);
var: MaCurrent(0),MaPrevious(0);
var: cnt(0);

// ↑変数を列挙。
// ()は初期値。文字列の場合は""でくくる。例 test("abc")

//------------------------------------
//ここから下がTickデータ更新ごとに実行.
//変数の値はずっと保持される
//------------------------------------

つづく


投稿者 kawarobo : 00:56 | コメント (0) | トラックバック

2005年06月08日

MACD Sampleの中身1

MQLⅡプログラミングの参考にMACD Sampleの中身を見てみましょう。

MetaEditorのメニュー
 File > Open
から、MACD Sample.mqlを開きます。

*SBFXのNavigatorウィンドウから
  ExpertAdvisors > MACD Sample (右クリック)> Modify
 でも開けます。

macdsample1


【MACDSampleの売買ルール】


  • ポジションは1つだけ。複数ポジションは持たない。
  • ポジションが無い場合、
     MACDの絶対値がオープンレベル(MACDOpenLevel)pipsより大きい地点で、
     MACDが正で、シグナルを上回ったとき、MAも上昇中なら 買い。
     MACDが負で、シグナルを上からクロスしたとき、MAも下降中なら 売り。

  • ポジションがある場合
    MACDの絶対値がクローズレベル(MACDCloseLevel)pipsより大きい地点で、
     買いポジなら、MACDが正で、シグナルを下回ったとき、閉じる。
     売りポジなら、MACDが負で、シグナルを上回ったとき、閉じる。

  • トレーリングストップの採用が可能。
  • トレーリングストップを設定していないならストップ値はなし。
  • 目標利益幅(TakeProfit)は10pips以上で一定値に固定。
  • 余剰証拠金が1000以上必要。
  • MACD算出のため、ヒストリカルデータの数200以上が必要。

次では、実際のMQLⅡコードを見ながら内容を確認していきます。


投稿者 kawarobo : 10:09 | コメント (0) | トラックバック

プログラミングしてみよう

StrategyBuilderFXのExpertを作成する言語はMQLⅡというものです。

これはエクセルのマクロなどで使えるVBScriptによく似た書式ですので、経験のある方にはそれほど難しくないと思います。


投稿者 kawarobo : 09:49 | コメント (0) | トラックバック

辞書の使い方(MQLDictionary)

辞書をつかってMQLの書式を確認することができます。

editexpert7本のアイコン(MQLDicionary)を押すと、MetaQuoteLanguageDictionaryが開きます。

editexpert8
それぞれの項目を選択すると説明が表示されます。

editexpert9「OK」を押すと、カーソル位置にその項目が自動的に挿入されてしまいますので、書式の確認だけしたい場合には「Cancel」でウィンドウを閉じてください。

editexpert10また、MetaEditorには入力補完機能があります。登録されている語を途中まで入力すると候補が現れますので、↑↓で選びEnterで確定してください。


投稿者 kawarobo : 09:40 | コメント (0) | トラックバック

エラーチェック&コンパイル(Verify)

MetaEditorで作成したプログラムはmqlファイルになりますが、SBFXで実行できるようにexpファイルに変換する作業(コンパイル)が必要です。
同時にmqlの文法にエラーがないかもチェックされます。

editexpert5チェックマークのアイコン「Verify」をクリックします。
このときプログラムは自動的に上書き保存されます。

editexpert11エラーが見つかれば、画面下のOutputウィンドウにエラー内容が表示されます。メッセージを参考にエラー箇所を修正してください。
この場合は、9行目の行末の「;」が抜けていたようです。

editexpert12修正して再びVerifyボタンを押します。
エラーが無ければこのように表示され、コンパイルが完了しました。

editexpert6MetaTraderボタンを押すとStrategyBuilderFXに戻ります。


投稿者 kawarobo : 09:26 | コメント (0) | トラックバック

新規Expertウィンドウを開く

MetaEditorのメニュー
 File > New
でExpert Advisor Wizardを立ち上げます。

*SBFXのNavigatorウィンドウからExpertAdvisorsを右クリック、Create a new Expertからでも直接立ち上げることができます。

editexpert1


editexpert2
ウィザード画面が現れますので、ExpertAdvisorProgramが選択されていることを確認して「次へ」。

editexpert3
新しいExpertの名前と作成者の署名、LotsStopLossなど特殊なパラメーターのデフォルト値を入力します。
署名は適当に入れてください。パラメーターは分からなければそのままでも大丈夫です。

editexpert4
ウィンドウが開き、Expert作成の準備が整いました。


投稿者 kawarobo : 09:14 | コメント (0) | トラックバック

MetaEditor入門

オリジナルのExpertAdvisorを作ることができるMetaEditorの使い方を見ていきましょう。

【MetaEditorの起動】

MetaEditorはStrategyBuilderFXのメニュー
Tools > MetaQuotes Language Editor
で起動します。

editexpert0


【Expert作成の流れ】

新規ウィンドウを開く → プログラミング → コンパイル → 完成


投稿者 kawarobo : 09:08 | コメント (0) | トラックバック

2005年06月02日

チャートのちょっとしたTIPS

charttips1
チャート上で、各バーの終値付近にマウスカーソルを合わせると、その4本値がポップアップ表示されます。


投稿者 kawarobo : 00:13 | コメント (0) | トラックバック

テスト結果がおかしい?

arrowchart4エキスパートのテストの仕方によっては、ランダムに生成された為替データのせいで、売買成立するはずが無いところで成立していたり、矢印や三角印の表示位置がおかしくなっていたりするバグが発生したりすることがあるので注意してください。

なお、チャートのデータは売値(Bid)ですので、買いオーダーや決済買いなどでは矢印や三角印がロウソク足の少し上にハミ出ていることがありますが、これはバグではありません。


投稿者 kawarobo : 00:11 | コメント (0) | トラックバック

2005年06月01日

チャート上で売買結果を見る

テスターで「Arrows in the chart」にチェックが入っていると、チャート上でその売買結果を見ることができます。

arrowchart2チャートを見てみると所々に、矢印や三角印が入っています。

矢印が発注したオーダー(成り行き注文の場合はその時点で成立済み)、三角印が売買成立ポイントです。
矢印が下向きのものはSell、上向きはBuy。
矢印の上下にあるラインはストップとリミットを表します。


arrowchart3
(この場合はリミットだけがセットされているようです。
その先の三角印で、リミット達成されました)


arrowchart1

*チャートを移動して見る場合はscrollをoffにしておきます。チャート上でドラッグしてずっと過去まで遡ってみることができます。

*表示が細かすぎたり大きすぎたりする場合は+-アイコンを使って調整します。


投稿者 kawarobo : 23:52 | コメント (0) | トラックバック

レポートと資産曲線を確認

tester10Reportタブを開き、テスト結果の詳細を確認します。
結果で重視されるのがトレード数と勝率、勝敗それぞれの収益率、あとは最大ドローダウンでしょうか。
(結果の見方はこちら)

特に、いくら最終利益が高くても、Max drawdownが大きいと資金曲線が乱高下していることになるので安定した収益が期待できません。
今回はトレード数42回とそれほど多くない中で、最大ドローダウンが24.1%あり、少し大きすぎるような気がします。

tester11資金曲線が気になるので、EquityGraphタブを開いて確認してみましょう。
右肩上がりではありますが、かなり荒い感じは否定できません。
もう少し長いスパンでテストしてみたいところです。


投稿者 kawarobo : 23:48 | コメント (0) | トラックバック

エキスパートのパラメーターを変える

tester4
パラメーターの値が良くないのかもしれません。
値を変更して、もう一度試してみましょう。
Settingsタブを開きます。

tester5MACDOpenLevelは3になっていますが、これを5に変えます。
数字の部分をダブルクリックすると入力可能になりますので
と入れ、Enterで確定します。
(Enterを押さないと元の数字に戻ってしまいます)


tester6同じようにMACDCloseLevel
MATrendPeriod112に変えます。

tester7それでは、StrategyTesterタブを開いて、
もう一度テストをスタートします。
Modelは「OHCL point(fast)」です。

tester8
結果、約2年間で5400ドルのプラス。
投資額の54%増という高成績になりました!


それでは、もうすこし細かくシミュレーションしてみましょう。

FXCMJapanの設定にあわせるために、
Commission50$(SBFXでは1ロット=10万通貨のため)
SpreadPips
Model=「every 1 point(slow)
に変えてもう一度テストをスタート。

tester9
結果は、先ほどより減りましたが、それでも3870$のプラス、38.7%増となりました。


投稿者 kawarobo : 22:39 | コメント (0) | トラックバック

ストラテジーテスターを使おう

前回、EURUSDのチャートに適用したMACDSampleがどれほどのものなのか、ストラテジーテスターでバックテストをしてみます。


tester1

EURUSDのチャートを右クリックでメニューを出し、
Expert Advisors > Strategy Tester

テスター画面を開きます。

tester2
「Arrows in the chart」にチェックを入れて、
あとでチャート上で売買履歴を確認できるようにします。
「Model」はOHCL points(fast)にして、Start。

tester3
あっという間にテストが終わりました。
結果は -12840$。マイナスが膨らみすぎて途中で止まってしまいました。
これではとても任せられません。


投稿者 kawarobo : 22:29 | コメント (0) | トラックバック

エキスパートアドバイザーを使ってみよう

jissennsbfx1それでは実際にSBFXを使ってみましょう。

SBFXを起動します。

見やすくするため、開いているチャートを全て閉じ、
新たにEURUSDのチャートを開きます。

jissennsbfx2 jissennsbfx3

jissennsbfx4
一時間足チャートに切り替え、
表示もロウソク足にします。

SBFXで自動売買の肝となる機能、エキスパートアドバイザーを使ってみましょう。
(語句や使い方の説明は、StrategyBuilderFX入門にて)

jissennsbfx5b
今回はサンプルプログラムとして入っている、MACDSampleというエキスパートを使います。

NavigatorウィンドウのExpertAdvisorsにある
MACDSampleをEURUSDチャートにドラッグ。

jissennsbfx6

「はい」をクリックして、
パラメータの入力画面になります。

jissennsbfx7

パラメータの初期値が既に入っているので、
あとはAllow Live tradingにチェックを入れます。

jissennsbfx9b
OKでウィンドウを閉じ、EURUSDチャートの右上のマークを確認します。
ここがニコマークになっていればエキスパートが動作中です。

マークがx印の場合は動作していません。
Enable Expert Advisorボタン(おやじマーク)
を押して動作させてください。

あとは立ち上げたまま放っておくだけで、為替データの更新があるたびにMACDSampleのプログラムが実行され、MACDSampleで設定されているルールどおりに、自動的に売買を行います。


次は、このMACDSampleがどれくらいの収益になるのか、過去のデータを使ったバックテストでみてみましょう。


投稿者 kawarobo : 00:00 | コメント (0) | トラックバック