カスタムインディケータをEAにする方法2

カスタムインディケータをEAにする方法2



前回の記事「カスタムインディケータをEAにする方法

の続きです!

③シグナルに換える。

iCustom関数の()内の書き方は、

iCustom(通貨ペア,時間足,インディケータ名,,...,インデックス,バーシフト);

でしたね。

・シグナルが出た瞬間の売買/シグナルが出た次のバーの始値で売買の切り替え

を実現するために、パラメータを作りましょうか。

iCustom関数のバーシフトの部分に入れるためのパラメータ

extern int SignShift=1;

としましょうか。
場所はインディケータのパラメータをコピペした下あたりでいいと思います。

そして、これを使ってインデックス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);

となりますね!

こうすれば、パラメータ SignShift が0で、シグナルが出た瞬間に対応できますし、
SignShift が1でシグナルが出た次のバーの始値で売買に対応できるようになりました!

この取得できた値を使って、シグナルを作ってみましょう!

int sign;
if(upsign!=-1) sign=1;
if(dnsign!=-1) sign=-1;

シグナル用変数を sign として
upsign が-1ではないとき sign に1を代入
dnsign が-1ではないとき sign に-1を代入

といった感じです。


あとは基本的なEA製作と同じです。

1つ注意することは、
シグナルが出た瞬間に取引をする場合に、
同じ足で何度もシグナルが変わることがあるので、制限をつけるとよいということです。


途中ですが、続きは次回にしたいと思いますm(..)m

カスタムインジケータをEAにする方法の関連記事

2008年12月31日|コメント (37)

カテゴリー:indicators

コメント (37)

慶次さん

あけましておめでとうございます。
今年もよろしくお願いいたします・・・m(_ _)m

「シグナルが出た瞬間の売買/シグナルが出た次のバーの始値で売買の切り替え」の記事
とても参考になります。ありがとうございます。

投稿者:ぶぅー |2009年1月 1日 22:43

ぶぅーさん

あけましておめでとうございます!

次回完成予定ですので、もう少しお待ちくださいね!

投稿者:慶次 |2009年1月 2日 00:51

私もicustomを使いますが、条件を付けて…と言うのを知らないので、勉強させていただきます。

あ、後れ馳せながら、明けましておめでとうございます m(__)m

投稿者:えぎ |2009年1月 2日 23:18

えぎさん

あけましておめでとうございます!
今年もよろしくお願いいたします!

今年もがんばっていきましょう(^0^)/

投稿者:慶次 |2009年1月 3日 11:17

ご担当者様
突然のメール失礼致します。

このたび相互リンクのお願いにお伺いさせていただきました。

投稿者:CFD比較WEB-CFD取引ガイド |2009年3月 4日 22:18

こんにちは。
私は、サラリーマントレーダーsatと申します。 
今、私は真剣にFXで儲けること、FXで日利20%を安定的に稼ぐことを考えて生きています。


昨年は、日利最高84%を記録し、週利では290%、当時は日利50%が平均的な収益でした。
(運用資金は1000万円)ところが、最近は利益をとっても、また失うことが多く『どうすれば』日利
20%を安定して獲得することができるかを真剣に考えております。

そこで、FXのブログ等をみていてここにたどりつきました。もしかしたらFXの情報交換や一緒に何か
することで日利20%の方法を一緒に模索することができるかもしれないと思いました。
もちろん、私自身、一緒にやって日利20%を獲得できるのではないか?、何か有益な情報交換を
して、お互いのトレード手法を切磋琢磨できるのではないか?と思った人にしかこのメールを出して
おりません。

どこまでご一緒にさせていただけるかわかりませんが、一度綿密な計画をたて、一緒に日利20%の世
界を目指してみませんか?もし日利20%の世界は目指さずに、トレード手法についての有益な情報
交換だけを、というのであれば、そちらでお願いいたします。なお、今のところ『日利20%の設計書』を
私のほうで用意しております。現在私は特にEAを組めてバックテストをやっていける人を探してます。
それ以外であってもFXのトレード手法につき情報交換でもかまいません。

まずはよろしければ、以下の質問にお答えいただけませんでしょうか?大変急なお願いですがよろしく
お願い申し上げます。

1.FXの共同作業(お互い金銭出資等はなく、労働を提供)を共にやってみませんか?もしくはFXの
情報交換に興味はございませんか?どちらに興味がございますか?

2.これまでの過去一番儲けた時期や実績。年利や月利にするとどのくらいでしょうか?

3.ここ最近のFXでの収益はどのくらいでしょうか?

4.今後目標にしているFXでの収益はどのくらいでしょうか?

5.メタトレーダー4を使ってEAを作成し、バックテストをする技能をお持ちですか?

6.FXの情報商材を集めることに興味がありますか?

7.FXを上達させる上で参考としている情報商材や「師匠」、参考文献等ありましたらご教示ください。

投稿者:サラリーマントレーダーsat |2009年5月 2日 04:55

サラリーマントレーダーsatさん

こんにちわ!
日利20%はすごいですね!
2ヶ月(44日)で約3000倍ですね^^

私は、今年2月に2時間で約200倍にしたのが最高です^^;
(リアル口座で、取引履歴保存してあります^^)
今はその手法は使えなくなってしまいましたT-T

私は、プログラミング代行サービスをしておりますので、
手法情報は提供できませんが、EA作成やメタトレーダー4の機能について詳しくなっていますので、お力になれるかもしれませんね!

また改めて連絡させていただきます^-^

投稿者:慶次 |2009年5月 2日 19:06

もし、日利20%プラスならば、数年もかからず地球上の金がひとりのものになり、全員破産。

投稿者:mu |2009年5月 3日 19:18

MQL4言語でのプログラムで以下のような部分があるのですが、SendMailは実行され、メールが届くのですが、オーダーが実行されません。どうしてですか?プログラム自体に問題が無ければ、後はどこに問題があると考えられますか?121証券に問い合わせてもオーダーは届いていないということなのです。
MagicNumberでは無く、MahicNumberとなっているのは作者様が意図的にそうしたようです。XPでもVistaでも同じ結果でした。Vistaのファイアウォールを解除してみても駄目でした。作者様はオーダーも問題なく実行されているとの事なのです。よろしくお願いいたします。


//買い
if ( ORDER_TYPE == OP_BUY )
{
double SL_pips_Bid = Ask - StopLoss_pips * Point;
double PT_pips_Bid = Ask + ProfitTaking_pips * Point;

OrderSend(Symbol(),OP_BUY,Lots,Ask,SlipPage_pips,SL_pips_Bid,PT_pips_Bid,"",MahicNumber,0,Blue);

Price = Ask;
SendMail(
"Mail",
"買いポジション取得しました。"
);
}//end of if

投稿者:kakaka |2009年5月28日 15:29

kakakaさん

こんにちわ。
SendMailが実行されているということは、
Allow live tradingにチェックがはいっていれば
OrderSendも実行されていますね。
ポジションを持たないのは、
ロット数が不適
ストップが不適
リミットが不適
のいずれかだと思います。
ブローカーの制限やロット数の桁などを確認し、パラメータを適当な値にすれば、ポジションをとると思います。

投稿者:慶次 |2009年5月28日 15:59

121証券様に尋ねてみますと、設定されている時間帯や通貨ペア名、ロット数、指値・逆指値注文のpips数が影響する可能性がございます。弊社では時間帯は日本時間での表示となっており、リアル口座の通貨ペア名の最後にはピリオドが付きます。また、指値・逆指値は20pips以上離す必要がございます。とのお返事を頂きました。ピリオドをつけるとしたらSymbol(.)これで良いのでしょうか?

投稿者:kakaka |2009年5月28日 16:21

慶次さまありがとう御座います。ブローカー側では、通過したオーダーしか確認できないのでしょうか、オーダーが届いたけど、条件が合わないので弾いたオーダーというのはブローカーの方でもログを確認できないのかなぁ・・ロット数0.1、1.0両方で試したけどダメでした。パラメタにストップを20で入れていますが計算式の間違えで0からの加算になってたりして・・リミットは入れていません。EAが条件に合ったときに決済すると言う様にしています。

投稿者:kakaka |2009年5月28日 16:30

ちょっと分かって来ました。もしかして手動でエントリしたときも逆指値が30以上離れていないと受け付けないようです。パラメタのストップロスを30にしてみます。

投稿者:kakaka |2009年5月28日 16:39

kakakaさん

ストップが不適だったみたいですね^^
121証券の場合、
StopLoss_pipsには20+スプレッド
でエントリが通ると思います。
スリッページも考えて、30ならOKですね!

投稿者:慶次 |2009年5月28日 17:04

ずいぶんと悩んでしまいましたが解決できてうれしいです。ストップロスの数値が20ではダメだったからMT4がオーダーを止めていたようです。助かりました~

投稿者:有難うございました |2009年5月28日 20:53

初心者で質問が間違っているかもしれませんが、以下の構文の場合買いの場合、売りの場合にそれぞれもう一つの命令を行いたいのですが、if(買いの場合)の中に文を挟み込むとエラーが出ます、if(買いの場合)をもう一つ作る方法の方がいいのでしょうか?

for(条件)
{
if(買いの場合)
{
if(条件)
  {
}
}

if(売りの場合)
{
if(条件)
  {
}
}
}

投稿者:kakaka |2009年6月 4日 15:54

kakakaさん

こんにちわ!
構文は、問題ないようです^^
その他の文法でエラーが出ている可能性がありますね!

投稿者:慶次 |2009年6月 4日 16:25

慶次さまありがとう御座います。
間違いないですよね・・
また具体的に質問させていただくかもです。
またよろしくお願いいたします。

投稿者:kakaka |2009年6月 5日 14:54

先日投稿させていただいた上記(買いの場合)の構文なのですが、以下のようにしましたが、ストップロスのスライド(オーダー内容の変更とEAが一定の小さい範囲で決済する事とスライド)がうまく行ってないようです、一定チェックpips上がったら損切りが一定pips上げるという事にしています。どこがおかしいでしょうか?

if ( OrderType() == OP_BUY )
{
double CC_pips_Bid = Price + CutLossCheck_pips * Point;
if ( CC_pips_Bid = Bid)
{
OrderClose( OrderTicket(), OrderLots(), Bid, SlipPage_pips, White );
}
double EAProfitTaking_pips_Bid = Price + EAProfitTaking_pips *Point;
if (EAProfitTaking_pips_Bid <= Bid)
{
OrderClose( OrderTicket(), OrderLots(), Bid, SlipPage_pips, White );
}
break;

}

投稿者:kakaka |2009年6月 6日 09:00

kakakaさん

中間あたりの、
);
が原因ではないでしょうか?

投稿者:慶次 |2009年6月 6日 19:16

ありがとう御座います。
確かに
);
は不要でした。
しかし、決済は実行されず、正しくプログラムを組めるように、勉強中です。
それと、私が投稿させていただいた記事は消去していただいて構いません。よろしくお願いいたします。

投稿者:kakaka |2009年6月 9日 13:11

お世話になっております。
オーダーのストップロスと利益確定値は一定以上約定値から離さないとオーダーを受け付けないようですが、EA自体がある一定の数値になったら成行きで決済させるという方法を取れば小さい幅たとえば5pipsの利益確定をEAが行う事も可能かと思ったのですが、出来ないようになっているのでしょうか?

投稿者:kakaka |2009年6月10日 01:35

kakakaさん
こんにちわ!
EA自体である一定の数値になったら成行きで決済させるという方法は可能ですよ^^
最近は、そのようなロジックを組むことが増えてきました。

if(ポジ有)
{
OrderSelect(...);
if(買いポジ)
{
if(Bid=買値+TPピプス)
OrderClose(...);
}
売りも同様
}

といった形でどうでしょうか?

投稿者:慶次 |2009年6月10日 07:49

有難うございます。
パソコンが停電なんかでEAが働かなくなった場合の為にオーダーでの損切りと利益確定も注文して、損切りはEAが成行きで確定する値と、注文変更を出してスライドさせるようにしているのですが、うまく働かないのです。また、バックテストはこの様な小さな動きには対応してないのでしょうか、everytickでも値動きは大雑把に記録しているのでしょうか、確定した値がなんだかバラバラなんです。値動きのスピードに処理が対応仕切れないのでしょうか、もう少しがんばってみます。

投稿者:kakaka |2009年6月10日 10:48

kakakaさん

everytickで細かくテストする場合は、テストする期間の1分足が必要です。
1度チャートを表示させて1分足のデータがどこまでさかのぼってあるか確かめてみてください。

投稿者:慶次 |2009年6月10日 11:24

1分足が必要なのですね、勉強になりました。ありがとう御座いました。
EAが成り行きで決済させる小さい幅の利益確定と損切りはFXDDで出来て121証券では出来ないという事はありますか?

