ラベル EA の投稿を表示しています。 すべての投稿を表示
ラベル EA の投稿を表示しています。 すべての投稿を表示

2014/09/05

なんとな~くWebRequest()が使ってみたくなって。。。イベントタイマーを作ってみました。

新MT4で新たに追加されたWebRequest()関数を使うことで、外部のサーバーにリクエストを送ることが可能となりました。(DLLを使用したり、ほかの言語を使用すれば、もちろん可能ですが。。^^;)ということで、今回は、DLLや多言語を使用することなく、外部サーバーから指標データを取得し、表示させてみました。

準 備

まず、WebRequest()関数のリファレンスを確認すると、この関数を使用する場合は、【ツール(T)】-【オプション(o)】―【エキスパートアドバイザー】で《Allow WebRequest for listed URL:》にチェックを入れ、外部サーバーのアドレスを追加しておきます。
今回は、DailyfxJapanを使用させて頂くので以下のようにしています。
opustion
その他の注意事項として、WebRequest()関数は、非同期関数で、EAもしくはスクリプトのみ使用可能。インジケーターで使用すると【error 4060 – "Function is not allowed for call".】と怒られます。∑(゚∀゚ノ)ノキャー今回は、EA上で使用することにしました。

 


実行してみると・・・

karenda
今回作成したEAをココに置いておきます。使用する際はEAとして使用してください。※2014/9/8EAを一部変更しました。
また、サーバーから取得したhtmlファイルは、MQL4/Filesに保存されます。


課題やら留意した点やら問題点

1.結局WebRequest()関数のテストをしようと思って作り始めたのですがリファレンスの例をそのまま使用しています。..orz
2.保存したHTMLファイルは、Shift_JISで保存しているのでブラウザで開くと文字化けする。(本来は、UTF-8)
3.StringSetChar(A,B,'文字')関数の文字部分は、”ストレートクォーテーションマーク”を使用するとバグが発生しましたので
  ’アポストロフィー’を使用しました。リファレンスも ’アポストロフィー’を使用しています。
4.終日イベントの時間を00:00としているので、00:00を過ぎると表示されなくなる。。orz
5.LABELオブジェクトを使用したので、表示させる文字数が多すぎるとすべてが表示されない。。orz
6.週末すべてのイベントが終了すると寂しい。土曜日に実行しても同じ。。。


まとめ

ん~なんだか中途半端な気がします。。^^;

2011/02/08

『一歩後・・』

先回投稿したEAについてパラメータの説明をしてくれという依頼がありましたので記載します。
あまりにも不親切でした・・・
まず、日本語環境以外で、【Inputs Variable】が表示されないとのご指摘を受けました。
日本語環境の場合は、以下の様に表示されます。
input
この現象を回避するには、mq5を開きパラメーターのコメントを削除してください。
例)茶色のコメント部を削除
input int     TakeProfit = 700;//利確値
input double  Balance    = 0.5;//損切値(利確値に対する割合)
input double  lot        = 0.1;//ロット数
input ENUM_MA_METHOD      MaMode     = MODE_EMA;
input ENUM_APPLIED_PRICE  PriceMode  = PRICE_CLOSE;
input int     SizeAry    = 10;
input int     Sizemin    = 3;
input int     pips       = 2;
input int     EPeriod    = 8;
input double  spred      = 0.020;
input int     stpos      = 1;
input int     heikensp   = 20; 
input int     heikenw    = 10;
input int     heikenbw   = 230;
input bool    Doten      = false;//【オプション1】ドテンしますか?
input bool    ModifyCh   = false;//【オプション2】利確値のシフトをしますか?
input int     ShiftProfit= 350;//【オプション2 パラメータ】
input int     ShiftLevel = 175;//【オプション2 パラメータ】

【パラメータの説明】
《TakeProfit》 利確値をpipsで設定します。
《Balance》 StopLoss値を利確値の割合で設定します。デフォルトでは、700×0.5=350pipsとなる。
《lot》 取引数量を指定します。
《MaMode/PriceMode/EPeriod/spred》 エンペロープインジケーターのパラメータです。
patarn
このEAは、平均足(Heiken_Ashi)のある一定の形を元にリミットオーダーを発生させる仕組みになっています。その形を設定するパラメーターが以下の物です。
《SizeAry》形を抽出する期間を設定します。
《Sizemin》上記画像のSizeAry期間中の赤印の期間を設定しています。
《heikenbw》上記画像の青印の幅の合計を設定しています。
《heikenw》上記画像の青印の個々の幅を設定しています。
《heikensp》上記画像の赤印の個々の幅を設定しています。
エンペロープは、リミットオーダーの注文値を導くために使用しています。
上線がSELL用で下線が、1BUY用となります。
《pips》エンペロープと価格にpips以上の差ができたときに、再度変更注文を行うための設定です。
《オプション》省略

【まとめ】
日本語環境にない方からの質問に日本語で答えるのもどうか?と思いますが・・・

2011/02/03

『前へ』

年末に掲示した『まねぶ』にて用いたEAを公開します。
特に深い意味はありませんのでご了承ください。
【使用するインジケーター】
①平均足
②エンペロープ
【取引条件】
①平均足が、設定回数分連続で同方向に動いたら、同方向にリミット注文
②エンペロープにてリミット注文を変更していく。
以上(詳しくはコードをご覧ください。)
imite
【ダウンロード】 Imitation.mq5
【まとめ】
ご興味がある方は、どうぞ!

2011/01/06

今年もよろしくお願いします。

年を跨いでしまいましたが、ATC2010に提出したEAの結果を報告します。 
 
【ATC2010の結果】
Report
総トレード数 34
ポジション比(BUY:SELL) 16:18
利益率(PF) 1.62
最大ドローダウン(MDD) 58.34%
純利益 $13634.41

ATC2010の開催中にいろいろなことがありましたので、実際の成績がどのようなものか確認します。

【ATC2010開催期間中のバックテスト結果】 
ReportTester-711870
総トレード数 33
ポジション比(BUY:SELL) 13:20
利益率(PF) 0.98
最大ドローダウン(MDD) 13.65%
純利益 ▲$387.76

実際は、こんな感じになります。順位は、120位ぐらいというところです。
ちなみに、2010/01/01~2010/08/31までのテスト結果が以下の通りです。
ReportTester-711870 

【まとめ】
私は、本来ポジティブな性格ですが、この内容を知っていて、しかも、利益が上がった理由が、トラブルによるものであることを知っていたため、どうしてもネガティブな発言が増えてしまいました。
ともあれ、3か月間楽しませて頂きました。

2010/11/29

まねぶ

まねぶとは、【まなぶ(学ぶ)】と同源で、【まねる(真似る)】とも同じ語源である。
そのため、学ぶの語源は【真似ぶ(まねぶ)】とされることも多い。語源由来辞典より
今回は、ATC2010で1位を独走中のbobsley氏のMover3MkIIを真似てみました。
【Mover3MkIIの基本情報】
【Mover3MkIIの予測フローチャート】
【模索結果】 作成したEAのテスト結果にATCTradeを使用して実際の履歴を添付してみました。
※結論から言ってしまえば、完全に一致するEAではありません。 ※ATCTradeは、設定をいじらずに使用しています。
【模索したEAの設定】 ロット調整を行わず、固定0.1Lotとしました。また、注文の中止は無視しています。 その他は、Mover3MkIIの設定を使用しました。
【模索したEAのテスト結果】 期間:2007/01/01~2010/10/31
【模索したEAで別条件を試してみた①】 一度ポジションを持つと逆シグナルが発生しても無視し、現在のポジションを維持していたので、ドテンさせたらどのような結果になるか試してみました。
【模索したEAで別条件を試してみた②】 TP/SLの割合はそのままにし、値幅に応じたTPを設定してみました。 今回は、2日足の値幅(高値-底値)のEMAを基準に使用しました。
【まとめ】 今回は、Mover3MkIIを真似ることでいろいろと勉強させて頂きましが、2008/09月~2009/11月の期間の結果に違和感を感じています。(ちなみにその期間の期待値は、-3.8でした。)データの異常があるのでしょうか?どちらにしてもMover3MkIIの結果ではありません

2009/07/26

Mizutori_EAの指標を検証してみました。


今回の内容は、私が違和感(自分で作っておきながら・・・)を感じていたMizutori_EAの指標について検証してみました。
対象になった指標は、以下のコードの指標です。
+―――――――――――――――――――――――――――――――+
stb = iMA(NULL,0,MaLimtPeriod,MaLimtShift,MODE_SMMA,PRICE_OPEN,0);
HiLimt = High[iHighest(NULL,0,MODE_CLOSE,LimtPeriod,0)];
LowLimt = Low[iLowest(NULL,0,MODE_CLOSE,LimtPeriod,0)];
st = (HiLimt-LowLimt)/(stb/100);
+――――――――――――――――――――――――――――――――+
※この指標を説明すると
ある一定期間(デフォルトなら、80バー期間(約6時間40分))の値幅(終値の高値―安値)を基準値(デフォルトなら、SMMA500)で割り、100倍したものです。
※では、なぜこの指標が必要だったか?(作成した当時の考え方です。)
①ある一定期間の値幅には、ある程度限界があるのではないか?(限界付近での逆張りは、リスク回避につながるのではないか?)
②値幅の限界は、価格に比例するのではないか?(100USDJPY より120USDJPYの方が値幅の限界が大きいはずだ!)
③導き出した値が小さすぎたので100倍して指標とした。
※限界とは,最大の意味ではなく、偏差的発想?ととらえてください。
【作成した当時妙にしっくりくる指標となりまともな検証もしないまま、使用してきました。】
しかし、違和感があったのも事実です。今回は、上記内容を検証してみます。
【検証内容】
手っ取り早く検証するために、今回は、ある一定期間を4時間(つまり4時間足)と設定し、その高値と安値の差を値幅(=高値―安値)として検証してみました。
また、0.01USDJPYピッチで出現頻度(ヒストグラム)を作成しその累計を百分率で表示させました。
下記の図は、2001年~現在までを年ごとにまとめたグラフです。

上記の図を説明すると、縦軸が出現頻度の累計百分率で、横軸が刻み(ピッチ)を表しています。
例えば、2001年では、【0~0.76】の範囲に約90%のデータがあることを意味しています。
また、標準偏差の2倍(95.45%)を値幅の上限(上記で言う限界)と見ると以下の値が導きだされます。
【2001】0.93 【2002】0.88 【2003】0.75 【2004】0.82 【2005】0.70 【2006】0.82 【2007】0.82 【2008】1.35 【2009】1.06(※データ数がほかのに比べて半分程度)
このことが、上記①の内容を意味しています。
しかし、漠然とですが、上記②の内容が否定されていることがわかるでしょうか?
わかりやすくするために、今度は、2001年~現在までのデータを安値を基軸に並べ替えてまとめた物を使用し、上記と同じようなグラフを作りました。
まとめた範囲は、【安値が90USDJPY以下】【90~100】【100~110】【110~112.5】【112.5~115】【115~117.5】【117.5~120】【120~122.5】【122.5~125】【125~】です。

上記図を見て頂くと一目瞭然です。上記指標の考えだと、価格が大きくなれば値幅も大きく(右にラインが移動する)なるはずでした。
しかし、実情は、価格の大きさと値幅は無関係にあることがわかります。
残念ですが、この指標は、不完全な物であるというほかありません。
そのまま使用される場合は、上記②の考えを排除した以下のコードに変更する方がベターだと思います。
+――――――――――――――――――――――――――――――――――――――+
//stb = iMA(NULL,0,MaLimtPeriod,MaLimtShift,MODE_SMMA,PRICE_OPEN,0);削除
HiLimt = High[iHighest(NULL,0,MODE_CLOSE,LimtPeriod,0)];
LowLimt = Low[iLowest(NULL,0,MODE_CLOSE,LimtPeriod,0)];
st = (HiLimt-LowLimt);
+――――――――――――――――――――――――――――――――――――――+
【まとめ】
偶然とは怖いものです。結果ばかり追いかける怖さを再確認しました。
また、上記の図を見て2008年の数値が突出していることが分かると思います。
これが崩壊の原因になったEAも少なくないはずです。
『100年に1度の・・・』との話をよく耳にしましたが、このデータを見ても納得できるところです。
さて、近況報告です。
ここ数カ月Mizutori から距離を置き、資料集めにぼっとしています。特に、データの【変換】方法の勉強です。
今注目している物が、ウェーブレット変換です。もちろん!EAの開発用ですよ!
では!

2009/04/17

Mizutoriをカスタマイズ!


ご無沙汰しております。
今回の課題は、『なぜこのEAの取引数が、サーバー(取引業者)によって異なるか?』です。
※この内容は、私の憶測です。

大きく分けると4つの要因が考えられます。
①サーバー(取引業者)によって微妙にデータが違い、それが原因となり注文処理が行われずスルーするのではないか?
②サーバー(取引業者)との接続状況もしくはサーバーの処理状況が悪く、本来1Pips毎に送られてくるデータが数Pipsまとめて送られてくる場合に注文処理がスルーするのではないか?
③こちらからは、注文オーダーを出したにも関わらず、サーバー(取引業者)で受け付けてもらえなかったからではないか?(この要因は、今回対象外としておきます。)
※ちなみに『OFF QUOTES エラーについて by FXDD
④PCの処理途中にpipsの更新があり、対応できない場合に注文処理がスルーするのではないか?(この要因は、今回対象外としておきます。)

2つの要因に対する解決策(?)は?
①に対しては、オリジナルのデータを元に、パラメーターの調整をすることで対応する方法がベターかもしれません。
②を今回のテーマと位置づけて考えてみました。
A)まずこのEAの取引条件の要の2つの条件を考えてみます。
1.『上部の乖離線を売値が越えたら売り!』若しくは、『下部の乖離線を買値が下回ったら買い!』としています。
 2.上記かつ、『RSI【(期間14)終値】が(ある数値を越えたら売りorある数値を下回ったら買い)としています。
※つまり、データがまとめて配信され、その中の一部のデータが、取引条件を超えていても
まとめられたデータの最後の値が、取引条件に達していなければ取引は成立しません。
これが、接続状況及びサーバー処理状況による取引回数が減る要因だと考えました。
B)上記の対策として、以下のように取引条件を変更してみました。
1.『上部の乖離線を現在のバーの高値が越えたら売り!』若しくは、『下部の乖離線を現在のバーの安値が下回ったら買い!』
 2.上記かつ、『RSI【(期間14)終値「ただし、現在のバーのみ高値or安値」】が(ある数値を越えたら売りorある数値を下回ったら買い)
C)上記の内容にしたらどうなるか?
利点:『新しいバーが作成されるか、または、注文オーダーが通るまで注文シグナルを送り続けます。』
欠点:『注文は処理されたが、予定値と実際の注文値に開きが生じる可能性がある。』

では、どの様に実装すればよいか?を以下に掲示しておきます。
①まず、『MQL4からRSIの指標を入手し指標のフォルダーに格納』 iRSIの代わりに使用します。
②次に、EAを開き以下のコードを追加する。
【指標の計算の変更(RSI期間14の場合)】
//RSI = iRSI(NULL,0,14,PRICE_CLOSE,0); 『要らないコードの削除もしくはコメント化』
double Hi_RSI;
double Lw_RSI;
double sump=0,sumn=0,rel=0;
double positive=0;
double negative=0;
double B_positive = iCustom(NULL,0,"RSI",1,1);
double B_negative = iCustom(NULL,0,"RSI",2,1);
//Hi_RSI用
rel=High[0]-Close[1];
if(rel>0) sump=rel;
else sumn=-rel;
positive=(B_positive*13+sump)/14;
negative=(B_negative*13+sumn)/14;
if(negative==0.0) Hi_RSI=0.0;
else Hi_RSI=100.0-100.0/(1+positive/negative);
//Lw_RSI用
sump=0;sumn=0;
rel=Low[0]-Close[1];
if(rel>0) sump=rel;
else sumn=-rel;
positive=(B_positive*13+sump)/14;
negative=(B_negative*13+sumn)/14;
if(negative==0.0) Lw_RSI=0.0;
else Lw_RSI=100.0-100.0/(1+positive/negative);
【条件式記入場所】(参考)
(BUY)
if(
(!OderStop)
&&(pos1<Max_Position)
&&(st>=Xox)
&&(Lw_RSI<=RSILowLimt)【RSIをLw_RSIに変更】
&&(MaLow>=Low[0]) 【AskをLow[0]に変更】
&&(ATR<=ATRLimt)
&&((Ask<=(LastPrice-(PipStep*Point)))||pos1==0)【お好みで、ASKをLow[0]に変更】
)Buy_Flag = true;

(SELL)
if(
(!OderStop)
&&(pos2<Max_Position)
&&(st>=Xox)
&&(Hi_RSI>=RSIHiLimt)【RSIをHi_RSIに変更】
&&(ATR<=ATRLimt)
&&(MaHi<=High[0]) 【BidをHigh[0]に変更】
&&((Bid>=(LastPrice+(PipStep*Point)))||pos2==0)【お好みでBidをHigh[0]に変更】
)Sell_Flag = true;

こんな感じになります。

まとめ
本来は、フォームに掲載するような内容ですが、ブログの更新のために使用させて頂きました。
また、お決まりのように、フォワードテスト等をしておりませんので、ご使用される方は、『人柱覚悟!』でお願いします。
では!

2009/03/07

バックテストの高速化


EA作りは、何度もバックテスト(検証)作業をしながら作り上げていくものです。
しかし、その検証に時間を費やされることは非常に苦痛です。
今回は、少しでも検証スピードを上げる方法(バックテストの高速化)を提案しておきます。
※なぜEAごとに検証スピードが異なるか?
簡単に言ってしまえば、処理容量が多いとスピードが落ちてしまうからです。
しかし、多くのEA(検証スピードのおそいEA)は、無駄な処理(必要のない処理)が含まれています。
処理作業を遅らせる要因は?
①大量のループ作業
例)100回ループがEA内にあり何も対策をしていない場合
データ分処理するとすれば、100回ループ×4回(1M[初値・高値・安値・終値])×検証時間軸(1Hなら×60)×検証期間となります。
②外部(EA外)の指標(インジケーター)の利用
※表示用に無駄な作業が含まれるため、処理スピード低下の要因となります。
※それらを回避するための対策は?
①大量のループ作業がある場合
A)時間軸の初値でオーダーの取引を検討するEAの場合
※【if(Volume[0]>1||!IsTradeAllowed())return(0);】をint start() { の後に追加しておく。(初値で処理をするという意味です。)
B)A以外のEA
※for(int i=0;i<Limit;i++)をfor(int i=0;i<Limit;i=i+10)のように変更してループ回数を減らしてみる。
※ただし、内容が粗悪になるため注意が必要です。(以外に使えます。)
②外部(EA外)の指標(インジケーター)の利用の場合
※簡単に言ってしまえば、必要な処理だけをEAの中に組み込んでしまえばそれが対策となります。
※しかし、フォワードテストやリアルで使用する際に、表示用として指標を表示させると2重処理していることになるのでPCへの負担は増えます。
例として、VQという指標をEA化したものを添付しておきますので確認してみてください。

まとめ
検討結果が、すぐにわかるのがEA作りの面白いところです。

2009/02/19

Mizutori_EAの賞味期限


このEAの賞味期限を検討してみました。
対象バージョン:Mizutori20.1_Custom_EA(デフォルト)
使用データ:MQ(2006/1~2009/1)※問題はありますが検証用ということで。
添付グラフの説明:月別に取引回数と利益をまとめてみました。


参考資料:VIX指標(恐怖指数)http://chartpark.com/vix.html
参考資料(VIX指標5年)とグラフを見比べて頂くと類似しているような気がしませんか?
前々から気になっていたことですが、この指標を利用すればある程度このEAの賞味期限がわかってくると思っています。


例えば、VIX30以下になると、極端に取引回数が減少しそれに伴い利益も思うように上げることができなくなってきます。
それが、このEA(20.1)の賞味期限ではないでしょうか?
では、どうすればいいのでしょうか?
パラメータを変更して、取引回数を増やす?
たぶん得策ではありません。
私の考えでは、それを補うための新たなポジション取得条件の追加が必要だと考えています。
そのため、最近のバージョンは、新条件を追加したものが多数存在します。
また、新条件毎のPfの設定もできると面白いかもしれませんね。
もうひとつの賞味期限が、先に訪れるかもしれませんが・・・・・・
ご参考までに・・・・
追記
VIX指数が上限に近づくとどのような動きになるか?という質問がありましたので。
※この内容は、私の予測です。
まず、VIX指数とは、
将来の投資家心理を示す数値として利用されており、英語で「investor fear gauge」、日本語で「恐怖指数」という別名が付けられています。
VIX指数は、通常時10~20の範囲内動き、相場の先行きに不安が生じた時に数値が大きく上昇する特徴があります。 だそうです。 これから予測すると、 ①相場の先行きに不安があれば、投資家は、資金を引き揚げる。 ②引き揚げた資金を違う市場で運用する。(少なからず為替市場にも流れているはず。※市場の出来高がわかればある程度裏付けが取れるかもしれませんが、そのような立場にはいませんので確認が取れません。) ③市場での運用されている方のシステムは、ボラが大きくなれば利益が多くなるシステムだと聞いたことがあります。(順張のシステム?)資金量が増えれば行き過ぎた相場になる。これをウサギだとすると。 ④それを捕食するオオカミが増える。(荒れた相場では、乖離が有効とされているそうです。) ⑤VIXの数値が下がれば、資金が戻る。 ⑥ウサギの餌(資金)が減れば、ウサギも減りオオカミも減る。 ⑦オオカミが減れば、このEAの成績が下がる。 と予測しています。 つまり、このEAは、オオカミ的な要素のEAだと思っています。 ご参考までに・・・・・・

2009/02/13

Mizutori_EAのパラメーターの説明


いろいろなバージョンを作ってしまったので、今回は、25.4を基本に説明します。
共通事項
各パラメータに適用する価格は、極力初値(PRICE_OPEN)を使用しています。
理由は、バックテストした時の誤作動を防止するためです。
終値(PRICE_CLOSE)は、そのバーが確定するまで更新される値です。最新の決定された数値を得ようとすると、初値となります。
トレンドフィルター
double MaSS = iMA(NULL,0,25,0,MODE_EMA,PRICE_OPEN,0);
double MaSM = iMA(NULL,0,50,0,MODE_EMA,PRICE_OPEN,0);
double MaMS = iMA(NULL,0,100,0,MODE_EMA,PRICE_OPEN,0);
double MaMM = iMA(NULL,0,200,0,MODE_EMA,PRICE_OPEN,0);
double MaLM = iMA(NULL,0,300,0,MODE_EMA,PRICE_OPEN,0);
double MaLL = iMA(NULL,0,400,0,MODE_EMA,PRICE_OPEN,0);
上記6つの指数平滑平均線(EMA)を用いてトレンドの発生を監視しています。
各平均線がクロスすることなく、虹状態になった場合に『トレンドが発生した!』としています。
問題点
※『ダマシ』に弱いため、初期でフィルターが効かないことがある。
※『トレンドが発生していない(トレンドが消えた)部分を含んでしまう。』
メインエンジン
double Ma = iMA(NULL,0,MaPeriod,MaShift,MODE_SMA,PRICE_OPEN,0);
double Bands_Ma = iMA(NULL,0,10,0,MODE_SMA,PRICE_OPEN,0);
double Bands = Bands_Ma*(Percent/100);
double MaHi = Ma+Bands;
double MaLow = Ma-Bands;
上記の5つのコードでメインエンジンを構成している。
Maが軸となる移動平均線でデフォルト状態だと、期間5シフトをした期間10の単純移動平均線(SMA)。
Bands_Maは、バンドの巾を形成するための数値を得るための、期間0シフトの期間10の単純移動平均線(SMA)。
Bandsは、Bands_Maを用いて幅を形成しています。
MaHi・MaLowは、Maを軸にした上下の巾を形成したものです。
問題点
※Percentを固定しているため、極端な値動き、値動きが少ない時などの分別が付かない。また、USDJPYM5に特化した数値のため他の通貨ペアに対応しづらい。
サブエンジン
double MaHi_Tr = Ma*(1+Percent_Tr/100);
double MaLow_Tr = Ma*(1-Percent_Tr/100);
メインエンジンに同じ。ただし、使用目的に合わせるために、Percentをメインエンジンと異なる仕様にできるようにしてあります。
期間内の高値と安値の抽出
double HiLimt = High[iHighest(NULL,0,MODE_CLOSE,LimtPeriod,0)];
double LowLimt = Low[iLowest(NULL,0,MODE_CLOSE,LimtPeriod,0)];
LimtPeriod期間内の最も高い(低い)終値がついたバーの高値(安値)をHiLimt/LowLimtに格納
※敗戦処理及びXoxの計算に使用します。
期間内の最高値(最安値)を使用しない理由は、極度に長い髭(瞬間的に付けた値)を回避するためです。
問題点
現在のところ、特にありません。
その他のパラメーター
double RSI = iRSI(NULL,0,14,PRICE_CLOSE,0);
※終値を利用した、期間14のRSI(Relative Strength Index)(相対力指数)

double Dv = iStdDev(NULL,PERIOD_H4,Dv_Period,0,MODE_EMA,PRICE_CLOSE,0);
※終値を利用した、4時間足での標準偏差で、グローバルに値が動いた時のフィルターとして使用しています。
double ATR = iATR(NULL,0,ATRPeriod,0);
※突発的な値動きがあった時のフィルターとして使用しています。
問題点
以下のようなコードの指標のため、バックテストでフィルターが作用し、リアルでは効かない可能性があります。
※ATR (Average True Range)の内部コード
double high=High[i];
double low =Low[i];
double prevclose=Close[i+1];
TempBuffer[i]=MathMax(high,prevclose)-MathMin(low,prevclose)
【高値[0]と終値[1]の高い方から安値[0]と終値の低い方を引いた数値をTempBufferに格納
AtrBuffer[i]=iMAOnArray(TempBuffer,Bars,AtrPeriod,0,MODE_SMA,i);
【TempBufferの期間(デフォルトなら2)の平均がATRの数値となります。】
double stb = iMA(NULL,0,MaLimtPeriod,MaLimtShift,MODE_SMMA,PRICE_OPEN,0);
double st=(HiLimt-LowLimt)/(stb/100);⇒100×((HiLimt-LowLimt)/stb )と置き換えます。
※変動係数(本来は、標準偏差/平均値を意味します。)を求め変動係数が小さい時は、内部エネルギーが蓄積されたと判定し、トレードを制限するために使用します。
※stbは、期間(デフォルト500)の平滑移動平均線で、軸となる価格を抽出するために使用しています。
※stは、高低差を軸となる価格で割ったものを100倍した【変動係数】を格納するものです。
参考
下記の式が上記式に近似します。(添付Bora指標参照:青が下記の指標、白が上記指標です。)
double st=MathLog(HiLimt/LowLimt)*100;
※たぶん、logを使用した方が、本来の意味に近づくと思っています。(USDJPYでは、(HiLimt-LowLimt)/(stb/100)がフィットしています。)
ちなみに LogA=e^Aです。
まとめ
大きなトレンドを避けて、逆張りを行っていけばある程度の成績が可能になると思います。
また、追加もしくは削除しなければならない指標があることでしょう。
フィルターを締め付けると、ほとんど取引をしなくなり、緩めると大きな損益が発生しますので注意してください。
それでは・・・。

2009/02/04

Mizutori_EAの説明(カスタムユーザー向け①)


表示にバグがありましたので修正しました。
Mizutori_EAの内部で何を行っているか、順に説明していきます。
本職の方が見たら、ホントでそれでいいのか?と問いかけたくなるところがあると思います。気になりましたコメントください。)
では、初期化関数から見ていきます。
この初期化関数『init()』は、EAを作動した時に1度だけ作動する場所です。
 一度だけ処理すれば、解決する内容を記載します。
int init()
{①
マジックナンバーの取得
Mc1Number = MYMAGIC + MagicfromSymbol();
【MagicfromSymbol()関数で処理した数値にMYMAGICを加えMc1Number(大域変数)に格納する。】
Profitの確認
TPf = Take_Profit();
【Take_Profit()関数で処理した数値をTPf(大域変数)に格納する。】
return(0);
}①
後処理関数です。(省略可能)
int deinit()
{
return(0);
}

ティックが更新するたびにスタート関数『start()』が呼び出されます。
expert start function
int start() {
int Order = SIGNAL_NONE;
int pos1=0,pos2=0;
bool OderStop = false;
bool OderClose = false;
bool fbp = false;
bool fsp = false;
//double Profit =0;
int Now_Time = TimeCurrent();
【現在のサーバータイムをNow_Timeに格納】
//int NowDay = TimeDay(Now_Time);
int NowHour = TimeHour(Now_Time);
【現在のサーバータイムを時間軸(時)に変更し、NowHourに格納】
int NowMin = TimeMinute(Now_Time);
【現在のサーバータイムを時間軸(分)に変更して、NowMinに格納】
if(!IsTradeAllowed())return(0);
【もし取引が可能でなければ、start()関数終了】
オーダーの凍結
int NT,FrT,ExT;
if(Trade_Freeze)【もしTrade_Freezeが真(true)なら{から}までを実行する。】
{①
NT = (60*NowHour)+NowMin;
【(60*NowHour)+NowMin『現在のサーバータイム』をNTに格納】
 ※●分を×分に変換しています。
FrT = (60*Freeze_SH)+Freeze_SM;
【設定したオーダー凍結開始時間を分に変換してFrTに格納】
ExT = (60*Freeze_EH)+Freeze_EM;
【設定したオーダー凍結終了時間を分に変換してExTに格納】
if((FrT<ExT)&&(FrT<NT)&&(NT<ExT))OderStop = true;
【もし( )内の条件が真(true)ならOderStop に真を格納】
if((FrT>ExT)&&((FrT<NT)||(NT<ExT)))OderStop = true;
もし( )内の条件が真(true)ならOderStop に真を格納】
}①

週末制限 および制限
if(Weekend_Stop==true && DayOfWeek()== Stop_Day_Of_Week && NowHour>=Stop_Hours)OderStop = true;//週末のオーダーストップ
 【もし( )内の条件が真(true)ならOderStop に真を格納】DayOfWeek()は、現在のサーバータイムの曜日(日~土)を0から6の数値で表す関数です。
if(Weekend_Stop==true && DayOfWeek()>Stop_Day_Of_Week)OderStop = true;
 【もし( )内の条件が真(true)ならOderStop に真を格納】
if(Weekend_Close==true && DayOfWeek()==Close_Day_Of_Week && NowHour>=Close_Hours)OderClose = true;//週末のオーダー強制決済
 【もし( )内の条件が真(true)ならOderClose に真を格納】
if(Weekend_Close==true && DayOfWeek()>Close_Day_Of_Week)OderStop = true;
 【もし( )内の条件が真(true)ならOderStop に真を格納】

最後に決済したオーダーの抽出
1時間の間最後に決済されてから金額よりも悪い条件で取引することを防止するための仕様です。
 int ht = OrdersHistoryTotal( )-1;
 【過去のオーダー数 -1をhtに格納】
int ODT = 0;
for(int Z = ht ; Z>=0 ;Z--)
 【過去のオーダー数回{~}内を繰り返す。Zは、過去のオーダー数からの引き算】
 過去のオーダーは、古いものから新しいもの(最後に決済したもの)の順に並んでいます。一番古いもの・・・・・・・・・・一番新しいもの
{
if(OrderSelect(Z, SELECT_BY_POS, MODE_HISTORY) == true)//口座履歴の選択
  【もし過去のデータファイルからデータを抜き出せたら{~}内を処理する。】
{
if(OrderMagicNumber() != Mc1Number) continue;//マジックナンバー
【もしマジックナンバーが異なっていたらこの処理をスキップする。】
datetime HistoryLastTime = OrderCloseTime( ) ;//決済した時間
【決済した時間をHistoryLastTimeに格納する。】
double HistoryLastPrice = OrderOpenPrice( ) ;
 【注文した時の価格をHistoryLastPriceに格納】
ODT = ODT+1;
 【ODTに1を加える】
}
if(HistoryLastPrice>0)break;
 【HistoryLastPriceが0以上ならループから脱出する。】
 }
 //ポジション取得の許可
int now =TimeHour(Now_Time-HistoryLastTime) ;
 【現在の時間から最後に決済された時間を引いてnowに時間単位(時)で格納】
if((now>=1)||(ODT==0)||(Ask<=(HistoryLastPrice-(PipStep*Point))))fbp = true;
 【もし(最後に決済されてから1時間以上経過した)または(過去のオーダーがない)または(最後に決済した価格よりもASKが下回ったら)fbpに真を格納する。】
if((now>=1)||(ODT==0)||(Bid>=(HistoryLastPrice+(PipStep*Point))))fsp = true;//
 【もし(最後に決済されてから1時間以上経過した)または(過去のオーダーがない)または(最後に決済した価格よりもBidが上回ったら)fbpに真を格納する。】
if(!Sort_Order){fbp = true;fsp = true;}
 【もしSort_Orderが真でなければ{ }を処理】
オープンポジションの抽出
//ポジション数の確認およびラストオーダーの金額の抽出
ポジションは、古いオーダー・・・・新しいオーダーの順で格納されています。
double LastPrice = 0;
for(int i=0;i<OrdersTotal();i++)【注文分繰り返す】
{①
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true){② //注文ポジションの選択
【もしデータファイルからデータを抜き出せたら{~}内を処理する。】
if(OrderMagicNumber() != Mc1Number) continue;//マジックナンバー
【マジックナンバーが異なればスキップ】
if(OrderType()==OP_BUY)pos1++;
 【BUY注文があればpos1に1を追加する】
if(OrderType()==OP_SELL)pos2++;
 【SELL注文があればpos2に1を追加する】
LastPrice=OrderOpenPrice();
【約定金額をLastPriceに格納】
}②
}①
int posX = pos1+pos2;
if((posX==0)||(posX > NumPos))
【もし( )内の条件のどちらかが真から{①}内を繰り返す。】
{①
NumPos=posX;
if(NumPos>1 && UseStopLoss )Changes_Stoploss(Mc1Number,NumPos);
【もしナンピン回数(オーダー数の合計)が更新されたら、Changes_Stoploss()関数にMc1Number,NumPosの条件を与えて処理させる。】
}①
時間軸による変更(サーバータイム[GTM+0]
int NH = NowHour+ServerTime_GMT;
MaShift = MaShift_Custom(NH);
【MaShift_Custom( )にNHを与えて、その結果をMaShiftに格納】
Xox = Xox_Custom(NH);
【Xox_Custom( )にNHを与えて、その結果をXoxに格納】

今回はここまでにしておきます。

2009/02/03

Mizutori_EAの説明(カスタムユーザー向け④)


前回の続きです。
※ご指示頂きましたので修正しました。(2009/2/11)
ここからは、注文・決済・注文の変更になりますが、汎用性を高くするために多くの無駄な作業が含まれています
※不具合が見つかりました。不具合の場所を赤字で書いておきます。
◆ ポジションの決済 ◆
void ClosePositions(int Close_Type ,int Oder_Type ,int MagicNumber)
【void型の関数は、処理後の値がない関数(処理値を返さない関数です。)】
【ClosePositionsという名前の自作関数で、決済タイプ(0:1つだけ決済する、1;すべて決済する)決済する注文の種別、マジックナンバー、を受けて処理を行います。】
{【①まで有効】
int Error ;
RefreshRates();
【値を最新のものにする。】
for(int i=OrdersTotal()-1;i>=0;i--)【注文がある分繰り返す】
{【②まで有効】
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break ; //注文ポジションの選択
【注文が、なければ処理を脱出する。】
if(OrderMagicNumber() != MagicNumber) continue; //マジックナンバー
【マジックナンバーが異なれば処理をスキップする。】
{ 【③まで有効】※不要かもしれません。
int type = OrderType();
【その注文のタイプを確認する。BUY or SELL】
if((type == OP_BUY && Oder_Type==SIGNAL_CLOSEBUY)||(type==OP_SELL && Oder_Type==SIGNAL_CLOSESELL))
【決済指示が来ている注文のタイプとその注文が同じタイプか確認し、同じタイプであるなら④内の処理を行う。】
{【④まで有効】
switch(type)【注文のタイプ別分儀】
{【⑤まで有効】
買ポジションに対する処理
case OP_BUY:【BUY注文の場合】
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);
 【決済注文を行う(この注文のチケットナンバー、この注文のロット数、売値、スリペ、チャート上の決済位置の印の色)】
Error = GetLastError();
【上記処理のエラーをErrorに格納】
if(Error!=0){Print("Close Positions Error OrderTicket = ", OrderTicket());}else{【⑥まで有効】
【もし、処理時にエラーがあれば、エラー報告しなければ以下の処理を行う。】
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");
【メールを送るようになっていれば、(   )内の文面でメールを送る。】
if(SignalAlert)Alert("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");
【アラート設定がなされていれば、(  )内の文面でアラートを発生させる。】
}⑥
if(Close_Type==0){return(0);}
【1つだけ決済する場合は、この関数を終了する。】
break;【swithchからの脱出】
売りポジションに対する処理
case OP_SELL: 【SLL注文の場合】
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);
【決済注文を行う(この注文のチケットナンバー、この注文のロット数、買値、スリペ、チャート上の決済位置の印の色)
Error = GetLastError();
【上記処理のエラーをErrorに格納】
if(Error!=0){Print("Close Positions Error OrderTicket = ", OrderTicket());}else{【⑦まで有効】
【もし、処理時にエラーがあれば、エラー報告しなければ以下の処理を行う。】
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");
【メールを送るようになっていれば、(   )内の文面でメールを送る。】
if(SignalAlert)Alert("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");
【アラート設定がなされていれば、(  )内の文面でアラートを発生させる。】
}⑦
if(Close_Type==0){return(0);}
【1つだけ決済する場合は、この関数を終了する。】
break; 【swithchからの脱出】
}⑤
}④
}③
}②
}①
【処理値を返さなくていいので、return()がありません。】
◆ポジションの注文 ◆
void OrderPositions(int Order,int pok1,int pok2,int MagicNumber)
【戻り値のないOrderPositionsという名前の自作関数で、注文の種別、現在のBUY注文の数、現在のSELL注文数、マジックナンバーを受けて処理する。】
{ 【①まで有効】
//-------ロット数の計算
double StopLossLevel =0;
double Stp=0;
int pos = MathAbs(pok1 - pok2);
【現在の注文数をposに格納】
double Lots = 0;
if(Lot_Management){Lots=lotSizeCalc(pos);}else{Lots=Fixed_Lots;}
【ロット調整を行う場合は、lotSizeCalc自作関数を実行し、Lotsに格納。ロット調整をしない場合は、Fixed_Lots(指示値)をLotsに格納】
if(Order==SIGNAL_BUY)
【BUY注文の場合{②}内の処理を行う】
{【②まで有効】
Ticket=0;
if(AccountFreeMarginCheck(Symbol(),OP_BUY,Lots)<=0 || GetLastError()==134){【③まで有効】
【余剰証拠金を確認し、不足している場合{③}内を処理】
Print("We have no money. Free Margin = ", AccountFreeMargin());
【残高不足であることを記載する。】
return(0);【自作関数の終了】}
if (UseStopLoss){Stp= Ask-StopLoss*Point ;}else Stp = 0.0;
【損切り値を設定する場合、損切り値をstpに格納、設定しない場合は、stpに0を格納】
if (UseTakeProfit) TakeProfitLevel = Ask + (TPf*Point) ; else TakeProfitLevel = 0.0;
【利食い値を設定する場合、利食い値をTakeProfitLevelに格納、設定しない場合は、TakeProfitLevelに0を格納】
for(int bt=1;bt<= Order_Challenge ;bt++)【Order_Challenge(指示値)分{④}内を繰り返す】
{【④まで有効】
Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage*Point, Stp, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
現在の通貨ペア、BUY注文、注文数、買値、スリペ、損切り値、利食い値、履歴に(Buy(#マジックナンバー))と記入、マジックナンバー、現在の時間、チャート上に記載される色を指示し、注文する。また、注文状況をTicketに格納】
if(Ticket > 0) 【注文が処理されたら】{【⑤まで有効】
if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {【⑥まで有効】
【注文がされているか再度確認するために、注文を確認し、注文がされていれば】
Print("BUY order opened : ", OrderOpenPrice());
【(BUY order open 約定金額)と履歴に残す】
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + "@"+DoubleToStr(Lots,2)+"@ Open Buy");
【メール設定されていれば、( )内の文面でメールを送る。】
if(SignalAlert) Alert ("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + "@"+DoubleToStr(Lots,2)+"@ Open Buy");
【アラート設定されていれば、( )内の文面でアラートを表示する。】
break ;【処理を抜け出す。】
⑥} else { ⇒ ⑥}⑤}else{⑦ 【不具合発見です。既設(赤部)だと1度目の注文確認で真、2回目の確認で偽にならないと、エラー報告が発生しないようになっています。変更が必要です。】
【変更内容は、1度目の確認が偽ならエラー処理をする。というものです。】
【2回目の確認は、本来注文の呼び出しがメインのため、エラー処理なしとしてみました。】
if(SignalAlert) Alert("Error opening BUY order : ", GetLastError());
【アラート設定がなされている場合、( )内を表示(エラー報告)】
Sleep(5000);//5秒間停止
【5秒間停止】
}【上記不具合のため、削除】
}⑦
}④
}③
if(Order==SIGNAL_SELL)
【SELL注文の場合{⑦}内の処理を行う】
{【⑦まで有効】
Ticket=0;
if(AccountFreeMarginCheck(Symbol(),OP_SELL,Lots)<=0 || GetLastError()==134){【⑧まで有効】
【余剰証拠金を確認し、不足している場合{⑧}内を処理】
Print("We have no money. Free Margin = ", AccountFreeMargin());
【残高不足であることを記載する。】
return(0); 【自作関数の終了】}⑧
if (UseStopLoss){Stp= Bid+StopLoss*Point ;}else Stp = 0.0;
【損切り値を設定する場合、損切り値をstpに格納、設定しない場合は、stpに0を格納】
if (UseTakeProfit) TakeProfitLevel = Bid - (TPf*Point) ; else TakeProfitLevel = 0.0;
【利食い値を設定する場合、利食い値をTakeProfitLevelに格納、設定しない場合は、TakeProfitLevelに0を格納】
for(int sc = 1;sc<= Order_Challenge ;sc++)【Order_Challenge(指示値)分{⑨}内を繰り返す】
{【⑨まで有効】
Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage*Point, Stp, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
【現在の通貨ペア、SELL注文、注文数、売値、スリペ、損切り値、利食い値、履歴に(Buy(#マジックナンバー))と記入、マジックナンバー、現在の時間、チャート上に記載される色を指示し、注文する。また、注文状況をTicketに格納】
if(Ticket > 0) 【注文が処理されたら】{【⑩まで有効】
if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {【⑪まで有効】
【注文がされているか再度確認するために、注文を確認し、注文がされていれば】
Print("SELL order opened : ", OrderOpenPrice());
【(SELL order open 約定金額)と履歴に残す】
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + "@"+Lots+"@ Open Sell");
【メール設定されていれば、( )内の文面でメールを送る。】
if(SignalAlert) Alert ("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + "@"+Lots+"@ Open Sell");
【アラート設定されていれば、( )内の文面でアラートを表示する。】
break ; 【return(0);の方がいいかもしれません。】
⑪} else { ⇒ ⑪}⑩}else{⑫ 【不具合発見です。既設(赤部)だと1度目の注文確認で真、2回目の確認で偽にならないと、エラー報告が発生しないようになっています。変更が必要です。】

【変更内容は、1度目の確認が偽ならエラー処理をする。というものです。】
【2回目の確認は、本来注文の呼び出しがメインのため、エラー処理なしとしてみました。】

if(SignalAlert) Alert("Error opening SELL order : ", GetLastError());
【アラート設定がなされている場合、( )内を表示(エラー報告)】
Sleep(5000);//5秒間停止
【5秒間停止】
} 【上記不具合のため、削除】
}⑫
}⑨
}②
}①
◆ Stoplossの変更(注文の変更)◆
void Changes_Stoploss(int MagicNumber,int pos)
【戻り値のないChanges_Stoplossという自作関数で、マジックナンバー、ナンピン回数を受けて処理します。】
{【①まで有効】
int Error ;
int Total = OrdersTotal()-1;
【注文数の合計をTotalに格納】
int K = Total-pos+1;※不具合処理のため削除
for(int i=Total;i>=K;i--) ⇒ for(int i=0;i> Total;i++) ※不具合発生のため変更
{【②まで有効】
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break ; //注文ポジションの選択
【注文の呼び出し、及び 注文がなければ、処理を脱出】
if(OrderMagicNumber() != MagicNumber) continue; //マジックナンバー
【マジックナンバーが異なればスキップ】
{ 【③まで有効】※たぶん要らない
int type = OrderType();
【その注文タイプをtypeに格納】
switch(type)【注文タイプの分儀】
{【④まで有効】
//買ポジションに対する処理
case OP_BUY:【BUY注文の場合】
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss( )-Point*StopStep,OrderTakeProfit(),0,Yellow);
【注文の変更(注文番号、注文値、損切り値、利食い値、時刻、黄色)で変更を行う】
Error = GetLastError();
【エラーをErrorに格納】
if(Error!=0){Print("Changes Stoploss Error OrderTicket = ", OrderTicket());}
【エラーがあるなら、履歴に残す】
break;【処理を脱出】
//売りポジションに対する処理
case OP_SELL:【SELL注文の場合】
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss( )+Point*StopStep,OrderTakeProfit(),0,Yellow);
【注文の変更(注文番号、注文値、損切り値、利食い値、時刻、黄色)で変更を行う】
Error = GetLastError();
【エラーをErrorに格納】
if(Error!=0){Print("Changes Stoploss Error OrderTicket = ", OrderTicket());}
【エラーがあるなら、履歴に残す】
break; 【SELL注文の場合】
}④
}③
}②
} ①
//+---------------------------------------------------------------- END ------------------------------------------------------------------+

2009/01/30

Mizutori_EAの説明(カスタムユーザー向け③)


先回な続きです。
【自作関数の書き方】
※自作関数が処理後に受け渡す形(今回はdouble)で宣言します。
※( )の前は、自作関数の名前、( )内部は、受け渡された物の形(今回は、int)とそれを格納する変数です。
※下記の場合、ポジション数をposに格納したlotSizeCalcという自作関数で,処理後に受け渡すものが、doubleの形であることを意味します。
◆ LOTサイズ計算 ◆
double lotSizeCalc(int pos)
{※ここから(※ここまで)がこの自作関数の範囲です。
int doru = 1;
double lotMM = 0;
int sizeND = 0;
double lotsize = MarketInfo(Symbol(),MODE_LOTSIZE);
【1ロットの単位(数量)をlotsizeに格納】
double maxlots = MarketInfo(Symbol(), MODE_MAXLOT);
【取引可能な最大Lot数をmaxlotsに格納】
double minlots = MarketInfo(Symbol(), MODE_MINLOT);
【取引可能な最少Lot数をminlotsに格納】
double accountFreeMargin = AccountFreeMargin();
【口座の余剰証拠金額をaccountFreeMarginに格納】
string Currency = AccountCurrency();
【口座預金の通貨名をCurrencyに格納】
if(Currency == "JPY") doru = 100;
【もし口座預金の通貨名が、JPYなら、doruに100を格納】
if(Currency =="USD") doru = 1;
【もし口座預金の通貨名が、USDなら、doruに1を格納】
※doruは、通貨ごとに違う単位を合わせるためのものです。
double lot =(accountFreeMargin*Leverage) / (doru*lotsize);
【(余剰証拠金×レバ)/(doru×ロットサイズ)をlotに格納】
if(minlots>=1){sizeND=0;}else{if(minlots>=0.1){sizeND=1;}else{if(minlots>=0.01){sizeND=2;}}}
【取引可能な最少Lot数により、小数点以下の適用範囲を決定する】
switch(pos)
【ナンピン回数により処理を分ける】
{
case 0: 【ナンピン回数0回の場合】
lotMM = NormalizeDouble(lot*Lotpos1,sizeND);
【ナンピン回数による倍率をlotに掛けて、最少Lot数単位で丸めた数値をlotMMに格納】
break;【switch処理を抜け出す】
case 1: 【ナンピン回数1回の場合】
lotMM = NormalizeDouble(lot*Lotpos2,sizeND);
【ナンピン回数による倍率をlotに掛けて、最少Lot数単位で丸めた数値をlotMMに格納】
break; 【switch処理を抜け出す】
case 2: 【ナンピン回数2回の場合】
lotMM = NormalizeDouble(lot*Lotpos3,sizeND);
【ナンピン回数による倍率をlotに掛けて、最少Lot数単位で丸めた数値をlotMMに格納】
break; 【switch処理を抜け出す】
case 3: 【ナンピン回数3回の場合】
lotMM = NormalizeDouble(lot*Lotpos4,sizeND);
【ナンピン回数による倍率をlotに掛けて、最少Lot数単位で丸めた数値をlotMMに格納】
break; 【switch処理を抜け出す】
case 4: 【ナンピン回数4回の場合】
lotMM = NormalizeDouble(lot*Lotpos5,sizeND);
【ナンピン回数による倍率をlotに掛けて、最少Lot数単位で丸めた数値をlotMMに格納】
break; 【switch処理を抜け出す】
default: 【ナンピン回数その他の場合】
lotMM = NormalizeDouble(lot*Lotpos6,sizeND);
【ナンピン回数による倍率をlotに掛けて、最少Lot数単位で丸めた数値をlotMMに格納】
break; 【switch処理を抜け出す】
}
if (lotMM < minlots) lotMM = minlots;
【求められた数値が最少Lot未満なら、lotMMに最小値を格納】
if (lotMM > maxlots) lotMM = maxlots;
【求められた数値が最大Lotを超えていたら、lotMMに最大値を格納】
if (lotMM > MaxLots) lotMM = MaxLots;
【求められた数値が設定した最大Lotを超えていたら、lotMMに設定した最大値を格納】
return (lotMM);
【求められた数値を、doubleの形で、この関数を呼び出したところに、返します。】
}※ここまで(lotSizeCalc自作関数の終わり)

◆時間軸によるMaのshiftの変更◆
int MaShift_Custom(int NowHour)
【MaShift_Customと名前の自作関数で、int型の数値を返します。】
{※ここから
int MaShift = 0;
if(NowHour>= EuTime_S && NowHour<= EuTime_E) MaShift = EuTime_MaShift ;
if(NowHour>= UsTime_S && NowHour<= UsTime_E) MaShift = UsTime_MaShift ;
if(AsTime_S <= AsTime_E) {
if(NowHour>= AsTime_S && NowHour<= AsTime_E) MaShift = AsTime_MaShift ;
} else {
if(NowHour>= AsTime_S || NowHour<= AsTime_E) MaShift = AsTime_MaShift ;
}
【1日を3つの範囲に分けてその範囲ごとの変数を設定するための仕様です。】
return(MaShift);
【求められた数値を、int型で、この関数を呼び出したところに、返します。】
}※ここまで
◆時間軸によるMaLimitのshiftの変更◆
※以前は、必要性がありましたが、今はほとんど使われていないものです。
※上記とほぼ同じことをしているので説明を省略します。
int MaLimtShift_Custom(int NowHour)
{
int MaLimtShift = 0;
if(NowHour>= EuTime_S && NowHour<= EuTime_E) MaLimtShift = EuTime_MaLimtShift;
if(NowHour>= UsTime_S && NowHour<= UsTime_E)MaLimtShift = UsTime_MaLimtShift;
if(AsTime_S <= AsTime_E) {
if(NowHour>= AsTime_S && NowHour<= AsTime_E)MaLimtShift = AsTime_MaLimtShift;
} else {
if(NowHour>= AsTime_S || NowHour<= AsTime_E)MaLimtShift = AsTime_MaLimtShift;
}
return(MaLimtShift);
}
◆時間軸による、Xoxの変更◆
※上記とほぼ同じため説明を省略します。
double Xox_Custom(int NowHour)
{※ここから
double Xox = 0;
if(NowHour>= EuTime_S && NowHour<= EuTime_E)Xox = EuTime_Xox;
if(NowHour>= UsTime_S && NowHour<= UsTime_E) Xox = UsTime_Xox;
if(AsTime_S <= AsTime_E) {
if(NowHour>= AsTime_S && NowHour<= AsTime_E) Xox = AsTime_Xox;
} else {
if(NowHour>= AsTime_S || NowHour<= AsTime_E) Xox = AsTime_Xox;
}
return(Xox);
}※ここまで

◆ マジックナンバーの作成◆
※本来、EAごと、通貨ペアごと、時間軸ごとに、マジックナンバーを変更しなければなりません。
しかし、忘れやすいので、通貨ごと、時間軸ごとで、マジックナンバーを自動的に変更するようにしてあります。
 ただし、別のEAと同時に使用する場合、邪魔になるかもしれません。(あくまでも、テスト用の参考ソースです。)
int MagicfromSymbol() {
【MagicfromSymbolという名前の自作関数で、int型の数値を返す】
int MagicNumber=0;
for (int i=0; i<5; i++) { 【5回繰り返します。】
MagicNumber=MagicNumber*3+StringGetChar(Symbol(),i);
【 MagicNumberを3倍し、通貨ペア名のi番目の文字コード番号を加えたものをMagicNumberに格納】
}
MagicNumber=MagicNumber*3+Period();
【MagicNumberを3倍し、時間軸を加えたものをMagicNumberに格納】
return(MagicNumber);
【求められた数値を、int型で、この関数を呼び出したところに、返す。】
}

◆TakeProfitの計算◆
double Take_Profit()
【Take_Profitという関数名で、double型の数値を返す。】
{※ここから
int StopLoss = MarketInfo(Symbol(),MODE_STOPLEVEL);
【注文時に決済注文を同時に発注する場合の最低利益をStopLossに格納】
int FreezLevel = MarketInfo(Symbol(),MODE_FREEZELEVEL);
【成り行き決済した場合の最低利益をFreezLevelに格納】
if(StopLoss>TakeProfit){TPf=StopLoss;}else{TPf=TakeProfit;}
【StopLossとTakeProfit(大域変数)を比べて、大きい方をTPfに格納】
if(FreezLevel>TPf)TPf=FreezLevel;
【FreezLevelがTPfより大きい場合、TPfにFreezLevelを格納】
return(TPf);
【求められた数値を、Double型で、この関数を呼び出したところに、返す。】
}※ここまで

次回に続く・・・・・・・・・

2009/01/28

Mizutori_EAの説明(カスタムユーザー向け②)


前回の続きです。
◆ 指標の計算◆
この部分で、すべての指標計算処理を行っています。
『iMA』とは、移動平均線の組込指標関数です。詳しい説明は、「Meta Editor」のヘルプで確認ください。
※詳細については、次の説明で行いたいと思います。
double Ma = iMA(NULL,0,MaPeriod,MaShift,MODE_SMA,PRICE_OPEN,0);
double MaSS = iMA(NULL,0,25,0,MODE_EMA,PRICE_OPEN,0);
double MaSM = iMA(NULL,0,50,0,MODE_EMA,PRICE_OPEN,0);
double MaMS = iMA(NULL,0,100,0,MODE_EMA,PRICE_OPEN,0);
double MaMM = iMA(NULL,0,200,0,MODE_EMA,PRICE_OPEN,0);
double MaLM = iMA(NULL,0,300,0,MODE_EMA,PRICE_OPEN,0);
double MaLL = iMA(NULL,0,400,0,MODE_EMA,PRICE_OPEN,0);
double Bands_Ma = iMA(NULL,0,10,0,MODE_SMA,PRICE_OPEN,0);
double Bands = Bands_Ma*(Percent/100);
double MaHi = Ma+Bands;
double MaLow = Ma-Bands;
double MaHi_Tr = Ma*(1+Percent_Tr/100);
double MaLow_Tr = Ma*(1-Percent_Tr/100);
double HiLimt = High[iHighest(NULL,0,MODE_CLOSE,LimtPeriod,0)];
double LowLimt = Low[iLowest(NULL,0,MODE_CLOSE,LimtPeriod,0)];
double RSI = iRSI(NULL,0,14,PRICE_CLOSE,0);
double stb = iMA(NULL,0,MaLimtPeriod,MaLimtShift,MODE_SMMA,PRICE_OPEN,0);
double st=(HiLimt-LowLimt)/(stb/100);
double Dv = iStdDev(NULL,PERIOD_H4,Dv_Period,0,MODE_EMA,PRICE_CLOSE,0);
double ATR = iATR(NULL,0,ATRPeriod,0);
◆シグナルの作成・注文及び決済◆
※注文を出す許可シグナルをFlag『旗』としています。
 つまり、買い注文を出す場合には、『Buy_Flag』を上げる(true)とします。
 許可シグナルを固定することにより、いくつもの条件を追加できるようにしています。
bool Buy_Flag = false;
【Buy_Flagを宣言し、下げる(false)を格納】
bool Sell_Flag = false;
【Sell_Flag を宣言し、下げる(false)を格納】
◆買いポジションの取得◆
//条件式記入---------------------------------------------------
if(
(!OderStop)
&&(pos1<Max_Position)
//&&(MaLimtHi>Ask)
//&&(MaLimtLow<Ask)
&&(st>=Xox)
&&(RSI<=RSILowLimt)
&&(MaLow>=Ask)
&&(ATR<=ATRLimt)
&&((Ask<=(LastPrice-(PipStep*Point)))||pos1==0)
)Buy_Flag = true;
【もし、上記の条件がすべて満たされるのであれば、「Buy_Flag」を上げる(true)】
//----------------------------------------------------------------------------+
if((!fbp)||(!Stop_DV && Dv>=Dv_Point))Buy_Flag = false;
【もし、条件が満たされるのであれば、「Buy_Flag」を下げる(false)】
//+トレンド発生時の停止 --------------------------------------+
if(
//(MaMG>MaLL)
(MaLL>MaLM)
&&(MaLM>MaMM)
&&(MaMM>MaMS)
&&(MaMS>MaSM)
&&(MaSM>MaSS)
)Buy_Flag = false;
【もし、条件が満たされるのであれば、「Buy_Flag」を下げる(false)】
//+新条件-----------------------------------------------------+
if(
(!OderStop)
&&(fbp)
&&(pos1<Max_Position)
&&(MaLL<MaLM)
&&(MaLM<MaMM)
&&(MaMM<MaMS)
&&(MaMS<MaSS)
&&(MaLow_Tr>=Ask)//今回変更
&&((Ask<=(LastPrice-(PipStep*Point)))||pos1==0)
)Buy_Flag = true;
【もし、条件が満たされるのであれば、「Buy_Flag」を上げる(true)】
※このように、最後に、『新条件を追加』することにより、上記の 『「Buy_Flag」を下げる(false)』の条件を無能力化できます。
//+-----------------------------------------------------------+
if(Buy_Flag == true){
【もし、「Buy_Flag」が上げられて(true)いたら、以下の処理を実施する】
ClosePositions(1,SIGNAL_CLOSESELL,Mc1Number);//買い注文と同時に売り注文の決済を行う場合
【ClosePositions自作関数で新規注文と逆のオーダーをすべて閉じる。】
※ちなみに、『ClosePositions(0,SIGNAL_CLOSESELL,Mc1Number);』とすると、逆のオーダーを1つだけ閉じます。
OrderPositions(SIGNAL_BUY,pos1,pos2,Mc1Number);
【OrderPositions自作関数で新規注文を出します。】
※ちなみに、OrderPositions(注文の種類,既存のBUY注文数,既存のSELL注文数,マジック);となっています。
Buy_Flag = false;
【Buy_Flag」を下げる(false)】※特に必要ありませんが、間違いを防止するために記載しています。
fbp=false;
return(0);
【終了:注文を出していますから、終了しています。】
}
【この{までが、「Buy_Flag」が上げられていたら・・・の範囲です】
◆売りポジションの取得◆
買いポジションと同じなので省略です。
//条件式記入---------------------------------------------------
if(
(!OderStop)
&&(pos2<Max_Position)
//&&(MaLimtLow<Bid)
//&&(MaLimtHi>Bid)
&&(st>=Xox)
&&(RSI>=RSIHiLimt)
&&(ATR<=ATRLimt)
&&(MaHi<=Bid)
&&((Bid>=(LastPrice+(PipStep*Point)))||pos2==0)
)Sell_Flag = true;
//-------------------------------------------------------------
if((!fsp)||(!Stop_DV && Dv>Dv_Point))Sell_Flag = false;
//+トレンド発生時の停止 --------------------------------------+
if(
//(MaMG<MaLL)
(MaLL<MaLM)
&&(MaLM<MaMM)
&&(MaMM<MaMS)
&&(MaMS<MaSM)
&&(MaSM<MaSS)
)Sell_Flag = false;
//+新条件-----------------------------------------------------+
if(
(!OderStop)
&&(fsp)//今回追加
&&(pos2<Max_Position)
&&(MaLL>MaLM)
&&(MaLM>MaMM)
&&(MaMM>MaMS)
&&(MaMS>MaSS)
&&(MaHi_Tr<=Bid)
&&((Bid>=(LastPrice+(PipStep*Point)))||pos2==0)
)Sell_Flag = true;
//+-----------------------------------------------------------+
if(Sell_Flag == true){
ClosePositions(1,SIGNAL_CLOSEBUY,Mc1Number);
OrderPositions(SIGNAL_SELL,pos1,pos2,Mc1Number);
Sell_Flag = false;
fsp=false;
return(0);
}
◆決 済◆
//+----------------------------------------------------------------------------------------+
//強制決済条件
※何らかの理由で、注文と同時にTakeProfit(利食い注文)が出来なかった場合、もしくは、利食い注文以下での決済が必要になった際の処理です。
※ただし、各業者が決めている【FreezLevel】以下での決済は行えません。
//買ポジ決済
double Current_Profit_Buy = Bid-LastPrice;
【現在の買いオーダー(BUY)の利食い値をCurrent_Profit_Buyに格納】
if((UseTakeProfit)&&(pos1>0)&&(TPf>TakeProfit*Point)&&(Current_Profit_Buy>(TakeProfit*Point)))ClosePositions(0,SIGNAL_CLOSEBUY,Mc1Number);
【現在の利食い値が、既定のTakeProfit以上なら決済処理を実行する。】※この場合は、1つの決済です。
//売ポジ決済
double Current_Profit_Sell = LastPrice-Ask;
【現在の売りオーダー(SELL)の利食い値をCurrent_Profit_Sellに格納】
if((UseTakeProfit)&&(pos2>0)&&(TPf>TakeProfit*Point)&&(Current_Profit_Sell>(TakeProfit*Point)))ClosePositions(0,SIGNAL_CLOSESELL,Mc1Number);
【現在の利食い値が、既定のTakeProfit以上なら決済処理を実行する。】※この場合は、1つの決済です。
//+----------------------------------------------------------------------------------------+
◆ナンピン回数による特別な決済条件◆
※ただし、ナンピン回数とは、同時ポジション数の最大値を意味します。
switch(NumPos)
【ナンピン回数別に処理を分ける】
{
case 0: 【ナンピン回数が0回の場合、(つまりポジションがない場合)】
break;【処理を脱出する】
case 1: 【ナンピン回数が1回の場合、】
break; 【処理を脱出する】
case 2: 【ナンピン回数が2回の場合、】
//if(pos1==1)ClosePositions(SIGNAL_CLOSEBUY,Mc1Number);
//if(pos2==1)ClosePositions(SIGNAL_CLOSESELL,Mc1Number);
break; 【処理を脱出する】
case 3: 【ナンピン回数が3回の場合、】
//if(pos1==1)ClosePositions(1,SIGNAL_CLOSEBUY,Mc1Number);
//if(pos2==1)ClosePositions(1,SIGNAL_CLOSESELL,Mc1Number);
break; 【処理を脱出する】
case 4: 【ナンピン回数が4回の場合、】
if((pos1==1))ClosePositions(1,SIGNAL_CLOSEBUY,Mc1Number);
if((pos2==1))ClosePositions(1,SIGNAL_CLOSESELL,Mc1Number);
【ポジション数が1になった場合、残りを強制決済する。】
※言い換えれば、ナンピン回数が4回あって3つのポジションが決済されれば、残りを強制決済することを意味します。
break; 【処理を脱出する】
default: 【ナンピン回数が5以上の場合、】
break; 【処理を脱出する】
}
◆指標による決済条件◆
【Buy(買い)注文の処理】
//条件式記入---------------------------------------------------
if(
(pos1>0)&&
(
(HiLimt-Bid<=Lt*Point)
||
//(ATR>ATRLimt)
//||
(MaHi<Bid)
||
(OderClose)
)
//-------------------------------------------------------------
){
ClosePositions(1,SIGNAL_CLOSEBUY,Mc1Number);
return(0);
}
【Sell(売り)注文の処理】
//条件式記入---------------------------------------------------
if(
(pos2>0)&&
(
(Ask-LowLimt<=Lt*Point)
||
//(ATR>ATRLimt)
//||
(MaLow>Ask)
||
(OderClose)
)
//-------------------------------------------------------------
){
ClosePositions(1,SIGNAL_CLOSESELL,Mc1Number);
return(0);
}
//+------------------------------------------------------------------+
return(0);
}
【ここでstart( )関数が終了します。】
※この後は、次回です。

2009/01/20

Mizutori_EAの取扱い説明(ビギナー向け)

※このEAは、スキル向上のために作成したEAです。  もし、このEAが原因で、あなたに損害を与えたとしても、一切保証できません。 また、このEAは、作動を保証するものでもありません。

数多くの方々の協力を経て作り上げたEAです。ご協力頂いた方にお礼申し上げます。

特徴
・移動平均線からの乖離を売買ルールの起点とし、いくつかの指標で制限を加えながら安定的に成績を上げるように開発してきた逆張りスキャルピング系のEAです。
・売買注文と同時に、利食い値、ストップをオーダーしています。
・売買ルールの中にナンピン手法が含まれています。  
  ・常時売買を繰り返すEAではなく、ある一定の条件を満たさないと売買を行いません。
   (そのため1週間に一度も売買を行わない場合があります。)  

適用範囲
・通貨ペア   USDJPY(デフォルトの場合)
・時間軸
5M(5分足)(デフォルトの場合)
・口座通貨名
USD 若しくは、JPY ・会社名
全てに適応できるはず?【確認は取れていません】
※(ただし、デフォルトの設定は、【point】=0.01で設定されています。詳細はQ&Aで)       
マジックナンバー
このEAは、別のEAとの競合を防止するため、自動的にマジックナンバーを成形するプログラムが装備されています。

【プログラムの内容】
通貨ペア名の文字コードを利用して数字(USDJPYの場合は、30120)を成形し、それに時間軸(5分足なら5)を加え、さらに【MYMAGIC】の数値を取り入れたものがマジックナンバーとなります。   MYMAGIC=12345の場合 マジックナンバーは、【42470】となります。他のEAを使用されている方は、調整してください。

