Advertisement
Guest User

SimpleMACross.java

a guest
Jan 6th, 2019
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.24 KB | None | 0 0
  1. package study_examples;
  2.  
  3. import com.motivewave.platform.sdk.common.Coordinate;
  4. import com.motivewave.platform.sdk.common.DataContext;
  5. import com.motivewave.platform.sdk.common.DataSeries;
  6. import com.motivewave.platform.sdk.common.Defaults;
  7. import com.motivewave.platform.sdk.common.Enums;
  8. import com.motivewave.platform.sdk.common.Inputs;
  9. import com.motivewave.platform.sdk.common.MarkerInfo;
  10. import com.motivewave.platform.sdk.common.desc.InputDescriptor;
  11. import com.motivewave.platform.sdk.common.desc.IntegerDescriptor;
  12. import com.motivewave.platform.sdk.common.desc.MAMethodDescriptor;
  13. import com.motivewave.platform.sdk.common.desc.MarkerDescriptor;
  14. import com.motivewave.platform.sdk.common.desc.PathDescriptor;
  15. import com.motivewave.platform.sdk.common.desc.SettingGroup;
  16. import com.motivewave.platform.sdk.common.desc.SettingTab;
  17. import com.motivewave.platform.sdk.common.desc.SettingsDescriptor;
  18. import com.motivewave.platform.sdk.common.desc.ValueDescriptor;
  19. import com.motivewave.platform.sdk.draw.Marker;
  20. import com.motivewave.platform.sdk.study.RuntimeDescriptor;
  21. import com.motivewave.platform.sdk.study.Study;
  22. import com.motivewave.platform.sdk.study.StudyHeader;
  23.  
  24. /** Moving Average Cross. This study consists of two moving averages:
  25.     Fast MA (shorter period), Slow MA. Signals are generated when the
  26.     Fast MA moves above or below the Slow MA. Markers are also displayed
  27.     where these crosses occur. */
  28. @StudyHeader(
  29.   namespace="com.mycompany",
  30.   id="MACROSS",
  31.   name="Sample Moving Average Cross",
  32.   label="MA Cross",
  33.   desc="Displays a signal arrow when two moving averages (fast and slow) cross.",
  34.   menu="Examples",
  35.   overlay=true,
  36.   signals=true)
  37. public class SampleMACross extends Study
  38. {
  39.   enum Values { FAST_MA, SLOW_MA };
  40.   enum Signals { CROSS_ABOVE, CROSS_BELOW };
  41.  
  42.   @Override
  43.   public void initialize(Defaults defaults)
  44.   {
  45.     // User Settings
  46.     SettingsDescriptor sd=new SettingsDescriptor();
  47.     setSettingsDescriptor(sd);
  48.     SettingTab tab=new SettingTab("General");
  49.     sd.addTab(tab);
  50.  
  51.     // Fast MA (shorter period)
  52.     SettingGroup ma1=new SettingGroup("Fast MA");
  53.     tab.addGroup(ma1);
  54.     ma1.addRow(new InputDescriptor(Inputs.INPUT, "Fast Input", Enums.BarInput.CLOSE));
  55.     ma1.addRow(new MAMethodDescriptor(Inputs.METHOD, "Fast Method", Enums.MAMethod.EMA));
  56.     ma1.addRow(new IntegerDescriptor(Inputs.PERIOD, "Fast Period", 10, 1, 9999, 1));
  57.  
  58.     // Slow MA (shorter period)
  59.     SettingGroup ma2=new SettingGroup("Slow MA");
  60.     tab.addGroup(ma2);
  61.     ma2.addRow(new InputDescriptor(Inputs.INPUT2, "Slow Input", Enums.BarInput.CLOSE));
  62.     ma2.addRow(new MAMethodDescriptor(Inputs.METHOD2, "Slow Method", Enums.MAMethod.EMA));
  63.     ma2.addRow(new IntegerDescriptor(Inputs.PERIOD2, "Slow Period", 20, 1, 9999, 1));
  64.  
  65.     tab=new SettingTab("Display");
  66.     sd.addTab(tab);
  67.  
  68.     SettingGroup lines=new SettingGroup("Lines");
  69.     tab.addGroup(lines);
  70.     lines.addRow(new PathDescriptor(Inputs.PATH, "Fast MA", defaults.getGreenLine(), 1.0f, null, true, false, false));
  71.     lines.addRow(new PathDescriptor(Inputs.PATH2, "Slow MA", defaults.getBlueLine(), 1.0f, null, true, false, false));
  72.  
  73.     SettingGroup markers=new SettingGroup("Markers");
  74.     tab.addGroup(markers);
  75.     markers.addRow(new MarkerDescriptor(Inputs.UP_MARKER, "Up Marker", Enums.MarkerType.TRIANGLE, Enums.Size.SMALL, defaults.getGreen(), defaults.getLineColor(), true, true));
  76.     markers.addRow(new MarkerDescriptor(Inputs.DOWN_MARKER, "Down Marker", Enums.MarkerType.TRIANGLE, Enums.Size.SMALL, defaults.getRed(), defaults.getLineColor(), true, true));
  77.  
  78.     // Runtime Settings
  79.     RuntimeDescriptor desc=new RuntimeDescriptor();
  80.     setRuntimeDescriptor(desc);
  81.  
  82.     desc.setLabelSettings(Inputs.INPUT, Inputs.METHOD, Inputs.PERIOD, Inputs.INPUT2, Inputs.METHOD2, Inputs.PERIOD2);
  83.     desc.exportValue(new ValueDescriptor(Values.FAST_MA, "Fast MA", new String[] { Inputs.INPUT, Inputs.METHOD, Inputs.PERIOD }));
  84.     desc.exportValue(new ValueDescriptor(Values.SLOW_MA, "Slow MA", new String[] { Inputs.INPUT2, Inputs.METHOD2, Inputs.PERIOD2 }));
  85.     desc.exportValue(new ValueDescriptor(Signals.CROSS_ABOVE, Enums.ValueType.BOOLEAN, "Cross Above", null));
  86.     desc.exportValue(new ValueDescriptor(Signals.CROSS_BELOW, Enums.ValueType.BOOLEAN, "Cross Below", null));
  87.     desc.declarePath(Values.FAST_MA, Inputs.PATH);
  88.     desc.declarePath(Values.SLOW_MA, Inputs.PATH2);
  89.  
  90.     // Signals
  91.     desc.declareSignal(Signals.CROSS_ABOVE, "Fast MA Cross Above");
  92.     desc.declareSignal(Signals.CROSS_BELOW, "Fast MA Cross Below");
  93.  
  94.     desc.setRangeKeys(Values.FAST_MA, Values.SLOW_MA);
  95.   }
  96.  
  97.   @Override
  98.   protected void calculate(int index, DataContext ctx)
  99.   {
  100.     int fastPeriod=getSettings().getInteger(Inputs.PERIOD);
  101.     int slowPeriod=getSettings().getInteger(Inputs.PERIOD2);
  102.     if (index < Math.max(fastPeriod, slowPeriod)) return; // not enough data
  103.  
  104.     DataSeries series=ctx.getDataSeries();
  105.  
  106.     // Calculate and store the fast and slow MAs
  107.     Double fastMA=series.ma(getSettings().getMAMethod(Inputs.METHOD), index, fastPeriod, getSettings().getInput(Inputs.INPUT));
  108.     Double slowMA=series.ma(getSettings().getMAMethod(Inputs.METHOD2), index, slowPeriod, getSettings().getInput(Inputs.INPUT2));
  109.     if (fastMA == null || slowMA == null) return;
  110.  
  111.     series.setDouble(index, Values.FAST_MA, fastMA);
  112.     series.setDouble(index, Values.SLOW_MA, slowMA);
  113.  
  114.     if (!series.isBarComplete(index)) return;
  115.  
  116.     // Check to see if a cross occurred and raise signal.
  117.     Coordinate c=new Coordinate(series.getStartTime(index), slowMA);
  118.     if (crossedAbove(series, index, Values.FAST_MA, Values.SLOW_MA)) {
  119.       MarkerInfo marker=getSettings().getMarker(Inputs.UP_MARKER);
  120.       if (marker.isEnabled()) addFigure(new Marker(c, Enums.Position.BOTTOM, marker));
  121.       ctx.signal(index, Signals.CROSS_ABOVE, "Fast MA Crossed Above!", series.getClose(index));
  122.     }
  123.     else if (crossedBelow(series, index, Values.FAST_MA, Values.SLOW_MA)) {
  124.       MarkerInfo marker=getSettings().getMarker(Inputs.DOWN_MARKER);
  125.       if (marker.isEnabled()) addFigure(new Marker(c, Enums.Position.TOP, marker));
  126.       ctx.signal(index, Signals.CROSS_BELOW, "Fast MA Crossed Below!", series.getClose(index));
  127.     }
  128.  
  129.     series.setComplete(index);
  130.   }
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement