• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Commit MetaInfo

Revision2ec087034349def7169d4a604073e79e98b86229 (tree)
Time2023-03-19 10:39:33
Authorkazuhiro_kondow <simauma.circus@gmai...>
Commiterkazuhiro_kondow

Log Message

mt5.TIMEFRAME_M3に変更
indicatorの再評価を追加

Change Summary

Incremental Difference

--- a/src/config/setting.ini
+++ b/src/config/setting.ini
@@ -22,6 +22,9 @@ Magic = 1
2222 # Tick Volumeを出来高の代用とし売買の活発度の指標とする
2323 # 過去6分間の下限を下回ると新規注文を控える
2424 TickVolumeLimit = 200
25+# TimeFrame
26+# 分単位の時間足設定(1-60)
27+TimeFrame = 3
2528
2629 # 口座設定
2730 [Account]
@@ -34,31 +37,31 @@ LossCut = 1.0
3437 [Strategy]
3538 # 許容スプリット(円)
3639 # 0.3~1.7銭がoandaの配信範囲94%
37-Allowablespread = 0.01
40+Allowablespread = 0.05
3841 # 取得した価格から注文を実行するトリガー値(円)
3942 # 1銭は0.01円
4043 OpenMergin = 0.007
4144 # 利益確定(円)
4245 ProfitTaking = 0.05
4346 # FXコアタイムの利益確定(円)
44-CoreTimeProfitTaking = 0.275
47+CoreTimeProfitTaking = 0.5
4548 # FXアイドルタイムの利益確定(円)
46-IdleTimeProfitTaking = 0.05
49+IdleTimeProfitTaking = 0.1
4750 # 損切(円)
48-LossCut = 0.5
51+LossCut = 1.85
4952
5053 # テクニカル分析
5154 [Technical]
5255 # 短期EMAの期間
53-FastEMAperiod = 16
56+FastEMAperiod = 12
5457 # 長期EMAの期間
55-SlowEMAperiod = 66
58+SlowEMAperiod = 25
5659 # シグナルの期間
57-Signalperiod = 27
60+Signalperiod = 16
5861 # 交差角度閾値
59-CrossingAngleThreshold = 0.925
62+CrossingAngleThreshold = 0.375
6063
61-; MACDCross(n1=16,n2=66,ns=27,angle=37,take=2,cut=20)
62-; crossover_angle = 0.925
63-; ProfitTaking = 0.05
64-; LossCut = 0.5
\ No newline at end of file
64+; MACDCross(n1=12,n2=25,ns=16,angle=15,take=60,cut=74)
65+; crossover_angle = 0.375
66+; ProfitTaking = 1.5
67+; LossCut = 1.85
\ No newline at end of file
--- a/src/exchange_rate_info.py
+++ b/src/exchange_rate_info.py
@@ -40,6 +40,10 @@ class ExchangeRateInfo():
4040 self.__ns = int(s['Technical']['Signalperiod'])
4141 # 交差角度閾値
4242 self.__angle = float(s['Technical']['CrossingAngleThreshold'])
43+ # 時間足設定値
44+ self.__time_frame = int(
45+ s['Trade']['TimeFrame']
46+ )
4347 except Exception as e:
4448 logger.error(e)
4549 raise
@@ -49,6 +53,7 @@ class ExchangeRateInfo():
4953 def __get_latest_rate(self) -> tuple:
5054 """最新レート取得
5155 """
56+ # mt5.TIMEFRAME_M1は固定
5257 rate = mt5.copy_rates_from_pos(
5358 self.__cp,
5459 mt5.TIMEFRAME_M1,
@@ -66,7 +71,7 @@ class ExchangeRateInfo():
6671 """
6772 rates = mt5.copy_rates_from_pos(
6873 self.__cp,
69- mt5.TIMEFRAME_M1,
74+ self.__time_frame,
7075 0,
7176 count
7277 )
@@ -286,7 +291,7 @@ class ExchangeRateInfo():
286291 msg = msg + ' Already judged loss cut.'
287292 s.technical_indicator = DEF.TECHNICAL_UPTREND
288293 s.turning_point = None
289- s.close_position = False
294+ s.close_position = True
290295
291296 elif self.__crossover([0.0, 0.0], macdsignal[-2:]) and \
292297 s.turning_point is True:
@@ -298,18 +303,70 @@ class ExchangeRateInfo():
298303 msg = msg + ' Already judged loss cut.'
299304 s.technical_indicator = DEF.TECHNICAL_DOWNTREND
300305 s.turning_point = None
301- s.close_position = True
306+ s.close_position = False
302307
308+ # 2023-03-17 05:53:50 num[-3]: MACD: 0.0601, MACDSignal: 0.0504
309+ # 2023-03-17 05:53:50 num[-2]: MACD: 0.0557, MACDSignal: 0.051
310+ # 2023-03-17 05:53:50 num[-1]: MACD: 0.0518, MACDSignal: 0.0511
311+ # 2023-03-17 05:53:50 befor turning point:True
312+ # 2023-03-17 05:53:50 Technical Indicator: Uptrend.
313+ # 2023-03-17 05:59:50 num[-3]: MACD: 0.0525, MACDSignal: 0.0512
314+ # 2023-03-17 05:59:50 num[-2]: MACD: 0.0494, MACDSignal: 0.051
315+ # 2023-03-17 05:59:50 num[-1]: MACD: 0.0447, MACDSignal: 0.0501
316+ # 2023-03-17 05:59:50 befor turning point:True
317+ # 2023-03-17 05:59:50 Technical Indicator: Downtrand.
318+ # turning pointとindicatorの状態が飛ぶ場合があるので対策を講じる
319+ # 状態不一致はひとつ前のmacd再評価を行う
303320 elif macd[-1] > macdsignal[-1]:
304- # 上昇トレンド
305- msg = 'Technical Indicator: Uptrend.'
306- s.technical_indicator = DEF.TECHNICAL_UPTREND
307-
321+ if s.turning_point is False:
322+ # ひとつ前のmacd再評価
323+ # 交差角度算出
324+ re_v_angle = self.__vector_angle(
325+ macd[-3:-1],
326+ macdsignal[-3:-1]
327+ )
328+ if self.__crossover(macd[-3:-1], macdsignal[-3:-1]):
329+ msg = (
330+ 'Revaluation CrossOver up.'
331+ f' vector angle:{re_v_angle}'
332+ )
333+ if re_v_angle > self.__angle:
334+ # GoldenCross 上昇転換サイン
335+ s.technical_indicator = DEF.TECHNICAL_GOLDEN_CROSS
336+ s.turning_point = True
337+ msg = msg + ' Technical Indicator: GoldenCross.'
338+ else:
339+ msg = msg + ' Already judged goldencross.'
340+ s.technical_indicator = DEF.TECHNICAL_UPTREND
341+ else:
342+ # 上昇トレンド
343+ msg = 'Technical Indicator: Uptrend.'
344+ s.technical_indicator = DEF.TECHNICAL_UPTREND
308345 elif macd[-1] < macdsignal[-1]:
309- # 降下トレンド
310- s.technical_indicator = DEF.TECHNICAL_DOWNTREND
311- msg = 'Technical Indicator: Downtrand.'
312-
346+ if s.turning_point is True:
347+ # ひとつ前のmacd再評価
348+ # 交差角度算出
349+ re_v_angle = self.__vector_angle(
350+ macd[-3:-1],
351+ macdsignal[-3:-1]
352+ )
353+ if self.__crossover(macdsignal[-3:-1], macd[-3:-1]):
354+ msg = (
355+ 'Revaluation CrossOver down.'
356+ f' vector angle:{v_angle}'
357+ )
358+ if re_v_angle > self.__angle:
359+ # DeadCross 降下転換サイン
360+ s.technical_indicator = DEF.TECHNICAL_DEAD_CROSS
361+ s.turning_point = False
362+ msg = msg + ' Technical Indicator: DeadCross.'
363+ else:
364+ msg = msg + ' Already judged deadcross.'
365+ s.technical_indicator = DEF.TECHNICAL_DOWNTREND
366+ else:
367+ # 降下トレンド
368+ s.technical_indicator = DEF.TECHNICAL_DOWNTREND
369+ msg = 'Technical Indicator: Downtrand.'
313370 else:
314371 # いずれにも該当しない
315372 s.technical_indicator = DEF.TECHNICAL_UNCHANGED
@@ -335,6 +392,13 @@ class ExchangeRateInfo():
335392 def execute(self):
336393 """処理実行
337394 """
395+ # 時間足に合わせて動作チェック
396+ # 時間足より1分早く動作
397+ if self.__time_frame > 1:
398+ if (datetime.now().minute % self.__time_frame) != \
399+ (self.__time_frame - 1):
400+ return
401+
338402 s = Setting()
339403
340404 # 市場チェック
--- a/src/main.py
+++ b/src/main.py
@@ -81,12 +81,14 @@ def main():
8181 # Trade成績の改善を目指す
8282 # EventMngは経済指標の対応を実装する
8383 # PositionMngは長期ポジションに対応する
84+ # mt5.TIMEFRAME_M3に変更
8485 logger.debug("set schedule.")
8586 schedule.every().minute.at(":00").do(em.execute)
8687 schedule.every().minute.at(":02").do(ac.execute)
87- schedule.every().minute.at(":04").do(rt.execute)
8888 schedule.every().minute.at(":06").do(pm.execute)
89- schedule.every().minute.at(":08").do(tm.execute)
89+ # 動作タイミングをmt5.TIMEFRAME_M3に合わせて調整
90+ schedule.every().minute.at(":10").do(tm.execute)
91+ schedule.every().minute.at(":50").do(rt.execute)
9092
9193 logger.debug("start loop.")
9294 while True:
--- a/src/trade_mng.py
+++ b/src/trade_mng.py
@@ -56,6 +56,9 @@ class TradeMng:
5656 self.__tick_limit = int(
5757 s['Trade']['TickVolumeLimit']
5858 )
59+ self.__time_frame = int(
60+ s['Trade']['TimeFrame']
61+ )
5962 except Exception as e:
6063 logger.error(e)
6164 raise
@@ -197,7 +200,7 @@ class TradeMng:
197200 """
198201 rates = mt5.copy_rates_from_pos(
199202 self.__cp,
200- mt5.TIMEFRAME_M1,
203+ self.__time_frame,
201204 0,
202205 count
203206 )
@@ -323,6 +326,11 @@ class TradeMng:
323326 """
324327
325328 try:
329+ # 時間足に合わせて動作チェック
330+ # 時間足で割って割り切れるなら動作
331+ if (datetime.now().minute % self.__time_frame) != 0:
332+ return
333+
326334 s = Setting()
327335
328336 # 未決注文の全解除
@@ -352,7 +360,7 @@ class TradeMng:
352360 return
353361
354362 # 直近のTick Volumeが基準以下ならorderしない
355- tick_vol = self.__get_recent_ticks_volume()
363+ tick_vol = self.__get_recent_ticks_volume(2)
356364 if tick_vol < self.__tick_limit:
357365 msg = (
358366 "Out of tick volume. "