Class Study

java.lang.Object
com.motivewave.platform.sdk.study.Study
All Implemented Interfaces:
Cloneable

public class Study extends Object implements Cloneable
This is the base class for all studies and strategies.
  • Field Details

    • SHIFT_DOWN

      public static final int SHIFT_DOWN
      The Shift key modifier constant.
      See Also:
    • CTRL_DOWN

      public static final int CTRL_DOWN
      The Control key modifier constant.
      See Also:
    • META_DOWN

      public static final int META_DOWN
      The Meta key modifier constant (Mac Command Key).
      See Also:
    • ALT_DOWN

      public static final int ALT_DOWN
      The Alt key modifier constant.
      See Also:
  • Constructor Details

    • Study

      public Study()
  • Method Details

    • initialize

      public void initialize(Defaults defaults)
      This method is called to initialize the design and runtime settings.
      Parameters:
      defaults - system defaults
    • onLoad

      public void onLoad(Defaults defaults)
      This method is called when the study is first loaded and before the data is loaded. This can be a useful place to set the minimum number of bars to calculate the study.
      Parameters:
      defaults - system defaults
    • precalculate

      protected void precalculate(DataContext ctx)
      Override this method to perform work before calculate and calculateValues() is called.
      Parameters:
      ctx - data context
    • postcalculate

      protected void postcalculate(DataContext ctx)
      Override this method to perform work after calculate and calculateValues() is called.
      Parameters:
      ctx - data context
    • calculate

      protected void calculate(int index, DataContext ctx)
      Override this method to calculate the values at a specific index in the data series. This method is called from calculateValues(ctx) and onBarUpdate(ctx)
      Parameters:
      index - index in the data series
      ctx - Data Context
    • calculateValues

      protected void calculateValues(DataContext ctx)
      By default, this method is called on events where the data series has been affected.
      Parameters:
      ctx - data context
    • isRepaintAllOnUpdate

      public boolean isRepaintAllOnUpdate()
      Indicates if a full repaint of the graph is necessary when the latest bar is updated. By default this returns false. If your study needs other parts (outside of the latest bar) to be repainted when the bar is updated, consider returning true.
      Returns:
      true if a full repaint of the graph is required when the bar is updated
    • onBarOpen

      public void onBarOpen(DataContext ctx)
      This method is called when the latest bar in the data series is first opened. By default, this method calls onBarUpdate(ctx)
      Parameters:
      ctx - data context
    • onBarUpdate

      public void onBarUpdate(DataContext ctx)
      This method is called when the latest bar in the data series has been updated.
      Parameters:
      ctx - data context
    • onTick

      public void onTick(DataContext ctx, Tick tick)
      This method is called when a tick (trade) occurs.
      Parameters:
      tick - latest tick (trade)
    • onBarClose

      public void onBarClose(DataContext ctx)
      This method is called when the latest bar in the data series has been closed. By default, this method calls onBarUpdate(ctx)
      Parameters:
      ctx - data context
    • onDataSeriesMoved

      public void onDataSeriesMoved(DataContext ctx)
      This method is called when the start and end indices of the data series have changed.
      Parameters:
      ctx - data context
    • onDataSeriesUpdated

      public void onDataSeriesUpdated(DataContext ctx)
      This method is called when additional historical data is loaded into the data series or when a new bar has been added to the data series. Please Note: this may change the indices of the data stored in the set. The data stored on the series will be preserved as it is stored by the start times of the individual bars.
      Parameters:
      ctx - data context
    • onNewDataSeries

      public void onNewDataSeries(DataContext ctx)
      This method is called when a new data series is created. Typically this occurs when the user changes the interval on the graph.
      Parameters:
      ctx - data context
    • onSettingsUpdated

      public void onSettingsUpdated(DataContext ctx)
      This method is called whenever the settings for the study have been updated.
      Parameters:
      ctx - data context
    • onMenu

      public MenuDescriptor onMenu(String plotName, Point loc, DrawContext ctx)
      Override this method to provide a custom context menu, when a popup trigger (right click) is detected on this study.
      Parameters:
      plotName - name of the plot where this event occurred
      loc - x,y coordinates of the mouse location where event occurred
      Returns:
      MenuDescriptor
    • onBeginResize

      public void onBeginResize(ResizePoint rp, DrawContext ctx)
      This method is called when a user begins to move a resize point.
      Parameters:
      rp - resize point that is about to be moved.
      ctx - draw context for the chart that is affected.
    • onResize

      public void onResize(ResizePoint rp, DrawContext ctx)
      This method is called whenever the user moves the resize point. It is called between the onBeginResize() and onEndResize() events.
      Parameters:
      rp - resize point that is being moved.
      ctx - draw context for the chart that is affected.
    • onEndResize

      public void onEndResize(ResizePoint rp, DrawContext ctx)
      This method is called when a user completes a movement of a resize point. On completion of this method, the study will be recalculated. This will also affect other charts that have an instance of this study.
      Parameters:
      rp - resize point was resized.
      ctx - draw context for the chart that is affected.
    • onDoubleClick

      public boolean onDoubleClick(Point p, int flags)
      This method is called when the user double clicks on a study.
      Parameters:
      p - x and y location where the user double clicked
      flags - indicators of modifier keys pressed
      Returns:
      true if the default behavior should be executed (display study dialog)
    • onClick

      public boolean onClick(Point p, int flags)
      This method is called when the user clicks on a study.
      Parameters:
      p - x and y location where the user clicked
      flags - indicators of modifier keys pressed
      Returns:
      true if the default behavior should be executed
    • onWheelMoved

      public boolean onWheelMoved(Point p, int delta, int flags)
      This method is called when the user moves the mouse wheel while the mouse is above the study.
      Parameters:
      p - x and y coordinate where the mouse is located
      delta - direction and amount the wheel was moved
      flags - indicators of modifier keys pressed
      Returns:
      true if the default behavior should be executed
    • clearState

      public void clearState()
      Override this method to clear any internal state that may be kept within the study. This method is called when the settings have been updated, the user chooses a new bar size or when additional historical data is loaded into the series
    • createRD

      public final RuntimeDescriptor createRD()
      Convenience Method. Creates a RuntimeDescriptor and set it on this study
      Returns:
      RuntimeDescriptor
    • getRuntimeDescriptor

      public final RuntimeDescriptor getRuntimeDescriptor()
      Gets the 'runtime' descriptor. This object describes the runtime characteristics of the study.
      Returns:
      runtime descriptor
    • setRuntimeDescriptor

      public final void setRuntimeDescriptor(RuntimeDescriptor desc)
      Sets the 'runtime' descriptor. This object describes the runtime characteristics of the study.
      Parameters:
      desc - runtime descriptor object
    • createSD

      public final SettingsDescriptor createSD()
      Convenience Method. Creates a SettingDescriptor and set it on this study
      Returns:
      SettingsDescriptor
    • getSettingsDescriptor

      public final SettingsDescriptor getSettingsDescriptor()
      Gets the settings descriptor. This object describes the design time characteristics of the study.
      Returns:
      settings descriptor
    • setSettingsDescriptor

      public final void setSettingsDescriptor(SettingsDescriptor sd)
      Sets the settings descriptor. This object describes the design time characteristics of the study.
      Parameters:
      sd - descriptor object
    • getSettings

      public final Settings getSettings()
      Gets the user defined settings.
      Returns:
      user defined settings
    • setSettings

      public final void setSettings(Settings settings)
      Sets the user defined settings. This method is called by the SDK framework and should not be called within the study code.
      Parameters:
      settings -
    • getBarSizes

      public List<BarSize> getBarSizes()
      Gets the list of bar sizes required by this study. By default, this method will return all of the bar sized defined in the settings. If a descriptor is defined for the bar size, it will check to see if the descriptor is enabled before adding the bar size.
      Returns:
      list of bar sizes required by this study
    • getInstruments

      public List<Instrument> getInstruments()
      Gets the list of instruments required by this study. By default, this method will return all of the instruments defined in the settings. If a descriptor is defined for the instrument, it will check to see if the descriptor is enabled before adding the instrument.
      Returns:
      list of instruments required by this study
    • getPopupMessage

      public String getPopupMessage(double x, double y, DrawContext ctx)
      Returns a message to display to the user when the mouse "hovers" over the study. By default, this method will iterate through figures and return the first non-empty message from a figure that contains the given x and y coordinates.
      Parameters:
      x - x coordinate
      y - y coordinate
      Returns:
      message to display to the user when the mouse is over given (x,y) coordinate.
    • getHeader

      public final StudyHeader getHeader()
      This convenience method gets the StudyHeader annotation defined for this study.
      Returns:
      study header
    • getLabel

      public String getLabel()
      Gets the display label for the default plot including setting values.
      Returns:
      display label for the default plot including setting values
    • getLabel

      public String getLabel(String plotName)
      Gets the display label for the given plot including setting values.
      Parameters:
      plotName - name of the study plot
      Returns:
      display label
    • clearFigures

      protected final void clearFigures()
      Clears the figures associated with this study (all figures).
    • clearFigures

      protected final void clearFigures(String plotName)
      Clears the figures associated with the given plot.
      Parameters:
      plotName - name of the study plot
    • addFigure

      protected final void addFigure(Figure figure)
      Adds a figure to the end of the figure list (for the default plot).
      Parameters:
      figure - figure to add
    • setFigures

      protected final void setFigures(List<? extends Figure> figures)
    • addFigureFront

      protected final void addFigureFront(Figure figure)
      Adds a figure to the start of the figure list (for the default plot).
      Parameters:
      figure - figure to add
    • addFigure

      protected final void addFigure(String plotName, Figure figure)
      Adds a figure to the end of the figure list for the plot associated with the given plot name.
      Parameters:
      plotName - name of the study plot
      figure - figure to add
    • setFigures

      protected final void setFigures(String plotName, List<? extends Figure> figures)
      Adds a figure to the end of the figure list for the plot associated with the given plot name.
      Parameters:
      plotName - name of the study plot
      figure - figure to add
    • addFigures

      protected final void addFigures(Collection<? extends Figure> figures)
      Adds a figure to the end of the figure list for the plot associated with the given plot name.
      Parameters:
      figures - figures to add
    • addFigures

      protected final void addFigures(String plotName, Collection<? extends Figure> figures)
      Adds a figure to the end of the figure list for the plot associated with the given plot name.
      Parameters:
      plotName - name of the study plot
      figures - figures to add
    • addFigure

      protected final void addFigure(int index, Figure figure)
      Adds a figure to the start of the figure list for the default plot.
      Parameters:
      index - position in the list to add
      figure - figure to add
    • addFigure

      protected final void addFigure(String plotName, int index, Figure figure)
      Adds a figure to the start of the figure list for the plot associated with the given plot name.
      Parameters:
      plotName - name of the study plot
      index - position in the list to add
      figure - figure to add
    • addFigureFront

      protected final void addFigureFront(String plotName, Figure figure)
      Adds a figure to the start of the figure list for the plot associated with the given plot name.
      Parameters:
      plotName - name of the study plot
      figure - figure to add
    • removeFigure

      protected final void removeFigure(Figure figure)
      Removes the given figure from the figure list for the default plot (if it exists).
      Parameters:
      figure - figure to remove
    • removeFigure

      protected final void removeFigure(String plotName, Figure figure)
      Removes the given figure from the figure list for the plot associated with the given name.
      Parameters:
      plotName - name of the study plot
      figure - figure to remove
    • removeFigures

      protected final void removeFigures(Collection<? extends Figure> figures)
      Removes the given figures from the figure list for the default plot.
      Parameters:
      figures - figures to remove
    • removeFigures

      protected final void removeFigures(String plotName, Collection<? extends Figure> figures)
      Removes the given figures from the figure list for the plot associated with the given name.
      Parameters:
      plotName - name of the study plot
      figures - figures to remove
    • getFigures

      public final List<Figure> getFigures()
      Gets the list of figures associated with the default plot.
      Returns:
      list of figures associated with the default plot
    • getFigures

      public final List<Figure> getFigures(String plotName)
      Gets the list of figures associated with the plot with the given name.
      Parameters:
      plotName - name of the study plot
      Returns:
      list of figures associated with the given plot name
    • getMinBars

      public int getMinBars()
      Gets the minimum number of bars required to display this study.
      Returns:
      minimum number of bars required to display the study
    • getMinBars

      public int getMinBars(DataContext ctx)
      Gets the minimum number of bars required to display this study.
      Parameters:
      ctx - data context
      Returns:
      minimum number of bars required to display the study
    • getMinBars

      public int getMinBars(DataContext ctx, BarSize bs)
      Gets the minimum number of bars required to display this study for the given bar size.
      Parameters:
      ctx - data context
      bs - bar size
      Returns:
      minimum number of bars required to display the study
    • setMinBars

      public void setMinBars(int bars)
      Sets the minimum number of bars required to display this study.
      Parameters:
      bars - minimum number of bars
    • setMinBars

      public void setMinBars(int bars, BarSize bs)
      Sets the minimum number of bars required to display this study.
      Parameters:
      bars - minimum number of bars
      bs - bar size
    • getMinStartTime

      public Long getMinStartTime()
      Gets the minimum start time (milliseconds since 1970) required to display this study (null if no minimum is required)
      Returns:
      minimum start time required to display this study (null if no minimum is required).
    • getMinStartTime

      public Long getMinStartTime(DataContext ctx)
      Gets the minimum start time (milliseconds since 1970) required to display this study (null if no minimum is required)
      Parameters:
      ctx - data context
      Returns:
      minimum start time required to display this study (null if no minimum is required).
    • setMinStartTime

      public void setMinStartTime(Long time)
      Sets the minimum start time (milliseconds since 1970) to display this study (null if no minimum is required)
      Parameters:
      time - minimum start time (milliseconds since 1970)
    • onActivate

      public void onActivate(OrderContext ctx)
      This method is called when the strategy is activated.
      Parameters:
      ctx - order context
    • onSessionStarted

      public void onSessionStarted(OrderContext ctx, TimeFrame session)
      This method is called when a trading session is started.
      Parameters:
      ctx - order context
      session - time frame
    • onSessionEnded

      public void onSessionEnded(OrderContext ctx, TimeFrame session)
      This method is called when a trading session is ended.
      Parameters:
      ctx - order context
      session - time frame session
    • onBarOpen

      public void onBarOpen(OrderContext ctx)
      This method is called when the current bar is first opened. By default, this method calls onBarUpdate(ctx).
      Parameters:
      ctx - order context
    • onBarUpdate

      public void onBarUpdate(OrderContext ctx)
      This method is called when the current bar has been updated.
      Parameters:
      ctx - order context
    • onBarClose

      public void onBarClose(OrderContext ctx)
      This method is called when the current bar has been closed. By default, this method calls onBarUpdate(ctx).
      Parameters:
      ctx - order context
    • onSignal

      public void onSignal(OrderContext ctx, Object signalKey)
      This method is called when a signal is generated by the study. This method will be called even if the signal is not enabled in the study settings.
      Parameters:
      ctx - order context
      signalKey -
    • onDeactivate

      public void onDeactivate(OrderContext ctx)
      This method is called when the strategy is deactivated.
      Parameters:
      ctx - order context
    • setVetoCloseOnDeactivate

      public void setVetoCloseOnDeactivate(boolean b)
    • onReset

      public void onReset(OrderContext ctx)
      This method is called when the strategy is reset.
      Parameters:
      ctx - order context
    • onPositionClosed

      public void onPositionClosed(OrderContext ctx)
      This method is called when the current open position is closed.
      Parameters:
      ctx - order context
    • onEnterNow

      public void onEnterNow(OrderContext ctx)
      This method is called on response to the 'Enter Now' button on the strategy panel. This is for manual entry strategies only.
      Parameters:
      ctx - order context
    • onOrderFilled

      public void onOrderFilled(OrderContext ctx, Order order)
      This method is called when an order is filled.
      Parameters:
      ctx - order context
      order - order that was filled
    • onOrderCancelled

      public void onOrderCancelled(OrderContext ctx, Order order)
      This method is called when an order is cancelled.
      Parameters:
      ctx - order context
      order - order that was cancelled
    • onOrderRejected

      public void onOrderRejected(OrderContext ctx, Order order)
      This method is called when an order is rejected.
      Parameters:
      ctx - order context
      order - order that was rejected
    • onOrderModified

      public void onOrderModified(OrderContext ctx, Order order)
      This method is called when an order is cancelled.
    • getState

      public final Enums.StrategyState getState()
      Gets the current state of this strategy.
      Returns:
      current state of this strategy
    • setState

      public final void setState(Enums.StrategyState state)
      Sets the current state of this strategy.
      Parameters:
      state - strategy state
    • getEntryState

      public final Enums.EntryState getEntryState()
      Gets the current entry state of this strategy.
      Returns:
      current entry state of this strategy
    • setEntryState

      public final void setEntryState(Enums.EntryState state)
      Sets the current state of this strategy.
      Parameters:
      state - entry state
    • isLong

      public final boolean isLong()
      returns true if this strategy is 'long'.
      Returns:
      true if this strategy is 'long'
    • isShort

      public final boolean isShort()
      returns true if this strategy is 'short'.
      Returns:
      true if this strategy is 'short'
    • setLong

      public final void setLong(Boolean b)
      Sets this strategy as "long' (if true)
      Parameters:
      b - flag that indicates if this strategy is long
    • isCancelInProgress

      public final boolean isCancelInProgress()
      returns true if the strategy is currently being cancelled.
      Returns:
      true if this strategy is currently being cancelled
    • setCancelInProgress

      public final void setCancelInProgress(boolean b)
      Sets the cancel in progress state for this strategy
      Parameters:
      b - true if this strategy is being cancelled
    • getStopPrice

      public final Float getStopPrice()
      Gets the current stop price for an active strategy. This may be used to calculate the stop profit/loss (null if there is no stop price).
      Returns:
      current stop price for an active strategy
    • setStopPrice

      public final void setStopPrice(Float price)
      Sets the stop price for the active strategy. Use null to indicate that there is no stop.
      Parameters:
      price - stop price
    • getTargetPrice

      public final Float getTargetPrice()
      Gets the current target price (exit price) for an active strategy. This may be used to calculate the target profit/loss (null if there is no target price).
      Returns:
      current target price for this strategy
    • setTargetPrice

      public final void setTargetPrice(Float price)
      Sets the target price for the active strategy. Use null to indicate that there is no target.
      Parameters:
      price - target price (null for no target)
    • setDataContext

      public final void setDataContext(DataContext ctx)
      This method is called by the study framework and should not be used.
    • getDataContext

      public DataContext getDataContext()
    • get

      public final String get(String ID, Object... params)
      Retrieves the locale dependent string from the resource bundle identified in the StudyHeader annotation.
      Parameters:
      ID - identifier in the resource bundle
      Returns:
      locale dependent string with parameter substitutions
    • round

      public final double round(double d)
      Rounds the give value to the minimum value displayable on the graph. If this is an overlay, it calls Instrument.round(d) for the for instrument in the data context. If this is not an overlay the value is rounded using the minTick value set on the RuntimeDescriptor.
      Parameters:
      d - the value to round
      Returns:
      the value d rounded to the min value displayable on the graph
    • format

      public final String format(double d)
      Formats the give value as a displayable value on the graph. If this is an overlay, it calls Instrument.format(d) for the for instrument in the data context. If this is not an overlay the value is rounded using the minTick value set on the RuntimeDescriptor.
      Parameters:
      d - the value to round
    • crossedAbove

      public final boolean crossedAbove(Object key1, Object key2)
      Convenience Method. Checks to see if the series of values defined by key1 has crossed above the series of values defined by key2 (using the latest value of the default data series). This occurs if round(series.getDouble(index, key1)) > round(series.getDouble(index, key2)) AND round(series.getDouble(index-1, key2)) < round(series.getDouble(index-1, key2))
      Parameters:
      key1 - key that identifies the first series of values
      key2 - key that identifies the second series of values
      Returns:
      true if the series key1 crossed above series key2
    • crossedAbove

      public final boolean crossedAbove(DataSeries series, int index, Object key1, Object key2)
      Convenience Method. Checks to see if the series of values defined by key1 has crossed above the series of values defined by key2. This occurs if round(series.getDouble(index, key1)) > round(series.getDouble(index, key2)) AND round(series.getDouble(index-1, key2)) < round(series.getDouble(index-1, key2))
      Parameters:
      series - series that contains the values
      index - index in the data series
      key1 - key that identifies the first series of values
      key2 - key that identifies the second series of values
      Returns:
      true if the series key1 crossed above series key2
    • crossedAbove

      public final boolean crossedAbove(Object key1, double val)
      Convenience Method. Checks to see if the series of values defined by key1 has crossed above the value 'val' (using the latest value of the default data series).
      Parameters:
      key1 - key that identifies the first series of values
      val - value to cross above
      Returns:
      true if the series key1 crossed above val
    • crossedAbove

      public final boolean crossedAbove(DataSeries series, int index, Object key1, double val)
      Convenience Method. Checks to see if the series of values defined by key1 has crossed above the value 'val'.
      Parameters:
      series - series that contains the values
      index - index in the data series
      key1 - key that identifies the first series of values
      val - value to cross above
      Returns:
      true if the series key1 crossed above val
    • crossedBelow

      public final boolean crossedBelow(Object key1, Object key2)
      Convenience Method. Checks to see if the series of values defined by the key key1 has crossed below the series of values defined by key2 (using the latest index in the default data series). This occurs if round(series.getDouble(index, key1)) < round(series.getDouble(index, key2)) AND round(series.getDouble(index-1, key1)) > round(series.getDouble(index-1, key2))
      Parameters:
      key1 - key that identifies the first series of values
      key2 - key that identifies the second series of values
      Returns:
      true if the series key1 crossed below series key2
    • crossedBelow

      public final boolean crossedBelow(DataSeries series, int index, Object key1, Object key2)
      Convenience Method. Checks to see if the series of values defined by the key key1 has crossed below the series of values defined by key2. This occurs if round(series.getDouble(index, key1)) < round(series.getDouble(index, key2)) AND round(series.getDouble(index-1, key1)) > round(series.getDouble(index-1, key2))
      Parameters:
      series - series that contains the values
      index - index in the data series
      key1 - key that identifies the first series of values
      key2 - key that identifies the second series of values
      Returns:
      true if the series key1 crossed below series key2
    • crossedBelow

      public final boolean crossedBelow(Object key1, double val)
      Convenience Method. Checks to see if the series of values defined by key1 has crossed below the value 'val' (using the latest value of the default data series).
      Parameters:
      key1 - key that identifies the first series of values
      val - value to cross below
      Returns:
      true if the series key1 crossed below val
    • crossedBelow

      public final boolean crossedBelow(DataSeries series, int index, Object key1, double val)
      Convenience Method. Checks to see if the series of values defined by key1 has crossed below the value 'val'.
      Parameters:
      series - series that contains the values
      index - index in the data series
      key1 - key that identifies the first series of values
      val - value to cross below
      Returns:
      true if the series key1 crossed below val
    • debug

      public final void debug(String msg)
      Logs a debug message to the study log.
      Parameters:
      msg - debug message
    • info

      public final void info(String msg)
      Logs an info message to the study log.
      Parameters:
      msg - info message
    • warning

      public final void warning(String msg)
      Logs a warning message to the study log.
      Parameters:
      msg - warning message
    • error

      public final void error(String msg)
      Logs an error message to the study log.
      Parameters:
      msg - error message
    • addPropertyChangeListener

      public void addPropertyChangeListener(PropertyChangeListener listener)
      Adds the given property change listener. This listener will receive property change events for all properties.
      Parameters:
      listener - property change listener
    • addPropertyChangeListener

      public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener)
      Adds the given property change listener. This listener will only receive property change events for the given propertyName.
      Parameters:
      propertyName - name of the property
      listener - property change listener
    • removePropertyChangeListener

      public void removePropertyChangeListener(PropertyChangeListener listener)
      Removes the given property listener.
      Parameters:
      listener - property change listener
    • removePropertyChangeListener

      public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener)
      Removes the given property listener for the given propertyName.
      Parameters:
      propertyName - name of the property
      listener - property change listener
    • firePropertyChange

      protected void firePropertyChange(String propertyName, Object oldValue, Object newValue)
      Fires a property change event for the given property name if the newValue is different from the oldValue
      Parameters:
      propertyName - name of the property
      oldValue - old (previous) value for this property
      newValue - new value for the property
    • destroy

      public void destroy()
      This method is called when the study is being disposed. This method should be used to release and resources (if any).
    • notifyRangeUpdated

      protected void notifyRangeUpdated()
      Sends a notification that the range for the study has been updated and the range for graph may need to be recomputed.
    • notifyValuesUpdated

      protected void notifyValuesUpdated()
      Sends a notification that the values for the study have been updated and any dependent studies may need to get recomputed.
    • notifyRedraw

      protected void notifyRedraw()
      Sends a notification that the study needs to be redrawn.
    • clone

      public Study clone()
      Creates a clone (copy) of this study.
      Overrides:
      clone in class Object
      Returns:
      clone of this study
    • beginFigureUpdate

      public void beginFigureUpdate()
    • endFigureUpdate

      public void endFigureUpdate()