Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 Торговля в разных тайм-фреймах Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
r-manager



Зарегистрирован: 02.04.2008
Сообщения: 17

СообщениеДобавлено: Ср Апр 02, 2008 1:37 pm Ответить с цитатой Вернуться к началу

Здравствуйте!
Возникла идея торговли на разных тайм-фреймах в зависимости от активности игроков.
Например, на простейшем ценовом канале.
Логика такая: если объемы торгов начинают возрастать, то система быстренько опускается на нужный временной интервал и отслеживает движения на нем. Если объемы торгов низкие, то вход в рынок не осуществляется, система переходит на бОльший тайм-фрейм.
Если же уже открыта позиция, то для предотвращения увеличения потерь даже при снижении объемов торгов система не переходит на больший временной интервал, а может переходить только на меньшие.
Хотел проверить идею, однако возникли трудности с написанием кода.

То ли в программном коде Амиброкера то, что я хочу сделать нереализуемо, то ли просто допускаю ошибки.
Перепробовал разные варианты, к сожалению либо выдается ошибка, либо компьютер вовсе зависает.
Решил обратиться за помощью к экспертам.
Укажите, пожалуйста, на мои ошибки. Очень прошу!
Привожу код последнего варианта недоделанной системы.

Цитата:
_SECTION_BEGIN("((H+L)/2)xV");
// Параметры

bars=Optimize("Макс/Мин на N-м кол-ве баров", 10, 5, 50, 2);
G1= Optimize("Макс. ((H+L)/2)xV ", 1000000, 100000, 10000000, 10000);
G0=Optimize("Мин. ((H+L)/2)xV ", 10000, 5000, 100000, 5000);
Per1=Optimize("Период усреднения ((H+L)/2)xV ",5,2,15,1);

B[0]=-1;
Sho[0]=-1;
Cov[0]=-1;
S[0]=-1;
D[0]=-1;


for(i = 1; i < BarCount; i++)
{
if (D[i]<0) //////////// если нет открытой позиции, то анализируем объем торгов и ищем время для открытия
{
////////////////////////////////////////////////////// анализируем 15 минутный интервал
TimeFrameSet( in15Minute );

G15[i]=EMA(((H[i]+L[i])/2)xV[i],Per1);
IIf(G15[i]>G0 AND G15[i]<G1,P[i]=1,P[i]=-1);
if (P[i]>0) /////// если объем торгов попадает в интервал, то идем дальше
{
HLine15[i]=Ref(HHV(H[i],bars),-1);
LLine15[i]=Ref(LLV(L[i],bars),-1);
B[i]=IIf(H[i]>Hline15[i],1,-1); ////// открываем Лонг, если пробой максимума
Sho[i]=IIf(L[i]<LLine15[i],1,-1); ////// открываем шорт, если пробой минимума
IIf(H[i]>Hline15[i],I[i]=15); ////// запоминаем временной интервал открытия позиции
IIf(L[i]<LLine15[i],I[i]=15); ////// запоминаем временной интервал открытия позиции
D[i]=IIf(B[i]>0 OR Sho[i]>0,1,-1); ///// фиксируем то, что имеется открытая позиция
}
Else /////// если объем торгов в 15 минутке не попадает в интервал, то анализируем часовик
{
TimeFrameSet( inHourly );

G60[i]= EMA(((H[i]+L[i])/2)xV[i],Per1);
IIf(G60[i]>G0 AND G60[i]<G1,P[i]=1,P[i]=-1);

if (P[i]>0)
{
HLine60[i]=Ref(HHV(H[i],bars),-1);
LLine60[i]=Ref(LLV(L[i],bars),-1);
B[i]=IIf(H[i]>Hline60[i],1,-1);
Sho[i]=IIf(L[i]<LLine60[i],1,-1);
IIf(H[i]>Hline60[i],I[i]=60);
IIf(L[i]<LLine60[i],I[i]=60);
D[i]=IIf(B[i]>0 OR Sho[i]>0,1,-1);
}
Else /////// если объем торгов в 60 минутке не попадает в интервал, то анализируем дневку
{
TimeFrameSet( inDaily );
G360[i]= EMA(((H[i]+L[i])/2)xV[i],Per1);
IIf(G360[i]>G0 AND G360[i]<G1,P[i]=1,P[i]=-1);

if (P[i]>0)
{
HLine360[i]=Ref(HHV(H[i],bars),-1);
LLine360[i]=Ref(LLV(L[i],bars),-1);
B[i]=IIf(H[i]>Hline360[i],1,-1);
Sho[i]=IIf(L[i]<LLine360[i],1,-1);
IIf(H[i]>Hline360[i],I[i]=360);
IIf(L[i]<LLine360[i],I[i]=360);
D[i]=IIf(B[i]>0 OR Sho[i]>0,1,-1);
}
Else //////// если объем торгов нигде не попал в заданный интервал, то сделка не совершается, сбрасывается интервал и начинается новый цикл проверки.
{
TimeFrameRestore();
}
}
}
///////////////////////////////////////////////////
}
else //////////// если позиция открыта, то следим за объемом торгов и ищем где закрыть (но не выше интервала открытия)
{
//////////////////////////////////////////////////////
if (B[i]>0) /////////////если открыт лонг
{
TimeFrameSet( in15Minute );

G15[i]= EMA(((H[i]+L[i])/2)xV[i],Per1);
IIf(G15[i]>G0 AND G15[i]<G1,P[i]=1,P[i]=-1); //////// проверяем попадает ли в интервал объем торгов
IIf(I[i]=15,A[i]=1,A[i]=-1); ////// проверяем не на этом ли интервале была открыта позиция
if ((P[i]>0) OR (A[i]>0)) ///// если объем торгов попадает в интервал или позиция была открыта на этом интервале, то …
{
LLine15[i]=Ref(LLV(L[i],bars),-1);
S[i]=IIf(L[i]<LLine15[i],1,-1); ////// продаем, если пробит минимум
D[i]=(-1)*S[i]; ////// даем сигнал о том, что позиция закрыта
}
Else ///// если и объем торгов не попал в интервал, и сделка была открыта в другом временном интервале, то проверяем часовик
{
TimeFrameSet( inHourly );

G60[i]= EMA(((H[i]+L[i])/2)xV[i],Per1);
IIf(G60[i]>G0 AND G60[i]<G1,P[i]=1,P[i]=-1);
IIf(I[i]=60,A[i]=1,A[i]=-1);

if ((P[i]>0) OR (A[i]>0))
{
LLine60[i]=Ref(LLV(L[i],bars),-1);
S[i]=IIf(L[i]<LLine60[i],1,-1);
D[i]=(-1)*S[i];
}
Else /////// если и тут ничего, то переходим к дневке
{
TimeFrameSet( inDaily );
G360[i]= EMA(((H[i]+L[i])/2)xV[i],Per1);
IIf(G360[i]>G0 AND G360[i]<G1,P[i]=1,P[i]=-1);
IIf(I[i]=360,A[i]=1,A[i]=-1);

if ((P[i]>0) OR (A[i]>0))
{
LLine360[i]=Ref(LLV(L[i],bars),-1);
S[i]=IIf(L[i]<LLine360,1,-1);
D[i]=(-1)*S[i];
}
Else ////// если сигналов к продаже нет, то ждем и проверяем на очередном баре снова
{
TimeFrameRestore();
}
}
}
/////////////////////////////////////////////////// переходим к случаю открытого шорта
}
else
{
//////////////////////////////////////////////////////
TimeFrameSet( in15Minute );

G15[i]= EMA(((H[i]+L[i])/2)xV[i],Per1);
IIf(G15[i]>G0 AND G15[i]<G1,P[i]=1,P[i]=-1);
IIf(I[i]=15,A[i]=1,A[i]=-1);

if ((P[i]>0) OR (A[i]>0))
{
HLine15[i]=Ref(HHV(H[i],bars),-1);
Cov[i]=IIf(H[i]>Hline15[i],1,-1);
D[i]=(-1)*Cov[i];
}
else
{
TimeFrameSet( inHourly );

G60[i]= EMA(((H[i]+L[i])/2)xV[i],Per1);
IIf(G60[i]>G0 AND G60[i]<G1,P[i]=1,P[i]=-1);
IIf(I[i]=60,A[i]=1,A[i]=-1);

if ((P[i]>0) OR (A[i]>0))
{
HLine60[i]=Ref(HHV(H[i],bars),-1);
Cov[i]=IIf(H[i]>Hline60[i],1,-1);
D[i]=(-1)*Cov[i];
}
else
{
TimeFrameSet( inDaily );
G360[i]=EMA(((H[i]+L[i])/2)xV[i],Per1);
IIf(G360[i]>G0 AND G360[i]<G1,P[i]=1,P[i]=-1);
IIf(I[i]=360,A[i]=1,A[i]=-1);

if ((P[i]>0) OR (A[i]>0))
{
HLine360[i]=Ref(HHV(H[i],bars),-1);
Cov[i]=IIf(H[i]>Hline360[i],1,-1);
D[i]=(-1)*Cov[i];
}
else
{
TimeFrameRestore();
}
}
}
///////////////////////////////////////////////////
}
////////////////
}
}


TimeFrameRestore();
PozitionSize=100000;


Buy=B>0;
Sell=S>0;
Short=Sho>0;
Cover=Cov>0;



////// Убираем лишние сигналы /////////////

Buy=ExRem(Buy,Sell);
Sell=ExRem(Sell,Buy);
Short=ExRem(Short,Cover);
Cover=ExRem(Cover,Short);

///////////// Рисуем всякое ///////////////
Plot(C,"price",1,128);
PlotShapes(IIf(Buy,shapeUpArrow,0),5,0,Graph0,-15);
PlotShapes(IIf(Sell,shapeDownArrow,0),4,0,Graph0,-15);
PlotShapes(IIf(Cover,shapeHollowUpArrow,0),5,0,Graph0,-15);
PlotShapes(IIf(Short,shapeHollowDownArrow,0),4,0,Graph0,-15);


_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} O=%g, H=%g, L=%g, C=%g {{VALUES}}", O, H, L, C ));
Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() );
_SECTION_END();


Конец.
Спасибо.

С уважением!
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Ср Апр 02, 2008 9:35 pm Ответить с цитатой Вернуться к началу

Цитата:

for(i = 1; i < BarCount; i++)
{
if (D[i]<0) //////////// если нет открытой позиции, то анализируем объем торгов и ищем время для открытия
{
////////////////////////////////////////////////////// анализируем 15 минутный интервал
TimeFrameSet( in15Minute );

Посмотрел на длинный код и приуныл. Думал придется разбираться долго.
Однако вроде сразу нашел трабл. Точно сказать не могу, по логике переключать фреймы внутри цикла нельзя. Допустим мы находились на 100ом баре минуток и тут переключаемся на дневки. i осталось прежней и получается, что мы находимся на 100ом дневном баре, а это совсем другое место на графике...
Идею я понял. Надо её подумать. Сразу с ходу сказать как это реализовать не знаю, но наверное придумаю. Smile

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Ср Апр 02, 2008 9:46 pm Ответить с цитатой Вернуться к началу

Вообще проблему вызывает только необходимость фиксации фрейма в то время, когда система в позе.
Если эту фиксацию убрать, то все очень просто. Алгоритм такой
Код:

mode = 
если
объем<x1 то 1
если 
x1<объем<x2 то 2
если
x2<объем<x3 то 3
...

timeframeset()
Buy1 =
sell1 =
timeframerestore()

timeframeset()
Buy2 =
sell2 =
timeframerestore()

timeframeset()
Buy3 =
sell3 =
timeframerestore()

Buy =
если
mode ==1
то buy1
если
mode ==2
то buy2
если
mode ==3
то buy3

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
r-manager



Зарегистрирован: 02.04.2008
Сообщения: 17

СообщениеДобавлено: Чт Апр 03, 2008 6:38 am Ответить с цитатой Вернуться к началу

Фиксация фрейма имеет большое значение, ее отсутствие может привести к тому, что убытки будут сильно расти.

А никак нельзя цепляться за последний бар, а не 100-й, например?
Хотя наверно такую систему можно только в реальном времени тестировать.

Т.е. получается, что цикл в данной системе нужен только для фиксации фрейма? И одновременно нельзя менять фрейм внутри цикла. Неразрешимая задача...

А если менять i?
Например, если минутка, то i=i, если 5-минутка, то i=5*i, если 15-минутка, то i=15*i и т.д. Единственная проблема будет при тестировании с дневными и выше графиками. Из-за того длительность торгов на отечественных площадках менялась.
Посмотреть профиль Отправить личное сообщение
r-manager



Зарегистрирован: 02.04.2008
Сообщения: 17

СообщениеДобавлено: Чт Апр 03, 2008 8:01 am Ответить с цитатой Вернуться к началу

Вернее наоборот. Получится, что-то такое:

TimeFrameSet (in15Minute);
a=округлвверх(i/15,0);
((H[a]+L[a])/2)*V[a] и т.д.
TimeFrameSet (inHourly);
a=округлвверх(i/60,0);
и т.д.

Вроде бы проблема устраняется.
К сожалению рядом нет Амиброкера. Не могу пока что проверить.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Чт Апр 03, 2008 11:14 pm Ответить с цитатой Вернуться к началу

В общем надо сделать так.
Пишем.
система1 (базовый фрейм)
Buy1 = ....;
sell1 = ...;

система2 (фрейм системы 2)
TimeFrameSet(фрейм системы 2);
Buy2 = ...;
sell2 = ...;
TimeFrameRestore();
Разжимаем сигналы системы 2 на базовый фрейм
Buy2 = TimeFrameExpand(Buy2, фрейм системы 2);
sell2 = TimeFrameExpand(sell2, фрейм системы 2);

и т.д. для всех систем.

В итоге получим базовый массив OHLC с сигналами от всех систем расположенными в нужных местах.
Далее прогоняем цикл и в зависимости от mode активируем нужные сигналы BuyN и затем удаляем все остальные до появления соответствующего SellN

Вроде понятно написал.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
r-manager



Зарегистрирован: 02.04.2008
Сообщения: 17

СообщениеДобавлено: Пт Апр 04, 2008 5:14 am Ответить с цитатой Вернуться к началу

Большое спасибо, Олег! Буду пробовать! Smile
Посмотреть профиль Отправить личное сообщение
r-manager



Зарегистрирован: 02.04.2008
Сообщения: 17

СообщениеДобавлено: Сб Апр 05, 2008 11:01 am Ответить с цитатой Вернуться к началу

Все сделал, но что-то во второй части кода (в цикле) пошли ошибки.
Не пойму как исправить. Видимо какая-то мелочь, которую не замечаю.
Не подскажете? Smile

Цитата:
D[0]=-1; /// если <0, то позиции нет, если >0, то позиция открыта

B[0]=-1; // buy
Sho[0]=-1; // short

S[0]=-1; // sell
Cov[0]=-1; // cover

I[0]=360; // тайм-фрейм открытой позиции

for(i = 1; i < BarCount; i++)
{
if (D[i-1]<0) //////////// если нет открытой позиции, то анализируем объем торгов
{
//////////////////////////////////////////////////////
if (P15[i-1]>0) ///// если объем торгов на 15 минутке попадает в интервал, то
{
B[i]=Buy15[i];
Sho[i]=Sell15[i];


IIf(Buy15[i]>0,I[i]=15,I[i]=I[i-1]); /// если есть покупка, запоминаем фрейм
IIf(Sell15[i]>0,I[i]=15,I[i]=I[i-1]); /// если есть продажа, запоминаем фрейм
D[i]=IIf(Sell15[i]>0 OR Buy15[i]>0,1,-1); /// если есть покупка, то значит, есть открытая позиция и наоборот

}
else
{
if (P60[i-1]>0) ////// иначе, анализ для 60-минутки
{
B[i]=Buy60[i];
Sho[i]=Sell60[i];

IIf(Buy60[i]>0,I[i]=60,I[i]=I[i-1]);
IIf(Sell60[i]>0,I[i]=60,I[i]=I[i-1]);

D[i]=IIf(Sell60[i]>0 OR Buy60[i]>0,1,-1);
}
else
{
if (P360[i-1]>0) /////// иначе, для дневок
{
B[i]=Buy360[i];
Sho[i]=Sell360[i];

IIf(Buy360[i]>0,I[i]=360,I[i]=I[i-1]);
IIf(Sell360[i]>0,I[i]=360,I[i]=I[i-1]);

D[i]=IIf(Sell360[i]>0 OR Buy360[i]>0,1,-1);
}
}
}
}

///////////////////////////////////////////////////
else //////////// если позиция есть, то следим за объемом торгов и ищем где закрыть (не не выше интервала открытия)
{
//////////////////////////////////////////////////////
if (B[i-1]>0) /////////////если открыт лонг
{
if ((P15[i-1]>0) OR (I[i-1]==15)) //// если объем торгов в 15-минутке попадает в интервал или лонг был открыт на 15-минутке, то
{
S[i]=Sell15[i];
D[i]=(-1)*S[i]; /// если есть продажа, то позиция закрыта, и наоборот
}
else
{
if ((P60[i-1]>0) OR (I[i-1]==60)) /// иначе анализ для часовика
{
S[i]=Sell60[i];
D[i]=(-1)*S[i];
}
else
{
if ((P360[i]>0) OR (I[i-1]==360)) /// иначе, для дневок
{
S[i]=Sell360[i];
D[i]=(-1)*S[i];
}
}
}
}

/////////////////////////////////////////////////// переходим к случаю открытого шорта
else
{
//////////////////////////////////////////////////////
if ((P15[i-1]>0) OR (I[i-1]==15))
{
Cov[i]=Buy15[i];
D[i]=(-1)*Cov[i];
}
else
{
if ((P60[i-1]>0) OR (I[i-1]==60))
{
Cov[i]=Buy60[i];
D[i]=(-1)*Cov[i];
}
else
{
if ((P360[i-1]>0) OR (I[i-1]==360))
{
Cov[i]=Buy360[i];
D[i]=(-1)*Cov[i];
}
}
}
}
///////////////////////////////////////////////////
}
////////////////
}


Buy=B>0;
Sell=S>0;
Short=Sho>0;
Cover=Cov>0;


Программа в выделенной красным цветом части находит ошибку.
Полагаю, что ошибки есть где-то еще, просто Амиброкер на этом месте останавливается, т.к. не знает что делать дальше.

Ошбка типа: Error 9. Array subscript has to be a number
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Сб Апр 05, 2008 5:06 pm Ответить с цитатой Вернуться к началу

r-manager писал(а):
Все сделал, но что-то во второй части кода (в цикле) пошли ошибки.
Не пойму как исправить. Видимо какая-то мелочь, которую не замечаю.
Не подскажете? Smile

Цитата:


IIf(Buy15[i]>0,I[i]=15,I[i]=I[i-1]); /// если есть покупка, запоминаем фрейм
IIf(Sell15[i]>0,I[i]=15,I[i]=I[i-1]); /// если есть продажа, запоминаем фрейм
D[i]=IIf(Sell15[i]>0 OR Buy15[i]>0,1,-1); /// если есть покупка, то значит, есть открытая позиция и наоборот



Программа в выделенной красным цветом части находит ошибку.
Полагаю, что ошибки есть где-то еще, просто Амиброкер на этом месте останавливается, т.к. не знает что делать дальше.

Ошбка типа: Error 9. Array subscript has to be a number

Это очень распространенная ошибка. Даже в примерах распространенных ошибок в хелпере она приводится.

Во первых функция IIf() это функция работы с массивами и её использование в циклах запрещено.
Во вторых такая запись
Код:

IIf(Buy15[i]>0,I[i]=15,I[i]=I[i-1]);

Не верна в принципе. Вот цитата из хелпера

Цитата:

EXAMPLE

Incorrect code

IIf( Close > 10, result = 7, result = 9 ); // WRONG

Correct code:

result = IIf( Close > 10, 7, 9 ); // CORRECT

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
r-manager



Зарегистрирован: 02.04.2008
Сообщения: 17

СообщениеДобавлено: Сб Апр 05, 2008 10:45 pm Ответить с цитатой Вернуться к началу

Переписал
Код:
IIf(Buy15[i]>0,I[i]=15,I[i]=I[i-1]); /// если есть покупка, запоминаем фрейм
IIf(Sell15[i]>0,I[i]=15,I[i]=I[i-1]); /// если есть продажа, запоминаем фрейм
D[i]=IIf(Sell15[i]>0 OR Buy15[i]>0,1,-1); /// если есть покупка, то значит, есть открытая позиция и наоборот

так
Код:
   if ((Buy15[i]>0) OR (Sell15[i]>0))
   {
   I[i]=15;
   D[i]=1;
   }
   else
   {
   I[i]=I[i-1];
   D[i]=-1;
   }


Но ошибка все равно появляется.
Просмотрел хелп, написано, что ввожу в квадратных скобках не число, а какой-то другой символ. Хотя стоит i, которое равно номеру бара.

Цитата:
D[0]=-1;

B[0]=-1;
Sho[0]=-1;

S[0]=-1;
Cov[0]=-1;

I[0]=360;


for(i = 1; i < BarCount; i++)
{
if (D[i-1]<0) //////////// если нет открытой позиции, то анализируем объем торгов
{
//////////////////////////////////////////////////////
if (P15[i-1]>0)
{
B[i]=Buy15[i];
Sho[i]=Sell15[i];

if ((Buy15[i]>0) OR (Sell15[i]>0))
{
I[i]=15;
D[i]=1;
}
else
{
I[i]=I[i-1];
D[i]=-1;
}
}
else
{
if (P60[i-1]>0)
{
B[i]=Buy60[i];
Sho[i]=Sell60[i];

if ((Buy60[i]>0) OR (Sell60[i]>0))
{
I[i]=60;
D[i]=1; ///Error 9. Array subscript has to be a number
}
else
{
I[i]=I[i-1];
D[i] = -1;
}
}
else
{
if (P360[i-1]>0)
{
B[i]=Buy360[i];
Sho[i]=Sell360[i];

if ((Buy360[i]>0) OR (Sell360[i]>0))
{
I[i]=360;
D[i]=1;
}
else
{
I[i]=I[i-1];
D[i]=-1;
}
}
}
}
}
///////////////////////////////////////////////////
else //////////// если позиция есть, то следим за объемом торгов и ищем где закрыть (не не выше интервала открытия)
{
//////////////////////////////////////////////////////
if (B[i-1]>0) /////////////если открыт лонг
{
if ((P15[i-1]>0) OR (I[i-1]==15))
{
S[i]=Sell15[i];
D[i]=(-1)*S[i];
}
else
{
if ((P60[i-1]>0) OR (I[i-1]==60))
{
S[i]=Sell60[i];
D[i]=(-1)*S[i];
}
else
{
if ((P360[i]>0) OR (I[i-1]==360))
{
S[i]=Sell360[i];
D[i]=(-1)*S[i];
}
}
}
}
/////////////////////////////////////////////////// переходим к случаю открытого шорта
else
{
//////////////////////////////////////////////////////
if ((P15[i-1]>0) OR (I[i-1]==15))
{
Cov[i]=Buy15[i];
D[i]=(-1)*Cov[i];
}
else
{
if ((P60[i-1]>0) OR (I[i-1]==60))
{
Cov[i]=Buy60[i];
D[i]=(-1)*Cov[i];
}
else
{
if ((P360[i-1]>0) OR (I[i-1]==360))
{
Cov[i]=Buy360[i];
D[i]=(-1)*Cov[i];
}
}
}
}
///////////////////////////////////////////////////
}
////////////////
}


PozitionSize=100000;

Buy=B>0;
Sell=S>0;
Short=Sho>0;
Cover=Cov>0;


Извините за столь частое беспокойство.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Сб Апр 05, 2008 11:41 pm Ответить с цитатой Вернуться к началу

Цитата:

Извините за столь частое беспокойство.

Не вопрос. Если бы не хотел, чтобы меня беспокоили, не стал бы заводить этот геморой с сайтом Smile

По теме. Я пока думал как сделать, очень хорошо представил себе код. Давай я в ближайшее время постараюсь написать его с коментариями. Так будет проще и быстрее. Ок?

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
r-manager



Зарегистрирован: 02.04.2008
Сообщения: 17

СообщениеДобавлено: Вс Апр 06, 2008 8:42 am Ответить с цитатой Вернуться к началу

Хорошо! Спасибо.

Тогда хотел бы добавить, что я пытался написать универсальный код.
Чтобы путем небольших изменений можно было бы поменять критерии перехода из одного фрейма в другой (например, по ATX, ATR, мувингам, осциляторам), и условия появления сигналов.
Думаю, что идея интересная, хотелось бы протестировать различные варианты.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пн Апр 07, 2008 8:30 am Ответить с цитатой Вернуться к началу

Вот. Правда в тестере не гонял. Возможны некоторые ошибки в коде, но логика точно правильная.
Код:

// Определяем фрейм
x1 = 0;
x2 = 0;
x3 = 0; // надо задать реальные границы переключения фреймов

// исправлено по замечанию в сообщении r-manager Вт Апр 08, 2008 10:40 pm
mode =
IIf(V < x1, 1,
IIf(x1<V and V<x2, 2,
IIf(x2<V and V<x3, 3,
4)));

// правила для базового фрейма
Buy1 = Cross(Close, MA(C, 10));
Sell1 = Cross(MA(C, 10), Close);

TimeFrameSet(inHourly); // переключаемся на часовки
// Правила для системы на часовках
Buy2 = Cross(Close, MA(C, 20));
Sell2 = Cross(MA(C, 20), Close);
TimeFrameRestore();
// разжимаем сигналы
Buy2 = TimeFrameExpand(Buy2, inHourly);
Sell2 = TimeFrameExpand(Sell2, inHourly);

TimeFrameSet(inDaily); // переключаемся на дневки
// Правила для системы на дневках
Buy3 = Cross(Close, MA(C, 30));
Sell3 = Cross(MA(C, 30), Close);
TimeFrameRestore();
// разжимаем сигналы
Buy3 = TimeFrameExpand(Buy3, inDaily);
Sell3 = TimeFrameExpand(Sell3, inDaily);

TimeFrameSet(inWeekly); // переключаемся на недельки
// Правила для системы на недельках
Buy4 = Cross(Close, MA(C, 40));
Sell4 = Cross(MA(C, 40), Close);
TimeFrameRestore();
// разжимаем сигналы
Buy4 = TimeFrameExpand(Buy4, inWeekly);
Sell4 = TimeFrameExpand(Sell4, inWeekly);

// задаем начальные значения ключей
inMarket = 0; // переменная в рынке/не в рынке
sys1 = 0; // ситема 1 рынке/не в рынке
sys2 = 0; // ситема 2 рынке/не в рынке
sys3 = 0; // ситема 3 рынке/не в рынке
sys4 = 0; // ситема 4 рынке/не в рынке

for(i=1; i<BarCount; i++)
{
   if(inMarket) // если в рынке, то проверяем выходы
   {
      if(sys1) // если в рынке система 1
      {
         if(Sell1[i]) // если продажа по системе 1
         {
            sys1 = 0;
            inMarket = 0;
            Sell[i] = Sell1[i]; // sell = продажа по системе 1
         }
      }
      if(sys2) // если в рынке система 2
      {
         if(Sell2[i]) // если продажа по системе 2
         {
            sys2 = 0;
            inMarket = 0;
            Sell[i] = Sell2[i]; // sell = продажа по системе 2
         }
      }
      if(sys3) // если в рынке система 3
      {
         if(Sell3[i]) // если продажа по системе 3
         {
            sys3 = 0;
            inMarket = 0;
            Sell[i] = Sell3[i]; // sell = продажа по системе 3
         }
      }
      if(sys4) // если в рынке система 4
      {
         if(Sell4[i]) // если продажа по системе 4
         {
            sys4 = 0;
            inMarket = 0;
            Sell[i] = Sell4[i]; // sell = продажа по системе 4
         }
      }
   }
   else // если система не в рынке будем проверять входы
   {
      if(mode[i] == 1) // если условия для системы 1
      {
         if(Buy1[i]) // проверяем наличие входа по системе 1
         {
            inMarket = 1; // система теперь в рынке
            sys1 = 1;     // в рынке по сигналу системы 1
            Buy[i] = Buy1[i]; // покупка = покупка по системе 1
         }
      }
      else if(mode[i] == 2) // если условия для системы 2
      {
         if(Buy2[i]) // проверяем наличие входа по системе 2
         {
            inMarket = 1; // система теперь в рынке
            sys2 = 1;     // в рынке по сигналу системы 2
            Buy[i] = Buy2[i]; // покупка = покупка по системе 2
         }
      }
      else if(mode[i] == 3)
      {
         if(Buy3[i])
         {
            inMarket = 1;
            sys3 = 1;
            Buy[i] = Buy3[i];
         }
      }
      else if(mode[i] == 4)
      {
         if(Buy4[i])
         {
            inMarket = 1;
            sys4 = 1;
            Buy[i] = Buy4[i];
         }
      }
   }
}

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.

Последний раз редактировалось: 000 (Вт Апр 15, 2008 10:45 pm), всего редактировалось 1 раз
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
r-manager



Зарегистрирован: 02.04.2008
Сообщения: 17

СообщениеДобавлено: Пн Апр 07, 2008 1:51 pm Ответить с цитатой Вернуться к началу

Огромнейшее спасибо, Олег!
Буду изучать. Результаты доложу Smile
Посмотреть профиль Отправить личное сообщение
r-manager



Зарегистрирован: 02.04.2008
Сообщения: 17

СообщениеДобавлено: Вт Апр 08, 2008 10:40 pm Ответить с цитатой Вернуться к началу

После некоторой подправки кода система заработала так как я хотел Smile
Еще раз благодарю! Smile
Правда результаты разочаровывают, но будем искать Грааль Smile

Проблемы были здесь:
mode =
IIf(V < x1, 1,
IIf(x1<V<x2, 2,
IIf(x2<V<x3, 3,
4)));

в двойных неравенствах. когда написал x1<V and V<x2, тогда все заработало как надо
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen