Страница 1 из 1
Камарилла
Добавлено: Пн сен 04, 2006 10:06 am
Евгений
Вот код сыроватый правда:
Код: Выделить всё
library Camarilla;
uses
graphics,
IndicatorInterfaceUnit;
var
// внешние параметры
piv,hh5,hh4,hh3,hh2,hh1,ll1,ll2,ll3,ll4,ll5:double;
// индексные буфера
Pivot: TIndexBuffer;
H5: TIndexBuffer;
H4: TIndexBuffer;
H3: TIndexBuffer;
H2: TIndexBuffer;
H1: TIndexBuffer;
L1: TIndexBuffer;
L2: TIndexBuffer;
L3: TIndexBuffer;
L4: TIndexBuffer;
L5: TIndexBuffer;
//---------------------------------------------------------------------------
// Процедура инициализации
//---------------------------------------------------------------------------
procedure Init; stdcall;
begin
IndicatorShortName('Camarilla');
SetOutputWindow(ow_ChartWindow);
// зарегистрировать опции
AddSeparator('Common');
// create buffers
IndicatorBuffers(11);
AddSeparator('Pivot');
Pivot := CreateIndexBuffer;
SetIndexBuffer(0, Pivot);
SetIndexStyle(0, ds_Line, psDashDotDot, 2, clYellow);
AddSeparator('H5 Color');
H5 := CreateIndexBuffer;
SetIndexBuffer(1, H5);
SetIndexStyle(1, ds_Line, psSolid, 1, clGreen);
AddSeparator('H4 Color');
H4 := CreateIndexBuffer;
SetIndexBuffer(2, H4);
SetIndexStyle(2, ds_Line, psSolid, 1, clGreen);
AddSeparator('H3 Color');
H3 := CreateIndexBuffer;
SetIndexBuffer(3, H3);
SetIndexStyle(3, ds_Line, psSolid, 1, clGreen);
AddSeparator('H2 Color');
H2 := CreateIndexBuffer;
SetIndexBuffer(4, H2);
SetIndexStyle(4, ds_Line, psSolid, 1, clGreen);
AddSeparator('H1 Color');
H1 := CreateIndexBuffer;
SetIndexBuffer(5, H1);
SetIndexStyle(5, ds_Line, psSolid, 1, clGreen);
AddSeparator('L1 Color');
L1 := CreateIndexBuffer;
SetIndexBuffer(6, L1);
SetIndexStyle(6, ds_Line, psSolid, 1, clRed);
AddSeparator('L2 Color');
L2 := CreateIndexBuffer;
SetIndexBuffer(7, L2);
SetIndexStyle(7, ds_Line, psSolid, 1, clRed);
AddSeparator('L3 Color');
L3 := CreateIndexBuffer;
SetIndexBuffer(8, L3);
SetIndexStyle(8, ds_Line, psSolid, 1, clRed);
AddSeparator('L4 Color');
L4 := CreateIndexBuffer;
SetIndexBuffer(9, L4);
SetIndexStyle(9, ds_Line, psSolid, 1, clRed);
AddSeparator('L5 Color');
L5 := CreateIndexBuffer;
SetIndexBuffer(10, L5);
SetIndexStyle(10, ds_Line, psSolid, 1, clRed);
end;
//---------------------------------------------------------------------------
// Процедура деинициализации
//---------------------------------------------------------------------------
procedure Done; stdcall;
begin
// см. Процедуру деинициализации
end;
//---------------------------------------------------------------------------
// Процедура рассчета заданного бара
//---------------------------------------------------------------------------
procedure Calculate(index: integer); stdcall;
var
MyH,MyL,MyC,RR,D1,D2,D3,D4: double;
begin
D1:=0.091667;
D2:=0.183333;
D3:=0.2750;
D4:=0.55;
MyH:=iHigh(Symbol, PERIOD_D1, 1);
MyL:=iLow(Symbol, PERIOD_D1, 1);
MyC:=iClose(Symbol, PERIOD_D1, 1);
RR:=MyH-MyL;
piv:=(MyH+MyL+MyC)/3;
hh5:=MyH/MyL*MyC;
hh4:=RR*D4+MyC;
hh3:=RR*D3+MyC;
hh2:=RR*D2+MyC;
hh1:=RR*D1+MyC;
ll1:=MyC-RR*D1;
ll2:=MyC-RR*D2;
ll3:=MyC-RR*D3;
ll4:=MyC-RR*D4;
ll5:=MyC-(hh5-MyC);
H5[index]:=hh5;
H4[index]:=hh4;
H3[index]:=hh3;
H2[index]:=hh2;
H1[index]:=hh1;
Pivot[index]:=piv;
L1[index]:=ll1;
L2[index]:=ll2;
L3[index]:=ll3;
L4[index]:=ll4;
L5[index]:=ll5;
end;
exports
// эти процедуры должны быть декларированы как внешние
Init, Done, Calculate;
end.
Работает Покуда только в режиме тестирования,
В эдит моде показывает уровни предпоследнего дня и все. И еще есть небольшая проблемка но в чем никак не пойму, на режимах от часа до 5минут переход к уровням следующего дня начинается не в 00:00 а в 23:00, 23:45 чем меньше таймфрейм тем ближе к полуночи на минутках думаю будет в 23:55 не тестил.
Terrenin Не подскажешь в чем дело?!
Re: Камарилла
Добавлено: Ср сен 06, 2006 5:09 pm
Terranin
Евгений писал(а):Вот код сыроватый правда:
Работает Покуда только в режиме тестирования,
В эдит моде показывает уровни предпоследнего дня и все. И еще есть небольшая проблемка но в чем никак не пойму, на режимах от часа до 5минут переход к уровням следующего дня начинается не в 00:00 а в 23:00, 23:45 чем меньше таймфрейм тем ближе к полуночи на минутках думаю будет в 23:55 не тестил.
Terrenin Не подскажешь в чем дело?!
А почему используется iHigh(..., 1); ? По идее должен использоваться 0. Потому и переход на предпоследнем баре происходит наверное. И даже не 0 там надо использовать а index.
Re: Камарилла
Добавлено: Чт сен 07, 2006 1:21 pm
Евгений
Terranin писал(а):А почему используется iHigh(..., 1); ? По идее должен использоваться 0. Потому и переход на предпоследнем баре происходит наверное. И даже не 0 там надо использовать а index.
Потому что идет расчет от предылдущего хая, лоу и клоуза, на дневках, а судя по хелпу индекс берется от текущего таймфрейма на который поставлен индюк, чтобы обратиться к старшему таймфрейу на истории надо делать пересчет... Причем руками, судя по всему, или ты незадукоментировал функцию возврата старшего индекса к младшему? Допустим на часах у меня 25 свеча, стало быть на днях должна быть 1, но ни одна функция мине этого значения не вернет. А ежели бы такое было то историю на раз пересчитать монаа было... Хотя, камарилла это в принципе динамический индикатор и его уже мона использовать, ордера ставяться на отбой или пробой уровней в системе страто используются дополнителныее индикаторы и еще индюк зависящий от гринвичского меридиана ши-канал настроенный на европейскую и американскии сессии. Но его писать смысла нет.
Re: Камарилла
Добавлено: Пт сен 08, 2006 1:50 pm
Terranin
Евгений писал(а):Terranin писал(а):А почему используется iHigh(..., 1); ? По идее должен использоваться 0. Потому и переход на предпоследнем баре происходит наверное. И даже не 0 там надо использовать а index.
Потому что идет расчет от предылдущего хая, лоу и клоуза, на дневках, а судя по хелпу индекс берется от текущего таймфрейма на который поставлен индюк, чтобы обратиться к старшему таймфрейу на истории надо делать пересчет... Причем руками, судя по всему, или ты незадукоментировал функцию возврата старшего индекса к младшему? Допустим на часах у меня 25 свеча, стало быть на днях должна быть 1, но ни одна функция мине этого значения не вернет. А ежели бы такое было то историю на раз пересчитать монаа было... Хотя, камарилла это в принципе динамический индикатор и его уже мона использовать, ордера ставяться на отбой или пробой уровней в системе страто используются дополнителныее индикаторы и еще индюк зависящий от гринвичского меридиана ши-канал настроенный на европейскую и американскии сессии. Но его писать смысла нет.
Чтобы работал и на истории надо писать iHigh(Symbol, PERIOD_D1, index + 1); Когда бежит в режиме тестирования index = 0 всегда (пересчитывается последний бар, потом добавляется новый), а на истории если пересчитать то в каждой точке индекс разный.
Re: Камарилла
Добавлено: Пт сен 08, 2006 2:00 pm
Евгений
Terranin писал(а):Чтобы работал и на истории надо писать iHigh(Symbol, PERIOD_D1, index + 1); Когда бежит в режиме тестирования index = 0 всегда (пересчитывается последний бар, потом добавляется новый), а на истории если пересчитать то в каждой точке индекс разный.
Обломись.
Invalid floatin point operation При попытке добавить индюк... Причем менял только строчку как ты предложил.
Re: Камарилла
Добавлено: Пт сен 08, 2006 2:07 pm
Terranin
Евгений писал(а):Terranin писал(а):Чтобы работал и на истории надо писать iHigh(Symbol, PERIOD_D1, index + 1); Когда бежит в режиме тестирования index = 0 всегда (пересчитывается последний бар, потом добавляется новый), а на истории если пересчитать то в каждой точке индекс разный.
Обломись.
Invalid floatin point operation При попытке добавить индюк... Причем менял только строчку как ты предложил.
А, да. Чего то я не посмотрел что у тебя жестко там период забит. Тогда индекс ему не пойдет. Если бы ты использовал текущий период тогда другое дело. В таком случае надо как то искать предыдущий день от текущего индекса на текущем таймфрейме.
Re: Камарилла
Добавлено: Пт сен 08, 2006 3:56 pm
Евгений
Terranin писал(а):А, да. Чего то я не посмотрел что у тебя жестко там период забит. Тогда индекс ему не пойдет. Если бы ты использовал текущий период тогда другое дело. В таком случае надо как то искать предыдущий день от текущего индекса на текущем таймфрейме.
Если использовать текущий таймфрейм то у индюка весь смысл пропадеть. Сижу вот счас и пытаюсь придумать как пересчитать. Хотяя в прынципе этот индюк на истории не очень-то нужен, в МТ4 он тоже на истории не показывает нихрена, только последний день всегда работает.
Ты еще таймфреймы добавлять будешь? А то я счас на имеющиеся его настрою, а с другими наверняка работать не захочет.
Re: Камарилла
Добавлено: Пт сен 08, 2006 4:26 pm
Terranin
Евгений писал(а):Terranin писал(а):А, да. Чего то я не посмотрел что у тебя жестко там период забит. Тогда индекс ему не пойдет. Если бы ты использовал текущий период тогда другое дело. В таком случае надо как то искать предыдущий день от текущего индекса на текущем таймфрейме.
Если использовать текущий таймфрейм то у индюка весь смысл пропадеть. Сижу вот счас и пытаюсь придумать как пересчитать. Хотяя в прынципе этот индюк на истории не очень-то нужен, в МТ4 он тоже на истории не показывает нихрена, только последний день всегда работает.
Ты еще таймфреймы добавлять будешь? А то я счас на имеющиеся его настрою, а с другими наверняка работать не захочет.
Пока не буду. Я буду добавлять только уже полностью настраиваемые пользователем таймфреймы.
Re: Камарилла
Добавлено: Пт сен 08, 2006 5:35 pm
dr_ruslan
Евгений писал(а): Хотяя в прынципе этот индюк на истории не очень-то нужен, в МТ4 он тоже на истории не показывает нихрена, только последний день всегда работает.
А вот этот показывает.
Добавлено: Вт сен 12, 2006 6:27 am
Евгений
Там так это реализовано что мозги вскипят. Сделал все как положено, теперь показывает нормально и на истории и в режиме тестирования. Исходник и дллка в архиве, при желании туда теперь можно добавить и уровни суппорта резистенса, и мид и фиб пивоты... А можно их и отдельными сделать
Terranin заметил такую фишку, функции iTime, iHigh, iLow параметр shift имеет тип longword. А index:integer, короче любая попытка обратиться к барам через индекс текущего бара в этих функциях приводит к посылу далеко и надолго да и вообще, поскольку эти параметры связаны неплохо бы было привести их к одному типу.
Добавлено: Вт сен 12, 2006 3:09 pm
Terranin
Евгений писал(а):Там так это реализовано что мозги вскипят. Сделал все как положено, теперь показывает нормально и на истории и в режиме тестирования. Исходник и дллка в архиве, при желании туда теперь можно добавить и уровни суппорта резистенса, и мид и фиб пивоты... А можно их и отдельными сделать
Terranin заметил такую фишку, функции iTime, iHigh, iLow параметр shift имеет тип longword. А index:integer, короче любая попытка обратиться к барам через индекс текущего бара в этих функциях приводит к посылу далеко и надолго да и вообще, поскольку эти параметры связаны неплохо бы было привести их к одному типу.
Почему к посылу? Вполне можно вместо longword подставлять integer. Просто shift по идее не бывает отрицательным. Shift в этих функциях это индекс бара от 0 в положительном направлении.
Добавлено: Вт сен 12, 2006 3:25 pm
Евгений
Terranin писал(а):
Почему к посылу? Вполне можно вместо longword подставлять integer. Просто shift по идее не бывает отрицательным. Shift в этих функциях это индекс бара от 0 в положительном направлении.
Можно то можно, но хня в том что даже присвоение переменной типа longword значения индекса не решает проблему и все равно выдается обшибка "типа инвалид флоатинг пойнт" И потом простая логика требует что раз индекс и шифт положительные для пущей надежности привести их к одному типу. чтобы не возникали исключения.
Добавлено: Вт сен 12, 2006 3:46 pm
Terranin
Евгений писал(а):Terranin писал(а):
Почему к посылу? Вполне можно вместо longword подставлять integer. Просто shift по идее не бывает отрицательным. Shift в этих функциях это индекс бара от 0 в положительном направлении.
Можно то можно, но хня в том что даже присвоение переменной типа longword значения индекса не решает проблему и все равно выдается обшибка "типа инвалид флоатинг пойнт" И потом простая логика требует что раз индекс и шифт положительные для пущей надежности привести их к одному типу. чтобы не возникали исключения.
Ну ок, сделаю integer везде. А ошибка скорее всего была из-за отрицательного значения которое привелось к положительному и выдало индекс которого нет в массиве.
Добавлено: Вт сен 12, 2006 4:39 pm
Евгений
Terranin писал(а):
А ошибка скорее всего была из-за отрицательного значения которое привелось к положительному и выдало индекс которого нет в массиве.
Не знаю, может и так... Но я вообще-то когда отлаживал выводил принтом значение индекса в журнал, все было в порядке (про отрицательное значение я тоже подумал вначале), потом сделал переменную типа лонгворд и ей индекс присвоил, оказалась та же фигня, точно не знаю в чем беда но любая прямая передача значения индекса в iTime вызывало ошибку и крах, потому и пришлось мудрить с процедурой поиска дневного бара таким диким выходом. Кст в МТ4 есть функция поиска бара по переданному времени, если понадобится можешь мою использовать, тока глянь может перебор циклов уменьшишь, а то у меня там перебор всего массива происходит чаще всего. Да чуть не забыл выложи описания модуля TechnicalFunctions, а то в нем рыться...
Добавлено: Вт сен 12, 2006 5:09 pm
Terranin
Евгений писал(а):Terranin писал(а):
А ошибка скорее всего была из-за отрицательного значения которое привелось к положительному и выдало индекс которого нет в массиве.
Не знаю, может и так... Но я вообще-то когда отлаживал выводил принтом значение индекса в журнал, все было в порядке (про отрицательное значение я тоже подумал вначале), потом сделал переменную типа лонгворд и ей индекс присвоил, оказалась та же фигня, точно не знаю в чем беда но любая прямая передача значения индекса в iTime вызывало ошибку и крах, потому и пришлось мудрить с процедурой поиска дневного бара таким диким выходом. Кст в МТ4 есть функция поиска бара по переданному времени, если понадобится можешь мою использовать, тока глянь может перебор циклов уменьшишь, а то у меня там перебор всего массива происходит чаще всего. Да чуть не забыл выложи описания модуля TechnicalFunctions, а то в нем рыться...
Я без всяких проблем использовал такие конструкции:
Код: Выделить всё
function iMA(currency: string; period: integer): double;
var
sum, weight, price: double;
i: integer;
begin
sum := 0;
weight := 0;
for i:=0 to period - 1 do
begin
price := (iHigh(currency, tm, index + i) + iLow(currency, tm, index + i) +
iClose(currency, tm, index + i)*2)/4;
sum := sum + price*(period - i);
weight := weight + (period - i);
end;
result := sum/weight;
end;
в кластерных индикаторах, как видишь тут сплошные integer передаются в функции ixxx и все прекрасно работало. Насчет iTime посмотрю но они все одинаково работают.
TechnicalFunctions это вспомогательные функции, надстройка над модулем интерфейсов я часто его меняю добавляю туда разные полезные функции, в принципе они все в шапке описаны довольно подробно.
Код: Выделить всё
type
TPriceType = (pt_Close, pt_Open, pt_High, pt_Low, pt_HL2, pt_HLC3, pt_HLCC4);
TMAType = (ma_SMA, ma_EMA, ma_WMA, ma_SSMA);
TValueType = (vt_Open, vt_High, vt_Low, vt_Close, vt_Volume);
// Get price by index and type
// index - index in bar array
// PriceType - type of price or combination
function GetPrice(index: integer; PriceType: TPriceType): double;
// Register option "Apply to price" and fill array of its
// text values
procedure RegApplyToPriceOption(var option: integer; name: string = '');
// Register option "MA type" and fill array of its text values
procedure RegMATypeOption(var option: integer; name: string = '');
// Get linear regression channel parameters
// shift - shift value
// period - channel period
// PriceType - type of price
// StartValue - start price of center line
// EndValue - end price of center line
// Height - channel height
// top - channel top
// bottom - channel bottom
procedure LRCChannelParams(shift, period: integer; PriceType: TPriceType;
var StartValue, EndValue, Height, Top, Bottom: double);
// Get moving average value
// index - index in bars array
// shift - shift value
// maType - moving average type (SMA, EMA, WMA)
// ApplyTo - price type
// prev - previous value for EMA
function GetMA(index, shift, period: integer; maType: TMAType;
ApplyTo: TPriceType; prev: double = 0): double;
// Get highest value in array
// ValueType - type of the value (vt_Open..vt_Volume)
// StartIndex - index from which we start search
// count - number of bars to search
function GetHighestValue(ValueType: TValueType; StartIndex, count: integer): double;
// Get lovest value in array
// ValueType - type of the value (vt_Open..vt_Volume)
// StartIndex - index from which we start search
// count - number of bars to search
function GetLowestValue(ValueType: TValueType; StartIndex, count: integer): double;
Добавлено: Ср сен 13, 2006 2:02 am
Евгений
Счас посмотрел у меня там вообще тоже инт используется. Значит какая-то проблема с индексом все-же.
Первый вариант определения даты расчитываемого бара был таким.
обломился.
сделал так
Код: Выделить всё
ind:longword;
ind:=index;
Print(IntToStr(ind));
CurDate:=iTime(Symbol, TimeFrame, ind);
в журнал выдает нормальный положительный номер текущего бара т.е. Принт отрабатывает, на тайме ошибка...
вот и пришлось мудрить.
Код: Выделить всё
procedure FindDayBar(ind:longword; var FindDayBar:integer); // Поиск дневного бара соответствующего расчитываемому.
var
CurDate,FindDate:TDateTime;
i, count,bar:integer;
begin
for i:=0 to bars-1 do
begin
if i=ind then count:=i;
end;
CurDate:=iTime(Symbol, TimeFrame, count);
bar:=iBars(Symbol, PERIOD_D1);
for i:=0 to bar-1 do
begin
FindDate:=iTime(Symbol, PERIOD_D1, i);
if CurDate= FindDate then
begin
FindDayBar:=i;
exit;
end;
end;
end;
Добавлено: Ср сен 13, 2006 7:08 pm
Terranin
Евгений писал(а):Счас посмотрел у меня там вообще тоже инт используется. Значит какая-то проблема с индексом все-же.
Первый вариант определения даты расчитываемого бара был таким.
обломился.
сделал так
Код: Выделить всё
ind:longword;
ind:=index;
Print(IntToStr(ind));
CurDate:=iTime(Symbol, TimeFrame, ind);
в журнал выдает нормальный положительный номер текущего бара т.е. Принт отрабатывает, на тайме ошибка...
вот и пришлось мудрить.
Код: Выделить всё
procedure FindDayBar(ind:longword; var FindDayBar:integer); // Поиск дневного бара соответствующего расчитываемому.
var
CurDate,FindDate:TDateTime;
i, count,bar:integer;
begin
for i:=0 to bars-1 do
begin
if i=ind then count:=i;
end;
CurDate:=iTime(Symbol, TimeFrame, count);
bar:=iBars(Symbol, PERIOD_D1);
for i:=0 to bar-1 do
begin
FindDate:=iTime(Symbol, PERIOD_D1, i);
if CurDate= FindDate then
begin
FindDayBar:=i;
exit;
end;
end;
end;
Скорее всего индекс неверный. В индикатор приходит index по текущему таймфрейму а в iTime жестко забит таймфрейм PERIOD_D1. Индекс например на 15шках намного больше может быть чем на дневках и выходить за пределы массива.
Добавлено: Чт сен 14, 2006 1:49 am
Евгений
Terranin писал(а):
Скорее всего индекс неверный. В индикатор приходит index по текущему таймфрейму а в iTime жестко забит таймфрейм PERIOD_D1. Индекс например на 15шках намного больше может быть чем на дневках и выходить за пределы массива.
Код: Выделить всё
CurDate:=iTime(Symbol, [b]TimeFrame[/b], index);
Хе если поглядишь внимательнее то обращение именно к текущему таймфрейму!!! Если конечно функция
TimeFrame его возвращает правильно
А если бы
Time окромя времени еще и дату выдавала то и мороки бы не было с таким косвенным обращением к текущему бару.
Добавлено: Ср окт 04, 2006 10:54 pm
Inn
Помогите пожалуйста?
На индикаторе Camarilla, можно сделать так,
что бы, квадратиков (линии) на всей истории не было, а только на текущем дне,
или выставить флажок и с количеством дней в параметрах,
кому надо тот выставит историю.
Спасибо.
Добавлено: Сб окт 07, 2006 3:10 pm
Terranin
Inn писал(а):Помогите пожалуйста?
На индикаторе Camarilla, можно сделать так,
что бы, квадратиков (линии) на всей истории не было, а только на текущем дне,
или выставить флажок и с количеством дней в параметрах,
кому надо тот выставит историю.
Спасибо.
Евгений куда то запропал, он автор этого индикатора...
Добавлено: Сб окт 07, 2006 8:57 pm
Inn
Дааа, плохо,
придется подождать!