Обращение к индикатору из стратегии
Добавлено: Чт ноя 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 писал(а):Индикатор на графике создался? Какие проблемы?
Ага... Понятно! Значит значение индикатора берется на последнем баре, но на последнем баре никогда не может образоваться фрактал, поэтому значение будет 0! Хорошо... А как тогда проеверить n-ое количество баров назад, что-бы все-таки знать каким был последний фрактал, вверх или вниз!?Terranin писал(а):Ну ты вроде все правильно написал:
fractal := GetIndicatorValue(IndFractals, 0, 0);
получить значение буфера индикатора, первое число индекс в буфере, второе индекс самого буфера. Здесь берем значение индикатора на последнем баре в буфере 0. Т.е. стрелочки вверх ищем, если вернуло 0 то нет стрелочки, иначе вернет значение high бара где стрелочка должна быть нарисовано. Для стрелочек вниз вернет low бара.
Не на последнем:-=LP=- писал(а):Ага... Понятно! Значит значение индикатора берется на последнем баре, но на последнем баре никогда не может образоваться фрактал, поэтому значение будет 0! Хорошо... А как тогда проеверить n-ое количество баров назад, что-бы все-таки знать каким был последний фрактал, вверх или вниз!?Terranin писал(а):Ну ты вроде все правильно написал:
fractal := GetIndicatorValue(IndFractals, 0, 0);
получить значение буфера индикатора, первое число индекс в буфере, второе индекс самого буфера. Здесь берем значение индикатора на последнем баре в буфере 0. Т.е. стрелочки вверх ищем, если вернуло 0 то нет стрелочки, иначе вернет значение high бара где стрелочка должна быть нарисовано. Для стрелочек вниз вернет low бара.
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);
}
}