-
Notifications
You must be signed in to change notification settings - Fork 53
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
next_tickの間隔について #416
Comments
環境変数
|
返信ありがとうございます。ど素人なので、具体的に困っていることを尋ねさせてください。 現在、HerokuにJijiをインストールして、defaultのmoving_average_agent.rbを自分用にカスタマイズしようとしています。そのなかで、42行目以降の以下の部分を変更すれば、tickの間隔をコントロールできるのではないかと思い、質問させてもらいました。そもそも方針が間違っているでしょうか? moving_average_agent.rbの42行目以降 次のレートを受け取るdef next_tick(tick)
end |
その方針でも大丈夫です。この場合、 |
ありがとうございます。この方針でいろいろトライしてみようと思います。 ちなみに、こうした方法でnext_tickの間隔を1時間毎などに設定し実際に口座に適応した時には、バックテストでレート間隔を1時間毎にした時と同様に、このエージェントは動くと考えてよろしいのでしょうか? それとも少し違うのでしょうか? |
2回に1回スキップする方式だと、レート間隔を1時間した場合は2時間に1回の呼び出しになりますね・・・。 |
素早い返信ありがとうございます。 関連する質問なのですが、仮に1時間毎の動作にした場合、交差状態の判断をするときに呼び出される直近の先行および遅行指標というのは、1時間前に呼び出したときのものになりますか。それとも、15秒前のものになりますか? |
この場合、1時間前に呼び出したときのものになります。 |
以下のようにnext_tick(tick)を書き換えてみたのですが、バックテストでエラーが出てしまいます。どうやら、前回のnext_tickのtimestampが呼び出せない状態のようなのですが、なにか改善するための方針などはあるでしょうか? def next_tick(tick)
end |
どんなエラーが出ていますでしょうか? |
以下のようなエラーが出てしまいます。 E, [2017-12-01T12:20:44.725738 #4] ERROR -- : undefined local variable or method |
エラーメッセージに記載されている通り、 def next_tick(tick)
return if (!@tick_prev.nil? && tick.timestamp >= @tick_prev.timestamp + 60 * 60)
@tick_prev = tick
# 移動平均を計算
res = @mvs.map { |mv| mv.next_data(tick[:USDJPY].bid) }
return if !res[0] || !res[1]
# グラフに出力
@graph << res
# ゴールデンクロス/デッドクロスを判定
@cross.next_data(*res)
do_trade
end |
ありがとうございました。言われたように書き換えると、バックテストのエラーが出なくなり、完了するようになりました。 しかし、このエージェントを使用してもdo tradeされる間隔が1時間毎にはなっていないようで、 どこか他に変更すべき箇所はあるのでしょうか? def next_tick(tick) @tick_prev = tick
end |
とりあえずデバッグログを埋め込んで、以下を確認してみてください。
|
デバッグログを埋め込むには、 logger.debug "test" をどこに書き加えれば良いでしょうか? |
あたりでどうでしょうか? |
ありがとうございます。ご指摘の4箇所にそれぞれ、loggerを入れてテストしてみました。 すると、ログにはtest1のあと、test2が75回ほどつづいてから、test2, test3, test4が終わりまで繰り返されました。 また、tick.timestamp >= @tick_prev.timestamp + 60 * 60 の 60 * 60の部分を6 * 6 にしても、666 * 666にしても表示されるログは 60 * 60の場合と変わりませんでした。 しかし、0 * 0にした場合には、test2がずっと続いて、test3とtest4は出て来ずに、取引も一度もされていませんでした。 取り急ぎ、ご報告まで。自分でも考えてみます。 |
0 * 0, 1 * 1, 10 * 1などのときは、test2がずっと続きます。 10 * 10にすると60 * 60と同じ様になります。 |
この場合、期待通り動作しているように思いますがどうでしょうか?
頑張ってください。 |
コメントありがとうございます。 1222..(x70-75)34234234.....というふうになっているということは、一番最初のnext_tickまで75回ほどスキップされて、その後は15秒間隔で動いているということかと思うのです。 本来は、12342..(x240)342..(x240)342..(x240)342..(x240)..というふうに続くのかと思っていたのですが。 このログの読み方で誤解しているところはあるでしょうか? |
あっていると思います。
で抜けているのかもしれませんね。 |
ご指摘の通り、サンプルのエージェントでも最初の75回程度 return if !res[0] || !res [1]のところでreturnされていました。そのため、この最初にreturnされ続ける現象は今回の改定とは直接関係ないかもしれません。(理由がありましたら、教えていただきたいです。) 次に、!@tick_prev.nil? && tick.timestamp >= @tick_prev.timestamp + 60*60のところですが、+されるの値が15以下の場合は、最初の1回のみ、この式は通過し、その後のreturn if !res[0] || !res [1]のところまでいってreturnされます。その後は、このreturn ifでずっとreturnされて取引が行われません。 16以上の場合は、サンプルエージェントと同様、この評価式は常に通り、最初の75回くらいはreturn if !res[0] || !res [1]のところでreturnされたあとに、その後は15秒間隔の取引が行われていました。 なぜ15以下の場合にこの評価式が最初の1回だけ通って、16以上の場合には常に通るようになるのでしょうか? |
なるほど、条件式が逆になっているのが原因のようですね。失礼しました。 return if (!@tick_prev.nil? && tick.timestamp < @tick_prev.timestamp + 60 * 60) を試してみてください。 |
評価式の確認をしていただき、ありがとうございました。 next_tickの先頭に また、ささいなことなのですが、エージェントの開始時に、return if !res[0] || !res[1]で長期移動平均線の日数分だけreturnされてから、crossの判定が始まることを確認しました。 念のため、確認なのですが、一度エージェントを動かしてしまえば2ヶ月でも3ヶ月でもそのまま動き続けるのでしょうか? それとも1ヶ月ごとにエージェントの再起動などがあるのでしょうか? |
Jijiの再起動等を行わなければ、そのまま動き続けます。 |
ありがとうございます。また何かおたずねすることがあると思いますが、宜しくお願い致します。 |
素晴らしいシステムトレードフレームワーク、ありがとうございます。
初心者なのですが質問がございます。
next_tickの行われる間隔を15秒からより長い時間に変更することはできるのでしょうか?
The text was updated successfully, but these errors were encountered: