Обращение к индикатору из стратегии
Добавлено: Чт ноя 09, 2006 3:23 pm
Как правильно обратиться к индюку, созданному самому, так же как и к стандартным из поставки?
Наш сайт: https://forextester.ru/
https://www.forextester.ru/forum/
Сначала его надо создать в процедуре ResetStrategy, например:wellx писал(а):Как правильно обратиться к индюку, созданному самому, так же как и к стандартным из поставки?
Код: Выделить всё
var
IndMACD: integer;
procedure ResetStrategy; stdcall;
begin
IndMACD := CreateIndicator(Currency, Timeframe, 'MACD', '8;20;12;Close');
end;
Код: Выделить всё
MacdCurrent := GetIndicatorValue(IndMACD, 0, 2);
MacdPrevious := GetIndicatorValue(IndMACD, 1, 2);
С МАКДОМ все понятно, а вот с индикатором Fractals подскажите как быть?Terranin писал(а): Сначала его надо создать в процедуре ResetStrategy, например:
IndMACD - это хэндл который мы будем использовать дальше при обращении к индикатору.Код: Выделить всё
var IndMACD: integer; procedure ResetStrategy; stdcall; begin IndMACD := CreateIndicator(Currency, Timeframe, 'MACD', '8;20;12;Close'); end;
'MACD' это имя dll без расширения
'8;20;12;Close' это параметры перечисленные через точку с запятой в том порядке как они идут в окне настройки индикатора
Обращение к индикатору:
value := GetIndicatorValue(хэндл, индекс, номер буфера);Код: Выделить всё
MacdCurrent := GetIndicatorValue(IndMACD, 0, 2); MacdPrevious := GetIndicatorValue(IndMACD, 1, 2);
У индикатора может быть несколько внутренних буферов вот собственно номер буфера и передаем, буфера нумеруются в порядке их создания процедурой CreateIndexBuffer от 0.
У MACD буфера создаются так:
FastEMA := CreateIndexBuffer; // 0
SlowEMA := CreateIndexBuffer; // 1
_MACD := CreateIndexBuffer; // 2
SMA := CreateIndexBuffer; // 3
значит мы обращаемся к буферу номер 2 = _MACD и выбираем оттуда данные по индексам 0 и 1.
Код: Выделить всё
{-----Reset strategy--------------------------------------------------------}
procedure ResetStrategy; stdcall;
begin
IndFractals := CreateIndicator(Currency, TimeFrame, 'Fractals', '');
OrderHandle := -1;
end;
{-----Process single tick---------------------------------------------------}
procedure GetSingleTick; stdcall;
var
fractal: double;
begin
// check our currency
if Symbol <> string(Currency) then exit;
// set currency and timeframe
SetCurrencyAndTimeframe(Symbol, TimeFrame);
//check new bar
if Time(0) = LastTime then exit;
LastTime := Time(0);
fractal := GetIndicatorValue(IndFractals, 0, 0);
Print(format('Индикатор: %.4f', [fractal]));
Индикатор на графике создался? Какие проблемы?-=LP=- писал(а):С МАКДОМ все понятно, а вот с индикатором Fractals подскажите как быть?
Сижу уже наверное 6-ой час, и так его и так, а он никак!
Подскажите, пожалуйста!Код: Выделить всё
{-----Reset strategy--------------------------------------------------------} procedure ResetStrategy; stdcall; begin IndFractals := CreateIndicator(Currency, TimeFrame, 'Fractals', ''); OrderHandle := -1; end; {-----Process single tick---------------------------------------------------} procedure GetSingleTick; stdcall; var fractal: double; begin // check our currency if Symbol <> string(Currency) then exit; // set currency and timeframe SetCurrencyAndTimeframe(Symbol, TimeFrame); //check new bar if Time(0) = LastTime then exit; LastTime := Time(0); fractal := GetIndicatorValue(IndFractals, 0, 0); Print(format('Индикатор: %.4f', [fractal]));
Да. На графике создался. Но я не могу понять как работать с его буферами. В хэлпе по ФТ написано: "Fractals up buffer - 0, Fractals down buffer - 1". Так вот мне интересно как это использовать, чтобы например знать когда появился фрактал вверх, а когда вниз. Если Вам не сложно, напишите кусочек кода или просто обьясните на словах!Terranin писал(а):Индикатор на графике создался? Какие проблемы?
Ну ты вроде все правильно написал:-=LP=- писал(а):Да. На графике создался. Но я не могу понять как работать с его буферами. В хэлпе по ФТ написано: "Fractals up buffer - 0, Fractals down buffer - 1". Так вот мне интересно как это использовать, чтобы например знать когда появился фрактал вверх, а когда вниз. Если Вам не сложно, напишите кусочек кода или просто обьясните на словах!Terranin писал(а):Индикатор на графике создался? Какие проблемы?
Ага... Понятно!Terranin писал(а):Ну ты вроде все правильно написал:
fractal := GetIndicatorValue(IndFractals, 0, 0);
получить значение буфера индикатора, первое число индекс в буфере, второе индекс самого буфера. Здесь берем значение индикатора на последнем баре в буфере 0. Т.е. стрелочки вверх ищем, если вернуло 0 то нет стрелочки, иначе вернет значение high бара где стрелочка должна быть нарисовано. Для стрелочек вниз вернет low бара.
Не на последнем:-=LP=- писал(а):Ага... Понятно!Terranin писал(а):Ну ты вроде все правильно написал:
fractal := GetIndicatorValue(IndFractals, 0, 0);
получить значение буфера индикатора, первое число индекс в буфере, второе индекс самого буфера. Здесь берем значение индикатора на последнем баре в буфере 0. Т.е. стрелочки вверх ищем, если вернуло 0 то нет стрелочки, иначе вернет значение high бара где стрелочка должна быть нарисовано. Для стрелочек вниз вернет low бара.Значит значение индикатора берется на последнем баре, но на последнем баре никогда не может образоваться фрактал, поэтому значение будет 0!
Хорошо... А как тогда проеверить n-ое количество баров назад, что-бы все-таки знать каким был последний фрактал, вверх или вниз!?
![]()
P.S. Я наверное Вас уже достал!Если что не так, порошу прощения!
Спасибо большое!!Terranin писал(а):Не на последнем:
fractal_up := GetIndicatorValue(IndFractals, n, 0);
fractal_dn := GetIndicatorValue(IndFractals, n, 1);
все просто
Спасибо, со стратегиями разобрался.FX Helper писал(а):Здравствуйте,
Всю необходимую информацию можете найти в программе Forex Tester -> меню Помощь -> Интерфейс стратегий -> Подпункт "Доступ к индикаторам".
Там Вы найдете описание функции CreateIndicator
Код: Выделить всё
#include <windows.h>
#include "StrategyInterfaceUnit.h"
#include "TechnicalFunctions.h"
PChar Currency = NULL;
int Timeframe;
int OrderHandle;
int IndMA;
EXPORT void __stdcall InitStrategy()
{
StrategyShortName("My Strategy");
StrategyDescription("Test");
RegOption("Currency", ot_Currency, &Currency);
RegOption("Timeframe", ot_TimeFrame, &Timeframe);
Timeframe = PERIOD_M15;
}
EXPORT void __stdcall DoneStrategy()
{
free(Currency);
}
EXPORT void __stdcall ResetStrategy()
{
IndMA = CreateIndicator(Currency, Timeframe, "MovingAverage", "55;0;0;Simple (SMA);Close");
SetIndicatorBuffStyle(IndMA, 0, psSolid, 1, clYellow);
}
EXPORT void __stdcall GetSingleTick()
{
if (strcmp(Currency, Symbol()) != 0) return;
SetCurrencyAndTimeframe(Currency, 15);
double x = GetIndicatorValue(IndMA, 0, 0);
if (Bid() < x && OrdersTotal() == 0)
{
SendInstantOrder(Symbol(), op_Sell, 1, Bid() + 50 * Point(), Bid() - 100 * Point(), "", 0, OrderHandle);
}
}