パラメーターの説明
#define MYMAGIC 12345 //ポジションの固有ID
マジックナンバーが競合する場合に調整します。
extern bool SignalAlert = true;
【true】の場合、取引ごとに、アラームを発生させます。
ただし、MT4での設定が必要です。
※利食い値に達した場合のCLOSEアラームは、発生しません。
extern bool SignalMail =false;
【true】の場合、取引ごとに、メールを送ります。
ただし、MT4でメール設定が必要になります。
※利食い値に達した場合のCLOSEメールは、配信されません。
//+-----------------------------------+
extern bool Lot_Management = true;//固定ロットの場合は,false
【true】の場合、ロットマネージメントを行います。
※ロットマネージメントとは、設定レバと余剰証拠金より自動的にロットサイズを調整するシステムです。
extern double Fixed_Lots = 0.0;//固定ロット数
【Lot_Management=false】の場合のロット数です。
extern double MaxLots = 10.0;
ロットマネージメントを使用して算出されたロット数の上限を指定しておくパラメーターです。
extern double Leverage = 1.0;
ロットマネージメントを使用する場合のレバを設定するパラメーターです。
extern double Slippage = 5.0;
注文を出す際のスリッページです。
//+-----------------------------------+
extern bool UseStopLoss = true;
【true】の場合、ストップロスを設定します。
extern int StopLoss = 100;
ストップロスの数値を設定します。
【100】とは、(point=0.01の場合)1.00を意味します。
100.00 USDJPYで注文を出した際のストップロス値は、101.00 USDJPYとなります。
 ※注意
最近、100.000と小数点以下が3桁の会社が出てきました。その場合は【1000】としてください。
extern bool UseTakeProfit = true;
【true】の場合、利食い値を設定します。
このEAでは、固定しておいてください。
extern double TakeProfit = 13.0;
利食い値の数値を設定します。
その他は、【StopLoss】を参照してください。
extern double PipStep = 18.0;
ナンピンを行う幅を数値で設定します。
その他は、【StopLoss】を参照してください。
extern int Max_Position = 5;//最大ポジション数
ナンピン回数の最大値を指定します。
extern int Order_Challenge = 10;//オーダーのアタック回数
何らかの原因で、オーダーが受け付けられなかった場合に、何回同じオーダーを繰り返し発信するかを指定します。
※オーダーが通らなかった場合、5秒間停止して、ループするようにしてあります。 //+-----------------------------------+
指標のパラメーター 後日、『Mizutori_EA(カスタムユーザー向け)マニュアル』にて説明
extern int MaPeriod = 10;
extern int AsTime_MaShift = 5;
extern int EuTime_MaShift = 5;
extern int UsTime_MaShift = 5;
extern double Limit_Percent = 0.3;
extern int Samples = 15;
extern int Break_Period = 10;
extern int MaLimtPeriod = 500;
extern int AsTime_MaLimtShift = 0;
extern int EuTime_MaLimtShift = 0;
extern int UsTime_MaLimtShift = 0;
extern int Lt = 2; extern int LimtPeriod = 80;
extern double AsTime_Xox = 0.7;
extern double EuTime_Xox = 0.7;
extern double UsTime_Xox = 0.7;
extern double RSIHiLimt = 70.0;
extern double RSILowLimt = 30.0;
extern bool Stop_DV =false;
extern double Dv_Point = 1.9;
extern int Dv_Period = 25;
extern bool Sort_Order = true;
//+---------------------------------------+
※時間変動設定のある指標のための時間設定です。デフォルト設定なら無力化されています。
extern int ServerTime_GMT = 0;//サーバーの時間
extern int AsTime_S = 20;//Asタイムの開始時間
extern int AsTime_E = 5;//Asタイムの終了時間
extern int EuTime_S = 6;
extern int EuTime_E = 11;
extern int UsTime_S = 12;
extern int UsTime_E = 19;
//+---------------------------------------+
週末制限用パラメーター
extern bool Weekend_Stop = true;//週末Stop用確認
【true】の場合、指定時間になると注文を出さなくなります。
extern bool Weekend_Close = true;//週末強制決済
【true】の場合、指定時間になるとポジションを強制決済します。
extern int Stop_Day_Of_Week = 5;//(0:日曜日 1:月曜日 2:火曜日 3:水曜日 4:木曜日 5:金曜日 6:土曜日)
注文を停止する曜日を指定します。
     ※注意、あくまでもサーバー時間です。
extern int Close_Day_Of_Week= 5;//(0:日曜日 1:月曜日 2:火曜日 3:水曜日 4:木曜日 5:金曜日 6:土曜日)
ポジションを決済する曜日を指定します。
     ※注意、あくまでもサーバー時間です。
extern int Stop_Hours = 13;
注文を停止する時間を指定します。
     ※注意、あくまでもサーバー時間です。
extern int Close_Hours = 20;
ポジションを決済する時間を指定します。
     ※注意、あくまでもサーバー時間です。
//+---------------------------------------+
一時的にEAを停止するパラメーター
extern bool Trade_Freeze = false;//時間による取引を凍結する場合はtrue
【true】の場合、指定時間内のオーダーを停止します。
     ※注意 日付してはしていませんので、設定して忘れていると、停止したままになります。
extern int Freeze_SH = 0;//凍結開始(時間)
オーダー停止の開始時間(時)
     ※注意、あくまでもサーバー時間です。
extern int Freeze_SM = 0;//凍結開始(分)
オーダー停止の開始時間(分)
     ※注意、あくまでもサーバー時間です。
extern int Freeze_EH = 0;//凍結終了(時間)
オーダー停止の終了時間(時)
     ※注意、あくまでもサーバー時間です。
extern int Freeze_EM = 0;//凍結終了(分)
オーダー停止の終了時間(分)
     ※注意、あくまでもサーバー時間です。 //+---------------------------------------+
ナンピン回数によるロット調整用のパラメーター このパラメーターを調整することにより、ロットに倍率を掛けることができます。
 extern double Lotpos1 = 1.0;
第1ポジション時のロット倍率
extern double Lotpos2 = 1.0;
第2ポジション時のロット倍率
extern double Lotpos3 = 1.0;
第3ポジション時のロット倍率
extern double Lotpos4 = 1.0;
第4ポジション時のロット倍率
extern double Lotpos5 = 1.0;
第5ポジション時のロット倍率
extern double Lotpos6 = 1.0;
その他(5以上)
//+---------------------------------------+

⑤エラー一覧
※EA作動時に「ターミナル」・「EXpert」・「メッセージ」に記載されるEAが発信するエラー報告です。 【We have no money. Free Margin =●●●】余剰証拠金不足です。
Close Positions Error OrderTicket =チケットナンバー】このチケットナンバーのオーダーを決済しようとしましたができませんでした。
※アラームによるエラーメッセージ
Error opening BUY order :GetLastError()】(GetLastError())の理由で買いポジションを取得できませんでした。
Error opening SELL order GetLastError()】(GetLastError())の理由で売りポジションを取得できませんでした。

⑥Q&A
Q)異なるバージョンのMizutoriを使用したいのですが、マジックは競合しますか?
A)競合します。EAをMetaEditorで開き【#define MYMAGIC 12345】を 【#define MYMAGIC 22345】に変更してください。

Q)Alpari UKで作動しません。
A)パラメーターの【StopLoss】・【TakeProfit】・【 PipStep】の数値を10倍してくださ。
※通貨ペアの値が小数点以下3桁になったため(他は、2桁)独自で対応してください。
Q)作動が確認されている業者は?
A)①ODL・FXDD・121証券・Alpari UK(上記対応後) Q)業者(サーバー)ごとに調整しなければならない時間設定は? A)週末STOPにかかわる事項だけです。(デフォルト状態の話です。)
Q)最低資金はいくら?
A)資金管理の内容が多かったので、一応参考までに掲示しておきます。
まずは、初期投資金額の設定方法です。
(最大オーダー数×必要証拠金/最少LOT)+(余剰証拠金(1と2の計算結果の大きい方)×KKD(勘と経験と度胸から求められる倍率 )
最低余剰証拠金1
(デフォルト時) (15×PipStep)+StopLoss=370(口座通貨名がJPYの場合、37,000JPY)
最低余剰証拠金2
バックテストでのMDDの結果 KKD:MDDは更新されるのが原則です。
KKD=2以上は必要です。
※計算を簡単にするために 口座通貨名JPY Lot=0.1
必要証拠金
10,000JPY/0.1Lot
最低余剰証拠金1を採用 KKD=2 と設定すると 最低初期投資金=(5×10,000)+(37,000×2)=124,000JPY となります。
次にその時のレバです。
(ここで注意が必要なことは、このEAで使われるレバは一般なレバとは分母が異なります。)
一般的なレバは、分母に有効証拠金が使われていますが、このEAでは余剰証拠金を使用していますので注意してください。
有効証拠金=124000
JPY Lot=0.1
必要証拠金 10,000JPY/0.1Lot とすると、
レバ=(Lot×100×100,000(取引数量))/(有効証拠金―(Lot数×必要証拠金))より
Lot=0.1(ファーストポジションの場合) (0.1×100×100,000)/(124,000-(1×10,000)=8.77
(このEAでいうレバです。)
これがlot=0.5(MAX)になると (0.5×100×100,000)/(124,000-32000※-(5×10,000))=119.05
※MAXLotに到達するまでに発生する見かけ損失分+Stoplossが発生するまでも損失分
第1ポジションの損失分 -100
第2ポジションの損失分 -82
第3ポジションの損失分 -64
第4ポジションの損失分 -46
第5ポジションの損失分 -28
合計            -320(-32,000JPY) となります。
初期投資金額の設定やレバの設定にお役立てください。
(あくまでも参考です。)

⑦まとめ
まだ、成長の巾があるEAだと思っています。EAの開発にご協力お願いします。
※誤字・誤り・更新内容がありましたら連絡をお願いします。