カスタムインディケータをEAにする方法3
下記の前回の記事と前々回の記事・・・
の続きです!
まずは、ファイルダウンロード
→BBands_Stops_EA.zip(mq4ファイルのダウンロード)
- EAの全体構成を決める
- EAのパラメータを作る
- 条件分けをする
といった感じにやっていきましょう!
1.EAの全体構成を決める
まず、ドテンを実現するためにはシグナルでクローズするというコードが必要ですね。
ドテンするかしないかの選択ができるように、そのパラメータもつくりましょう。
ドテンする場合で、シグナルが出た瞬間の取引の場合、コストが大きくなってしまいますので、
「1度エントリしたら次の足まで待って、シグナルがダマシだった場合は
クローズして次のシグナルまで待つ」
といった取引をするようにしましょうか。
2.EAのパラメータを作る
EAを使うときに、選択できるようにするものをパラメータ化していきましょう!
エントリの時のパラメータとして
extern double Lots = 0.1; extern int StopLoss = 0; extern int TakeProfit = 0; extern int Slippage = 1;
ロット数、ストップ値、リミット値、スリッページ
インディケータの使い方として
extern int SignShift = 1; extern bool ClosebySign = true;
何本前の足のシグナルか、シグナルでクローズするか
EAのマジックナンバーもパラメータにしましょうか^^;
extern int MagicNumber = 883102;
EAでエントリしたときのコメントをパラメータにしたいときは、
string EA_Comment = "EA";
の前にexternをつけてください。
また、他のインディケータを使うときに改造しやすいように
//Other Set string IndicatorName ="BBands_Stops_mtf"; int IndicatorUpIndex = 2; int IndicatorDnIndex = 3; int NoSignValue = -1;
として、インディケータ名、シグナルのインデックス、シグナルが出ていないときの値を
変数に代えときましょうか。
シグナル部分は
double upsign=iCustom(NULL,TimeFrame,IndicatorName,0,Length,Deviation, IndicatorUpIndex,SignShift); double dnsign=iCustom(NULL,TimeFrame,IndicatorName,0,Length,Deviation, IndicatorDnIndex,SignShift); int sign; if(upsign!=NoSignValue) sign=1; if(dnsign!=NoSignValue) sign=-1;
といった形になるかと思います。
3.条件分けをする
条件分けは、
- ポジションがあるかないか
- シグナルがどういう状態か
- エントリした足から足が新たにできているか
などなど・・・大まかな条件から、枝分かれするイメージで作っていきましょう。
まず、ポジションがあるか無いかを調べるために、
int pos=-1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) pos=i;
}
として、
ポジションが無かったら変数posは-1
ポジションがあれば、posはそのポジションのインデックスの値
とします。
そして、
if(pos>=0)
{
}
のカッコ内にポジションがあるときに実行してもらうコード
if(pos<0)
{
}
のカッコ内にポジションが無いときに実行してもらうコード
を書いていきましょう。
まず、ポジションが無いときに実行してもらうコードを書いていきましょうか。
//MM double lots=Lots;
として、後でマネーマネジメントの機能追加をしやすいように書いておきましょう^^
if(bar!=iBars(NULL,TimeFrame))
{
として、エントリした足(TimeFrameで指定したチャートのバー番号)では、実行しないようにします。
ここで出てくる bar は、エントリしたときのバー番号を記憶してもらう整数変数ですので、
パラメータの下あたりに、
int bar;
として、記憶用整数変数 bar を宣言しておきましょう!
そして、
if(sign==1)
{
if(TakeProfit>0) double tp=Ask+TakeProfit*Point;
else tp=0;
if(StopLoss>0) double sl=Ask-StopLoss*Point;
else sl=0;
int ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,Slippage,sl,tp,EA_Comment,MagicNumber,
0,Blue);
if(ticket>0) bar=iBars(NULL,TimeFrame);
}
として、sign が1のときに実行してもらう内容を書いてあげましょう。
内容は、
もし、TakeProfitが0より大きい場合、小数変数tpは買値+TakeProfitピプス。
そうでない場合、tpは0。
もし、StopLossが0より大きい場合、小数変数slは買値-StopLossピプス。
そうでない場合、slは0。
指定した内容で買い注文をし、整数変数ticketに注文番号を代入。
もし、ticketが0より大きい場合、 bar にTimeFrameで指定したチャートのバー番号を代入。
という感じです。
ここで、TakeProfitやStopLossが0の場合、ストップやリミットを設定しないで注文をするといったことが出来るようになりました。
最近では、ストップやリミットが小さいとエントリを受け付けないブローカーが増えてきましたので、
MarketInfo(Symbol(),MODE_STOPLEVEL)と
MarketInfo(Symbol(),MODE_SPREAD)
ブローカーのストップ・リミット制限と
スプレッド
を使って条件わけをするとよいかと思います。
今回は省略します^^;
signが-1のときも同様に書いてあげましょう。
ここでの注意は、変数 tp,sl,ticket はすでに宣言してありますので、
変数宣言の必要がありません。
これでポジションなしの時のコードが完成しました!
次に、ポジションがあるときに実行してもらうコードを書いていきましょう!
OrderSelect(pos,SELECT_BY_POS);
として、ポジションの情報を取得できるようにポジションの選択をしておきます。
if(ClosebySign==true && bar!=iBars(NULL,TimeFrame))
{
として、ClosebySignがtrueでバー番号がエントリした足のバー番号ではないときだけ、実行してもらうようにします。
この条件は、ポジションの分岐とあわせて、
if(pos>=0 && ClosebySign==true && bar!=iBars(NULL,TimeFrame))
{
次に
if( (OrderType()==OP_BUY && sign==-1) || (OrderType()==OP_SELL && sign==1) )
{
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Yellow);
pos=-1;
}
として、買いポジションでsignが-1、または、売りポジションでsignが1のときクローズ
posに-1を代入とします。
ここで、posに-1を代入してあげると、下に書いたポジション無しの場合のコードも実行してくれるといった感じです。
そして、最後に大きな課題
「1度エントリしたら次の足まで待って、シグナルがダマシだった場合はクローズして、次のシグナルまで待つ」
を書きましょう。
if(SignShift==0 && bar==iBars(NULL,TimeFrame)-1)
{
double upsign1=iCustom(NULL,TimeFrame,IndicatorName,0,Length,Deviation,
IndicatorUpIndex,1);
double dnsign1=iCustom(NULL,TimeFrame,IndicatorName,0,Length,Deviation,
IndicatorDnIndex,1);
if( (OrderType()==OP_BUY && upsign1==NoSignValue) || (OrderType()==
OP_SELL && dnsign1==NoSignValue) )
{
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Yellow);
return(0);
}
}
とします。
SignShiftが0で、前の足でエントリしたときにのみ実行してもらうコードです。
また、iCustom関数で1つ前の足のシグナルをしらべます。
(signを決定するブースで記憶変数を使って調べる方法もありますが、今回はiCustom関数を使ってみましょう)
結局シグナルが出ていなかった場合、クローズする
という条件のコードを書いてあげましょう。
これで、一旦クローズしておいて、次のシグナルを待つという形になりました。
今回は、これで完成です。
あとは、ストップ・リミットが0でシグナルでもクローズしないとなるといつまででもポジションをもっていることになりますので、お好みでその条件も加えると良いかと思います。
でわ、今回はこのへんでm(..)m
カスタムインジケータをEAにする方法の関連記事
コメント (86)
慶次さん
新年早々からの御教授ありがとうございます。
記事から情熱が伝わり、大変ありがたく感じております。
落ちこぼれそうな脳みそに活を入れて何度も熟読し、
記憶させますので続編よろしくお願い致します・・・m(_ _)m
投稿者:ぶぅー |2009年1月 3日 22:02
ぶぅーさん
こんにちわ!
今回は、これで完成です^^
もし「こんなふうに改造したい!」といったことがありましたら、何でもいってくださいね!
投稿者:慶次 |2009年1月 4日 08:17
こんにちは。
自分は年末年始など関係ない仕事をしておりますので、なかなかゆっくり読む機会がまだありませんが、これから頑張って勉強させていただきます。
m(__)m
投稿者:えぎ |2009年1月 4日 13:25
了解しました・・・ >_<;
只今熟読&解析中でございます・・・(^^;
質問したい事が多々ありますが、まだまとまっていないので後でまとめてコメントしたいと思います。
初歩的な質問ばかりで申し訳ありませんがよろしくお願いします。
投稿者:慶次さん |2009年1月 4日 13:32
慶次さん
「メタトレ!完全自動売買のススメ」をご覧の皆様へのお詫びです。
上記コメントは私「ぶぅー」が書いたものです。訂正させて下さい。
記事を熱読しながら書いていたので、心ここにあらず状態・・・(>__<;
只今熟読&解析中でございます・・・(^^;
質問したい事が多々ありますが、まだまとまっていないので後でまとめてコメントしたいと思います。
初歩的な質問ばかりで申し訳ありませんがよろしくお願いします。
お詫びいたします・・・m(_ _)m
投稿者:ぶぅー |2009年1月 4日 13:52
慶次さん、こんにちは。
本日2度目の書き込みです(笑)。
仕事中に時間が出来ましたので、プリントアウトしたEAのコードと説明文を読んでみていました。
そこで、質問が2つありますが、お聞きしてよろしいでしょうか?
まず1つは、
ポジション有の時の処理の「SignShift」ですが、これはどの場面で「0」に書き換えられるのでしょうか?
EAを見ても書き換えがなされていない気がしたので質問してみました。見落とし、勘違いならすいません m(__)m
あともう1つ、最後の辺りの文章に「ストップ・リミットが0でシグナルでもクローズしないとなるといつまででもポジションをもっていることになります」と書いてありますが、ドテンのシグナルが出ていてもクローズしないような事象が起こりうる可能性がありますでしょうか?
以前、デモでテストしていた際に、テスターではキチンとクローズ処理をしているのに、フォワードテスト中ではクローズ処理をしない時が何度か有り、悩んだ事があったもので、質問してみました。
ちなみに、過剰な変動相場ではありませんでした。
考えられる事象があれば、教えていただけませんか?
よろしくお願いいたします。
いつもすみません m(__)m
投稿者:えぎ |2009年1月 4日 16:40
ぶぅーさん
こんにちわ。
どんな質問でもいいので聞いてくださいね!
えぎさん
こんにちわ。
SignShiftはパラメータにしてありますので、EAを使うときにパラメータの変更で
0と入力する形になっております。
また、今回は、パラメータのClosebySignでドテンをするかどうかを選択できるようにしてあります。
なので、ドテンシグナルが出ていても、ClosebySignをfalseにしている場合、クローズしません。
フォワードテストでの事象につきましては、設定ミスまたは、不具合が考えられるとおもいます^^;
投稿者:慶次 |2009年1月 4日 17:30
ブログ拝見させて頂きました。EAの講義ありがとうございます。正直私にはまだレベルの高い中身ですが、書かれている内容をじっくり読んでみたいと思います。
投稿者:うめ |2009年1月 4日 21:46
慶次さん
質問をまとめました。
遅くなってごめんなさい・・・(>_
ここで次の記事がありました。
--------------------------------------
レポート内で
Profit factor 2.0以上
Maximal drawdown
Relative drawdown 10%以内
Profit trades(% of total) 80%以上
なら合格です。
--------------------------------------
この中のRelative drawdown の意味が解らないので教えていただけませんか。
あっちこっち調べましたが、どこにも載っていなかったのでお願いします・・・m(_ _)m
身内、親類、同類・・・親類のドローダウン?
直訳するとなおさら理解不能です・・・(>_
Comment(upsign);で実際に確認しました。
時間足のシグナル取得については理解できましたが、この下記記事について
知識不足により、不明な点をどうしても解決することが出来ませんでした。
教えてください・・・m(_ _)m
記事
-------------------------------------------------------------------------
これで、TimeFrameで設定した時間足のシグナルが取得できるようになりました。
おまけに、シグナルが出ているときはシグナルの高さ(レート)の値になり、
そうでないときは、-1という値になることがわかりました(^0^)/
-------------------------------------------------------------------------
そうでないときは、-1という値になる。
これはどこを見れば確認できますでしょうか?
③カスタムインディケータをEAにする方法2
記事
-----------------------------------------------------------------------------------------
そして、これを使ってインデックス2番と3番の値を取得するコードが
double upsign=iCustom(NULL,TimeFrame,"BBands_Stops_mtf",0,Length,Deviation,2,SignShift);
double dnsign=iCustom(NULL,TimeFrame,"BBands_Stops_mtf",0,Length,Deviation,3,SignShift);
となりますね!
-----------------------------------------------------------------------------------------
(NULL,TimeFrame,"BBands_Stops_mtf",0,Length,Deviation,2,SignShift);
(NULL,TimeFrameと"BBands_Stops_mtf",0 この0もTimeFrameを指していると解釈しています。
別々にする意味?この二つの関係がイマイチよく理解できていません。
申し訳ありませんがご解説お願いします・・・m(_ _)m
BBands_Stops_mtfパラメータの内容
TimeFrame :0
Length :13
Deviation :1.62
ManeyRisk :1.0
Signal :1
Line :1
‥
‥
‥
④カスタムインディケータをEAにする方法3
記事
-------------------------------------------------------------------------------------------
ここで、TakeProfitやStopLossが0の場合、ストップやリミットを設定しないで注文をするといった
ことが出来るようになりました。
最近では、ストップやリミットが小さいとエントリを受け付けないブローカーが増えてきましたので、
MarketInfo(Symbol(),MODE_STOPLEVEL)と
MarketInfo(Symbol(),MODE_SPREAD)
ブローカーのストップ・リミット制限と
スプレッド
を使って条件わけをするとよいかと思います。
今回は省略します^^;
-------------------------------------------------------------------------------------------
121証券を利用しています。
新規売買価格から19pips以内の利益が出たところでドテン決済シグナルが出た場合、
今の状態では決済されないということでしょうか。
19pips以内の利益が出た時点での決済処理を可能にするには、
MarketInfo(Symbol(),MODE_STOPLEVEL)と
MarketInfo(Symbol(),MODE_SPREAD)
を設定しなさい。と言うことになりますでしょうか。
大変申し訳ありませんが、ご解説よろしくお願いいたします・・・m(_ _)m
投稿者:ぶぅー |2009年1月 5日 00:51
うめさん
こんにちわ!
今回の内容は、シンプルですがとても重要な内容が詰まっていると思います。
がんばりましょうね!
ぶぅーさん
こんにちわ!
①
Maximal drawdown
は、金額が最大のドローダウンのことです。
Relative drawdown
は、ドローダウンの比率が最大のものです。
例えば、資金10万円から初めて
最初に2万円のドローダウンがあり、
その後順調に100万円まで資金を増やした後、
10万円のドローダウンがあった場合、
Maximal drawdown 10万円(10%)
Relative drawdown 2万円(20%)
となるかと思います。
②
Comment関数を使うと、チャートの左上に内容が表示されます。ビジュアルモードで、表示されたチャートにインディケータを表示させ、左上の数値とインディケータの表示を比較してみてください。
③
iCustom関数の()内の書き方は、
iCustom(通貨ペア,時間足,インディケータ名,パラメータ,…,インデックス,バーシフト);
といった具合です。
iCustom(NULL,30,…
と書くと30分足のインディケータの値を取得し、
iCustom(NULL,0,…
と書くと今のチャートの時間足のインディケータの値を取得するといった意味になります。
今のチャートで、インディケータのプロパティTimeFrameが使えない(インディケータの不具合??)ので、
TimeFrameの時間足のインディケータでプロパティTimeFrameを0にしたものを取得するといったことをしています。
iCustom関数で別時間足のデータを取得するのか、インディケータの機能で別時間足のデータを計算するのか
の違いです。
また、今回はシグナルのタイミングにかかわるプロパティのみを使い、その他は省略しております。
④
ドテンのときは、成行きで注文しているので、問題なく取引できるとおもいます。
多くのブローカーで設けている制限は、指値・逆指値のような予約するものを制限しておりますので、大丈夫です^^
チョット解かり難いですが、がんばりましょう!
投稿者:慶次 |2009年1月 5日 10:13
なるほど、理解しました。
SignShiftは変動するのではなく、あらかじめの設定するのですね?
で、0の場合は現在の足(バー)が対象になるから、ダマシ(過剰反応?)かどうかの判定をしている、ということですね。
なるほど、納得納得。
ありがとうございます。
投稿者:えぎ |2009年1月 5日 10:55
慶次さん
こんばんわ
解説ありがとうございます。お蔭様で疑問点が全て解決しました。
昨日は記事を理解するため、何度も読ませていただきました・・・(^^)その後、実際にチャートに反映させての確認、対策?等・・・夢中になってしまい・・・慶次さんに対してのお礼のコメントがまだだったことに気付き、反省しております・・・m(_ _)m
今回の「カスタムインディケータをEAにする方法」の御教授、大変感謝しております。どうもありがとうございました・・・m(_ _)m
投稿者:ぶぅー |2009年1月 5日 21:42
えぎさん
こんにちわ!
疑問解決できてよかったです^^
ぶぅーさん
こんにちわ!
全解決よかったです^^
お役に立ててうれしいです!
がんばりましょうね!
投稿者:慶次 |2009年1月 6日 11:43
今回の講座を読んでいてふと思ったことがありましたので、またお知恵を貸していただけませんでしょうか?
と申しますのも、たとえば121証券で取り扱いのない通貨がありますよね?
例えば、EUR/GBPなどはメタトレーダーでのチャート表示も可能でテスターでのテストなども可能ですが、実際には取引通貨としては取り扱いされていないため、EUR/JPYとGBP/JPYを相対的にオーダー(EUR/GBPの買いならば、EUR/JPYを買いGBP/JPYを売る)するような方法しかありませんよね?
ですので、もしよろしければ、こういった取引をするための講座もしていただけませんでしょうか?
今回の講座のものを単純に
Ticket = OrderSend("EURJPY",OP_SELL,Lots,Bid,Slippage,sl,tp,EA_Comment,MAGIC,0,Red);
と書き換えて試した見たところ、なんかOrderSendError4106とか出てしまって、悩んでしまってます・・・。
どうか、お力をお貸しくださいませ。
よろしくお願いいたします。
投稿者:えぎ |2009年1月 7日 00:24
今回の講座を読んでいてふと思ったことがありましたので、またお知恵を貸していただけませんでしょうか?
と申しますのも、たとえば121証券で取り扱いのない通貨がありますよね?
例えば、EUR/GBPなどはメタトレーダーでのチャート表示も可能でテスターでのテストなども可能ですが、実際には取引通貨としては取り扱いされていないため、EUR/JPYとGBP/JPYを相対的にオーダー(EUR/GBPの買いならば、EUR/JPYを買いGBP/JPYを売る)するような方法しかありませんよね?
ですので、もしよろしければ、こういった取引をするための講座もしていただけませんでしょうか?
今回の講座のものを単純に
Ticket = OrderSend("EURJPY",OP_SELL,Lots,Ask,Slippage,sl,tp,EA_Comment,MAGIC,0,Red);
Ticket2= OrderSend("GBPJPY",OP_SELL,M_Lots,Bid,Slippage,sl,tp,EA_Comment,MAGIC,0,Blue);
と書き換えて試した見たところ、なんかOrderSendError4106とか出てしまって、悩んでしまってます・・・。
どうか、お力をお貸しくださいませ。
よろしくお願いいたします。
投稿者:えぎ |2009年1月 7日 00:26
すいません、修正中のが連続書き込みなってしまいました・・・。
申し訳ないです。
投稿者:えぎ |2009年1月 7日 00:27
たびたびすいません・・・
Ticket = OrderSend("EURJPY",OP_SELL,Lots,Ask,Slippage,sl,tp,EA_Comment,MAGIC,0,Red);
は
Ticket = OrderSend("EURJPY",OP_BUY,Lots,Ask,Slippage,sl,tp,EA_Comment,MAGIC,0,Red);
の間違いです。
すいません。
投稿者:えぎ |2009年1月 7日 00:29
えぎさん
こんにちわ!
他通貨を注文するときの、買値・売値は、
MarketInfo関数または、iClose関数+スプレッドで取得するとよいかと思います。
また、121証券のリアル口座では、通貨名を注意する必要があります。
投稿者:慶次 |2009年1月 7日 08:17
あ!
そうだった!
通貨名・・・なるほどそうでした・・・。
ありがとうございます。
投稿者:えぎ |2009年1月 7日 10:18
慶次さん、コンニチワ。
ご指摘をいただいたように、
string paritex="EURJPY";
EUR_Ticket= OrderSend(paritex,OP_BUY,M_Lots,MarketInfo(paritex,MODE_ASK),Slippage,0,0,EA_Comment,MAGIC,0,Blue);
このように作り変えてみました。
ですが、
unknown symbol name EURJPY for OrderSend function
と出てしまいます。
試しにライブ口座のテスターに対応させるべく、
string paritex="EURJPY.";
EUR_Ticket= OrderSend(paritex,OP_BUY,M_Lots,MarketInfo(paritex,MODE_ASK),Slippage,0,0,EA_Comment,MAGIC,0,Blue);
と変換し、ライブ口座でテストしてみましたが、同等のエラーが出てしまいます。
このやり方、どこかマズイところがありますでしょうか?
ご指摘いただけたら喜びます。
よろしくお願いいたします。
投稿者:えぎ |2009年1月 7日 12:09
慶次さん
「カスタムインディケータをEAにする方法」
についてのご教授、大変お世話になりました。
他のインディケータを使うときのことも考えた部分の説明は初心者の私にとって
とても解りやすく、有効に利用できる内容であり、大変感謝しております。
どうもありがとうございました。
またお願いがあります。
ここ数日、BBands_Stops_EAの欠点を補う手法がないかを調べ、対策をEAに追加しようと
しておりますが、どうしても能力不足で作成できません。
再度、慶次さんの鋭く理解しやすい(^_^)ご教授で問題解決に導いていただきたく思い、
書き込みいたしました。
<内容>
利益確定に焦点を絞りました。
インディケータに反応しない市場の急激な変化に対応できるよう
段階的に利益確定をしたいのです。
(例としまして+5pips,+15pips,決済 3段階に分けての確定を考えております。)
矢印は値動きを表しています。
上昇 →
下降 ⇒
値動き
①エントリー→+5→シグナル発生(決済)。
②エントリー→+5→+15→シグナル発生(決済)。
③エントリー→+5→+15⇒シグナル(決済)の手前で下降⇒+15で決済。
④エントリー→+5⇒+15の手前で下降⇒+5で決済。
⑤エントリー⇒+5の手前で下降 -15で損切り決済。
(ブローカーで設けている制限内での損切り決済。)
①~⑤全てを実行する決済処理は可能でしょうか。
全然急ぎません。もしよろしければ、慶次さんの手が空いた時で結構ですので
ご教授の検討、よろしくお願いいたします・・・m(_ _)m
投稿者:ぶぅー |2009年1月10日 21:36
えぎさん
こんにちわ!
遅くなりゴメンナサイ^^;
現バージョンでのバックテストでは、他通貨の取引が出来ないようになっております。
デモトレードで取引のテストをしてみてください。
ぶぅーさん
こんにちわ!
+5以上+15未満上昇した時すべてを+5で決済するのは避けて、
③④に【+何pipsまで上昇したら】という条件つきで、できると思います。
その場合、例えば
④エントリー→+8⇒+15の手前で下降⇒+5で決済。
といった感じになるかと思います。
投稿者:慶次 |2009年1月11日 10:54
こちらこそ、無理を言いました。
すいませんでした。
そうですか、バックテストでは他通貨の取引が出来ないのですか・・・ちょっと不便ですね・・・。
ご返答、ありがとうございます!^^
投稿者:えぎ |2009年1月14日 11:13
返事が遅れてすみません。
④エントリー→+8⇒+15の手前で下降⇒+5で決済。
了解しました。
投稿者:ぶぅー |2009年1月14日 21:55
バックテストでは他通貨の取引が出来ない。
上記の質問にこのように書かれていましたが、121証券はユーロ円を取り扱っているけど、どういった意味でしょうか?これから口座開設予定なので気になりました^^;。EA作ってもエントリーされないことがあるということかな?
投稿者:うめ |2009年1月20日 22:13
バックテストでは他通貨の取引が出来ない。
上記の質問にこのように書かれていましたが、121証券はユーロ円を取り扱っているけど、どういった意味でしょうか?これから口座開設予定なので気になりました^^;。EA作ってもエントリーされないことがあるということかな?
投稿者:うめ |2009年1月20日 22:16
int pos=-1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) pos=i;
}
として、
ポジションが無かったら変数posは-1
ポジションがあれば、posはそのポジションのインデックスの値
連続書き込みになってすいません。EAに関する質問ですが、なぜOrdersTotal()にマイナス1するのでしょうか?この文の中でiが何度も出てきますが、それぞれどのような意味を表しているか説明文を読んでも理解できませんでした。解説頂けますでしょうか?
投稿者:うめ |2009年1月21日 00:03
うめさん
こんにちわ!
バックテストで他通貨がテストできないというのは、MT4の機能上の問題で、どのブローカーでも同じです。
また、posをマイナスにするのは、ポジションのインデックスが0のものも認識するためマイナスにしてあります。
iは整数変数の宣言をしておりますので、任意の整数と言う感じでしょうか^^;
詳しくは、
完全自動売買への道のりをご覧下さい。
投稿者:慶次 |2009年1月21日 08:18
if(SignShift==0 && bar==iBars(NULL,TimeFrame)-1)
回答ありがとうございます。一度じっくり読んでみます。
別件ですが、上記の文でなぜマイナス1しているのか教えて頂けないでしょうか?どうも私はカッコの中のマイナス1、posとかiにものすごく弱いみたいです^^;すぐに1とか2とか代入して考えようとしますが、逆に混乱・・・
投稿者:うめ |2009年1月22日 01:59
追加で質問させて下さい。
プログラム全体を見るとポジション持っている場合から書き始めてますが、とても深い意味があるように感じましたがよろしければ解説をお願いできますでしょうか
投稿者:うめ |2009年1月22日 02:02
うめさん
こんにちわ。
プログラムを読んで、不思議に思ったところがあったら、一度思ったとおりに改造して動かしてみて下さい。
きっと、新しい発見があると思います^-^
投稿者:慶次 |2009年1月22日 08:17
ブログを拝見しました。
FXに興味があるので、参考になりました。
また、訪問させて頂きます。
よろしければ、私のブログにもお越し下さい。
※ランキング投票しておきました。
投稿者:FXマニア |2009年1月23日 10:51
FXマニア
こんにちわ。
ブログみました^-^
投資研究をされているのですね!
がんばりましょうね^0^
投稿者:慶次 |2009年1月23日 14:01
慶次さま
お久しぶりです!
いつも丁寧なコメントに感服しています。
今回書かせていただきましたのは、米国FXCMで日本語対応の口座開設サイトができたみたいで、他のブログを見ましても、いまいち評判が書かれていなかったので、もし慶次さんの方で、何か御存知でしたら教えていただきたいと思いまして。。。
^^;
http://www.fx-account.com/
今までODL JAPANを使っていたのですが、相変わらず日足が6本表示されますし、そろそろチェンジしたくなってきました。。
(^_^;)
ちなみに、最近の私はEURGBPのスキャル以外は、いまいちです。。
(-。-)
投稿者:マーサ |2009年1月24日 22:41
マーサさん
お久しぶりです!
私もFXCMについてあまり分かりませんが、
安心感はありますよね!
最近のスキャルEAで、ODL等と顧客の関係はギクシャクしている感じですね^^;
ブローカーを使い分けてのいいとこどりするのがいいですね!
投稿者:慶次 |2009年1月25日 09:52
慶次さん
こんばんわ
BBands_Stops_mtfでは大変お世話になりました。
今回はバックテストについて教えていだだきたいことがあり
書き込み致しました。
ある期間の値動きについて、時間を指定したバックテストを
手軽に行いたいのです。
どのような事をすれば可能か教えていただけませんか。
(例えば過去6ヶ月22:00~06:00のみの値動き、
30分足についてバックテストを行いたいのです。)
よろしくお願い致します・・・m(_ _)m
投稿者:ぶぅー |2009年2月 9日 19:00
慶次さん
問題解決しました・・・(^_^;
お騒がせしました。
投稿者:ぶぅー |2009年2月 9日 20:43
お忙しいところ申し訳ありません。最近からFX自動売買の勉強をしている者です。ここで紹介頂いたVQ_EAをダウンロードして試しているのですがインジケータ等はきちんと出るのですが売買が出来ないようでいろいろ調べているのですがどうにも解らず、大変不躾とは思いますが解決方法を教えて頂ければと思い連絡をしました。宜しくお願いします。
投稿者:山オヤジ |2009年2月13日 19:26
山オヤジさん
こんにちわ!
チャートの右上にEAの名前の表示があるかと思いますが、その横にニッコリマークはでてますでしょうか?
投稿者:慶次 |2009年2月14日 12:26
返事遅くなり申し訳ありません。横にはニッコリマークが表示されています。
投稿者:山 |2009年2月17日 17:52
山さん
こんにちわ!
操作履歴などにエラー表示はございませんか?
投稿者:慶次 |2009年2月17日 23:03
慶次さんがトレードブースターのミスターFXさんなんですか?
投稿者:たっくん |2009年2月19日 13:15
たっくんさん
コメントありがとうございます。
私はミスターFXさんではないですよ^^
発売当初はミスターFXさんに期待してましたが。。。
投稿者:慶次 |2009年2月19日 16:04
VQ-EAの件、いろいろな所を参考にさせて頂きなんとか解決しました。今は「インジケーターをEAにする方法」を参考に少しずつですがプログラムを理解できるように頑張ってます。大変お忙しいところ丁寧に返答頂きありがとうございました。また不明なところがありましたらご教授下さい。宜しくお願いします。
投稿者:山オヤジ |2009年2月19日 22:52
・・・ということは、トレードブースターは利益が出なかったということですか?僕も一時期興味がありました。7月は全勝という記事がありましたが・・・。
投稿者:たっくん |2009年2月20日 00:44
>山オヤジさん
こんにちわ!
解決できてよかったです!
またご連絡くださいね^^
>たっくんさん
こんにちわ!
トレードブースターは、あのあとの大きな値動きには対応できなかったです^^;
今、バックテストで見ましたら11月前後からだいぶ回復しているようですが・・・。
投稿者:慶次 |2009年2月20日 08:20
いつもお世話になりありがとうございます。大変お忙しい中恐縮ですが、不明なことがあり連絡しました。今私は「BBand_Stops_EA」に悪戦苦闘しておりますが、インディケーターの各インデックスの動きとバー(値)の動きに多少の誤差があるような気がしています。出来るだけバーの動きに近づけるような調整が出来るのでしょうか?また出来るとしたらどこを変更したらよいか教えて頂けないでしょうか。
それともう一つはiCustom関数の事についてですが、iCustom(通貨ペア,時間足,インディケータ名,,・・・,インデックス,バーシフト)とありますが「・・・,」部分は入れるのでしょうか?
私は、iCustom(Null,TimeFrame,"BBands_Stops_mtf",0,Length,Deviation,2,SignShift)
としています。ご指摘頂ければありがたいです。
面倒な事をお聞きして申し訳ありませんが宜しくお願いします。
投稿者:山オヤジ |2009年2月21日 11:30
山オヤジさん
こんにちわ!
SignShiftを1にすると、1本前のバーの値を取得します。0にすると現在のバーの値を取得できます。
「・・・,」部分は省略可です。
iCustom関数の書き方も問題ないと思います^-^
投稿者:慶次 |2009年2月21日 12:02
慶次さん
早速の返事ありがとうございます。早速試してみようと思います。お忙しいのに大変恐縮です。今後とも宜しくお願いします。
投稿者:山オヤジ |2009年2月21日 16:28
慶次さんは250の技が発売される前の2007年からEA作成代行サービスをされてるそうですが、どうやってMQLを勉強したんですか?元々理系でC言語のプロなんですか?興味深々です。僕は250の技で勉強しているところです。
投稿者:たっくん |2009年2月23日 05:41
たっくんさん
こんにちわ!
EA製作代行サービスは2008年の後半からですよ^^
もともと理系ではありますが専門は物理系で、プログラム経験はエクセルのVBAを少し(ホント少し)触ったことがあるくらいでした^^;
過去、C言語は1行目から挫折しました・・・-_-;
MQLは楽しくてワクワクで!!
それですね!
実は、私が覚え初めに飛躍的に上達したと実感できた勉強法があるのですが、またの機会に^^;
今はMQLの学習環境がよいですので勉強しやすいと思います。
がんばりましょうね^-^
投稿者:慶次 |2009年2月23日 08:53
又質問させて下さい。すいません。さっそくプログラムを組んでみたんですね。無事error0でcompileできたんですが、mq4ファイルのままでex4ファイルになりません。どうしたらいいんでしょうか・・・?
投稿者:たっくん |2009年2月23日 11:01
色々いじってたら無事ex4ファイルできました。綺麗な右肩下がりでしたが・・・。
投稿者:たっくん |2009年2月23日 12:19
たっくんさん
無事ex4ファイルができてよかったです^^
私も最初はきれいな右肩下がりのEAばかり作ってました^^;
がんばりましょうね!
投稿者:慶次 |2009年2月23日 15:50
今現在の慶次さんの自作EAの最も高いPFっていくつぐらいなんですか?それを目標に頑張ります!
投稿者:たっくん |2009年2月24日 15:53
慶次さん
いつも参考になるアドバイス頂きありがとうございます。「BBand_Stops_EA」の方は試行錯誤しながらですがデモ実行中です。今回は「VQ_EA」のことでどうしても解らずお尋ねしました。インディケータで売買のシグナルがでますが実際の売買は1つ後のバーで実行されます。前回はSignShiftの1,0の変更で出来ると教わりました。これにはそれらしきものがありません。どこで変更するのか、更にそのバーの始値で売買するにはどうしたらよいかご伝授頂ければと思います。いつも勝手な質問ばかりで申し訳ありませんが宜しくお願いします。追伸、MQLの学習参考にさせていただきます。ありがとうございました。
投稿者:山オヤジ |2009年2月25日 00:02
たっくんさん
こんにちわ!
PFを求めるEAならとんでもない数値のものができるのですが、実用的ではないものになってしまいます^^;
私の場合は、PFが1.6~2.3程度でフォワードテストするようにしております。
山オヤジさん
こんにちわ!
VQ_EAのパラメータ、TradeAtCloseBarをfalseにするとシグナルと同時にトレードするようですね。また、シグナルが出るのはバー形成中ですので、始値で売買はできません。(始値でシグナルが出たとき以外)
投稿者:慶次 |2009年2月25日 08:54
慶次さん
早速連絡頂きありがとうございます。変更してデモ実行中です。お忙しい中申し訳ありませんでした。また宜しくお願いします。
投稿者:山オヤジ |2009年2月25日 18:27
山オヤジさん
こんにちわ!
また何かありましたらご連絡くださいね^^
投稿者:慶次 |2009年2月25日 18:52
返り値が想定外なのですが?
BBands_Stops_mtfの返り値を調べる(操作履歴に表示)簡単表示EAを作って期間限定で、steretagytesterで実行したのですが、全て”-1”になります。
※"Every tick"も、"open prices only"でも同じ現象です。
なぜなのか理由が皆目理解できません。
どなたか間違いの理由をご伝授願いませんでしょうか?
●steretagytester環境
業者:121証券
通貨:EURJPY
足:5分足
期間(日付と時間を指定):3月3日-3月4日(3/3のみ)
データは、念の為、一旦ヒストリーセンターでダウンロードしました。
BBands_Stops_mtfは、以下の3つの引数以外は既存値のままにしました。(externをはずす)
EAのソースはこれだけです。
extern int TimeFrame = 0;
extern int Length=13; // Bollinger Bands Period
extern double Deviation=1.62; // Deviation was 2
int init()
{
return(0);
}
int start()
{
double upsign=iCustom(NULL,TimeFrame,"BBands_Stops_mtf",TimeFrame,Length,Deviation,2,0);
Print("BBands_Stops_mtf : " + upsign);
return(0);
}
どなたかご伝授宜しくお願い致します。
投稿者:初心の心 |2009年3月 6日 12:31
初心の心さん
こんにちわ!
iCustom関数でTimeFrame,Length,Deviationの部分は、
インディケータBBands_Stops_mtfのコード内でexternがついているものに代入されます。
3つのパラメータにはexternはつけてありますか?
投稿者:慶次 |2009年3月 6日 13:10
慶次様
驚きました!
こんな早々にご返答いただきありがとうございます。
はい、BBands_Stops_mtfのコード内では、externは3つのみにしています。
以外は全てはずして指定しております。
まったく理解不能になっております。
慶次様、どうぞ、解決策をご伝授の程、宜しくお願い致します。
ちなみに以下が、BBands_Stops_mtfの変更部分です。
//---- input parameters
extern int TimeFrame = 0;
extern int Length=13; // Bollinger Bands Period
extern double Deviation=1.62; // Deviation was 2
// extern double MoneyRisk=1.00; // Offset Factor
// extern int Signal=1; // Display signals mode: 1-Signals & Stops; 0-only Stops; 2-only Signals;
// extern int Line=1; // Display line mode: 0-no,1-yes
// extern int Nbars=1000;
// extern string IndicatorCorrectName = "BBands_Stops_mtf";
// extern string note___Ind_Name = "if ind.Name changed - enter New Name";
double MoneyRisk=1.00; // Offset Factor
int Signal=1; // Display signals mode: 1-Signals & Stops; 0-only Stops; 2-only Signals;
int Line=1; // Display line mode: 0-no,1-yes
int Nbars=1000;
string IndicatorCorrectName = "BBands_Stops_mtf";
string note___Ind_Name = "if ind.Name changed - enter New Name";
投稿者:初心の心 |2009年3月 6日 14:01
初心の心さん
iCustom(NULL,TimeFrame,"BBands_Stops_mtf",0,Length,Deviation,2,0);
としても同じでしょうか?
投稿者:慶次 |2009年3月 6日 14:29
慶次様
ありがとうございます。
やはり、”-1”でした。
5分足の"open prices only"で実行しました。
以下は以前からあった2箇所のみの値です。
※正確には、値があるのはこの2箇所のみです。
15:05:44 2009.03.03 06:40 BBands_Stops_mtf_ea EURJPY.,M5: BBands_Stops_mtf : 122.31555427
15:05:44 2009.03.03 19:55 BBands_Stops_mtf_ea EURJPY.,M5: BBands_Stops_mtf : 123.20530577
以下が修正したリソース内容です。
extern int TimeFrame = 0;
extern int Length=13; // Bollinger Bands Period
extern double Deviation=1.62; // Deviation was 2
int init()
{
return(0);
}
int start()
{
double upsign=iCustom(NULL,TimeFrame,"BBands_Stops_mtf",0,Length,Deviation,2,0);
Print("BBands_Stops_mtf : " + upsign);
return(0);
}
宜しくお願い致します。
投稿者:初心の心 |2009年3月 6日 15:15
慶次様
早々のご返答ありがとうございます。
当方なりに別の角度で考えてみました。
1)MT4自身のインストール等、設定が何か抜けている?
※俗にいう標準インストールで、以外の設定は特にしていない。
2)BBands_Stops_mtf自身は、インジケータとしては稼動していますが、
EA化する場合になにがしらの設定がありそれを抜けている?
※慶次様が提供していただいたBBands_Stops_mtfのみダウンロード。
投稿者:初心の心 |2009年3月 6日 15:29
初心の心さん
open prices onlyだと始値の時点でシグナルが発生していないと-1を返すかと思います。
投稿者:匿名 |2009年3月 6日 17:32
慶次様
ご対応ありがとうございます。
ちなみに、”Every tick”でも結果は、”-1”で同じなのですが、この場合の対処方法はどの様になるのでしょうか?
投稿者:初心の心 |2009年3月 6日 18:52
慶次様
ご対応ありがとうございます。
すみません。
言葉が正確ではなかったですね。
検証方法として、EA上で、”open prices only”及び、”Every tick”を使用して、iCustom関数で、一番シンプルに、BBands_Stops_mtfの返り値を確認する為には、どの様なロジックのソースを書けば表示される様になるのしょうか?
当方といたしましてはこれで、確認出来ると考えていたもで、現状理解出来ておらず、申し訳ありません。
投稿者:初心の心 |2009年3月 6日 18:59
初心の心さん
「以下は以前からあった2箇所のみの値です。
※正確には、値があるのはこの2箇所のみです。」
とは、変更後のことでしょうか?
でしたら、正常に確認できていると思います。
そうでなくて、すべて-1になっている場合は、ロジックではなくほかに原因がありそうです。
投稿者:慶次 |2009年3月 6日 19:43
慶次様
ご迷惑をおかけいたしております。
2箇所のみとは、初期状態の時から出ていた情報で、変更前から出ていた情報です。
これが正しいのでしょうか?
だとすれば、今ひとつ理由が理解出来ていません。
あと、違う意味でお聞きしたいのですが、5分足のテストでありながら、その5分間に何十回と無く情報が出力されるのはなぜなのでしょうか?(場合によっては、数値がかわるのでしょうか?)
単純に考えて、5分足での計測なのだから、5分間に1度なので、その5分間は同じ値が出るだけと考えていますが、根本的な考え方合ってますでしょうか?
投稿者:初心の心 |2009年3月 6日 20:07
初心の心さん
>5分足のテストでありながら、その5分間に何十回と無く情報が出力されるのはなぜなのでしょうか?
EAは時間足に関係なく、レートが動くたびに作動します。
5分間に100回レートが動いたら100回出力されます。
>(場合によっては、数値がかわるのでしょうか?)
始値の時点ではシグナルがでていなくて、バー形成中にシグナルが出た場合、出力の数値は変わります。
投稿者:慶次 |2009年3月 7日 08:00
慶次様
ご対応ありがとうございます。
どうも動きが不安定の様ですので、一度アンインストール後、クリーンインストールを行い、再確認してみます。
又、プログラムの動き方自体を改めて考え直してみます。
考え方の間違いで、大変ご迷惑をおかけしている可能性が高い様ですので。
このような未熟者に対して、ご丁重にご対応いただき、ありがとうございます。
又、改めまして宜しくお願い致します。
ご迷惑をおかけいたしました。
投稿者:初心の心 |2009年3月 7日 16:14
20pipsで損切りして(121の場合)、損切りと同時に
20pips上で買いの逆指値ってできないんでしょうか?
できたら飛躍的に成績が向上しそうです。
投稿者:たっくん |2009年3月11日 13:32
慶次様
お久しぶりです。お忙しいところ申し訳ありません。私先日より「lukas1 arrows & curves」というインデイケーターを「BBand_Stop_mft」を元にしてEAにしようと挑戦しているのですが、どうもシグナルが取得されないためか(?)バックテストすると初回に買いがエントリーされるだけでそれ以後はエントリーしないような状態です。何が違うのかよく分からず助けを求めた次第です。
インデイケーターの冒頭は以下のとおりです。
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Yellow
#property indicator_color2 OrangeRed
#property indicator_color3 Black
#property indicator_color4 Black
//---- input parameters
extern int SSP = 5;
extern int RISK = 3;
extern int CountBars = 18250;
extern double SkyCh = 23.6;
extern bool alertMessage = true;
extern bool alertSound = false;
extern bool alertEmail = true;
//----
int Shift = 0;
int TSP = 9;
int PrevAlertTime;
double smin, smax;
//---- buffers
double val1[];
double val2[];
double Sky_BufferH[];
double Sky_BufferL[];
string previousAlert;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- indicator line
SetIndexStyle(0, DRAW_ARROW);
SetIndexArrow(0, 233); // arrowbuy
SetIndexStyle(1, DRAW_ARROW);
SetIndexArrow(1, 234); // arrowsell
SetIndexBuffer(0, val1); // buy
SetIndexBuffer(1, val2); // sell
//----
SetIndexStyle(2, DRAW_LINE);
SetIndexBuffer(2, Sky_BufferH);
SetIndexShift(2, Shift);
SetIndexLabel(2, "Sky-channel High");
//----
SetIndexStyle(3, DRAW_LINE);
SetIndexBuffer(3, Sky_BufferL);
SetIndexShift(3, Shift);
SetIndexLabel(3, "Sky-channel Low");
//----
if(CountBars >= Bars)
CountBars=Bars; // CountBars (SSP=9)
SetIndexDrawBegin(0, Bars - CountBars + SSP);
// "1"-(SSP=9)
SetIndexDrawBegin(1, Bars - CountBars + SSP);
SetIndexDrawBegin(2, SSP + Shift - 1);
SetIndexDrawBegin(3, SSP + Shift - 1);
//----
return(0);
}
私のものは、
//-----input parameters
extern string EntrySetting="Entry Setting";
extern double Lots=0.1;
extern int StopLoss=0;
extern int TakeProfit=0;
extern int Slippage=1;
extern int TimeFrame=30;
extern int SSP=5;
extern int Risk=3;
extern int SignShift=0;
extern int CountBars=18250;
extern double SkyCh=23.6;
extern int MagicNumber=883102;
extern string EA_Comment="EA";
extern bool ClosebySign=true;
//Other Set
string IndicatorName="lukas1 arrows & curves";
int Shift=0;
int TSP=9;
int IndicatorUpIndex=0;
int IndicatorDnIndex=1;
int NoSignValue=-1;
///memo
int bar;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
//sign****************************************************************
double upsign=iCustom(NULL,TimeFrame,"lukas1 arrows & curves",0,SSP,SkyCh,0,SignShift);
double dnsign=iCustom(NULL,TimeFrame,"lukas1 arrows & curves",0,SSP,SkyCh,1,SignShift);
int sign;
if(upsign!=NoSignValue) sign=1;
if(dnsign!=NoSignValue) sign=-1;
大変お忙しいところ恐縮ですが宜しくご教授おねがいします。
投稿者:山オヤジ |2009年3月17日 21:14
山オヤジさん
こんにちわ。
シグナルが出ていないときの値は
インディケータごとに違いますので
NoSignValueを-1からEMPTY_VALUEにすると
よいかもです^^
投稿者:慶次 |2009年3月19日 10:45
慶次さんこんばんは。
【BBands_Stops_mtf】インジケータのEA化の解説ついでにといっては何ですが..
【BBands_Stops_mtf】インジケータを改造して、アラートにメール送信機能を追加するには、どのようにしたらよいでしょうか?
本来は有償になりそうな、ご相談なんで、どうかとは思ってしまいますが..
また、どなたかご存知な方がいらっしゃいましたら、ご教授頂けましたら幸いです。
PS
不適切な書き込みでしたら、削除願います。m(_ _)m
投稿者:ysman |2009年3月21日 19:26
慶次様
本日からEAの勉強を始めた初心者ですが幾つか質問がり投稿しました。宜しければご回答お願いします。
ブログの中に掲載中のカスタムインディケータをEAにする方法を読みプログラムを書いてみました。コンパイルではエラーはでませんが、テスターでテストすると下記エラーが連発されます!
USDJPY,M15: OrderClose error 4051
USDJPY,M15: invalid ticket for OrderClose function
何故だか判りませんご教授ねがいますか?
下記がEAの内容です。
#property copyright ""
#property link ""
//---- input parameters
extern double Lots = 0.1;
extern int StopLoss = 0;
extern int TakeProfit = 0;
extern int Slippage = 1;
extern int TimeFrame = 0;
extern int Length=13; // Bollinger Bands Period
extern double Deviation=1.62; // Deviation was 2
extern int SignShift=1;
extern bool ClosebySign = true;
extern int MagicNumber = 883102;
extern string EA_Comment = "EA";
int bar;
int start()
{
//Other Set
string IndicatorName ="BBands_Stops_mtf";
int IndicatorUpIndex = 2;
int IndicatorDnIndex = 3;
int NoSignValue = -1;
double upsign=iCustom(NULL,TimeFrame,IndicatorName,0,Length,Deviation,IndicatorUpIndex,SignShift);
double dnsign=iCustom(NULL,TimeFrame,IndicatorName,0,Length,Deviation,IndicatorDnIndex,SignShift);
int sign;
if(upsign!=NoSignValue) sign=1;
if(dnsign!=NoSignValue) sign=-1;
int pos=-1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) pos=i;
}
//MM
double lots=Lots;
if(bar!=iBars(NULL,TimeFrame))
{
if(sign==1)
{
if(TakeProfit>0) double tp=Ask+TakeProfit*Point;
else tp=0;
if(StopLoss>0) double sl=Ask-StopLoss*Point;
else sl=0;
int ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,Slippage,sl,tp,EA_Comment,MagicNumber,
0,Blue);
if(ticket>0) bar=iBars(NULL,TimeFrame);
}
OrderSelect(pos,SELECT_BY_POS);
if(ClosebySign==true && bar!=iBars(NULL,TimeFrame))
{
if( (OrderType()==OP_BUY && sign==-1) || (OrderType()==OP_SELL && sign==1) )
{
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Yellow);
pos=-1;
}
if(SignShift==0 && bar==iBars(NULL,TimeFrame)-1)
{
double upsign1=iCustom(NULL,TimeFrame,IndicatorName,0,Length,Deviation,
IndicatorUpIndex,1);
double dnsign1=iCustom(NULL,TimeFrame,IndicatorName,0,Length,Deviation,
IndicatorDnIndex,1);
if( (OrderType()==OP_BUY && upsign1==NoSignValue) || (OrderType()==
OP_SELL && dnsign1==NoSignValue) )
{
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Yellow);
return(0);
}
}
}
}
}
以上です
すいません!
投稿者:池田 優 |2009年11月 2日 16:24
池田さん
コメントありがとうございます。
2つめのOrderCloseで既にエグジットされているポジションをクローズしようとしているのではないでしょうか・・・。
投稿者:慶次 |2009年11月 2日 19:27
慶次さま早速の返答有難うございました。でも意味が解りません!お手数おかけしました。もう少し理解できるレベルになったら質問します。
投稿者:池田 |2009年11月 3日 21:14
池田さん
よーく見たら、ポジションありの時、ポジション無の時、
の場合わけがされていません^^;
投稿者:慶次 |2009年11月 4日 07:54
こんには慶次様
上記の部分を修正したところエラーが無くなりました!有難う御座います!
ところでVQSimpleDePSforTestのファイルでテストしようと思っていますが、時間と通貨のチャートは何が良いのでしょうか?
何時も質問ばかりですいません宜しくお願いします。
投稿者:池田 優 |2009年11月 4日 11:23
池田さん
エラーがなくなりよかったです^^
VQSimpleDePSforTestはいろいろ試してみてください^^;
投稿者:慶次 |2009年11月 4日 16:35
初めまして。門と申します。
長文で申し訳御座いません。
最近EAの作成に取り掛かり、インディケーターをEAにしてみようと勉強中です。
プログラムの処理は何とか解読しつつあるのですが、
2点程行き詰ってしまい、御教授頂きたく書き込みをしております。
[インディケーター]
//+------------------------------------------------------------------+
//| Heiken Ashi Ma.mq4 |
//+------------------------------------------------------------------+
//| mod by Raff |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 DarkOrange
#property indicator_color2 Turquoise
#property indicator_color3 Red
#property indicator_color4 RoyalBlue
//---- parameters
extern int MaMetod = 3;
extern int MaPeriod = 25;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//|------------------------------------------------------------------|
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_HISTOGRAM, 0, 1, Red);
SetIndexBuffer(0, ExtMapBuffer1);
SetIndexStyle(1,DRAW_HISTOGRAM, 0, 1, RoyalBlue);
SetIndexBuffer(1, ExtMapBuffer2);
SetIndexStyle(2,DRAW_HISTOGRAM, 0, 3, Red);
SetIndexBuffer(2, ExtMapBuffer3);
SetIndexStyle(3,DRAW_HISTOGRAM, 0, 3, RoyalBlue);
SetIndexBuffer(3, ExtMapBuffer4);
//----
SetIndexDrawBegin(0,5);
//---- indicator buffers mapping
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexBuffer(2,ExtMapBuffer3);
SetIndexBuffer(3,ExtMapBuffer4);
//---- initialization done
watermark();
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: add your code here
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
double maOpen, maClose, maLow, maHigh;
double haOpen, haHigh, haLow, haClose;
if(Bars0) ExtCountedBars--;
int pos=Bars-ExtCountedBars-1;
while(pos>=0)
{
maOpen=iMA(NULL,0,MaPeriod,0,MaMetod,MODE_OPEN,pos);
maClose=iMA(NULL,0,MaPeriod,0,MaMetod,MODE_CLOSE,pos);
maLow=iMA(NULL,0,MaPeriod,0,MaMetod,MODE_LOW,pos);
maHigh=iMA(NULL,0,MaPeriod,0,MaMetod,MODE_HIGH,pos);
haOpen=(ExtMapBuffer3[pos+1]+ExtMapBuffer4[pos+1])/2;
haClose=(maOpen+maHigh+maLow+maClose)/4;
haHigh=MathMax(maHigh, MathMax(haOpen, haClose));
haLow=MathMin(maLow, MathMin(haOpen, haClose));
if (haOpen<haClose)
{
ExtMapBuffer1[pos]=haLow;
ExtMapBuffer2[pos]=haHigh;
}
else
{
ExtMapBuffer1[pos]=haHigh;
ExtMapBuffer2[pos]=haLow;
}
ExtMapBuffer3[pos]=haOpen;
ExtMapBuffer4[pos]=haClose;
pos--;
}
//----
return(0);
}
//+------------------------------------------------------------------+
void watermark()
{
ObjectCreate("fxcruiser", OBJ_LABEL, 0, 0, 0);
ObjectSetText("fxcruiser", "fxcruiser", 11, "Lucida Handwriting", RoyalBlue);
ObjectSet("fxcruiser", OBJPROP_CORNER, 2);
ObjectSet("fxcruiser", OBJPROP_XDISTANCE, 5);
ObjectSet("fxcruiser", OBJPROP_YDISTANCE, 10);
return(0);
}
1点目ですが、インディケーターではExtCountedBarsを最大値として、
デクリメントして過去のデータから処理をしていると思うのですが、
過去のデータを全て処理するには多いため、EAでは以下の処理を行っております。
haOpenは過去のデータからでないと取れないため、
100個程過去から繰り返し行っているのですが、
インディケーターで表示されている青と赤の色で一致してくれてません。
if(haOpen < haClose) {
の部分で1は青、-1は赤と表現したいのですが、実際にインディケータと比べると、
食い違っており、何処が間違っているのか検証方法も思いつかなくて困っております。
御教授頂けると助かります。
int TEST(int shift) {
double maOpen, maClose, maLow, maHigh;
double haOpen, haHigh, haLow, haClose;
double oldHaOpen, oldHaClose;
for(int i=shift+100; shift<=i; i--) {
maOpen = iMA(SYMBOL, PERIOD_M30, MaPeriod, 0, MaMetod, MODE_OPEN, i);
maClose = iMA(SYMBOL, PERIOD_M30, MaPeriod, 0, MaMetod, MODE_CLOSE, i);
maLow = iMA(SYMBOL, PERIOD_M30, MaPeriod, 0, MaMetod, MODE_LOW, i);
maHigh = iMA(SYMBOL, PERIOD_M30, MaPeriod, 0, MaMetod, MODE_HIGH, i);
haOpen = (oldHaOpen + oldHaClose) / 2;
haClose = (maOpen + maHigh + maLow + maClose) / 4;
oldHaOpen = haOpen;
oldHaClose = haClose;
}
if(haOpen < haClose) {
return(1);
} else {
return(-1);
}
return(0);
}
2点目ですが、インディケーター側のソースで、
ExtMapBuffer1~4の値に常に入っている状態ですが、
何故青と赤の表示が切り替わるのでしょうか?
こんな初歩的な質問で申し訳御座いませんが、
何卒宜しく御願い致します。
投稿者:門 |2009年12月26日 01:16
門さん
こんにちわ!
SYMBOLは、文字列変数ですね?
バックテストでは、他通貨ペアの他時間足で現在の高値安値を取得しようとすると、
始値が返ってきます。
そのあたりで、食い違いがあるかもです^^;
まずは、実行する通貨ペアと時間足で検証してみてください。
2点目ですが、
インディケータのDRAW_HISTOGRAMは、チャート上に表示させる場合と、
サブウィンドウに表示させる場合の仕様が違うようです^^;
チャート上に表示させる場合は、2つで1セット、重なった部分を描画しないといった感じ
になります^^
たぶんです・・・^^;
投稿者:慶次 |2009年12月26日 09:48
さっそくのコメント有難う御座います!
記載忘れてました申し訳御座いません。
SYMBOLは"EURUSD"でインディケータで表示している対象通貨や時間足(30分)も食い違いはありません。
その他にもMaPeriod、MaMetodの値も同一です。
> 重なった部分を描画しないといった感じになります
ここの判断はどうすれば良いのでしょうか?
ようは重なって上に描画されている色を抽出したいのです。
因みにバックテストとはiCustam関数を使用しての値を取得したと云う事でしょうか?
大変申し訳御座いませんが御教授の程お願い致します。
投稿者:門 |2009年12月26日 11:41
門さん
こんにちわ!
>ようは重なって上に描画されている色を抽出したいのです。
門さんのコードで特に問題ない気がします。
iMA(SYMBOL, PERIOD_M30,
を
iMA(NULL,0,
に変えてみてください。
また、Print関数などで内部の変数を出力すると、
原因がわかったりします^^;
投稿者:慶次 |2009年12月26日 14:33


