ブログトップ

こんなFXの日記

konnafx.exblog.jp

システムトレーダーとして、日々研鑽を重ねていく…

タグ:メタトレーダー ( 22 ) タグの人気記事

読者の方から質問があったので、記事にしました。




ふだんプログラムをしている人にとっては、どうってことはない話ですが、最近MQLを勉強し始めた方にとっては、多少お役に立てるかもしれません。



まず、基本的なロジックを考えましょう。emoticon-0133-wait.gif



単純に考えられるのは、




① 日本時間の土曜日のクローズ時刻直前の一定時刻になったら、現有ポジションを決済する。
② その直後にEA自体の稼動を停止する。
③ 日本時間の月曜日の早朝にEAを再稼動する。





しかし、これだとちょっと問題が…



まず、②や③ですが、プログラム的には可能かも知れませんが、バックテストで思惑通りになるかどうかという問題があります(やったことがないので分かりません)。また、①については、その一定時刻に通信トラブルなどが発生した場合に、ちょっと怖いですよね。emoticon-0144-nod.gif



なので、




① 日本時間の土曜日のクローズ時刻よりかなり前の一定時刻から決済プログラムを発動しつづける。
② 現有ポジションが決済されたら、その後、日本時間の月曜日の朝まで注文関数を呼び出さない。
③ 日本時間の月曜日の朝になったら、通常のプログラムにもどす。
 




というのがよいでしょう。emoticon-0128-hi.gif



早速プログラミングに入る前に、




a0204254_10401411.png





足し算や引き算の苦手な方は、いつもこんな表を用意しておくと便利です。emoticon-0136-giggle.gif



上の表の青い部分を当日とすると、黄色の部分は前日になることにご注意!




人によって考え方はまちまちですが、私の場合、



① 日本時間の土曜日午前1時になったら、決済プログラムを発動しつづける。
② 現有ポジションが決済されたら、その後、日本時間の月曜日午前9時まで注文関数を呼び出さない。
③ 日本時間の月曜日午前9時になったら、通常のプログラムにもどす。




としています(上の表の赤枠部分参照)。②③で、午前9時としたのは、月曜日早朝の「窓開け」現象による混乱を考慮して、スタートを少し遅らせているわけです。



サーバーの時間帯が仮にGMTだとすると、プログラムをするときは、結局、



① 金曜日の16時になったら、決済プログラムを発動しつづける。
② 現有ポジションが決済されたら、その後、日曜日の23時代が終了するまで注文関数を呼び出さない。
③ 日曜日の23時代が終了したら、通常のプログラムにもどす。




ということになります。




具体的なプログラム法は、次回にまわします。emoticon-0139-bow.gif



ポチッとやって。ね。ポチッと。emoticon-0128-hi.gif
   ↓
にほんブログ村 為替ブログへ
にほんブログ村
[PR]
by xchsshzo | 2012-06-01 12:05 | メタトレーダー
ちょっと、小数点の実験をしていて気づきました。




a0204254_9424747.png





どう出るかなと思ったら、




a0204254_944134.png





Comment()関数は、下5桁を勝手に四捨五入するんですね。emoticon-0138-thinking.gif




Print()関数はどうなんだろうと思って…、




a0204254_9571434.png





そうしたら、




a0204254_9575483.png





やはり、下5桁を勝手に四捨五入しています。emoticon-0138-thinking.gif




皆さんの周りにもいませんか?



















誰も指示していないのに勝手なことをして周りに迷惑をかけるヤツ!emoticon-0106-crying.gif



でも、ひょっとしたら、これって、Comment()関数やPrint()関数に限った話ではなくて、メタトレーダー全体が勝手に四捨五入する仕様になっていないかなと、不安にかられ…emoticon-0107-sweating.gif



a0204254_10108.png




どうなるかなと思ったら、



a0204254_1014099.png




ほっとしました。emoticon-0141-whew.gif



ポチッとやって。ね。ポチッと。emoticon-0128-hi.gif
   ↓
にほんブログ村 為替ブログへ
にほんブログ村
[PR]
by xchsshzo | 2012-05-23 10:14 | メタトレーダー
みこりんさんから質問をいただきました。emoticon-0105-wink.gif



元記事とご質問はこちらです。



