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

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

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

MQL(Meta Quotes Language)は、Meta Trader4(MT4)で用いられるプログラミング用語です。MQLによりEAやインジケーターの作成が可能。C言語で書かれているため、C言語の知識があれば簡単に扱うことができます。

Q&A

解決済

1回答

2745閲覧

OrderSendで成行した後にSLTPをModifiedする

Fetherion

総合スコア60

MQL

MQL(Meta Quotes Language)は、Meta Trader4(MT4)で用いられるプログラミング用語です。MQLによりEAやインジケーターの作成が可能。C言語で書かれているため、C言語の知識があれば簡単に扱うことができます。

0グッド

1クリップ

投稿2020/09/23 03:09

現在、ある条件において注文を出すということを行い、その後SLTPをセットするという流れでやっています。
Entry注文に関しては成行となり、カウントダウン方式の為、同時に設定ができない(らしい)ので、Entry後にModifiedする流れになっています。

全体的な流れをコードで書いていきます。

MQL

1//Property 2long order_magic = 11111; 3double input_sl = 0.3; 4double input_tp = 0.6; 5int select_hour = 3; 6int select_min = 00; 7datetime timeLimit = 0; 8 //他にもありますが、とりあえず、、、 9 10//Expert tick function 11void OnTick() 12{ 13 //時間関係 14 datetime tm = TimeCurrent(); 15 MqlDateTime stm; 16 TimeToStruct(tm, stm); 17 18 //条件として、指定した時分の時だけ処理を行います 19 if(select_hour == stm.hour && select_min == stm.min && timeLimit < tm) 20 { 21  //まぁいろいろちょっと値の取得なりなんなりがありますが、、、それらが終わって 22 23  //Entry注文 24  MqlTradeRequest request = {0}; 25  MqlTradeResult result = {0}; 26 27  //いろいろ設定していきますが、省略させていただきます。 28  request.action = TRADE_ACTION_DEAL; 29   30  //OrderSend 31  if(!OrderSend(request, result)) { //Error表示 } 32 33  //時間を空けます(すぐにやるとどうもうまくいかなかったので) 34  Sleep(3000); //3秒 35 36  //現在のポジション✓を行います 37  int total = PositionsTotal(); 38 39  //forで回しながら一つずつ条件判定を行います 40  for(int i = 0; i < total; i++) 41  { 42   ulong position_ticket = PositionGetTicket(i); 43   ulong magic = PositionGetInteger(POSITION_MAGIC); 44   double sl = PositionGetDouble(POSITION_SL); 45   double tp = PositionGetDouble(POSITION_TP); 46 47   //もしも、Entry時のマジックナンバーが一致し、そのSLとTPが設定されていなかったら、SLTPをセットする 48   if(magic == order_magic && sl == 0 && tp == 0) 49   { 50    double price = PositionGetDouble(POSITION_PRICE_OPEN); 51     52    //SLとTPの設定 53 54    ZeroMemory(request); 55    ZeroMemory(result); 56 57    //パラメータを設定して 58 59    if(!OrderSend(request, result)) { //Error表示 } 60   } 61  } 62  //timeLimitの設定 63  timeLimit = tm + 120; 64 } 65}

省略しながら書きましたが、とりあえず、基本的には動作確認はしまして、実際に動作しています。

しかし、ある条件においてはSLTPがModifiedできない状況があります。
###エラーに関して
基本的に表示されるエラーは「Invalid Stops」ということで、Entryして3秒後の価格が設定したいSlまたはTPに近すぎてSetできないという状況なのかなと、認識しています。

では、このエラーに対してどういうアプローチがいいのか?を考えています。

例えば、A通貨ペアにおいて、現在の価格から0.054離れていないと注文ができないという状況だとします。
設定したい値はEntry時の価格から0.1の場所とします。
1.
Entry価格=100.000円
設定したいSL又はTP価格=100.100円
Entry後3秒後の価格=100.060円

2.
Entry価格=100.000円
設定したいSL又はTP価格=100.100円
Entry後3秒後の価格=100.060円
その後100.010円とかになった時

3.
一瞬で動いて、そもそも3秒後には100.100円まで到達していた時


SLTPでError表示の部分に関して、そうなった場合、価格の監視をスタートして、設定した値に到達した場合は成行決済?
到達せずに設定できるポイントまで価格が変わったら再度SLTP?

どのようにアプローチされているでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

OrderSend()の前にSLTP共にストップレベル以上に調整する必要があると思います。
MarketInfo(Symbol(), MODE_STOPLEVEL) // MQL4の場合

時間経過でのレート変動でエラーになる場合、
最新レートを基準にストップレベルに対応しなければならないので、
RefreshRates()で最新レートを取得してから
BidまたはAskにストップレベルを加味した値をSLTPに設定しないとオーダーは通らないと思います。
エントリー価格でない点に注意です。

for内でSleepがないので変更注文に一度失敗した後は全て連続注文的なエラーになりそうです。
変更注文を成功してもforを抜けられないのでその辺も必要かと。
同じポジションへのforだと勘違いしていました。
自分はOrderSend()する箇所をforで囲んでストップレベルエラーの時だけ最新レートでストップレベル調整して再OrderSend()しています。
この場合、SLが調整されるケースが発生すると想定損失額と差が生じる原因になるので、
SLの調整を許容できない場合はそれなりの処理が必要です。

MQL5だと思いますがMQL4とはエラーメッセージが異なる様なので、
エラーメッセージと共にエラーコードなど合わせてもらえると問題を特定しやすいかなと思います。

投稿2020/09/23 14:49

編集2020/09/23 16:01
buibui80

総合スコア1033

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

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

Fetherion

2020/09/25 00:18

返信遅くなりました。 当然と言えば当然ではあるでしょうが、やはりそういう形が綺麗でしょうかね。 例えば、Errorが出たらmodifiedできなかったよという形でbool modified = false;みたいなのを用意し、 Tickで、if(!modified){設定したかった価格を超えたので決済}っていう形もアリなのかな?と思ったのですが、どうでしょうか?
buibui80

2020/09/25 00:56

運用の方針によると思いますが、自分の場合は必ずSL注文を完了させます。 ストップレベルエラー時はSL値を調整してでもSLの変更注文を完了した上で、 OnTick()で決済ロジックを組んでプログラム的にも決済をさせます。 急な値動きで決済ロジックの決済に遅延や失敗が発生したり、 MT4のクラッシュやネットが不通になって決済ロジックが機能しないケースを回避する目的があります。
Fetherion

2020/09/26 03:28

ありがとうございます! SLを完了させる、、、これはやはり大事ですよね。せっかくのものがそれで台無しになってはどうにもなりませんしね。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問