某証券会社でGOGOJANさんのサイトで作成したEAを運用したところ、エントリー条件を満たしているにも関わらず、エントリーしなかったため、ChatGPTに質問してみたところ、標記のコードにより、証券会社毎にEA初期化のタイミングが違うために、EAをMT5に貼った瞬間にfalse判定がででしまうため、準備の瞬間にコードチェックが引っかかっていると回答を得られました。
それにつきまして、if(IsTradeAllowed()==false){}をコメントアウトしてEAを運用させようと思うのですが、なにかアドバイスや補足説明など頂けないでしょうか。
また、if(IsTradeAllowed()==false){}に問題はなく、別の原因も考えられますでしょうか?
MT5のビジュアルモードでの動作は確認済みです。
| 検索結果がありません。 |
| 検索結果がありません。 |
ご質問の件について、結論から申しますと、今回のエントリーしなかった原因は「IsTradeAllowed()==false」よりも、「フィリングモード(FillingMode)」に起因する可能性のほうが高いと考えられます。
以下に両方のポイントをまとめます。
1. IsTradeAllowed() について
if(IsTradeAllowed()==false){}のチェックは、**「EA が現在の環境で発注可能か」**を確認するための安全装置です。
ただし、証券会社によっては以下のようなことが起こります:
そのため、このチェックが原因で発注できないケースはあります。
ただし、EA 全体の安全性のためには、本来は残しておくのが推奨です。
そのため、完全に削除するのではなく、
**「初期化直後だけ判定しない」「必要なタイミングだけ使う」**などの改善のほうが安全です。
2. FillingMode(フィリングタイプ)による注文拒否のほうが有力
MT5 では、注文送信時に type_filling(フィリングタイプ) をブローカー仕様に合わせる必要があります。
多くの EA 自動生成ツール(GogoJungle や EA つくーる含む)では
デフォルトで ORDER_FILLING_FOK が設定されているため、
ブローカーが IOC のみ対応の場合、注文が通らずエントリーしない現象が普通に起こります。
よくあるブローカー仕様
証券会社により違うため、この判定は非常に重要です。
対応コード例(推奨)
このコードを追加しないと、
ビジュアルモードではエントリーできるのに、リアル環境ではエントリーしない
という典型的な症状が発生し得る可能性がございます。
つきましては、コードの追加をお試しいただきたく存じます。
ご教授頂きありがとうございます。
大変恐縮ですが、どこに2.FillingMode(フィリングタイプ)の対応コードを追加すればよろしいでしょうか??
まずは前回のご質問の続きとして、「FillingMode(フィリングタイプ)の判定コードを、EA内のどこに書けばよいか」という点について整理します。
1. 追加する場所の基本的な考え方
ポイントはとてもシンプルで、
に
type_fillingを設定する、というイメージです。多くのMT5 EAは、以下のどちらかのパターンになっています。
MqlTradeRequest/OrderSend()を直接使うパターンCTradeクラス(trade.Buy()/trade.Sell())を使うパターンそれぞれの場合の「追加位置」を例で示します。
2.
MqlTradeRequest/OrderSend()を使っている場合EAのソースの中に、次のようなコードがないか探してみてください。
このような構造になっている場合は、
request.type_fillingを固定値で書かずにOrderSend()を呼ぶ前で、ブローカーの FillingMode に応じて設定するように書き換えます。
具体例は次のようになります。
つまり、
OrderSend()を呼ぶ直前」request.type_fillingを設定している(または設定すべき)場所」に、上記の
FillingMode判定を差し込むイメージになります。もし、現在のコードが
のように「1行だけ固定」で書かれているようでしたら、その1行を上の if 文ブロックに置き換えてください。
3.
CTradeクラス(trade.Buy()/trade.Sell())を使っている場合EAのソース内に、次のようなコードがあるパターンです。
この場合も考え方は同じで、
に FillingMode を見て、
CTradeのフィリングタイプを設定します。例:
もし EA 内に
CTrade trade;という宣言があり、trade.Buy()/trade.Sell()で発注しているようでしたら、このように「発注前に1回 SetTypeFilling を呼ぶ」形で対応するのが分かりやすいです。4. IsTradeAllowed() のコメントアウトについての補足
前回お伝えした通り、
if(IsTradeAllowed()==false){ ... }が「本当に原因」の場合もありますが、そのため、
という順番で切り分けていただくほうが、安全です。
IsTradeAllowed()を完全にコメントアウトしてしまうと、「そもそも取引できない環境」でも EAが無理に注文を出そうとしてしまうため、安全装置を外すことになります。
そのため、
IsTradeAllowed()の条件の位置やタイミングを見直す(EA開始直後だけ判定しない/一定時間後に再チェックする等)という方向で調整するほうが、トラブルは少なくなります。
5. もし EAつくーる で作成したMT5 EAに同じ問題が出た場合
今回のご質問は GogoJungle さんのEAとのことですが、参考として EAつくーる製 MT5 EA で同じ現象が出る場合は、
Tkool.mqh内でOrderSendまたは内部のラッパ関数)がまとまっている箇所に、上記と同じ「FillingMode による
type_fillingの切り替え」を追加する形になります。ただし、
Tkool.mqhは共通ライブラリですので、編集する場合は「バックアップを取ってから」「他のEAにも影響する可能性がある」点にご注意ください。まとめると、
OrderSend()またはtrade.Buy()/Sell()を呼ぶ直前」SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE)を見てtype_fillingを切り替えるというイメージで探していただければ、目的の位置にたどり着けるはずです。
大変ご丁寧に説明してくださってありがとうございます。
少し考えてみます。
本当にありがとうございました。