Есть вопросы по написанию стратегии

Образцы, куски исходников, вопросы. Обсуждаем программирование.
Ответить
Сообщение
Автор
Атон
Сообщения: 11
Зарегистрирован: Ср ноя 15, 2006 3:10 am

Есть вопросы по написанию стратегии

#1 Сообщение Атон » Чт янв 18, 2007 9:06 am

Михаил добрый день!

Занялся всерьез написанием стратегий на Дельфи.
Документация, к сожалению, оказалась для меня (новичка) достаточно скудна или в ней очень много недописано. Прошу вас разъяснить следующую ситуацию:

Хочу получить значение 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

#2 Сообщение Атон » Чт янв 18, 2007 11:36 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 минутного бара?

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#3 Сообщение Terranin » Чт янв 18, 2007 3:12 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

Атон
Сообщения: 11
Зарегистрирован: Ср ноя 15, 2006 3:10 am

#4 Сообщение Атон » Пт янв 19, 2007 2:54 pm

Спасибо, все получилось для одного ТФ.
В документации сказано, что можно переключать стратегию на разные ТФ, во время расчета.
Допустим я хочу открывать ордер по крупному ТФ (например, Н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

#5 Сообщение Terranin » Пт янв 19, 2007 3:26 pm

Атон писал(а):Спасибо, все получилось для одного ТФ.
В документации сказано, что можно переключать стратегию на разные ТФ, во время расчета.
Допустим я хочу открывать ордер по крупному ТФ (например, Н1), а закрывать по мелкому (например, М15).
Как это реализовать? Я попробывал приведенный ниже код, но все сбивается в кучу, почему-то...
В чем ошибка?
Ошибка в том, что Вы перезаписываете переменную LastTime для двух таймфреймов. А надо бы иметь 2 переменные для каждого отдельно.
Asta la vista
Mike

Ответить