質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

Q&A

解決済

2回答

9845閲覧

このEA(MQL4)がたまに注文を連打してしまう理由をお教えください。

teityura

総合スコア84

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

0グッド

2クリップ

投稿2017/08/13 17:50

1分足のチャートで、ボリンジャーバンドの上抜き(下抜き)でエントリーするEAを作成しようとしています。

エントリーは
1.2本前の終値がバンド(-2σ)より下
2.1本前の終値がバンド(-2σ)より上
の条件を満たした足で、1回だけ注文をして、ポジションを1個だけ保有させたいです。
しかし、同じ足で複数回エントリーしたり、ポジションを複数個保持したりしてしまいます。
この原因を知りたいです。

OrderSend()は戻り値として、成功すれば整数で約定番号を、失敗すれば-1を返すようなので、Ticket=0をグローバル変数で宣言し、チケットが1以上なら、注文するようにすればいいと思います。
if(Ticket >= 1) { OrderSend(...) }

ですが、もしMT4をなんらかの理由で閉じてしまい、ポジションを保有していたら、終了前に記憶していた約定番号を忘れてしまい、正常に動作しないという問題が発生するようなので、本EAによる成行注文をforループで見れば、MT4を閉じてしまって、もう一度開いた状態でも売買を再開できると思い、下記のようなコードにしています。

MT4を終了してしまっても、再度開いて問題なく動作させたい場合、どのような処理にするのがよいでしょうか。

MQL4

1//マジックナンバーの定義 2input int MAGIC = 4649; 3input string COMMENT = "BB2"; 4 5//パラメーターの設定 6extern double Lots = 0.1; 7extern int Slip = 6; 8extern double tp_width = 20.0; 9extern double sl_width = 10.0; 10 11//BBのパラメータ 12extern int BB_Period = 20; 13extern int BB_Shift = 0; 14extern double BB_Deviations = 2; 15extern int Applied_Price = PRICE_CLOSE; 16 17int OnInit() 18{ 19 return(INIT_SUCCEEDED); 20} 21 22void OnDeinit(const int reason) 23{ 24 //--- 25} 26 27void OnTick() 28{ 29 double bb_middle_0 = iCustom(NULL,0,"Bands",BB_Period,BB_Shift,BB_Deviations,0,0); 30 double bb_middle_1 = iCustom(NULL,0,"Bands",BB_Period,BB_Shift,BB_Deviations,0,1); 31 double bb_middle_2 = iCustom(NULL,0,"Bands",BB_Period,BB_Shift,BB_Deviations,0,2); 32 double bb_upper_1 = iCustom(NULL,0,"Bands",BB_Period,BB_Shift,BB_Deviations,1,1); 33 double bb_upper_2 = iCustom(NULL,0,"Bands",BB_Period,BB_Shift,BB_Deviations,1,2); 34 double bb_lower_1 = iCustom(NULL,0,"Bands",BB_Period,BB_Shift,BB_Deviations,2,1); 35 double bb_lower_2 = iCustom(NULL,0,"Bands",BB_Period,BB_Shift,BB_Deviations,2,2); 36 37 int Ticket = 0; 38 for(int i=0; i<OrdersTotal()-1; i++) 39 { 40 if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false){ 41 Print("OrderSelect returned the error of ",GetLastError()); 42 }else{ 43 //適用したEAのマジックナンバー以外か、通貨ペア以外か、成行注文以外なら次のループへ 44 if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol() || OrderType()>=2) continue; 45 Ticket = OrderTicket(); 46 Print(Ticket); 47 break; 48 } 49 } 50 51 //イグジット注文 52 if(Ticket > 0){ 53 if(OrderSelect(Ticket,SELECT_BY_POS,MODE_TRADES) == false){ 54 Print("OrderSelect returned the error of ",GetLastError()); 55 } 56 if(OrderType()==OP_BUY){ 57 if(bb_middle_0 <= Close[0]){ 58 bool Closed = OrderClose(Ticket,Lots,Bid,Slip,clrRed); 59 } 60 }else if(OrderType()==OP_SELL){ 61 if(bb_middle_0 >= Close[0]){ 62 bool Closed = OrderClose(Ticket,Lots,Ask,Slip,clrBlue); 63 } 64 } 65 } 66 67 //エントリー注文 68 if(Ticket <= 0){ 69 if(bb_lower_2>Close[2] && bb_lower_1<Close[1]){ 70 Ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,0,COMMENT,MAGIC,0,clrRed); 71 }else if(bb_upper_2<Close[2] && bb_upper_1>Close[1]){ 72 Ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,0,COMMENT,MAGIC,0,clrBlue); 73 } 74 } 75}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

同じ足で複数回エントリーしたり、ポジションを複数個保持したりしてしまいます。

→OnTick()が原因です。
OnTick()がどういうものか調べてください。
このロジックはほぼ毎回、複数個保持するロジックになってると思います。
(解決策例)グローバル変数で、1つ前の時間を保持しておき、時間が変わったら、購入する 等のロジックが必要です。

MT4を終了してしまっても、再度開いて問題なく動作させたい場合、どのような処理にするのがよいでしょうか。

→詳しく見ていませんが、やりたい事を察するに、
「//イグジット注文」の部分を
break;のところに入れれば解決ですかね?

投稿2018/05/01 08:34

tomari_perform

総合スコア760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コードを見る限りだとチケットの注文数の上限が宣言されてないように見えます。
エントリー注文で[もし、1回エントリーしてるならばエントリーしない]と言った感じでコードを書くと改善すると思います。

投稿2017/12/12 18:32

junnnn

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問