Как повторно использовать значение в разных функциях?
Я программирую Обучение в MotiveWave, программе, используемой для (дневной) торговли. Исследование это собственный класс. (информация о SDK MotiveWave находится здесь: https://www.motivewave.com/sdk/javadoc/overview-summary.html).
public class L_V2 extends com.motivewave.platform.sdk.study.Study
В моем исследовании используются 2 разных таймфрейма: 1-часовой и 4-часовой. Оба рассчитываются в другой функции. Иначе сформулировано: оба используют разные наборы данных, как показано в коде ниже.
У меня есть два значения, рассчитанные на 4-часовом таймфрейме, называемые "ma9" и "ma11", которые я хотел бы использовать в выражении "if" на 1-часовом таймфрейме.
Это код для 4-х часового периода. Он просто вычисляет 2 скользящие средние
@Override
protected void calculateValues(DataContext ctx)
{
int maPeriodTF2 = getSettings().getInteger(MA_PERIOD_TF2);
int ma2PeriodTF2 = getSettings().getInteger(MA2_PERIOD_TF2);
//Object maInput = getSettings().getInput(MA_INPUT, Enums.BarInput.CLOSE);
BarSize barSizeTF2 = getSettings().getBarSize(MA_BARSIZE_TF2);
DataSeries series2 = ctx.getDataSeries(barSizeTF2);
StudyHeader header = getHeader();
boolean updates = getSettings().isBarUpdates() || (header != null && header.requiresBarUpdates());
// Calculate Moving Average for the Secondary Data Series
for(int i = 1; i < series2.size(); i++) {
if (series2.isComplete(i)) continue;
if (!updates && !series2.isBarComplete(i)) continue;
// MA TF2
Double ma9 = series2.ma(getSettings().getMAMethod(MA_METHOD_TF2), i, maPeriodTF2, getSettings().getInput(MA_INPUT_TF2));
Double ma11 = series2.ma(getSettings().getMAMethod(MA2_METHOD_TF2), i, ma2PeriodTF2, getSettings().getInput(MA2_INPUT_TF2));
series2.setDouble(i, Values.MA9_H4, ma9);
series2.setDouble(i, Values.MA11_H4, ma11);
}
// Invoke the parent method to run the "calculate" method below for the primary (chart) data series
super.calculateValues(ctx);
Теперь я хотел бы использовать эти 2 значения, "ma9" и "ma11" в другой функции, на 1-часовом таймфрейме:
@Override
protected void calculate(int index, DataContext ctx)
DataSeries series=ctx.getDataSeries();
if (ma9 < ma11 && other conditions)
{ctx.signal(index, Signals.YOU_SHOULD_BUY, "This would be my buying signal", series.getClose(index));
}
Как я могу экспортировать ma9 и ma11, чтобы они стали "глобальными", и я мог повторно использовать их в этой другой функции?
1 ответ
По сути, идея состоит в том, чтобы где-то хранить значения или просто передавать их соответствующим образом после вычисления. Существует шаблон Java, основанный на синглтоне, который позволяет хранить / извлекать значения внутри класса (используя коллекцию: HashMap). Любые значения могут быть добавлены, повторены в любых классах на основе предопределенных (ключ, значение) с использованием конструкции Singelton.getInstance() со стандартной операцией HashMap (put, get).
Может быть, этот пример может быть полезным.
import java.util.Hashtable;
class Singleton extends Hashtable<String, Object> {
private static final long serialVersionUID = 1L;
private static Singleton one_instance = null;
private Singleton() {
};
public static Singleton getInstance() {
one_instance = (one_instance == null) ? new Singleton() : one_instance;
return one_instance;
}
}
import java.util.Random;
public class Reuse {
public static void main(String[] args) {
Reuse r = new Reuse();
Compute c = r.new Compute();
Singleton.getInstance().put("r1", c.getRandom());
Singleton.getInstance().put("r2", c.getRandom());
Singleton.getInstance().put("n", c.getName());
System.out.println(Singleton.getInstance().get("r1"));//print random_number_1
System.out.println(Singleton.getInstance().get("r2"));//print random_number_2
System.out.println(Singleton.getInstance().get("n"));// print name (value for key n)
}
class Compute
{
public Double getRandom()
{
return new Random().nextDouble();
}
public String getName()
{
return "name";
}
}
}