ここでは、MTF機能付きのカスタムインジケーターのシグナルによって自動売買する自作EAの作り方を解説します。
MTF機能付きのiCustom()関数の使い方を復習したい人は前編をご覧ください。
前回記事【MTF機能付きのカスタムインジケーターをEAにする方法(前編)】へ
下記の機能を盛り込んだEAを作成していきます。
・シグナルが出た瞬間か次の始値かの取引タイミング選択
・インジケーターのシグナルによる決済のON/OFF
シグナルが出た瞬間にエントリーする設定の場合で、シグナルがダマシだった場合は、次のローソク足の始値で決済してノーポジション状態になるようにしていきます。
既存EAをカスタマイズする
今回は、過去の記事【MetaTrader4のEAを改良する方法】で作成したEAをカスタマイズして、目的のEAを作成していきます。
念のため、カスタマイズ前のコードをお見せするぞい!
//+------------------------------------------------------------------+ //| MA_Doten_EAv1.01.mq4 | //+------------------------------------------------------------------+ #property copyright "Dr.EA Keiji" #property link "https://www.dr-ea.com/meta-blog/" #property version "1.01" #property strict // パラメーター extern int StopLoss = 500; extern int TakeProfit = 500; extern double Lots = 0.1; extern int MagicNumber = 20191030; extern int MA_Period = 20; extern int MA_Shift = 0; extern ENUM_MA_METHOD MA_Method = MODE_SMA; extern ENUM_APPLIED_PRICE MA_Applied = PRICE_CLOSE; extern bool ExitByMA = false; // グローバル変数 int entry_bar; // エントリーした時のバーの数 //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // 使い回ししそうな変数を宣言 int i, ticket; double sl, tp; // 保有ポジションを確認 ------------------------------- int ticket_buy = 0; // 買いポジションの注文番号 double lots_buy = 0; // 買いポジションのロット数 int ticket_sell = 0; // 売りポジションの注文番号 double lots_sell = 0;// 売りポジションのロット数 for (i=0; i<OrdersTotal(); i++) { // ポジション選択 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) return; // 通貨ペアまたはマジックナンバーが違う場合はスキップ if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue; // 保有ポジションの注文番号とロット数を変数に代入 if (OrderType() == OP_BUY) { ticket_buy = OrderTicket(); lots_buy = OrderLots(); } if (OrderType() == OP_SELL) { ticket_sell = OrderTicket(); lots_sell = OrderLots(); } } // 取引シグナルを判定 --------------------------------- int entry_sign = 0; // エントリー用シグナル int exit_sign = 0; // 決済用シグナル // MAの値を取得 double ma_1 = iMA(NULL, 0, MA_Period, MA_Shift, MA_Method, MA_Applied, 1); double ma_2 = iMA(NULL, 0, MA_Period, MA_Shift, MA_Method, MA_Applied, 2); // 条件を満たしたらシグナル発生 (1: 買いシグナル, -1: 売りシグナル) if (Close[2] <= ma_2 && Close[1] > ma_1) { if (ma_2 < ma_1) entry_sign = 1; // MAが上昇ならエントリー許可 if (ExitByMA == true) exit_sign = 1; // ExitByMAがtrueなら決済許可 } if (Close[2] >= ma_2 && Close[1] < ma_1) { if (ma_2 > ma_1) entry_sign = -1; // MAが下降ならエントリー許可 if (ExitByMA == true) exit_sign = -1; // ExitByMAがtrueなら決済許可 } // 決済 ----------------------------------------------- // 買いポジション決済 if (ticket_buy > 0 && exit_sign == -1) { if (OrderClose(ticket_buy, lots_buy, Bid, 0, clrYellow) == true) ticket_buy = 0; else Print("OrderClose error."); } // 売りポジション決済 if (ticket_sell > 0 && exit_sign == 1) { if (OrderClose(ticket_sell, lots_sell, Ask, 0, clrYellow) == true) ticket_sell = 0; else Print("OrderClose error."); } // エントリー------------------------------------------- if (ticket_buy == 0 && ticket_sell == 0 && entry_bar != Bars) { // 買いエントリー if (entry_sign == 1) { sl = 0; tp = 0; if (StopLoss > 0) sl = Ask - StopLoss * Point; if (TakeProfit > 0) tp = Ask + TakeProfit * Point; ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 0, sl, tp, NULL, MagicNumber, 0, clrBlue); if(ticket > 0) entry_bar = Bars; else Print("OrderSend error."); } // 売りエントリー if (entry_sign == -1) { sl = 0; tp = 0; if (StopLoss > 0) sl = Bid + StopLoss * Point; if (TakeProfit > 0) tp = Bid - TakeProfit * Point; ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 0, sl, tp, NULL, MagicNumber, 0, clrRed); if(ticket > 0) entry_bar = Bars; else Print("OrderSend error."); } } }
カスタマイズ前のEAファイル【MA_Doten_EAv1.01.mq4】をダウンロード
そして今回完成したEAのコードはこちら。どーん!
あわわ
// パラメーター extern int StopLoss = 500; extern int TakeProfit = 500; extern double Lots = 0.1; extern int MagicNumber = 20191030; extern string IndicatorName = "BBands_Stops_mtf"; extern int TimeFrame = 0; extern int Length = 13; extern double Deviation = 1.62; extern int SignalShift = 1; extern bool ExitBySignal = false; // グローバル変数 int entry_bar; // エントリーした時のバーの数 //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // 使い回ししそうな変数を宣言 int i, ticket; double sl, tp; // 保有ポジションを確認 ------------------------------- int ticket_buy = 0; // 買いポジションの注文番号 double lots_buy = 0; // 買いポジションのロット数 datetime open_time_buy = 0; // 買いポジ取得時間 int ticket_sell = 0; // 売りポジションの注文番号 double lots_sell = 0;// 売りポジションのロット数 datetime open_time_sell = 0; // 売りポジ取得時間 for (i=0; i0) { // シグナルによる決済 if (ExitBySignal == true && entry_sign == -1) exit_ok = true; // ダマシ後の決済 if (SignalShift == 0 && iBarShift(NULL, TimeFrame, open_time_buy) == 1) { up_sign = iCustom(NULL, TimeFrame, IndicatorName, 0, Length, Deviation, 2, 1); if (up_sign == -1) exit_ok = true; } if (exit_ok == true) { if (OrderClose(ticket_buy, lots_buy, Bid, 0, clrYellow) == true) ticket_buy = 0; else Print("OrderClose error."); } } // 売りポジション決済 if (ticket_sell > 0) { if (ExitBySignal == true && entry_sign == 1) exit_ok = true; if (SignalShift == 0 && iBarShift(NULL, TimeFrame, open_time_sell) == 1) { dn_sign = iCustom(NULL, TimeFrame, IndicatorName, 0, Length, Deviation, 3, 1); if (dn_sign == -1) exit_ok = true; } if (exit_ok == true) { if (OrderClose(ticket_sell, lots_sell, Ask, 0, clrYellow) == true) ticket_sell = 0; else Print("OrderClose error."); } } // エントリー------------------------------------------- if (ticket_buy == 0 && ticket_sell == 0 && entry_bar != Bars) { // 買いエントリー if (entry_sign == 1) { sl = 0; tp = 0; if (StopLoss > 0) sl = Ask - StopLoss * Point; if (TakeProfit > 0) tp = Ask + TakeProfit * Point; ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 0, sl, tp, NULL, MagicNumber, 0, clrBlue); if(ticket > 0) entry_bar = Bars; else Print("OrderSend error."); } // 売りエントリー if (entry_sign == -1) { sl = 0; tp = 0; if (StopLoss > 0) sl = Bid + StopLoss * Point; if (TakeProfit > 0) tp = Bid - TakeProfit * Point; ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 0, sl, tp, NULL, MagicNumber, 0, clrRed); if(ticket > 0) entry_bar = Bars; else Print("OrderSend error."); } } }
今回完成EAファイル【BBands_Stops_EA_Ver1.01.mq4】をダウンロード
パラメーターを差し替える
基となるEAは、MAによるシグナルで取引するEAなので使用するMAを設定するパラメーターがあります。それを今回必要なパラメーターに差し替えます。
MA_Period~ExitByMAのパラメーター部分を次のコードに変更します。
extern string IndicatorName = "BBands_Stops_mtf"; extern int TimeFrame = 0; extern int Length = 13; extern double Deviation = 1.62; extern int SignalShift = 1; extern bool ExitBySignal = false;
使用するカスタムインジケーター名とそのパラメーターと、下記の機能を搭載するためのパラメーターです。
・シグナルが出た瞬間か次の始値かの取引タイミング選択
・インジケーターのシグナルによる決済のON/OFF
SignalShiftが0の場合は、シグナルが出た瞬間にエントリー注文するようにします。SignalShiftが1の場合は、次の始値でエントリー注文するようにします。
シグナル判定を差し替える
今回のシグナル判定は、次のようにエントリー用シグナルのみを先に判定するようにします。
int entry_sign = 0; // エントリー用シグナル // インジケーターのシグナルの値を取得 double up_sign = iCustom(NULL, TimeFrame, IndicatorName, 0, Length, Deviation, 2, SignalShift); double dn_sign = iCustom(NULL, TimeFrame, IndicatorName, 0, Length, Deviation, 3, SignalShift); // 条件を満たしたらシグナル発生 (1: 買いシグナル, -1: 売りシグナル) if (up_sign != -1) entry_sign = 1; if (dn_sign != -1) entry_sign = -1;
決済判定と決済処理
決済用シグナルを次のように真偽型に変更しておきます。
bool exit_ok = false; // 決済用シグナル
決済条件を満たした場合に、変数exit_okをtrueにして、決済処理を実行するように変更します。
買いポジションの決済判定と決済処理
datetime変数「open_time_buy」は予め宣言しておいて、保有ポジション確認で、買いポジションをオープンした時間を格納しておきます。
買いポジションの決済判定と決済処理を次のようにします。
if (ticket_buy > 0) { // シグナルによる決済 if (ExitBySignal == true && entry_sign == -1) exit_ok = true; // ダマシ後の決済 if (SignalShift == 0 && iBarShift(NULL, TimeFrame, open_time_buy) == 1) { up_sign = iCustom(NULL, TimeFrame, IndicatorName, 0, Length, Deviation, 2, 1); if (up_sign == -1) exit_ok = true; } if (exit_ok == true) { if (OrderClose(ticket_buy, lots_buy, Bid, 0, clrYellow) == true) ticket_buy = 0; else Print("OrderClose error."); } }
ダマシ後の決済条件では、TimeFrameで指定した時間足の1つ前のローソク足でエントリーていて、そのローソク足にシグナルがない場合に一旦決済するようにしています。
売りポジションの決済判定と決済処理
売りポジションの決済についても、買いポジション決済と同じ要領でコードにします。
if (ticket_sell > 0) { if (ExitBySignal == true && entry_sign == 1) exit_ok = true; if (SignalShift == 0 && iBarShift(NULL, TimeFrame, open_time_sell) == 1) { dn_sign = iCustom(NULL, TimeFrame, IndicatorName, 0, Length, Deviation, 3, 1); if (dn_sign == -1) exit_ok = true; } if (exit_ok == true) { if (OrderClose(ticket_sell, lots_sell, Ask, 0, clrYellow) == true) ticket_sell = 0; else Print("OrderClose error."); } }
まとめ
MTF機能付きのカスタムインジケーターをiCustom()関数でEA化する方法を解説しました。
ダマシの場合の対処は他にいろんな方法がありそうですね。
いろいろと試してみてください。
慶次さん
新年早々からの御教授ありがとうございます。
記事から情熱が伝わり、大変ありがたく感じております。
落ちこぼれそうな脳みそに活を入れて何度も熟読し、
記憶させますので続編よろしくお願い致します・・・m(_ _)m
ぶぅーさん
こんにちわ!
今回は、これで完成です^^
もし「こんなふうに改造したい!」といったことがありましたら、何でもいってくださいね!
こんにちは。
自分は年末年始など関係ない仕事をしておりますので、なかなかゆっくり読む機会がまだありませんが、これから頑張って勉強させていただきます。
m(__)m
了解しました・・・ >_<;
只今熟読&解析中でございます・・・(^^;
質問したい事が多々ありますが、まだまとまっていないので後でまとめてコメントしたいと思います。
初歩的な質問ばかりで申し訳ありませんがよろしくお願いします。
慶次さん
「メタトレ!完全自動売買のススメ」をご覧の皆様へのお詫びです。
上記コメントは私「ぶぅー」が書いたものです。訂正させて下さい。
記事を熱読しながら書いていたので、心ここにあらず状態・・・(>__<;
只今熟読&解析中でございます・・・(^^;
質問したい事が多々ありますが、まだまとまっていないので後でまとめてコメントしたいと思います。
初歩的な質問ばかりで申し訳ありませんがよろしくお願いします。
お詫びいたします・・・m(_ _)m
慶次さん、こんにちは。
本日2度目の書き込みです(笑)。
仕事中に時間が出来ましたので、プリントアウトしたEAのコードと説明文を読んでみていました。
そこで、質問が2つありますが、お聞きしてよろしいでしょうか?
まず1つは、
ポジション有の時の処理の「SignShift」ですが、これはどの場面で「0」に書き換えられるのでしょうか?
EAを見ても書き換えがなされていない気がしたので質問してみました。見落とし、勘違いならすいません m(__)m
あともう1つ、最後の辺りの文章に「ストップ・リミットが0でシグナルでもクローズしないとなるといつまででもポジションをもっていることになります」と書いてありますが、ドテンのシグナルが出ていてもクローズしないような事象が起こりうる可能性がありますでしょうか?
以前、デモでテストしていた際に、テスターではキチンとクローズ処理をしているのに、フォワードテスト中ではクローズ処理をしない時が何度か有り、悩んだ事があったもので、質問してみました。
ちなみに、過剰な変動相場ではありませんでした。
考えられる事象があれば、教えていただけませんか?
よろしくお願いいたします。
いつもすみません m(__)m
ぶぅーさん
こんにちわ。
どんな質問でもいいので聞いてくださいね!
えぎさん
こんにちわ。
SignShiftはパラメータにしてありますので、EAを使うときにパラメータの変更で
0と入力する形になっております。
また、今回は、パラメータのClosebySignでドテンをするかどうかを選択できるようにしてあります。
なので、ドテンシグナルが出ていても、ClosebySignをfalseにしている場合、クローズしません。
フォワードテストでの事象につきましては、設定ミスまたは、不具合が考えられるとおもいます^^;
ブログ拝見させて頂きました。EAの講義ありがとうございます。正直私にはまだレベルの高い中身ですが、書かれている内容をじっくり読んでみたいと思います。
慶次さん
質問をまとめました。
遅くなってごめんなさい・・・(>_
ここで次の記事がありました。
————————————–
レポート内で
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
うめさん
こんにちわ!
今回の内容は、シンプルですがとても重要な内容が詰まっていると思います。
がんばりましょうね!
ぶぅーさん
こんにちわ!
①
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関数で別時間足のデータを取得するのか、インディケータの機能で別時間足のデータを計算するのか
の違いです。
また、今回はシグナルのタイミングにかかわるプロパティのみを使い、その他は省略しております。
④
ドテンのときは、成行きで注文しているので、問題なく取引できるとおもいます。
多くのブローカーで設けている制限は、指値・逆指値のような予約するものを制限しておりますので、大丈夫です^^
チョット解かり難いですが、がんばりましょう!
なるほど、理解しました。
SignShiftは変動するのではなく、あらかじめの設定するのですね?
で、0の場合は現在の足(バー)が対象になるから、ダマシ(過剰反応?)かどうかの判定をしている、ということですね。
なるほど、納得納得。
ありがとうございます。
慶次さん
こんばんわ
解説ありがとうございます。お蔭様で疑問点が全て解決しました。
昨日は記事を理解するため、何度も読ませていただきました・・・(^^)その後、実際にチャートに反映させての確認、対策?等・・・夢中になってしまい・・・慶次さんに対してのお礼のコメントがまだだったことに気付き、反省しております・・・m(_ _)m
今回の「カスタムインディケータをEAにする方法」の御教授、大変感謝しております。どうもありがとうございました・・・m(_ _)m
えぎさん
こんにちわ!
疑問解決できてよかったです^^
ぶぅーさん
こんにちわ!
全解決よかったです^^
お役に立ててうれしいです!
がんばりましょうね!
今回の講座を読んでいてふと思ったことがありましたので、またお知恵を貸していただけませんでしょうか?
と申しますのも、たとえば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とか出てしまって、悩んでしまってます・・・。
どうか、お力をお貸しくださいませ。
よろしくお願いいたします。
今回の講座を読んでいてふと思ったことがありましたので、またお知恵を貸していただけませんでしょうか?
と申しますのも、たとえば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とか出てしまって、悩んでしまってます・・・。
どうか、お力をお貸しくださいませ。
よろしくお願いいたします。
すいません、修正中のが連続書き込みなってしまいました・・・。
申し訳ないです。
たびたびすいません・・・
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);
の間違いです。
すいません。
えぎさん
こんにちわ!
他通貨を注文するときの、買値・売値は、
MarketInfo関数または、iClose関数+スプレッドで取得するとよいかと思います。
また、121証券のリアル口座では、通貨名を注意する必要があります。
あ!
そうだった!
通貨名・・・なるほどそうでした・・・。
ありがとうございます。
慶次さん、コンニチワ。
ご指摘をいただいたように、
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);
と変換し、ライブ口座でテストしてみましたが、同等のエラーが出てしまいます。
このやり方、どこかマズイところがありますでしょうか?
ご指摘いただけたら喜びます。
よろしくお願いいたします。
慶次さん
「カスタムインディケータをEAにする方法」
についてのご教授、大変お世話になりました。
他のインディケータを使うときのことも考えた部分の説明は初心者の私にとって
とても解りやすく、有効に利用できる内容であり、大変感謝しております。
どうもありがとうございました。
またお願いがあります。
ここ数日、BBands_Stops_EAの欠点を補う手法がないかを調べ、対策をEAに追加しようと
しておりますが、どうしても能力不足で作成できません。
再度、慶次さんの鋭く理解しやすい(^_^)ご教授で問題解決に導いていただきたく思い、
書き込みいたしました。
<内容>
利益確定に焦点を絞りました。
インディケータに反応しない市場の急激な変化に対応できるよう
段階的に利益確定をしたいのです。
(例としまして+5pips,+15pips,決済 3段階に分けての確定を考えております。)
矢印は値動きを表しています。
上昇 →
下降 ⇒
値動き
①エントリー→+5→シグナル発生(決済)。
②エントリー→+5→+15→シグナル発生(決済)。
③エントリー→+5→+15⇒シグナル(決済)の手前で下降⇒+15で決済。
④エントリー→+5⇒+15の手前で下降⇒+5で決済。
⑤エントリー⇒+5の手前で下降 -15で損切り決済。
(ブローカーで設けている制限内での損切り決済。)
①~⑤全てを実行する決済処理は可能でしょうか。
全然急ぎません。もしよろしければ、慶次さんの手が空いた時で結構ですので
ご教授の検討、よろしくお願いいたします・・・m(_ _)m
えぎさん
こんにちわ!
遅くなりゴメンナサイ^^;
現バージョンでのバックテストでは、他通貨の取引が出来ないようになっております。
デモトレードで取引のテストをしてみてください。
ぶぅーさん
こんにちわ!
+5以上+15未満上昇した時すべてを+5で決済するのは避けて、
③④に【+何pipsまで上昇したら】という条件つきで、できると思います。
その場合、例えば
④エントリー→+8⇒+15の手前で下降⇒+5で決済。
といった感じになるかと思います。
こちらこそ、無理を言いました。
すいませんでした。
そうですか、バックテストでは他通貨の取引が出来ないのですか・・・ちょっと不便ですね・・・。
ご返答、ありがとうございます!^^
返事が遅れてすみません。
④エントリー→+8⇒+15の手前で下降⇒+5で決済。
了解しました。
バックテストでは他通貨の取引が出来ない。
上記の質問にこのように書かれていましたが、121証券はユーロ円を取り扱っているけど、どういった意味でしょうか?これから口座開設予定なので気になりました^^;。EA作ってもエントリーされないことがあるということかな?
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が何度も出てきますが、それぞれどのような意味を表しているか説明文を読んでも理解できませんでした。解説頂けますでしょうか?
うめさん
こんにちわ!
バックテストで他通貨がテストできないというのは、MT4の機能上の問題で、どのブローカーでも同じです。
また、posをマイナスにするのは、ポジションのインデックスが0のものも認識するためマイナスにしてあります。
iは整数変数の宣言をしておりますので、任意の整数と言う感じでしょうか^^;
詳しくは、
完全自動売買への道のりをご覧下さい。
if(SignShift==0 && bar==iBars(NULL,TimeFrame)-1)
回答ありがとうございます。一度じっくり読んでみます。
別件ですが、上記の文でなぜマイナス1しているのか教えて頂けないでしょうか?どうも私はカッコの中のマイナス1、posとかiにものすごく弱いみたいです^^;すぐに1とか2とか代入して考えようとしますが、逆に混乱・・・
追加で質問させて下さい。
プログラム全体を見るとポジション持っている場合から書き始めてますが、とても深い意味があるように感じましたがよろしければ解説をお願いできますでしょうか
うめさん
こんにちわ。
プログラムを読んで、不思議に思ったところがあったら、一度思ったとおりに改造して動かしてみて下さい。
きっと、新しい発見があると思います^-^
ブログを拝見しました。
FXに興味があるので、参考になりました。
また、訪問させて頂きます。
よろしければ、私のブログにもお越し下さい。
※ランキング投票しておきました。
FXマニア
こんにちわ。
ブログみました^-^
投資研究をされているのですね!
がんばりましょうね^0^
慶次さま
お久しぶりです!
いつも丁寧なコメントに感服しています。
今回書かせていただきましたのは、米国FXCMで日本語対応の口座開設サイトができたみたいで、他のブログを見ましても、いまいち評判が書かれていなかったので、もし慶次さんの方で、何か御存知でしたら教えていただきたいと思いまして。。。
^^;
http://www.fx-account.com/
今までODL JAPANを使っていたのですが、相変わらず日足が6本表示されますし、そろそろチェンジしたくなってきました。。
(^_^;)
ちなみに、最近の私はEURGBPのスキャル以外は、いまいちです。。
(-。-)
マーサさん
お久しぶりです!
私もFXCMについてあまり分かりませんが、
安心感はありますよね!
最近のスキャルEAで、ODL等と顧客の関係はギクシャクしている感じですね^^;
ブローカーを使い分けてのいいとこどりするのがいいですね!
慶次さん
こんばんわ
BBands_Stops_mtfでは大変お世話になりました。
今回はバックテストについて教えていだだきたいことがあり
書き込み致しました。
ある期間の値動きについて、時間を指定したバックテストを
手軽に行いたいのです。
どのような事をすれば可能か教えていただけませんか。
(例えば過去6ヶ月22:00~06:00のみの値動き、
30分足についてバックテストを行いたいのです。)
よろしくお願い致します・・・m(_ _)m
慶次さん
問題解決しました・・・(^_^;
お騒がせしました。
お忙しいところ申し訳ありません。最近からFX自動売買の勉強をしている者です。ここで紹介頂いたVQ_EAをダウンロードして試しているのですがインジケータ等はきちんと出るのですが売買が出来ないようでいろいろ調べているのですがどうにも解らず、大変不躾とは思いますが解決方法を教えて頂ければと思い連絡をしました。宜しくお願いします。
山オヤジさん
こんにちわ!
チャートの右上にEAの名前の表示があるかと思いますが、その横にニッコリマークはでてますでしょうか?
返事遅くなり申し訳ありません。横にはニッコリマークが表示されています。
山さん
こんにちわ!
操作履歴などにエラー表示はございませんか?
慶次さんがトレードブースターのミスターFXさんなんですか?
たっくんさん
コメントありがとうございます。
私はミスターFXさんではないですよ^^
発売当初はミスターFXさんに期待してましたが。。。
VQ-EAの件、いろいろな所を参考にさせて頂きなんとか解決しました。今は「インジケーターをEAにする方法」を参考に少しずつですがプログラムを理解できるように頑張ってます。大変お忙しいところ丁寧に返答頂きありがとうございました。また不明なところがありましたらご教授下さい。宜しくお願いします。
・・・ということは、トレードブースターは利益が出なかったということですか?僕も一時期興味がありました。7月は全勝という記事がありましたが・・・。
>山オヤジさん
こんにちわ!
解決できてよかったです!
またご連絡くださいね^^
>たっくんさん
こんにちわ!
トレードブースターは、あのあとの大きな値動きには対応できなかったです^^;
今、バックテストで見ましたら11月前後からだいぶ回復しているようですが・・・。
いつもお世話になりありがとうございます。大変お忙しい中恐縮ですが、不明なことがあり連絡しました。今私は「BBand_Stops_EA」に悪戦苦闘しておりますが、インディケーターの各インデックスの動きとバー(値)の動きに多少の誤差があるような気がしています。出来るだけバーの動きに近づけるような調整が出来るのでしょうか?また出来るとしたらどこを変更したらよいか教えて頂けないでしょうか。
それともう一つはiCustom関数の事についてですが、iCustom(通貨ペア,時間足,インディケータ名,,・・・,インデックス,バーシフト)とありますが「・・・,」部分は入れるのでしょうか?
私は、iCustom(Null,TimeFrame,”BBands_Stops_mtf”,0,Length,Deviation,2,SignShift)
としています。ご指摘頂ければありがたいです。
面倒な事をお聞きして申し訳ありませんが宜しくお願いします。
山オヤジさん
こんにちわ!
SignShiftを1にすると、1本前のバーの値を取得します。0にすると現在のバーの値を取得できます。
「・・・,」部分は省略可です。
iCustom関数の書き方も問題ないと思います^-^
慶次さん
早速の返事ありがとうございます。早速試してみようと思います。お忙しいのに大変恐縮です。今後とも宜しくお願いします。
慶次さんは250の技が発売される前の2007年からEA作成代行サービスをされてるそうですが、どうやってMQLを勉強したんですか?元々理系でC言語のプロなんですか?興味深々です。僕は250の技で勉強しているところです。
たっくんさん
こんにちわ!
EA製作代行サービスは2008年の後半からですよ^^
もともと理系ではありますが専門は物理系で、プログラム経験はエクセルのVBAを少し(ホント少し)触ったことがあるくらいでした^^;
過去、C言語は1行目から挫折しました・・・-_-;
MQLは楽しくてワクワクで!!
それですね!
実は、私が覚え初めに飛躍的に上達したと実感できた勉強法があるのですが、またの機会に^^;
今はMQLの学習環境がよいですので勉強しやすいと思います。
がんばりましょうね^-^
又質問させて下さい。すいません。さっそくプログラムを組んでみたんですね。無事error0でcompileできたんですが、mq4ファイルのままでex4ファイルになりません。どうしたらいいんでしょうか・・・?
色々いじってたら無事ex4ファイルできました。綺麗な右肩下がりでしたが・・・。
たっくんさん
無事ex4ファイルができてよかったです^^
私も最初はきれいな右肩下がりのEAばかり作ってました^^;
がんばりましょうね!
今現在の慶次さんの自作EAの最も高いPFっていくつぐらいなんですか?それを目標に頑張ります!
慶次さん
いつも参考になるアドバイス頂きありがとうございます。「BBand_Stops_EA」の方は試行錯誤しながらですがデモ実行中です。今回は「VQ_EA」のことでどうしても解らずお尋ねしました。インディケータで売買のシグナルがでますが実際の売買は1つ後のバーで実行されます。前回はSignShiftの1,0の変更で出来ると教わりました。これにはそれらしきものがありません。どこで変更するのか、更にそのバーの始値で売買するにはどうしたらよいかご伝授頂ければと思います。いつも勝手な質問ばかりで申し訳ありませんが宜しくお願いします。追伸、MQLの学習参考にさせていただきます。ありがとうございました。
たっくんさん
こんにちわ!
PFを求めるEAならとんでもない数値のものができるのですが、実用的ではないものになってしまいます^^;
私の場合は、PFが1.6~2.3程度でフォワードテストするようにしております。
山オヤジさん
こんにちわ!
VQ_EAのパラメータ、TradeAtCloseBarをfalseにするとシグナルと同時にトレードするようですね。また、シグナルが出るのはバー形成中ですので、始値で売買はできません。(始値でシグナルが出たとき以外)
慶次さん
早速連絡頂きありがとうございます。変更してデモ実行中です。お忙しい中申し訳ありませんでした。また宜しくお願いします。
山オヤジさん
こんにちわ!
また何かありましたらご連絡くださいね^^
返り値が想定外なのですが?
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);
}
どなたかご伝授宜しくお願い致します。
初心の心さん
こんにちわ!
iCustom関数でTimeFrame,Length,Deviationの部分は、
インディケータBBands_Stops_mtfのコード内でexternがついているものに代入されます。
3つのパラメータにはexternはつけてありますか?
慶次様
驚きました!
こんな早々にご返答いただきありがとうございます。
はい、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”;
初心の心さん
iCustom(NULL,TimeFrame,”BBands_Stops_mtf”,0,Length,Deviation,2,0);
としても同じでしょうか?
慶次様
ありがとうございます。
やはり、”-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);
}
宜しくお願い致します。
慶次様
早々のご返答ありがとうございます。
当方なりに別の角度で考えてみました。
1)MT4自身のインストール等、設定が何か抜けている?
※俗にいう標準インストールで、以外の設定は特にしていない。
2)BBands_Stops_mtf自身は、インジケータとしては稼動していますが、
EA化する場合になにがしらの設定がありそれを抜けている?
※慶次様が提供していただいたBBands_Stops_mtfのみダウンロード。
初心の心さん
open prices onlyだと始値の時点でシグナルが発生していないと-1を返すかと思います。
慶次様
ご対応ありがとうございます。
ちなみに、”Every tick”でも結果は、”-1”で同じなのですが、この場合の対処方法はどの様になるのでしょうか?
慶次様
ご対応ありがとうございます。
すみません。
言葉が正確ではなかったですね。
検証方法として、EA上で、”open prices only”及び、”Every tick”を使用して、iCustom関数で、一番シンプルに、BBands_Stops_mtfの返り値を確認する為には、どの様なロジックのソースを書けば表示される様になるのしょうか?
当方といたしましてはこれで、確認出来ると考えていたもで、現状理解出来ておらず、申し訳ありません。
初心の心さん
「以下は以前からあった2箇所のみの値です。
※正確には、値があるのはこの2箇所のみです。」
とは、変更後のことでしょうか?
でしたら、正常に確認できていると思います。
そうでなくて、すべて-1になっている場合は、ロジックではなくほかに原因がありそうです。
慶次様
ご迷惑をおかけいたしております。
2箇所のみとは、初期状態の時から出ていた情報で、変更前から出ていた情報です。
これが正しいのでしょうか?
だとすれば、今ひとつ理由が理解出来ていません。
あと、違う意味でお聞きしたいのですが、5分足のテストでありながら、その5分間に何十回と無く情報が出力されるのはなぜなのでしょうか?(場合によっては、数値がかわるのでしょうか?)
単純に考えて、5分足での計測なのだから、5分間に1度なので、その5分間は同じ値が出るだけと考えていますが、根本的な考え方合ってますでしょうか?
初心の心さん
>5分足のテストでありながら、その5分間に何十回と無く情報が出力されるのはなぜなのでしょうか?
EAは時間足に関係なく、レートが動くたびに作動します。
5分間に100回レートが動いたら100回出力されます。
>(場合によっては、数値がかわるのでしょうか?)
始値の時点ではシグナルがでていなくて、バー形成中にシグナルが出た場合、出力の数値は変わります。
慶次様
ご対応ありがとうございます。
どうも動きが不安定の様ですので、一度アンインストール後、クリーンインストールを行い、再確認してみます。
又、プログラムの動き方自体を改めて考え直してみます。
考え方の間違いで、大変ご迷惑をおかけしている可能性が高い様ですので。
このような未熟者に対して、ご丁重にご対応いただき、ありがとうございます。
又、改めまして宜しくお願い致します。
ご迷惑をおかけいたしました。
20pipsで損切りして(121の場合)、損切りと同時に
20pips上で買いの逆指値ってできないんでしょうか?
できたら飛躍的に成績が向上しそうです。
慶次様
お久しぶりです。お忙しいところ申し訳ありません。私先日より「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;
大変お忙しいところ恐縮ですが宜しくご教授おねがいします。
山オヤジさん
こんにちわ。
シグナルが出ていないときの値は
インディケータごとに違いますので
NoSignValueを-1からEMPTY_VALUEにすると
よいかもです^^
慶次さんこんばんは。
【BBands_Stops_mtf】インジケータのEA化の解説ついでにといっては何ですが..
【BBands_Stops_mtf】インジケータを改造して、アラートにメール送信機能を追加するには、どのようにしたらよいでしょうか?
本来は有償になりそうな、ご相談なんで、どうかとは思ってしまいますが..
また、どなたかご存知な方がいらっしゃいましたら、ご教授頂けましたら幸いです。
PS
不適切な書き込みでしたら、削除願います。m(_ _)m
慶次様
本日から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);
}
}
}
}
}
以上です
すいません!
池田さん
コメントありがとうございます。
2つめのOrderCloseで既にエグジットされているポジションをクローズしようとしているのではないでしょうか・・・。
慶次さま早速の返答有難うございました。でも意味が解りません!お手数おかけしました。もう少し理解できるレベルになったら質問します。
池田さん
よーく見たら、ポジションありの時、ポジション無の時、
の場合わけがされていません^^;
こんには慶次様
上記の部分を修正したところエラーが無くなりました!有難う御座います!
ところでVQSimpleDePSforTestのファイルでテストしようと思っていますが、時間と通貨のチャートは何が良いのでしょうか?
何時も質問ばかりですいません宜しくお願いします。
池田さん
エラーがなくなりよかったです^^
VQSimpleDePSforTestはいろいろ試してみてください^^;
初めまして。門と申します。
長文で申し訳御座いません。
最近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の値に常に入っている状態ですが、
何故青と赤の表示が切り替わるのでしょうか?
こんな初歩的な質問で申し訳御座いませんが、
何卒宜しく御願い致します。
門さん
こんにちわ!
SYMBOLは、文字列変数ですね?
バックテストでは、他通貨ペアの他時間足で現在の高値安値を取得しようとすると、
始値が返ってきます。
そのあたりで、食い違いがあるかもです^^;
まずは、実行する通貨ペアと時間足で検証してみてください。
2点目ですが、
インディケータのDRAW_HISTOGRAMは、チャート上に表示させる場合と、
サブウィンドウに表示させる場合の仕様が違うようです^^;
チャート上に表示させる場合は、2つで1セット、重なった部分を描画しないといった感じ
になります^^
たぶんです・・・^^;
さっそくのコメント有難う御座います!
記載忘れてました申し訳御座いません。
SYMBOLは”EURUSD”でインディケータで表示している対象通貨や時間足(30分)も食い違いはありません。
その他にもMaPeriod、MaMetodの値も同一です。
> 重なった部分を描画しないといった感じになります
ここの判断はどうすれば良いのでしょうか?
ようは重なって上に描画されている色を抽出したいのです。
因みにバックテストとはiCustam関数を使用しての値を取得したと云う事でしょうか?
大変申し訳御座いませんが御教授の程お願い致します。
門さん
こんにちわ!
>ようは重なって上に描画されている色を抽出したいのです。
門さんのコードで特に問題ない気がします。
iMA(SYMBOL, PERIOD_M30,
を
iMA(NULL,0,
に変えてみてください。
また、Print関数などで内部の変数を出力すると、
原因がわかったりします^^;
慶次さん 初めまして
BBand_StopsEAを探して、こちらにたどり着きました。
MT4が600系になったせいか、インディケーターBBands_Stops_mtf
がチャートに表示されません。
コンパイルすると
erroer(s)6,1warning(s)
と表示されます。
お忙しい中、申し訳ありませんが、表示出来る様に
改造していただけないでしょうか?
宜しくお願いいたします。
河野
河野さん
こんにちは。
詳しく調べますので
http://www.dr-ea.com/contact/
よりご連絡ください。