為替ロボット 研究所

2005年06月15日

もくじ

MQLⅡ覚え書き もくじ


投稿者 kawarobo : 02:08 | コメント (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) | トラックバック

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) | トラックバック

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) | トラックバック

条件式

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) | トラックバック

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) | トラックバック

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) | トラックバック

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) | トラックバック

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) | トラックバック

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) | トラックバック

LastTradeTime(最終オーダー時刻)

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

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


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

CurTime(現在時刻)

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


投稿者 kawarobo : 04:17 | コメント (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) | トラックバック

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) | トラックバック

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) | トラックバック

期間とシフトの単位(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) | トラックバック

2005年07月10日

UserFunction(ユーザー定義のファンクション)

外部ファンクションを呼び出す。
外部ファンクションは、多言語の関数のようなもので、別途ユーザーが作成できる。
入力値(引数)を得て、処理の結果、出力値(返り値)を返す。
呼び出し側で返り値を受け取る記述をしていないと警告が出る。
ファンクションファイルは、Expertフォルダのfunctionsフォルダ内に保存しておく。

書式:
UserFunction(ファンクション名[,引数1][,引数2][,...])

 ファンクション名=
  外部ファンクションのファイル名。拡張子は不要

 引数=
  ファンクションの入力値。必要なければ省略できる。
  数値のみで文字列は不可。
  引数は「,」に続けて複数指定可能。

例:
---呼び出し側(test.mql)---
vars: input1(0),input2(0),theoutput(0);

input1=2;
input2=4;
theoutput= UserFunction("testfunc",input1,input2);

Print("output=",theoutput);// ファンクションの出力値を表示

---ユーザーファンクション(functions/testfunc.mql)---
inputs: i(0),j(0);
//inputs:で宣言した順に引数が割り当てられる。
//この例では、iにinput1(=2)、jにinput2(=4)の値が入る。
var: k(0);

k= i*j;

return(k);

---出力結果---
output=8


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

FileOpen(csvファイルを開く)

Expertsフォルダ内にあるCSVファイルを呼び出し、ファイルハンドルを返す。
拡張子が.csvとなっているファイル以外は呼び出せない。
ファイルハンドルは、現在呼び出し中のファイルを特定するためのIDのようなもの。読み込みや書き出しなどはこのファイルハンドルで対象ファイルを指定して行なう。
FileOpenで呼び出し、処理した後は必ずFileCloseで閉じなければならない。

書式:
FileOpen(ファイル名,区切り文字)

 ファイル名= expertsフォルダ内の.csvファイルに限る。.csvは省略可
 区切り文字= 列の区切り文字。

例:
vars: fh1(0),fh2(0),filename1("data1");

fh1=FileOpen(filename1,";");
fh2=FileOpen("data2.csv",",");

FileWrite(fh1, Close, Close[1], Close[2]);
FileWrite(fh2,TimeToStr(time[0]),open[0],high[0],low[0],close[0]);
FileClose(fh1);
FileClose(fh2);
---出力結果---
(data1.csv)
111.91;112.16;112.09
//直近3本ぶんの終値

(data2.csv)
2005.07.11 00:00,112.18,112.28,111.86,111.88
//直近の時間と4本値


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

FileWrite(csvファイルに書き込む)

FileOpenで呼び出したファイルに、値を書き込む。
書き込みは行単位。
FileOpen後、そのままFileWriteした場合は最初の行から上書きされるでの、ファイルの末尾から追記したい場合は、FileSeekで書き込み地点を末尾に移動しておく。

書式:
FileWrite(ファイルハンドル,引数1[,引数2][,...])

 ファイルハンドル= 書き込み対象のファイルハンドル。FileOpen時に得られる
 引数= 書き込む値。「,」に続けて複数指定すると、FileOpenで指定した区切り文字で区切って、一行に書き込む。

例:
vars: fh1(0),filename1("data1"),filename2("data2");

fh1=FileOpen(filename1,",");
FileWrite(fh1,"time","open","high","low","close");
FileWrite(fh1,TimeToStr(time[0]),open[0],high[0],low[0],close[0]);
FileClose(fh1);

fh1=FileOpen(filename2,",");
FileWrite(fh1,"time","open","high","low","close");
FileSeek(fh1,0, SEEK_END);
FileWrite(fh1,TimeToStr(time[0]),open[0],high[0],low[0],close[0]);
FileClose(fh1);
---出力結果---
(data1.csv)
time,open,high,low,close
2005.07.11 00:00,112.18,112.28,111.85,111.92
//常にファイル先頭から上書きしている

(data2.csv)
time,open,high,low,close
2005.07.11 00:00,112.18,112.28,111.85,111.94
2005.07.11 00:00,112.18,112.28,111.85,111.93
2005.07.11 00:00,112.18,112.28,111.85,111.92
//1行目書き出し後、末尾に追記している


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

FileClose(csvファイルを閉じる)

 FileOpenで呼び出していたファイルを閉じる。

書式:
FileClose(ファイルハンドル)

 ファイルハンドル= 閉じる対象のファイルハンドル。FileOpen時に得られる

例:
vars: fh1(0),filename1("data1");

fh1=FileOpen(filename1,",");
FileWrite(fh1,"test");
FileClose(fh1);


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