投稿者:kakaka |2009年6月10日 14:59

kakakaさん

ブローカーによって、約定のしやすさなど違ってくるとは思いますが、FXDDと121証券のピプスの桁がちがいますので、それによって動作が変わってくるEAもあるかと思います。
操作履歴などで、エラーなどの表示がないかご確認ください。

投稿者:慶次 |2009年6月10日 18:27

FXDDのデモアカウントで試してみましたが同じくうまくいきませんでした。スリッページを10pipにしていたので、3にしたらうまくいっているようです。損切りが設定の倍の値で約定しているのが不思議なのですが・・。ありがとう御座いました。

投稿者:kakaka |2009年6月11日 17:07

OderCloseでスリッページを有効にしないようにするにはどうしたらいいのでしょうか?スリッページを有効にしない事とスリッページを0にする事は意味が違うと思うのですが・・以前私はクリック証券を利用していまして、その頃はスリッページの事を全く意識しなくても良かった様な気がするのです。MT4のEAで条件に合っても決済されないのはスリッページが影響しているのではないかと思っています。よろしくお願いいたします。

投稿者:kakaka |2009年6月13日 00:27

kakakaさん

EAのコードや操作履歴などを見ていないのでなんともいえないのですが、スリッページに関しましては0にすることで有効にならないかと思います。

投稿者:慶次 |2009年6月13日 08:11

いくつも質問して申し訳ありません。
Bool Flag_Update_Ask = OderModify
以降に
if(Flag_Update_Ask){①}
の場合、オーダー変更が成功したら①を実行するということだと思うのですが、
実行してサーバーに許可されたかどうかまで調べるのか、許可されたかどうかは関係なくオーダーと発信した段階でFlag_Update_Askはtrueになるのかどちらなのでしょうか?

また、if(Flag_Update_Ask = true)と同じ事なのでしょうか?

投稿者:kakaka |2009年6月25日 22:34

for(int i=0; i < OrdersTotal() ; i++)
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == false)
{break;}
if(OrderMagicNumber()! = MagicNumber || OrderSymbol() != Symbol())
{continue;}
という文で質問なのですが、OrdersTotal()という文だけでサーバーに問い合わせてポジションをいくつ持っているか調べ、その数を返すという事でしょうか?

投稿者:kakaka |2009年6月25日 22:54

すみませんもう一つ質問させて下さい。
start関数内でClosePositions();と記入してstart関数外のClosePositions()を実行させた場合、Void ClosePositions()以降に記入したVoid ClosePositions2()も実行されてしまうのでしょうか?

Void ClosePositions()
Void ClosePositions2()

投稿者:kakaka |2009年6月25日 23:00

すみませんもう一つ質問させて下さい
bool Flag_Order = False;
for ( int i = 0; i < OrdersTotal() ; i++ )
{
if ( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) == false )
{break;}
if ( OrderMagicNumber() != MahicNumber || OrderSymbol() != Symbol() )
{continue;}
Flag_Order = True;
とあり、for文外に
if ( ! Flag_Order )
{Order = -1;Price = 0;}
としているのは、どういうことでしょうか?
オーダーチェックを通り抜けてきたかどうかを(! Flag_Order)つまり(Flag_Order == false)でチェックしているという事ですか?
そうだとしたら、このif ( ! Flag_Order )という条件は必要な物なのでしょうか?

投稿者:kakaka |2009年6月25日 23:16

kakakaさん

こんにちわ。

Order~は
実行してサーバーに許可されたかどうかまで調べる感じです。
if(bool型) は if(bool型==true) と同じ意味です。

その他の質問ついては、次回以降の記事で解説を交えて書きたいと思います^^;

投稿者:慶次 |2009年6月26日 10:32

ありがとう御座いました。
次回以降の記事楽しみにしています。
尚、例えば
PT_Price = Ask + EA_PT_pips * Point;
と書いた場合、自動的にdouble型になるのでしょうか?

投稿者:kakaka |2009年6月30日 12:35

kakakaさん

こんにちわ!
一度double型と宣言してあれば、ずっとdouble型ですよ。

投稿者:慶次 |2009年6月30日 14:46

コメントを投稿する

(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)






画像の中に見える文字を入力してください。

Captchaの認証で入力ミスがありますと、コメントが消えてしまいますのでご注意ください。
コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。