Typography
white-space
Utilities for controlling an element's white-space property.
# indie:lang_version = 5from indie import indicator, param, Optional, MainContextfrom indie.algorithms import SinceHighest, SinceLowestfrom indie.drawings import LabelAbs, AbsolutePosition, callout_position@indicator('Pivots High/Low by Ruslan S ', overlay_main_pane=True)@param.int('length_high_left', default=10)@param.int('length_low_left', default=10)@param.int('length_high_right', default=10)@param.int('length_low_right', default=10)class Main(MainContext):def __init__(self):none_label: Optional[LabelAbs] = Noneself._prev_high_pivot = self.new_var(none_label)self._prev_high_pivot_bar_index = self.new_var(0)self._prev_low_pivot = self.new_var(none_label)self._prev_low_pivot_bar_index = self.new_var(0)def calc(self, length_high_left, length_low_left, length_high_right, length_low_right):sh = SinceHighest.new(self.high, length_high_left + 1)sl = SinceLowest.new(self.low, length_low_left + 1)if sh[0] == 0:# we have a new high pivot candidatenew_pivot_candidate_y = self.high[0]hp_ref: Optional[LabelAbs] = self._prev_high_pivot.get()if hp_ref is not None: # we have a previous high pivot, must decide which one is betterif self.bar_index - self._prev_high_pivot_bar_index.get() > length_high_right:self._prev_high_pivot.set(None) # prev_high_pivot is too far away in history, forget about itelif hp_ref.value().position.price < new_pivot_candidate_y:self._update_high_pivot() # new pivot candidate is better, update previous pivot# else new pivot candidate is worse, keep the previous pivotif self._prev_high_pivot.get() is None:self._update_high_pivot() # create new low pivotif sl[0] == 0:new_pivot_candidate_y = self.low[0]lp_ref: Optional[LabelAbs] = self._prev_low_pivot.get()if lp_ref is not None: # we have a previous low pivot, must decide which one is betterif self.bar_index - self._prev_low_pivot_bar_index.get() > length_low_right:self._prev_low_pivot.set(None) # prev_low_pivot is too far away in history, forget about itelif lp_ref.value().position.price > new_pivot_candidate_y:self._update_low_pivot() # new pivot candidate is better, update previous pivot# else new pivot candidate is worse, keep the previous pivotif self._prev_low_pivot.get() is None:self._update_low_pivot() # create new low pivotdef _update_high_pivot(self) -> None:new_pivot_y = self.high[0]new_pivot_x = self.time[0]new_pivot_bar_index = self.bar_indexif self._prev_high_pivot.get() is None: # create and drawself._prev_high_pivot.set(LabelAbs(str(new_pivot_y),AbsolutePosition(new_pivot_x, new_pivot_y),callout_position=callout_position.TOP_RIGHT,))self._prev_high_pivot_bar_index.set(new_pivot_bar_index)else: # update field values and redrawhp_ref: Optional[LabelAbs] = self._prev_high_pivot.get()hp_ref.value().position = AbsolutePosition(new_pivot_x, new_pivot_y)hp_ref.value().text = str(new_pivot_y)self._prev_high_pivot_bar_index.set(new_pivot_bar_index)self.chart.draw(self._prev_high_pivot.get().value())def _update_low_pivot(self) -> None:new_pivot_y = self.low[0]new_pivot_x = self.time[0]new_pivot_bar_index = self.bar_indexif self._prev_low_pivot.get() is None: # create and drawself._prev_low_pivot.set(LabelAbs(str(new_pivot_y),AbsolutePosition(new_pivot_x, new_pivot_y),callout_position=callout_position.BOTTOM_LEFT,))self._prev_low_pivot_bar_index.set(new_pivot_bar_index)else: # update field values and redrawhp_ref: Optional[LabelAbs] = self._prev_low_pivot.get()hp_ref.value().position = AbsolutePosition(new_pivot_x, new_pivot_y)hp_ref.value().text = str(new_pivot_y)self._prev_low_pivot_bar_index.set(new_pivot_bar_index)self.chart.draw(self._prev_low_pivot.get().value())
Use the whitespace-normal utility to cause text to wrap normally within an element. Newlines and spaces will be collapsed:


Be the first to comment
Publish your first comment to unleash the wisdom of crowd.