打倒[Too many requests]~僕が2,3回ほど注文することにした訳~
それは一昨日起こった。何気なく寝る前にMT4の様子を見に行ったら
Too many requestsでポジションが立っていなかった。
ログを見るとどうも同時に注文がなされたため
GBPUSDのリクエストは破棄された模様。
そういえばMT4は同時に注文ができなかった、
1/1000秒で他EA同士がバッティングした場合片方は無視されるのだ。
そういうのも回避するようにいずれしておこうでそのまま忘れていた。
もともと知っていたはずのものをおもいっきり失念してここに至るわけだが。
人間の能力の限界を再確認して更に気を引き締めていくべきタイミングなのだろう。
こなれてきた時に事故は起こる。
さて、こいつを再現するところから始めないといけないだろう。
まずはメインで使ってるところのデモ口座を用意する。
デモトレードお申込み | デモトレード | FXCMジャパン証券
そもそもfxcmのデモ口座俺持ってなかったんだって自分で驚愕している。
相当な数のデモ口座を開いた気がするのだが途中で一ヶ月縛りのところは試さなくなったんだっけ?
まあいい
開設完了。ちなみに今回も作業しながら同時進行でブログを記している。
それでは[Too many requests]を再現するためのEAの作成に移る。
難しいことはできないしやる気もないのでティックが更新されるたびに
最小単位で買いポジションを建てるようにして
それをチャートの数を徐々に増やして[Too many requests]を引き起こしやすくしてみる。
あとでポジションクローズでも引き起こしてみたいがまずは1つずつである。
magicはいらなそうなのでなしで(使わないと0が入ってあるはず)。
というか2行だけ記入でいいな。lotsすら0.01で問題ないので一行でもいける。
さて同時起動してみましょう。
案外簡単に(EA2つで)再現出来て拍子抜けですが、
逆にリアルでも簡単に起こることということです。
わりかしアホな状態でEAを動かしていることがわかったのでさっさと修正したい。
しかし地道にやっていきましょう。
まずはこのEAをもう一度ポジションを建てようと試みるEAに変えていきます。
mt4 (MetaTrader4)使い倒シストレError codes (エラーコード)
GetLastError()の間違った使い方…。 - とあるMetaTraderの備忘秘録
この辺を参考にして。
そしてもう一度起動。
コメントにB2が無いので失敗です。sleepを追加して、
あとわかりにくいので2回め(失敗後)は売り注文することにします。
やはりだめ40行目が思った処理になってない気がするので
プリント関数でもって文字を表示させてみる。
さてエキスパートの窓を見に行く
あれ?err=8ではなく141だ。
その上の4109はたぶん売買を許可しない場合のやつティックが更新されるたび量産されているだけ。
上のリンクで再度確認に行くとなんと同じ[Too many requests]が8と141に!!!
なんだそれ。
まあいい8か141でもう一度注文することにした。スリープも排除。
できたのがコレ
レッツトライ
おお、出来ました。
次は決済でも引き起こします。次のEAは1行。
閉じるためのポジションはさっきの実験で使ったポジションで、無くなる前にけりをつける。
どうやら勝手にその辺のチケット番号(0)が収納されているようではないのだな。
わかったよ選びますよ。
ここでEAを分別する必要が出てきた、別々の注文がバッティングした場合をしらべたいのでチケットを分ける必要がある。
ここでは0と1にした。
さあやろう
出たには出たが一度しか再現できなかった、どうやらクローズ注文の方は
わりかし制限が緩いようである。これってスキャルピングの時に応用できそうな?仕様だよね。
このように同時刻で通っている。
ダメだったやつ
なんら変わらないので他(同時刻以外)の条件で弾かれたようだ。
ということでOrderSendの周りだけ[Too many requests]で2から3回ほどリトライする実装をしていくことにする。
このへんでしっかりしないとバグを生み出して損失がやばいので注意して進める。
というか
ほぼコレでいい気がしてきたのでこれを少し変えて実装して終わろう。
そしてその他の理由でポジションが立たなかった場合のことはあえて無視していく。
最後に言いたいのは
EA25個あるんですけどライブラリとか使ってないんですけどって言うこと。