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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

1255閲覧

楽天MT4でのエントリーオーダーエラーについて。

Tanichael

総合スコア0

MQL4

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/08/14 08:09

前提・実現したいこと

楽天のMT4でEAを作成しようとしております。

エントリーの判断基準として、
「五分間足のひけがボリンジャーバンドの上のラインを超えた際、あるいは五分間足のひけがボリンジャーバンドの下のラインを下回った際」
に成り行き注文を行いたいのですが、エントリーオーダーをした際にエラーコード130がでてしまい、注文ができません。

ストップ、リミットの値がストップレベルを下回ってしまっているのかとおもい確認してみたのですが、楽天のMT4はストップレベルが0であり、そうでもないようです。

なぜこのようなエラーが出てしまうのでしょうか。どなたか教えていただけましたら幸いです。

発生している問題・エラーメッセージ

DemoEA2 USDJPY,M5: OrderSend error 130

といったようなものです。

該当のソースコード

mql4

1 2GetPositionInfo関数は直前のポジションのデータを得る関数です。直前のポジションが決済済みであれば、新たにポジションを登録し、そうでなければエントリーできないという仕様です。 3 4ENUMがついた部分は判断基準となる変数です。 5 6ソースコード 7enum ENUM_ENTRY { 8 ENTRY_NO = 0, 9 ENTRY_OVER, 10 ENTRY_UP, 11 ENTRY_DOWN, 12 ENTRY_UNDER 13}; 14 15 16bool EA_EntryOrder( 17 ENUM_ENTRY in_long 18) { 19 bool ret = false; 20 double order_lot = _MinLot; 21 int order_type = OP_BUYSTOP; 22 double order_rate = Ask + Point(); 23 24 if(in_long == ENTRY_UP) { 25 order_type = OP_BUYSTOP; 26 order_rate = Ask + Point(); 27 28 } else if(in_long == ENTRY_DOWN) { 29 order_type = OP_SELLSTOP; 30 order_rate = Bid - Point(); 31 32 } else if(in_long == ENTRY_OVER) { 33 order_type = OP_BUY; 34 order_rate = Ask; 35 } else if(in_long == ENTRY_UNDER) { 36 order_type = OP_SELL; 37 order_rate = Bid; 38 } 39 40 order_rate = NormalizeDouble(order_rate, Digits); 41 42 43 44 int get_order_type; 45 double set_limit_rate = 0; 46 double set_stop_rate = 0; 47 double entry_rate; 48 double limit_offset; 49 double stop_offset; 50 51 entry_rate = order_rate; 52 get_order_type = order_type; 53 54 double atr = iATR( 55 Symbol(), 56 Period(), 57 7, 58 1 59 ); 60 61 limit_offset = atr * 0.3; 62 stop_offset = atr * 0.2; 63 64 if(get_order_type == OP_BUYSTOP) { 65 set_limit_rate = entry_rate + limit_offset; 66 set_stop_rate = entry_rate - stop_offset; 67 } else if(get_order_type == OP_SELLSTOP) { 68 set_limit_rate = entry_rate - limit_offset; 69 set_stop_rate = entry_rate + stop_offset; 70 } else if(get_order_type == OP_BUY) { 71 set_limit_rate = entry_rate + limit_offset; 72 set_stop_rate = entry_rate - stop_offset; 73 74 } else if(get_order_type == OP_SELL) { 75 set_limit_rate = entry_rate - limit_offset; 76 set_stop_rate = entry_rate + stop_offset; 77 78 } 79 80 set_limit_rate = NormalizeDouble(set_limit_rate, Digits); 81 set_stop_rate = NormalizeDouble(set_stop_rate, Digits); 82 83 84 int ea_ticket_res = -1; 85 ea_ticket_res = OrderSend( 86 Symbol(), 87 order_type, 88 order_lot, 89 order_rate, 90 100, 91 set_stop_rate, 92 set_limit_rate, 93 "テストEA", 94 MAGIC_NO, 95 0 96 ); 97 if(ea_ticket_res != -1) { 98 GetPosiInfo(_StPositionInfoData); 99 ret = true; 100 } else { 101 int get_error_code = GetLastError(); 102 string error_detail_str = ErrorDescription(get_error_code); 103 104 printf("[%d]エントリーオーダーエラー。エラーコード=%d エラー内容=%d", __LINE__, get_error_code, error_detail_str); 105 106 } 107 return ret; 108} 109 110void JudgeEntry(ENUM_BAND in_band) { 111 bool entry_bool = false; 112 ENUM_ENTRY entry_long = ENTRY_NO; 113 114 if(in_band == BAND_UP) { 115 entry_bool = true; 116 entry_long = ENTRY_UP; 117 } else if(in_band == BAND_DOWN) { 118 entry_bool = true; 119 entry_long = ENTRY_DOWN; 120 } else if(in_band == BAND_OVER) { 121 entry_bool = true; 122 entry_long = ENTRY_OVER; 123 } else if(in_band == BAND_UNDER) { 124 entry_bool = true; 125 entry_long = ENTRY_UNDER; 126 } 127 128 GetPosiInfo(_StPositionInfoData); 129 130 if(_StPositionInfoData.ticket_no > 0) { 131 entry_bool = false; 132 } 133 134 if(entry_bool == true) { 135 EA_EntryOrder(entry_long); 136 } 137} 138 139----------------------------------------------------------------------- 140 141 142### 試したこと 143 144上記のコードのset_limit_rate、set_stop_rateを大きな値に変えてみました。 145その結果、エラーが出る頻度が大幅に減少しました。 146 147このことから、ストップレベルに引っかかっているのかなと推測したのですが、ストップレベルは0であることを知り、途方に暮れてしまいました。 148 149### 補足情報(FW/ツールのバージョンなど) 150 151楽天のMT4を使用しております。

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

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

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

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

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

guest

回答1

0

OrderSendしたときに、実際のレートが変わっていてエラーになっている可能性はないでしょうか。
エラーが出たらRefreshRatesを呼び出し、何回かリトライしているコードをよく見かけます。

投稿2020/08/14 16:24

mah

総合スコア591

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

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

Tanichael

2020/08/22 07:15

ご返信大変遅くなり申し訳ございません。 ご回答誠にありがとうございます。 ご回答を拝見し、試してみたのですが、設定した試行回数分OrderSendしたあと結局sendされておりませんでした。 ほかの点を見直してみようかと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問