バーの数で30分足の始値での売買をしているのですが、
expertログを確認すると、22:00:13に売買成立しており、
毎回10秒以上遅れて成立してしまいます。

MT4とは元々こういうものなのでしょうか?
それとも通常であれば22:00:01などに約定するのでしょうか?




まず、前提として、バーの「始値」で発注するためには、「始値」そのものが存在しなければいけません。emoticon-0144-nod.gif



この点、「終値」は、原則として定刻の到来と同時に確定しますが、「始値」は、定刻の到来と同時に確定するわけではなく、定刻の到来後最初のティック変動ではじめて確定します(そのときはじめて新しいバーが誕生するわけで、それまでは、新しいバーは未存在で、定刻前のバーが、まだ最新のバーということになります)。



なので、定刻の到来とその後最初のティック変動との間にタイムラグがあれば、当然、定刻より時間的にずれて約定します。業者、通貨ペア、時間帯にもよりますが、出来高の少ない場面では、数秒どころか、数分間ずれ込むこともあります。emoticon-0106-crying.gif



1分足のデータがときどき欠けていることがあるのもそのためです。



a0204254_23144761.png




つまり、定刻が到来しても1分以上の間ティック変動がないと、その間「始値」が確定せず、そのバーはついに存在しないまま次の定刻まで時が流れてしまうわけです。この場合には、バーそのものが存在しないので、「始値」だけでなく「高値」「安値」「終値」も存在しないことになり、丸々データに欠損ができてしまうわけです。emoticon-0104-surprised.gif



ところで、定刻の到来とその後最初のティック変動との間のタイムラグのために、定刻より遅れて約定してしまう現象については、私は、とくに気にする必要はないと考えています。なぜならば、そのような現象は、「定刻通り」に約定しないというだけで、「始値」で約定していることに違いはなく、バックテストとの整合性はきちんと保たれているからです。 emoticon-0103-cool.gif



ポチッとやって。ね。ポチッと。emoticon-0128-hi.gif
   ↓
にほんブログ村 為替ブログへ
にほんブログ村
[PR]
by xchsshzo | 2012-04-08 23:28 | メタトレーダー
一番手っ取り早いのは、多くの方がご存知のように、メタトレーダーを使って直接ダウンロードする方法です。


メニュー→「ツール」→「History Center」と進み、



a0204254_11373023.png




ダウンロードします。



すると、次のような警告が出ます。



a0204254_11433536.png




正確に和訳すると、



「メタクォーツソフトウェア会社」のヒストリーセンターからデータをダウンロードしようとしていますが、お客様の口座は、「アルパリジャパン株式会社」の取引サーバーに開設されています。

これからダウンロードされるデータは、現在ご使用中の取引サーバーに蓄積されているデータとは異なる可能性があることにご注意ください。このため、これからダウンロードされるデータは、「アルパリジャパン株式会社」が提示した過去の値動きを検証するのにはご使用になれません。それでもダウンロードを続けたい場合は、OKを押してください。




要するに、このやり方で入手できるのは、自分の証券会社のデータではなく、あくまでもメタクォーツ社が保有するデータということです。

しかし、メタクォーツ社のヒストリカルデータについては、ご承知の通り、かなり評判が悪いです。emoticon-0101-sadsmile.gif



http://projectv-japan.sblo.jp/article/41941643.html

http://bonansa.blog47.fc2.com/blog-category-10.html



そこで、比較的人気があるのが、FXDDのヒストリカルデータです。



しかし、先日、FXDDの担当者へライブチャットで確認したところ、こちらのデータは、実は、メタクォーツ社が提供しているデータだそうです。emoticon-0104-surprised.gif

前述の、メタトレーダーを使って直接ダウンロードされるデータと同一なのか、それを修正したものなのか、定かではありませんが、いずれにしても、出所が出所なので、ちょっと心配です。emoticon-0101-sadsmile.gif



また、 Forex Testerから入手される方も多いようです。



しかし、こちらのデータは出所がよくわからない上に、読者の方々のコメントの通り、実際に、チャートに表示してみると…、



a0204254_11414282.png




赤丸より左側が、Forex Tester のデータで、右側がアルパリジャパンのデータで、たしかに、ローソクの形が全然違いますね。emoticon-0104-surprised.gif



あと、アルパリグループのデータを提供している海外のサイトもあるようです。

しかし、こちらのデータの信憑性については、今のところ不明です。emoticon-0107-sweating.gif




結局、



長期で正確なヒストリカルデータを入手するのは…、
















不可能に決ってんじゃん!emoticon-0140-rofl.gif



なんて締めくくったら、きっと、読者の方々から袋叩きにされますよね。emoticon-0106-crying.gif



そこで、こんな手を見つけました。



まずは、こちらをポチッとやってね。



にほんブログ村 為替ブログへ
にほんブログ村



あっ! 違った。


こちらでした。emoticon-0139-bow.gif



FXCMジャパン



ここへ無料デモ口座を申し込みます。



ただし、MT4用の口座ではなく、手動売買用の口座に申し込むのがポイントです。emoticon-0133-wait.gif



a0204254_12145990.png




一連の手続きが完了して、パスワードなどを取得すると、「FX Trading Station 2.0」(いわゆる「トレードステーション」とは別物)というツールをダウンロード&インストールできます。

初期画面はこんな感じです。



a0204254_10394411.png




赤丸の部分をスクロールして、お目当ての通過ペアを選んで、その気配値上で右クリックします。



a0204254_1048073.png




お目当てのチャートを表示します。



a0204254_10523089.png




「ファイル」→「マーケットショットの作成」と進みます。



a0204254_10554551.png




すると、こんな画面が出るので、



a0204254_1104977.png




データレンジを「その他」に指定します。


a0204254_114877.png




ダウンロードしたい期間を指定して、OKを押します。



a0204254_1172029.png




ダウンロードには、もちろん時間がかかります。

ダウンロード中は、ローソク足がごにょごにょと作成されていくのがわかります。



a0204254_11152743.png




終了したら、「ファイル」→「CSVへエクスポート」と進み、あとは、ファイル名を指定してデスクトップなどに落とすだけです。



ちなみに、直近10年分のデータが入手できます。



このデータの信憑性について、私は、担当のおねえちゃんと電話で以下のようなやりとりをしました。


takechan : こちらのデータは正確なものでしょうか。
おねえちゃん : はい。すべて弊社(グループ)がお客様に提示してきたリアルレートです。
takechan : たしか、御社は、NDD方式を採用しているので、こちらのデータはインターバンクのレートと同一と考えてよいでしょうか。
おねえちゃん : いいえ、完全に同一というわけではありません。当然スプレッドによる誤差があります。しかし、弊社による価格操作などは一切ございません。
takechan : ということは、このデータはインターバンクのレートと限りなく近いデータと考えてよいでしょうか。
おねえちゃん : はい、差し支えございません。
takechan : 今度食事などご一緒にいかがでしょうか。
おねえちゃん : ええ、よろこんで。


emoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gifemoticon-0103-cool.gif



最後の2行は、私の作り話です。emoticon-0139-bow.gif








さあ、






                今だけの特別価格
                98,500円
     29,800円

a0204254_953656.jpg


                  値上げまで、あと、 

         10日 と 16時間 42分 37.26秒

※本商材はお客様の将来の利益を保証するものではありません。
お問い合わせは、info@takechanまで。
 
                
emoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gifemoticon-0140-rofl.gif







でも、一つ問題があるんです。



一度にダウンロードできるデータ量が限られています。

1分足だと約2週間分、5分足だと約3ヶ月分です。

なので、分割して入手し、データを結合させる必要があります。emoticon-0101-sadsmile.gif



ところで、



よーく考えたら、



NDD方式の業者であること
取引ツールから長期のヒストリカルデータをダウンロード可能であること




という二つの条件さえ満たせば、国内外を問わず、また、メタトレーダー対応非対応を問わず、どこの業者からでも、同様のやり方で、長期で正確なヒストリカルデータを入手できるはずですよね。emoticon-0104-surprised.gif

探せば、もっと簡単にデータを入手できる業者があるかも知れません。emoticon-0138-thinking.gif



あとは、読者の皆様からの貴重な情報をお待ちしております。emoticon-0139-bow.gifemoticon-0139-bow.gifemoticon-0139-bow.gif


ポチッとやって。ね。ポチッと。emoticon-0128-hi.gif
   ↓
にほんブログ村 為替ブログへ
にほんブログ村
[PR]
by xchsshzo | 2011-12-16 13:50 | メタトレーダー
無料だから仕方ないけど…。



不満がいっぱいです。emoticon-0149-no.gif



第1に、



なんといっても、スプレッドが広いです。

最近は縮小化傾向にあるとはいえ、まだまだ広いですねー。emoticon-0106-crying.gif



第2に、



異なる通貨ペアや異なる時間足でポートフォリオを組みたくても、ストラテジーテスターでバックテストをするときは、挿入チャートを一つしか指定できないので、検証できません。emoticon-0106-crying.gif



ロシア人にはポートフォリオという概念は無いのだろうか。emoticon-0138-thinking.gif



第3に、



一つのメタトレーダーで複数のEAを回すとバグの原因になります。emoticon-0106-crying.gif



第4に、



一つのパソコンに複数のメタトレーダーを入れるとPCが重くなります。emoticon-0106-crying.gif



第5に、



一つのEAに複数のロジックを入れると、プログラムが長くなって、自分でも何が書いてあるのかわからなくなります。emoticon-0131-angel.gif



第6に、



そもそも、MQLは、非常に不便な言語です。emoticon-0119-puke.gif

たとえば、ポジションを決済するだけでも、トレーディングプールから通貨ペアとマジックナンバーの一致するポジションを一つずつ探してきて、決済しなければならないので、

a0204254_1929929.gif


こんなふうに、無駄に長いプログラムになります。emoticon-0141-whew.gif

これに、通信エラー対策のプログラムでも入れようものなら、古代エジプトの象形文字みたいになっちゃいます。





こんな感じですね。






a0204254_1941157.jpg




いつも思うのですが、たとえば、OrderSend()関数で発注するときに、

a0204254_19473979.gif


Pos1に、1000分の1秒単位で日時が記憶されて、これを決済するときは、

a0204254_1951180.gif


みたいに、簡単に済ませないものでしょうか。



第7に、



EAやカスタムインジケーターの名前を変更しようと思って、右クリックするでしょ。

そうすると、



a0204254_2082488.gif



ほらね。

どこにも「名前の変更」がないでしょー。emoticon-0106-crying.gif



第8に、



長期のヒストリカルデータの入手が非常に困難ですね。emoticon-0124-worried.gif

トレードステーションやマネックストレーダーなどは、それぞれの証券会社が責任をもって開発したツールなので、その証券会社のヒストリカルデータがきちんとダウンロードできるみたいですね。

この点、メタトレーダーは、ロシアの変なソフトウェア会社が作ったツールなので、証券会社のヒストリカルデータは、別途、自分で入手しないといけないんですね。

数ヶ月~1年程度のものなら比較的簡単に入手できますが、10年ほどのデータで、かつ、正確なものを入手しようとなると、これがけっこう大変なんですね。

この問題点については、次回、テーマにしたいと思います。



第9に、



バックテストにえらく時間がかかりますね。

とくに、パラメーターを最適化するときなんて、へたをすると、10時間もかかったり…。emoticon-0118-yawn.gif



第10に、



挙句に、MT5なんてものが出現しちゃったでしょ~。emoticon-0104-surprised.gif

プログラム言語の文法などはほとんど同じかと思っていたら、全然違うみたいだし。

それに、よほど、使い勝手がよくなるかと思ったら、両建てができないから、ますますポートフォリオが組めないじゃんね。



この点については、 豊嶋先生のブログが詳しいですね。




ちなみに、MT4が消えて、世の中MT5だらけになったら、もう、私はメタトレーダーと別れます。








だって、付き合う価値無いもん。



ポチッとやって。ね。ポチッと。emoticon-0128-hi.gif
   ↓
にほんブログ村 為替ブログへ
にほんブログ村
[PR]
by xchsshzo | 2011-12-14 21:00 | メタトレーダー
去る10/6に、フォレックス・ドットコム・ジャパンは、山中康司先生を講師に招いて、「カウントダウン注文の注意点」と題して、MT4の特別セミナーを開催しました。


その内容を録画した動画を視聴したい方は、こちらへどうぞ。



セミナーの前半では、これまでの成行注文と今回新たに採用されるカウントダウン注文との違いや、メリット・ディメリットなどについて解説がありました。


セミナーの中で、山中先生が、


DD方式ならばこれまでの成行注文方式、NDD方式ならばカウントダウン方式、というのが普通だ。



という趣旨のコメントをしてらしたのが印象的です。



「じゃー、フォレックス・ドットコム・ジャパンはどうなのよ???」というツッコミまではありませんでした。「いらんことしゃべるなよ!」という事前の指示が主催者側からあったのでしょうか。emoticon-0136-giggle.gif




セミナーの後半は、EAの修正ポイントを解説されていましたが、私がこちらで解説した内容とほぼ同旨で、残念ながら、それ以上の情報は得られませんでした。



こういったセミナーの場合、講師としては、当然、主催者側からの指示に従って解説をしているはずなので、私は山中先生ご自身を批判をするつもりはまったくありません。でも、主催者であるフォレックス・ドットコム・ジャパンの企業としての誠意をあまり感じられないセミナーでした。emoticon-0106-crying.gif



ポチッとやって。ね。ポチッと。emoticon-0128-hi.gif
   ↓
にほんブログ村 為替ブログへ
にほんブログ村
[PR]
by xchsshzo | 2011-10-12 13:12 | メタトレーダー
ここ最近多忙につき、記事の訂正が遅れまして、ごめんなさい。emoticon-0139-bow.gif


本日は、まず、10/7の記事10/9の記事のどの部分を訂正したのかご説明いたします。


訂正前の記事では、


MyOrderSend()
MyOrderModify()
MyOrderClose()


という三つのオリジナル関数に、いずれも、その最後に、return() 処理が入っていました。


a0204254_949109.gif



いずれも不要な記述なので、削除しただけです。


豊嶋先生の書籍では、一定の条件のときに、break によってwhile文を抜け出す仕様になっているため、最後に、return() 処理が必要になりますが、私の場合は、break によるwhile文の抜け出しをしていないので、最後の return() 処理は不要な記述というわけです。作動上とくに問題はありませんが、見苦しいので削除しました。



ところで、もう一つ悩んでいたことがあります。emoticon-0138-thinking.gif


MyOrderModify() 関数のエラー130(Invalid Stops)が出たときの処理方法についてです。


このエラーが出るときには、実は、以下の2つのパターンがあります。


パターンその1(逆転現象)


1ドル=100円のときにロングを注文
99.50円に損切りをつけようとしてもたつく
その間に現在価格が99.49円まで下落
にもかかわらず99.50円に損切りをつけようとする



パターンその2(接近現象)


1ドル=100円のときにロングを注文
99.50円に損切りをつけようとしてもたつく
その間に現在価格が99.60円まで下落
にもかかわらず99.50円に損切りをつけようとする



逆転現象の場合には、当たり前ですが、証券会社によっては、接近現象の場合にもエラー130が出ます。どの程度まで接近するとエラーになるか(これをSTOPLEVELといいます)は、証券会社によって異なります。調べる方法は簡単で、スタート関数内に、


a0204254_1181335.gif



と記述すれば、チャートの左上に、STOPLEVELがピップス単位で表示されます。emoticon-0137-clapping.gif


ところで、接近現象によるエラー130の場合には、その後の価格変動によっては、STOPLEVELを脱出し、損切りをつけられる可能性も十分にあります。それにもかかわらずエラー130が出たというだけで決済してしまうのは、ちょっと不本意ですよね。emoticon-0120-doh.gif


そこで、エラー130が出た場合、


接近現象→break によってwhile文を抜け出し、次からのティック変動にゆだねる
逆転現象→直ちに決済



という具合に条件分岐をした方がよいのではないか、と悩んでいたわけです。





しか~し、




フォレックス・ドットコム・ジャパンのSTOPLEVELは、なんと、1PIPなんです。emoticon-0104-surprised.gif


したがって、プログラムの変更はしないことにしました。emoticon-0100-smile.gif



ところで、STOPLEVELが1PIPというのは、かなり良心的ですよね。emoticon-0105-wink.gif


これでスキャルパーをたくさん呼び寄せておいて、カウントダウン&DD方式で思いっきりスベらせれば、証券会社としてはボロ儲けできるでしょう。って、takechan、言い過ぎだよ。emoticon-0136-giggle.gif



ポチッとやって。ね。ポチッと。emoticon-0128-hi.gif
   ↓
にほんブログ村 為替ブログへ
にほんブログ村
[PR]
by xchsshzo | 2011-10-11 10:51 | メタトレーダー
本日は、前回紹介した、


MyOrderSend()
MyOrderModify()
MyOrderClose()


という三つのオリジナル関数を、スタート関数内でどのように使うかを考えたいと思います。



ただし、その前に、MyOrderSend()関数について少しだけ補足します。emoticon-0133-wait.gif


ちょっと前の記事で紹介したように、ポートフォリオを組む場合で、証拠金維持率が一定限度を絶対に割らないような資金管理法を採用する場合には、要注意です。すなわち、丸腰ポジションが存在する間はその損切り額が未確定であるため、ポートフォリオ全体の予想損失額を正確に割り出すことができず、その結果、新規ポジションの最適ロット数を計算できません。なので、そのような場合には、丸腰ポジションがすべて消えるまで、新規発注をしないようなプログラムが必要になります。emoticon-0144-nod.gif


具体的には、前回のMyOrderSend()関数に、たとえば以下の赤枠のようなプログラムを追加することになります。


a0204254_9201477.gif




では、本日の本題へ移りましょう。emoticon-0133-wait.gif


まずは、おなじみのフローチャートの確認です。


a0204254_21414234.gif



このような流れを実現するためには、以下のようなプログラムでOKです。


a0204254_2144571.gif



あらかじめオリジナルのグローバル関数を作成しておいたので、スタート関数内はかなりスッキリしました。emoticon-0157-sun.gif


新規注文の部分については、もう説明不要ですね。


その下の、損切り・利食い・緊急決済の部分をみていきましょう。



まず、static変数として、MOM(MyOrderModifyを勝手に略しました)を宣言し、初期値を「0」としておきます。


ここで、前回説明した、MyOrderModify()関数の型と返り値を思い出してください。豊嶋先生の書籍に変更を加えて、


・条件分岐をするために、bool型ではなく、int型で定義し、
・注文変更の必要がない場合および注文変更が成功した場合は、「0」を
・通常のエラーが発生した場合は、「-1」を
・エラー130(invalid stops=無効な指値)が出た場合は、「チケット番号」を返す。



でしたよね。emoticon-0138-thinking.gif


そこで、MOM<=0 のときは、ティック変動をまってMyOrderModify()関数を実行します。注文変更の必要がない場合(=丸腰ポジションが一つもない場合)には、そのまま再び「0」を返して終了するだけのことです。また、10秒間の高速リトライに失敗して「-1」が返された場合には、static変数MOMがそれを記憶しているので、次のティック変動で再びMyOrderModify()関数が実行されます。つまり、EAの稼動を停止させることなく、高速リトライに失敗→MyOrderModify()関数の実行→高速リトライに失敗→MyOrderModify()関数の実行→…と、成功にいたるまで、ずっと損切りと利食いを設定し続けてくれます。


それに対して、エラー130(invalid stops=無効な指値)が出た場合は、もはや成功の見込みは薄いので、「チケット番号」を返し(MOM>0)、直ちに、MyOrderClose()関数が発動され、これも、static変数の記憶により、EAの稼動を停止させることなく、高速リトライの失敗と再実行を繰り返してくれます。


そして、MyOrderModify()関数またはMyOrderClose()関数のいずれかが無事成功したら、static変数MOM=0となり、通常の状態に復帰し、売買サインによるMyOrderSend()関数の発動と、MyOrderModify()関数による丸腰ポジションの監視・処理が並行して行われることになります。



以上により、絶対に安全だとは言えませんが、




丸腰ポジションがそのまま残ってしまうという可能性を、極限まで少なくすることができるのではないか




と考えています。emoticon-0103-cool.gif






















でもさー、


こんなめんどくさいプログラムを準備するよりも、アルパリジャパンに乗り換えた方が賢明かも知れないとか思ってしまうのは、私だけでしょうか? emoticon-0140-rofl.gif



ポチッとやって。ね。ポチッと。emoticon-0128-hi.gif
   ↓
にほんブログ村 為替ブログへ
にほんブログ村
[PR]
by xchsshzo | 2011-10-09 00:41 | メタトレーダー
本日は、フォレックス・ドットコム・ジャパンのカウントダウン方式に対応する、エラー処理つきの発注プログラムの具体例を紹介します。emoticon-0133-wait.gif



1.はじめに



まず、前回のおさらいですが、ポイントは、


新規発注に成功した後、エラーによって損切りがつけられなかったという事態(以下「丸腰ポジション」と呼びます)を絶対に避けなければならない



ということでしたね。emoticon-0100-smile.gif


そこで、もう一度、フローチャートを確認しましょう。


a0204254_17265795.gif



ここで、やってはいけないプログラム法としては、


OrderSend()
OrderModify()
OrderClose()


という三つの関数を、一つのオリジナル関数にまとめてしまうことです。たとえば、こんな感じです。


a0204254_17473017.gif



これだと、スタート関数内で発注プログラムを書くときに、


a0204254_1751837.gif



となります。この場合、もしも丸腰ポジションが発生すると、後でみるように、10秒間の高速リトライ処理をして、それにも失敗した場合には、ループを抜けて次からのティック変動にゆだねるわけですが、上記のプログラムだと、次に売買サインが出るまで、丸腰ポジションが放置されたままになってしまいます。スキャルピングシステムのように、頻繁に売買サインが出るロジックならば、まだしも、スイング系のシステムだと、ちょっと危険かなと思います。emoticon-0107-sweating.gif


なので、あくまでも、


MyOrderSend()
MyOrderModify()
MyOrderClose()


という三つのオリジナル関数を別々に作成して、それぞれの中でエラー対策をつけて、スタート関数内では、


a0204254_1855682.gif



というように、ティックの変動ごとに、それぞれのオリジナル関数が独立に作動するようにすべきでしょう。emoticon-0103-cool.gif




2.ヘッダーファイルの読み込み



さて、それぞれのオリジナル関数を作成する前に、エラー表示をわかりやすくするためのファイル(メタトレーダーに標準装備されている)を、プログラムの最初の方で呼び出しておきましょう。emoticon-0133-wait.gif


a0204254_18233121.gif




3.MyOrderSend()関数の作成



さて、いよいよ、MyOrderSend()関数の作成です。


a0204254_917585.gif



基本的には、豊嶋先生の書籍のパクリです。emoticon-0139-bow.gif すなわち、エラーにより新規発注が通らなかったときは、0.1秒間隔で10秒間の高速リトライ処理を行い、それでもだめなときは、ループを抜けて次からのティック変動にゆだねます。


ただし、カウントダウン方式による特殊性から、以下のような変更を加えました。


1.損切りと利食いを設定するためのパラメーターを削除した。
2.RefreshRates()関数による現在価格の更新は無意味なので削除した。
3.ERR_INVALID_PRICE(無効な価格)は発生しないと考えられるので、これによる break を削除した。
4.ERR_INVALID_STOPS(無効な指値)も発生しないので、これによる break を削除した。




4.MyOrderModify()関数の作成



次に、損切りと利食い設定するための、MyOrderModify()関数の作成です。


a0204254_9173551.gif



これも、豊嶋先生の書籍をモデルにして、10秒間の高速リトライ処理を入れてあります。


主な変更点としては、以下の通りです。


1.あとで、条件分岐をするために、bool型ではなく、int型で定義した。すなわち、注文変更の必要がない場合および注文変更が成功した場合は、「0」を返し、通常のエラーが発生した場合は、「-1」を返し、エラー130(invalid stops=無効な指値)が出た場合は、「チケット番号」を返す。
2.損切りまたは利食いのついていないポジションのみを選択して処理をするようにした。
3.ERR_NO_RESULT(無変更処理によるエラー) は、2との関係で発生することはないと考えられるので、これによる break を削除した。




5.MyOrderClose()関数の作成



最後に、MyOrderClose()関数の作成です。


a0204254_9175411.gif



これも、豊嶋先生の書籍を参考にしました。


変更点は、以下の通りです。


1.RefreshRates()関数による現在価格の更新は無意味なので削除した。
2.ERR_INVALID_PRICE(無効な価格)は発生しないと考えられるので、これによる break を削除した。




さて、以上で、フォレックス・ドットコム・ジャパンのカウントダウン方式に必要な三つのオリジナル関数ができたわけですが、次回は、これらをスタート関数内でどのように記述するかについて考えてみます。emoticon-0133-wait.gif



ポチッとやって。ね。ポチッと。emoticon-0128-hi.gif
   ↓
にほんブログ村 為替ブログへ
にほんブログ村
[PR]
by xchsshzo | 2011-10-07 20:30 | メタトレーダー
本日から数回に分けて、カウントダウン方式を採用したフォレックス・ドットコム・ジャパン用EAの発注プログラムの書き方について考えてみましょう。emoticon-0133-wait.gif



最終的には、各種エラー対策も盛り込んだプログラムになり、やや複雑になるので、あとからコードが見やすいように、あらかじめ、いくつかオリジナル関数を作成し、これらをグローバル関数として定義しておいて、あとからスタート関数内へ呼び出す手法をとります。


この点、パンローリング 「FXメタトレーダー実践プログラミング」(豊嶋久道著)では、エラー対策を盛り込んだ各種オリジナル関数を、別のファイルに記述しておいて(ライブラリー関数)、あとからEAへ呼び出すという手法を用いていますが、このやり方では、メタトレーダーの作動が少し重くなるので、今回は、オリジナル関数を、ライブラリー関数ではなく、グローバル関数として、EAに直接記述することにしました。emoticon-0148-yes.gif



そこで、プログラミング初心者の方のために、まず、グローバル関数がどのようなものか説明します。emoticon-0133-wait.gif


スタート関数のすぐ上あたりに、外部パラメーターを設定しましょう。


a0204254_114477.gif



次に、int型のオリジナル関数「P」をグローバル関数として定義します。場所は、start()関数の外であれば、その上でも下でもどちらでもOKですが、今回はとりあえず、先ほどの外部パラメーターとスタート関数の間あたりに次のように記述してください。


a0204254_1204454.gif



このオリジナル関数「P」の意味は、次の通りです。


・int型で定義したので、実行されると、何らかの整数を返します。
・a,bという二つのパラメーターをとります。
・内部で、aとbの合計を計算し、その結果をint型の「p」という変数に渡すという処理を行います。
・最終的には、その「p」を結果として返します。



では、さっそく、このオリジナル関数「P」をスタート関数内で3回ほど呼び出して実行してみましょう。次のように記述してください。


a0204254_1384331.gif



このEAをチャートに挿入すると、EA上で、


P1=1+2
P2=3+4
P3=5+6



という処理がオリジナル関数「P」によって実行され、その結果が、Comment()関数によって、チャート左上に、次のように表示されるはずです。


P1=3
P2=7
P3=11



以上、簡単ですが、グローバル関数の基本的な使い方を紹介させていただきました。emoticon-0105-wink.gif






さて、ここからいよいよ本題です。


カウントダウン方式の最大の課題は、


新規発注に成功した後、エラーによって損切りがつけられなかったという事態(以下「丸腰ポジション」と呼びます)を絶対に避けなければならない


ということです。emoticon-0104-surprised.gif



そこで、まず、それぞれ内部にエラー対策を盛り込んだ


MyOrderSend()関数
MyOrderModify()関数
MyOrderClose()関数



という3つのオリジナル関数を作成して、これらをグローバル関数として定義します。そして、基本的には、MyOrderSend()関数が成功した後に、MyOrderModify()関数によって損切りをつけ、緊急事態には、MyOrderClose()関数を発動させて、丸腰ポジションを直ちに決済するという流れになります。


以下、大まかなプログラムの流れをフローチャートにしました。


a0204254_2253716.gif



上の、「エラー130」というのは、Invalid Stops (無効な指値) によるエラーです。これはどういうことかというと、MyOrderSend()関数が成功した後に、何らかの通信トラブルなどが発生し、MyOrderModify()関数が何度か失敗する間に、現在価格が有効逆指値の範囲を通過してしまうというような事態も考えられます。そのような場合には、MyOrderModify()関数をリトライする間に、「エラー130」が出るはずなので、もはやその時は、MyOrderModify()関数が成功する見込みはほとんどなく、しかも、想定外の含み損が発生しているはずなので、直ちにその丸腰ポジションを決済しなければならないというわけです。



次回は、それぞれのオリジナル関数の具体的なプログラム法について考えます。emoticon-0139-bow.gif



ポチッとやって。ね。ポチッと。emoticon-0128-hi.gif
   ↓
にほんブログ村 為替ブログへ
にほんブログ村
[PR]
by xchsshzo | 2011-10-03 03:05 | メタトレーダー