Михаил добрый день!
Занялся всерьез написанием стратегий на Дельфи.
Документация, к сожалению, оказалась для меня (новичка) достаточно скудна или в ней очень много недописано. Прошу вас разъяснить следующую ситуацию:
Хочу получить значение 15 ЕМА через вызов индикатора. Использую помощь
Forex Tester v 1.0 Strategies help. Прописываю модули и т.п. как
описано в ФАКе и описании индикатора Moving Average ('MovingAverage',
'<Period: integer>; <Shift: integer>; <MAtype: string>; <ApplyToPrice:string>'
'8;5;Simple (SMA);Close'), но в результате получается какая-то
неразбериха = тип ЕМА не берет, а иногда не берет и тип цены 9illegal
value). Ни один из трех вариантов не работает.
Может у вас есть дополнительные описания функции? Хелп? Нельзя ли
подробней описать для чего нужны в GetIndicatorValue(IndMA, 0, 1)
индекс и буфер, и как их определять, если я хочу допустим получить
значения сразу для двух-трех ЕМА (15, 30, 45). Спасибо
Кусочек моего кода:
---
uses
SysUtils, Classes, StrategyInterfaceUnit, TechnicalFunctions;
var
IndMA: integer;
procedure ResetStrategy; stdcall;
begin
1) IndMA := CreateIndicator('GBPUSD', PERIOD_H1, 'MovingAverage','15;0;StrMAType(ma_EMA);Close');
2) IndMA := CreateIndicator('GBPUSD', PERIOD_H1, 'MovingAverage','15;0;ma_EMA;Close');
3) IndMA := CreateIndicator('GBPUSD', PERIOD_H1, 'MovingAverage','15;0;"Exponential (EMA)";Close');
end;
procedure GetSingleTick; stdcall; export
var
EMA: double;
begin
EMA := GetIndicatorValue(IndMA, 0, 1);
end;
Есть вопросы по написанию стратегии
-
- Сообщения: 11
- Зарегистрирован: Ср ноя 15, 2006 3:10 am
-
- Сообщения: 11
- Зарегистрирован: Ср ноя 15, 2006 3:10 am
Спасибо, почитал внимательней другие ветки и разобрался:
Правильно будет вот так, проблема была в буферах и дополнительно разобрался с двумя индикаторами
uses
SysUtils, Classes, StrategyInterfaceUnit, TechnicalFunctions;
var
IndMA1: integer;
IndMA2: integer;
procedure ResetStrategy; stdcall;
begin
IndMA1 := CreateIndicator('GBPUSD', PERIOD_H1, 'MovingAverage','15;0;Exponential (EMA);Close');
IndMA2 := CreateIndicator('GBPUSD', PERIOD_H1, 'MovingAverage','30;0;Exponential (EMA);Close');
end;
procedure GetSingleTick; stdcall; export
var
EMA1, EMA2: double;
begin
EMA1 := GetIndicatorValue(IndMA1, 0, 0);
EMA2 := GetIndicatorValue(IndMA2, 1, 0);
end;
Возник другой вопрос, ведь данные значения пересчитываются каждый тик, правильно?
А как сделать, чтобы эти значения считались только допустим по окончании 15 минутного бара?
Правильно будет вот так, проблема была в буферах и дополнительно разобрался с двумя индикаторами
uses
SysUtils, Classes, StrategyInterfaceUnit, TechnicalFunctions;
var
IndMA1: integer;
IndMA2: integer;
procedure ResetStrategy; stdcall;
begin
IndMA1 := CreateIndicator('GBPUSD', PERIOD_H1, 'MovingAverage','15;0;Exponential (EMA);Close');
IndMA2 := CreateIndicator('GBPUSD', PERIOD_H1, 'MovingAverage','30;0;Exponential (EMA);Close');
end;
procedure GetSingleTick; stdcall; export
var
EMA1, EMA2: double;
begin
EMA1 := GetIndicatorValue(IndMA1, 0, 0);
EMA2 := GetIndicatorValue(IndMA2, 1, 0);
end;
Возник другой вопрос, ведь данные значения пересчитываются каждый тик, правильно?
А как сделать, чтобы эти значения считались только допустим по окончании 15 минутного бара?
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Индикаторы по-любому считаются на каждом тике, но если Вы хотите чтобы стратегия работала по каждому бару один раз то надо делать так:Атон писал(а):Спасибо, почитал внимательней другие ветки и разобрался:
Правильно будет вот так, проблема была в буферах и дополнительно разобрался с двумя индикаторами
uses
SysUtils, Classes, StrategyInterfaceUnit, TechnicalFunctions;
var
IndMA1: integer;
IndMA2: integer;
procedure ResetStrategy; stdcall;
begin
IndMA1 := CreateIndicator('GBPUSD', PERIOD_H1, 'MovingAverage','15;0;Exponential (EMA);Close');
IndMA2 := CreateIndicator('GBPUSD', PERIOD_H1, 'MovingAverage','30;0;Exponential (EMA);Close');
end;
procedure GetSingleTick; stdcall; export
var
EMA1, EMA2: double;
begin
EMA1 := GetIndicatorValue(IndMA1, 0, 0);
EMA2 := GetIndicatorValue(IndMA2, 1, 0);
end;
Возник другой вопрос, ведь данные значения пересчитываются каждый тик, правильно?
А как сделать, чтобы эти значения считались только допустим по окончании 15 минутного бара?
Код: Выделить всё
var
LastTime: TDateTime;
...
procedure ResetStrategy; stdcall;
begin
...
LastTime := 0;
...
end;
procedure GetSingleTick; stdcall;
begin
// проверяем нашу валюту
if Symbol <> OurCurrency then
exit;
// устанавливаем валюту и таймфрейм
SetCurrencyAndTimeFrame(Symbol, OurPeriod);
// проверяем время последнего бара
if Time(0) <> LastTime then
begin
LastTime := Time(0);
// делаем чего нам надо 1 раз на бар
end;
end;
Asta la vista
Mike
Mike
-
- Сообщения: 11
- Зарегистрирован: Ср ноя 15, 2006 3:10 am
Спасибо, все получилось для одного ТФ.
В документации сказано, что можно переключать стратегию на разные ТФ, во время расчета.
Допустим я хочу открывать ордер по крупному ТФ (например, Н1), а закрывать по мелкому (например, М15).
Как это реализовать? Я попробывал приведенный ниже код, но все сбивается в кучу, почему-то...
В чем ошибка?
var
LastTime: TDateTime;
...
procedure ResetStrategy; stdcall;
begin
...
LastTime := 0;
...
end;
procedure GetSingleTick; stdcall;
begin
// проверяем нашу валюту
if Symbol <> OurCurrency then
exit;
// устанавливаем валюту и таймфрейм М5
SetCurrencyAndTimeFrame(Symbol, OurPeriod_M5);
// проверяем время последнего бара
if Time(0) <> LastTime then
begin
LastTime := Time(0);
// делаем чего нам надо по закрытию ордера 1 раз на бар
end;
// устанавливаем валюту и таймфрейм H1
SetCurrencyAndTimeFrame(Symbol, OurPeriod_H1);
// проверяем время последнего бара
if Time(0) <> LastTime then
begin
LastTime := Time(0);
// делаем чего нам надо по открытию ордера 1 раз на бар
end;
end;
В документации сказано, что можно переключать стратегию на разные ТФ, во время расчета.
Допустим я хочу открывать ордер по крупному ТФ (например, Н1), а закрывать по мелкому (например, М15).
Как это реализовать? Я попробывал приведенный ниже код, но все сбивается в кучу, почему-то...
В чем ошибка?
var
LastTime: TDateTime;
...
procedure ResetStrategy; stdcall;
begin
...
LastTime := 0;
...
end;
procedure GetSingleTick; stdcall;
begin
// проверяем нашу валюту
if Symbol <> OurCurrency then
exit;
// устанавливаем валюту и таймфрейм М5
SetCurrencyAndTimeFrame(Symbol, OurPeriod_M5);
// проверяем время последнего бара
if Time(0) <> LastTime then
begin
LastTime := Time(0);
// делаем чего нам надо по закрытию ордера 1 раз на бар
end;
// устанавливаем валюту и таймфрейм H1
SetCurrencyAndTimeFrame(Symbol, OurPeriod_H1);
// проверяем время последнего бара
if Time(0) <> LastTime then
begin
LastTime := Time(0);
// делаем чего нам надо по открытию ордера 1 раз на бар
end;
end;
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Ошибка в том, что Вы перезаписываете переменную LastTime для двух таймфреймов. А надо бы иметь 2 переменные для каждого отдельно.Атон писал(а):Спасибо, все получилось для одного ТФ.
В документации сказано, что можно переключать стратегию на разные ТФ, во время расчета.
Допустим я хочу открывать ордер по крупному ТФ (например, Н1), а закрывать по мелкому (например, М15).
Как это реализовать? Я попробывал приведенный ниже код, но все сбивается в кучу, почему-то...
В чем ошибка?
Asta la vista
Mike
Mike