~最近のエントリー~
FXの口座をいっぱい持つと無敵になる??その2
先日の話題と関連して、もう一つ興味深い話がありました。
これも同じ人から聞いた話なのですが、あの邪道かつせこい手法よりはいくぶんまともな感じ(失礼)の手法です。
といっても怪しいのは怪しいですが(^^;
デイトレやスキャルピングで勝つにはどうすればいいでしょうか?
誰もが一度は考えるだろうと思うんですが、
「1分足やティックチャートをじっと見て、レンジなら上で売り、下で買い。レンジブレイクしてトレンドができたらそっちについていく。」
言葉で言うのは簡単ですが、実際にやろうとするとこれほど難しいことはないですね。
例えばこれはレンジかな?というような状況がしばらく続いていたとします。
上下の幅は精々5,6pips程度しかなくレンジの上下で取るのは難しそうです。
ところが次の瞬間、下に2pipsほどレンジを抜けました。
さあ、これはレンジブレイクなのか、だましなのか・・・
なにかきっかけがあって20~30pip程度するすると動き出すこともあれば、単にプライスがぶれただけですぐレンジに戻る場合もあります。
チャートをじっと見ているだけでこれを瞬時に判断できるでしょうか?
そこを見極める、ある方法があった(?)のです
勘のいい方はこの記事のタイトルと先日の話の流れで気づかれたかと思いますが、
複数のFX口座を使う方法です。
それはつまり、いろんなFX会社のプライスを比較するのです。
例えば、A、B、C、D 4つのFX会社の取引画面を開いておいてプライスを監視しておきます。
先ほどの狭いレンジのような状況になったときに、
A社のプライスが下に2pips抜けました。B,C,D社は動きません。
これは単にA社のプライスがブレただけなんだなと判断してだましを回避です。
次にA社が抜けたあとB社、C社と抜けて来ました。
お!これは動き出したな、と判断して一番出遅れているD社で売り注文を出し
うまくトレンドに乗って勝つことができました。
と、こういう感じです。
なるほどね~、とこれを聞いたときには思いましたが、
2社を比較して見るだけでも大変なのに、4社、5社も同時に見るなんて・・しかも一番出遅れてるところを見極めて注文出すなんて
とても人間わざではありません。
人間には不可能。 ・・ということで、やっぱり期待に漏れずその人はやってくれました。
人間に無理なら機械にやらせよう! 監視&出遅れ発見ツールを作ったのです!
おお~~ さすがですね。
気合が違います。
さて気になる結果ですが、
本人いわく、『調整中』とのことで明言はしてくれませんでしたが、
実際にはそう単純な話ではなく、A,B,C社でいっせいにブレただけだったり、トレンド発生と同時に一気に値が飛んで変なところをつかまされたり、
なかなか大変なようです。
世の中甘くはないですね。
ただ先日のあの方法よりは危険が少なそうです。なんとなくまともな感じもしますし(^^;)、
聞いたことの無いやり方なので 工夫してうまくいくのかどうなのか興味があります。
また追いかけて進展を聞きましたら、こちらで報告したいと思います。
そしてあわよくばツールの公開も(?)
そして、これを読んで興味を持たれた方はとりあえず手動からでも試して見てはいかがでしょうか?
投稿者 kawarobo : 17:36
| コメント (0)
| トラックバック (0)
FXの口座をいっぱい持つと無敵になる??
ちょっと怪しいですが、興味深い話を聞きましたのでご紹介します。
リスク分散のためにFXの口座をいくつかに分けて運用している方は多いと思いますが、リスク分散ではなく別の目的で複数の口座を持つ人がいるそうです。
ご存知のとおり、FXは株と違って証券取引場を通さない相対取引です。
同じドル円でも、A会社とB会社でプライスが違っているわけです。
そこでこんなことを考えた人がいます。
A社とB社のプライスをずっと比較し続けていたら、どこかのタイミングで2社の価格の差がスプレッド以上にひらくことがあるのでは?と。
つまり、A社のドル円が95.00-95.03 に対し、B社 95.04-95.06となるような瞬間があるのか?ということです。
もしそんなことがあったとすれば、A社で95.03でドル円買い、B社で95.04売りとすればその時点で1pipの儲かることになります。
ただこのままではどちらもポジションがひらきっぱなしなので、
今度はA社の売り値とB社の買値が同じになったタイミング(例 A社95.10-95.13、B社95.08-95.10) でA社でドル円売りクローズ、B社でドル円買いクローズすれば無事取引終了です。
こうすれば最初に買ったときより上がってるか下がってるかに関係なく、確実に1pipの儲けになります。
これを裁定取引と言うのかどうかはわかりませんが、
このとおり実現できれば、取引を始めた瞬間に利益が確定するわけなので、絶対に負けないということになるのです・・
せいぜい数pipsしかとれないので かなりせこいですが・・・
ちり積もで、例えば10万通貨でやれば1pipでも千円ですから、平均2pipで1日10往復できれば2万円、100万通貨でやれば1日20万円にもなります!!
さすがにこれは現実的とは思えませんが。
そして実際にそんなことが起こりうるのか、ということですが
実はこれが本当にできてしまうらしいのです。。
私も実際、FXCMと、ある会社とで比較をしてみて、そんな瞬間を目撃しました。
ただし、この状況になったとしても0.数秒ぐらいしかもたないので、
「あれ?これはもしかして?」と判断しあぐねてる間に崩れてしまいます。
もし瞬時に察知できたとしても、あっちをクリック、こっちをクリックしていては絶対に間に合いません。
とても人間わざでは無理なんですね・・
しかしこれを見つけた人はあきらめませんでした。
人間に無理なら機械にやらせよう!ということで、2社の値段を監視して
その瞬間が訪れたときに売買操作を自動でやってくれるツールを開発したのです!
根性ですね~
しかしすごいですね、完全自動で理論的には絶対に負けないわけですから
それこそ寝ているだけで勝手に儲かる!・・・
と、言いたいところですが、やはり世の中そんなに甘くはありませんでした。
実際に動かしてみると、スリッページやオーダーが通らないなどの罠がいくつもあって、思ったとおりのプライスで約定してくれないそうです。
数pipsしかとれないからとレバレッジを思いっきり効かせていたのに、A社のほうしか約定せずB社スルーとかなると、かなり痛いことになります。
それでもその人はあきらめず開発を続けていて、真偽の程はわかりませんがようやくそれらしい感じになってきたと言っています。
ポイントはとにかくいろんな会社の口座を開いて、それぞれの会社間のプライスの開き具合をチェックして、最良の「通貨ペア」ならぬ「会社ペア」を見つけることだそうです。
そしてスリッページの有無や表示のプライスで確実に執行できるかどうかの確認も。
ただしデモトレードではだめです。プライスが微妙に遅れていたり、実際には約定できない値が出ている場合があるそうです。これは実際にトレードしてみて確認しないと分からないとのこと。
これはコストがばかにならなそうです・・・
以上、私が聞いたのはここまでです。
邪道、かつ非常にせこい手法でしたので(^^; それ以上深追いしませんでした。
もし思いのほかたくさんの方が興味をもたれるようでしたら、さらに詳細を聞いてみようと思います。あわよくばツールの公開もできれば・・
ただし、上述のとおりうまくいかないリスクが高いですので、試される方はくれぐれも自己責任でお願いします。m(__)m
投稿者 kawarobo : 12:41
| コメント (0)
| トラックバック (0)
MT5の登場は今秋?
MetaTrader5が出るという話が結構前から出ていたようです。
去年の年末に出るとか、3月末とか噂がありましたが、今年の秋ごろ(Automated Trading Championship 2009に間に合うように)出るのではないかとのことです。http://forum.mql4.com/
自動売買の新しい方法を試すため、先日久しぶりにMQL4を触ってみたんですが、MT4で使えるDLLの作成方法などの情報が乏しく、仕様的にもかなり古い感じでなかなか厳しいものがありました。(この新しい方法については近日中にアップします)
早くMQL5を使ってみたいなあと期待しています。
投稿者 kawarobo : 23:54
| コメント (0)
| トラックバック (1)
プログラムの作成 練習2-4 繰り返しフォー >>
次は繰り返し処理を行なう方法です。 "Hello"と10回表...
続き
プログラムの作成 練習2-4 繰り返しフォー <<
次は繰り返し処理を行なう方法です。
"Hello"と10回表示させたい時、
Print("Hello"); を10回書いてもいいですが、このようにfor()を使うと楽にできます。
int i;
for(i=0; i<10; i++){
Print("Hello"); // *
}
*の行が10回繰り返し実行されます。
for(i=0; i<10; i++){ ~ } を翻訳(?)すると、
「①始めに i=0をセットします。そしてi<10なら、{}の処理を行いなさい。
②{}の処理が終わったら、i++(iを1増やす)を行ない、
③それでも i<10なら{}の処理を行いなさい。
(以下、②③のくりかえし)
」
こんな感じです。
最初は、i=0なので i<10 ( 0<10 )となり、*のPrint文が実行されます。
それが終わったところで、i++ で iが1になりますが、それでも i<10 ( 1<10 )なので、*のPrint文が実行されます。
そして、i=2、3、4・・・と繰り返していって、iが9の時、*のPrint文を実行したあと最初に戻り、
i++をすると、iは10になります。
i=10だと i<10 の条件を満たさなくなるので、forの処理は終了です。
つまり、i=0からi=9まで合計10回、処理が行なわれるわけです。
この実行結果を見ると分かりやすいと思います。
int i;
Print("forの前");
for(i=0;i<10;i++){
Print("Hello i="+i);
}
Print("forの後");
結果は、
「forの前」
「Hello i=0」
「Hello i=1」
・・・
「Hello i=9」
「forの後」
となります。
for( ) は入れ子式にすることもできます。
int I,J;
for(I=0; I<10; I++){
for(J=0; J<10; J++){
Print("I="+I+ ",J="+J);
}
}
Print("end");
結果は、
I=0,J=0
I=0,J=1
・・・
I=0,J=8
I=0,J=9
I=1,J=0
I=1,J=1
・・・
I=1,J=9
I=2,J=0
・・・
・・・
I=9,J=9
end
応用として、
このようにするとティック更新の度に、直近10足分の始値が出力されます。
int start(){
int i;
for(i=0; i<10; i++){
Print("Open["+i+"]="+ Open[i]);
}
}
結果は
Open[0]=114.40
Open[1]=114.23
Open[2]=114.30
...
Open[9]=114.89
Open[ ]はMT4に備わっている機能で、指定した本数分 前の足の始値を得るものです。
Open[0]は現在の足、Open[1]なら一つ前の足の始値になります。
上の例だと新しいものから順に出力されますが、古い順に出力したい場合には、
Print("Open["+i+"]="+ Open[i]);
のiを下のように(9-i)に変えます。
Print("Open["+(9-i)+"]="+ Open[9-i]);
もしくは、
int start(){
int i;
for(i=9; i>-1; i--){
Print("Open["+i+"]="+ Open[i]);
}
}
のように、繰り返しのたびにiを減らしていくように、for文を変更するといいでしょう。
( i=9,8,7,,,1,0 と変化していきます)
結果
Open[9]=114.89
Open[8]=114.80
Open[7]=114.20
...
Open[0]=114.40
続きを隠す
16:00
| コメント (0)
| トラックバック (2)
プログラムの作成 練習2-3 条件分岐 >>
プログラミングに欠かせない処理、条件分岐を練習してみましょう...
続き
プログラムの作成 練習2-3 条件分岐 <<
プログラミングに欠かせない処理、条件分岐を練習してみましょう。
条件分岐は、
「こういう状態なら○○の処理を、そうでないならxxの処理を実行せよ」
というふうに、条件に応じて処理内容を変えるものです。
mq4ではif()を使います。
int start(){
int i;
i=1;
if(i==1){
Print("OK");①
} else{
Print("NG");②
}
}
if()は「もし()内の条件が真ならば、そのあとの{}内の処理を行い、偽ならば、else以下の処理を行え」というものです。
つまりこの例では, i が1なら①の処理を行い、iが1以外なら②の処理を行ないます。iには1を代入していますので、①が実行されて「OK」が出力されます。
i==1と「=」が二つ並んでいることに注意してください。=を一個だけにしているとエラーが出ます。
==は比較演算子と呼ばれるもので、両辺の値を比較するための記号です。
・A == B AとBが等しければtrue(真)
・A != B AとBが等しくないならtrue
・A > B Aのほうが大きいならtrue
・A >= B AがB以上ならtrue(A=Bの場合を含む)
・A < B
・A <= B
A==B かつ A > C というような条件を調べるには、
&&をつかって、
A==B && A > C
というふうに書きます。
この場合、A=2、B=2、C=1ならば真、A=2、B=2、C=3ならば偽になります。
「または」は|| (Shift+¥キーで出る「|」を2つ)です。
A==B || A < C
AとBが等しい、または、AよりCが大 なら真
A=2,B=2,C=3は真、A=2,B=3,C=1も真、A=2,B=2,C=1も真です。
A=2,B=1,C=3は偽になります。
()でくくればさらに複雑な条件を調べることが出来ます。
(A==B && A > C) || A < D
AがBと等しくてCより大きい、または、AがDより小さいなら真
A=2、B=2、C=1、D=3ならば真、A=2、B=2、C=3、D=1の場合も真、A=2、B=2、C=3、D=3は偽になります。
真や偽のときの処理が一行で終わる場合には{}を省略することが出来ます。
if( i==1) Print("OK");
else Print("NG");
入れ子式に使うこともできます。
if( i==1 ){
if( j==2 ){
Print("OK");
} else {
Print("NG j");
}
} else Print("NG i");
偽の場合に何もしないのなら、elseは省略できます。
int start(){
int i,j;
i=1;
j=2;
if( i==1) {
Print("i ==1");
}
if( j==1) Print("j=1");
else Print("j !=1");
return(0);
}
//結果、「i==1」と 「j !=1」が表示される
続きを隠す
00:40
| コメント (2)
| トラックバック (0)
プログラムの作成 練習2-2 演算 >>
前回のコードに少し手を加えてこのようにしてみました。 結果は...
続き
プログラムの作成 練習2-2 演算 <<
前回のコードに少し手を加えてこのようにしてみました。
結果はどうなるでしょうか。
int i;
int start(){
string mojiretsu; //文字列変数mojiretsuを宣言
i++;
mojiretsu ="i="+i ;
Print(mojiretsu);
return(0);
}
結果は「i=1」、「i=2」、、、となります。
太字の部分で、変数mojiretsuには文字列「i=」にiの値をくっつけたものが代入されているからです。
*ここではわざわざ変数を使っていますが、print()内に直接入れてしまっても構いません。
Print(mojiretsu); → Print("i="+i);
数値同士の場合は、その計算結果が表示されます。
int i,j;
i=1;
j=2;
Print(i+j);//結果「3」が表示される
つまり、「文字列+文字列」や「文字列+数値」は文字列になり、「数値+数値」は数値になります。
ではこうするとどうなるでしょう?
int i,j;
i=1;
j=2;
Print("i+j="+i+j);
結果は「i+j=12」になります。
これはまず文字列"i+j="+数値iが行なわれて文字列"i+j=1"になり、続いて文字列"i+j=1"+数値jが行なわれるからです。
i+jを数値として計算したい場合は、()でくくって
Print("i+j="+(i+j) );
とします。
プログラム内では算数の演算と同じ優先順位があります。
( )内が最優先、次が*(掛ける)や/(割る)、そのあとで+や-、という順番です。
例えば、1*2+3は5で 、1+2*3=7、(1+2)*3=9 となります。
ということは
Print("i*j="+ i * j );
とすると、i*jの部分が先に計算されますので、結果は「i*j=2」になります。
続きを隠す
13:36
| コメント (0)
| トラックバック (0)
プログラムの作成 練習2-1 >>
変数についてさらに練習してみましょう。 その前に気をつけてお...
続き
プログラムの作成 練習2-1 <<
変数についてさらに練習してみましょう。
その前に気をつけておくことがあります。
変数名はできるだけ自分で分かりやすいように名づければよいのですが、
予約語とかぶらないように気をつけてください。
エディタで入力した時に色が変わって表示されるものは、システム上ですでに予約されている単語なので、新たな変数名としては使えません。
一部の小文字を大文字に変えるなどして無理やり使い分けることもできますが、おすすめはしません。
さて、変数をつかった次のプログラムを見てください。
int start()
{
int i; // 変数i を整数として宣言
print(i); // iの中身(=0)を表示
return(0);// 終了
}
前回までのHello.mq4とほとんど同じですね。
これはティックが更新されるたびに「0」と表示されます。
変数iは宣言をしただけで、何も代入していません。
何も値を入れていない変数の中身は0になります。
(stringの場合は空っぽの状態(=NULL)になります)
これに少し手を加えます。
int start()
{
int i; // 変数i を整数として宣言
i=i+1;
print(i); // iの中身を表示
return(0);// 終了
}
i=i+1は、「i+1の値を iに代入する」という意味です。「iの値を1増やす」と考えるほうが自然でしょうか。
ここではiは0+1で1になります。
このように変数の値を1増やすという処理はよく使われるので、特別に「変数++」 というふうに省略して書くことができます。i=i+1ならi++というようにです。
i--というのもあって、これはi=i-1のことです。
似たような感じで、i +=1 というのもあります。これもi=i+1の意味ですが、最後の数字を変えればi=i+2や3などの代わりにもできます。
+=だけじゃなく、-=、 *=、 /=、などもできます。例えばi *=3はi=i*3の意味です。
さてプログラムに戻ります。
この場合の結果は毎回「1」が表示されます。なぜなら、start(){~}の中で宣言された変数は毎回、リセットされてしまうからです。
リセットされて0になっているところへ1を足したものが出力されるので結果は常に1です。
では回数を重ねるごとに数を増やしていきたい場合はどうすればいいでしょうか?
実はこんなふうに、変数の宣言をstart(){~}の外に出してしまえばいいのです。
int i; // 変数i を整数として宣言
int start()
{
i=i++; // i=i+1の意味
print(i); // iの中身を表示
return(0);// 終了
}
これで変数iがリセットされることはなくなりますので、1,2,3,4と、毎回値が1ずつ増えていくようになります。
このように変数の値を保存しておきたいものは、start()の外で宣言するようにしてください。
続きを隠す
11:55
| コメント (0)
| トラックバック (0)
コンパイル時エラーの対処方法 >>
mql4プログラムをコンパイルした時に出てくるエラーの見方で...
続き
コンパイル時エラーの対処方法 <<
mql4プログラムをコンパイルした時に出てくるエラーの見方です。
エラーメッセージは左側にエラー内容、右側にエラーが発生した場所が記されています。
'printstring' - variable not defined
C:\Program Files\MetaTrader 4\experts\Hello.mq4 (2, 1)
発生場所の()内は行数と文字数を表します。この例だと2行目の1文字目に問題があることになります。
現在のカーソル位置(行数、文字数)がエディタ画面の右下に出ているので、それを見ながらエラー箇所に移動し、修正します。
主なエラーと対処方法をざっとあげてみます。
'変数名' - variable not defined
変数が宣言されていません。
変数が宣言されているか確認、変数名のタイプミス(特に大文字小文字の別)が無いか確認
'\end_of_program' - ending bracket '}' expected
} が足りません。{ に対する }をどこかに書き忘れています。
エラー発生場所はプログラムの最後になっていますが、実際にはどこか途中で足りない部分があるのでプログラム全体を見直す必要があります。
'\end_of_program' - unbalanced left parenthesis
) が足りません。( に対する )をどこかに書き忘れています。
エラー発生場所はプログラムの最後になっていますが、実際にはどこか途中で足りない部分があるのでプログラム全体を見直す必要があります。
'return' - semicolon expected
; セミコロンが抜けています。
指定行前後の行末を確認。
';' - semicolon unexpected
;セミコロンが変なところにあります。
指定行前後に不必要なセミコロンがないか確認
')' - wrong parameters count
関数のパラメータ数が足りません。
指定行にある関数の書式を確認
'=' - illegal assignment use
=の使い方が間違っています。
if分などの条件式で「==」と間違ってないか確認
続きを隠す
11:09
| コメント (0)
| トラックバック (0)
プログラムの作成 練習1-4 >>
つづいて、変数の使い方を練習してみましょう。 前回のプログラ...
続き
プログラムの作成 練習1-4 <<
つづいて、変数の使い方を練習してみましょう。
前回のプログラムで
Print("Hello World");
となっていた部分を
printstring="Hello World";//①
Print(printstring);//②
と置き換えてみます。
①はprintstring という変数に文字列「Hello World」を代入せよ という意味、
②は変数printstringを画面に出力せよ という意味です。このとき変数printstringには①で指定した文字列が入っていますので、「Hello World」と表示されることになります。
Print("printstring")ではないことに注意して下さい。
" "で囲むと、この部分は変数ではなくただの文字列ですよ、という意味になるので、「Hello World」ではなく「printstring」という文字列が表示されることになります。
ではプログラム全体を見て見ましょう。上に書いたように置き換えるとこのようになります。
int start(){
printstring="Hello World";
Print(printstring);
return(0);
}
しかし、このままだとエラーが出てきます。
printstringというのは私が勝手に名づけた変数です。ルールのところでも書いていますが、そういう自分で作った変数は、使う前に必ず「こういう変数を使います」ということを宣言しておかなくてはいけません。
今回のprintstringには文字列をいれることにしていますので、
string printstring;
と最初に書いて、printstringは文字列変数です!と宣言します。
int start(){
string printstring;
printstring="Hello World";
Print(printstring);
return(0);
}
次は変数の使い方をもう少し掘り下げてみましょう。
続きを隠す
10:12
| コメント (0)
| トラックバック (0)
プログラムの作成 練習1-3 >>
[サンプルコード:Hello World] では、これをベー...
続き
プログラムの作成 練習1-3 <<
[サンプルコード:Hello World]
では、これをベースにプログラミングをしてみましょう。
Print("Hello World");
この一文を3行目に入れてください。
int start()
{
Print("Hello World");
return(0);
}
Print( )は()内の値を画面に表示するものです。
int start() { から } はティックの更新ごとに実行されるので、為替のレートが変わるたびに「HelloWorld」と表示が出るはずです。
実際にどのようになるか見てみましょう。
Complileボタンを押すと、プログラムファイルが上書き保存され、エラーがないかチェックされます。
エラーが無ければ下の画面に「0 error(s). 0 warning(s)」と表示され、完成です。
MetaTraderボタンを押し、MT4の画面に戻ると、ExpertAdvisorsの中に「Hello」が追加されています。
これをチャートにドラッグして適用します。
「Allow live trading」にチェックを入れてOK。
「Enable Expert Advisors」ボタンを押すとマークが変わり、エキスパートが実行開始します。
TerminalウィンドウのExperts画面を開いてみてください。
為替レートが変わるたびにHelloWorldという文字列が表示されるはずです。
続きを隠す
03:28
| コメント (2)
| トラックバック (0)