python 斐波那契回撤的抓取和回撤问题

pxq42qpu  于 2024-01-05  发布在  Python
关注(0)|答案(1)|浏览(120)

我试图做一个副本的metatrader斐波纳契回撤,我股票上调整大小和抓取问题,我可以打开斐波那契与水平和调整大小,但只要我接触的中心,这是抓取,它总是停留在抓取,它不做任何更多的抓取。

  1. import tkinter as tk
  2. class FibonacciRetracementApp:
  3. def __init__(self, master):
  4. self.master = master
  5. self.master.title("Fibonacci Retracement")
  6. self.canvas = tk.Canvas(self.master, width=600, height=400, bg="white")
  7. self.canvas.pack(expand=tk.YES, fill=tk.BOTH)
  8. self.points = []
  9. self.lines = []
  10. self.center_point = None
  11. self.second_set_drawn = False
  12. self.resizing = False
  13. self.resizing_point = None
  14. self.canvas.bind("<Button-1>", self.create_point)
  15. self.canvas.bind("<B1-Motion>", self.on_motion)
  16. self.canvas.bind("<ButtonRelease-1>", self.release_button)
  17. def create_point(self, event):
  18. x, y = event.x, event.y
  19. if self.second_set_drawn:
  20. self.check_for_resizing(x, y)
  21. return
  22. self.points.append((x, y))
  23. if len(self.points) == 2:
  24. if not self.second_set_drawn:
  25. self.draw_fibonacci_retracement()
  26. self.second_set_drawn = True
  27. self.canvas.delete("point")
  28. def check_for_resizing(self, x, y):
  29. if len(self.points) == 2:
  30. if self.center_point is None:
  31. self.add_center_point()
  32. x1, y1 = self.points[0]
  33. x2, y2 = self.points[1]
  34. # Check if the cursor is near the first resize corner
  35. if self.is_near_resize_corner(x, y, x1, y1):
  36. self.resizing = True
  37. self.resizing_point = 0
  38. # Check if the cursor is near the second resize corner
  39. elif self.is_near_resize_corner(x, y, x2, y2):
  40. self.resizing = True
  41. self.resizing_point = 1
  42. def is_near_resize_corner(self, x, y, corner_x, corner_y):
  43. return (corner_x - 5 <= x <= corner_x + 5) and (corner_y - 5 <= y <= corner_y + 5)
  44. def add_center_point(self):
  45. x1, y1 = self.points[0]
  46. x2, y2 = self.points[1]
  47. center_x = (x1 + x2) // 2
  48. center_y = (y1 + y2) // 2
  49. self.center_point = (center_x, center_y)
  50. def move_center_point(self, event):
  51. if self.center_point is not None:
  52. x, y = event.x, event.y
  53. dx = x - self.center_point[0]
  54. dy = y - self.center_point[1]
  55. self.canvas.move("blue_line", dx, dy)
  56. self.center_point = (x, y)
  57. def move_existing_point(self, x, y):
  58. if self.resizing_point is not None:
  59. self.points[self.resizing_point] = (x, y)
  60. self.update_fibonacci_retracement()
  61. def draw_fibonacci_retracement(self):
  62. x1, y1 = self.points[0]
  63. x2, y2 = self.points[1]
  64. retracement_levels = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1.0]
  65. for level in retracement_levels:
  66. y_level = y1 + level * (y2 - y1)
  67. line = self.canvas.create_line(x1, y_level, x2, y_level, fill="blue", dash=(4, 2), tags="blue_line")
  68. self.lines.append(line)
  69. def update_fibonacci_retracement(self):
  70. if len(self.points) == 2:
  71. x1, y1 = self.points[0]
  72. x2, y2 = self.points[1]
  73. self.canvas.delete("blue_line")
  74. retracement_levels = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1.0]
  75. for level in retracement_levels:
  76. y_level = y1 + level * (y2 - y1)
  77. line = self.canvas.create_line(x1, y_level, x2, y_level, fill="blue", dash=(4, 2), tags="blue_line")
  78. self.lines.append(line)
  79. def on_motion(self, event):
  80. if self.resizing:
  81. x, y = event.x, event.y
  82. self.move_existing_point(x, y)
  83. elif self.center_point is not None:
  84. self.move_center_point(event)
  85. def release_button(self, event):
  86. self.resizing = False
  87. self.resizing_point = None
  88. if __name__ == "__main__":
  89. root = tk.Tk()
  90. app = FibonacciRetracementApp(root)
  91. root.mainloop()

字符串
我正试着让抓取和逻辑工作没有问题

vjrehmav

vjrehmav1#

移动后忘记更新self.points,移动后忘记更新self.center_point

  1. def move_center_point(self, event):
  2. if self.center_point is not None:
  3. x, y = event.x, event.y
  4. dx = x - self.center_point[0]
  5. dy = y - self.center_point[1]
  6. self.canvas.move("blue_line", dx, dy)
  7. self.center_point = (x, y)
  8. ### update self.points
  9. self.points[0] = (self.points[0][0]+dx, self.points[0][1]+dy)
  10. self.points[1] = (self.points[1][0]+dx, self.points[1][1]+dy)
  11. def move_existing_point(self, x, y):
  12. if self.resizing_point is not None:
  13. self.points[self.resizing_point] = (x, y)
  14. self.update_fibonacci_retracement()
  15. ### update center point
  16. x1, y1 = self.points[0]
  17. x2, y2 = self.points[1]
  18. self.center_point = ((x1 + x2) // 2, (y1 + y2) // 2)

字符串

展开查看全部

相关问题