Автор |
Сообщение |
Serg
Зарегистрирован: 04.08.2010
Сообщения: 14
|
Привет. Подскажите как сделать чтобы закрытие происходило на следующий день если не сработали стопы раньше??
код взят из этого сайта. спасибо автору.
но вот как подстроить под мою задачу не знаю((((.
EndDay = Day() != Ref(Day(),1);
Cur_ED = IIf(EndDay == 1, Close, 0);
Sell = EndDay;
One = False;
PredD = 0;
IfPredD = False;
for( i = 0; i < BarCount-1; i++ )
{
if(Cur_ED[i] != 0)//в конце дня
{
if (NOT IfPredD) IfPredD = True;
PredD = Cur_ED[i]; //присваиваем закрытие курса в конце дня
One = False;
}
else
{
if ((Close[i] <= PredD - x)AND
(IfPredD)) //если уже был предыдущий день
{
if (NOT One)
{
//открываем позицию максимум один раз за текущий день
One = True;
Buy[i] = 1; //открываем позицию
}
}
}
} |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Код все таки лучше вставлять вот так
Код: |
EndDay = Day() != Ref(Day(),1);
Cur_ED = IIf(EndDay == 1, Close, 0);
Sell = EndDay;
One = False;
PredD = 0;
IfPredD = False;
for( i = 0; i < BarCount-1; i++ )
{
if(Cur_ED[i] != 0)//в конце дня
{
if (NOT IfPredD)
IfPredD = True;
PredD = Cur_ED[i]; //присваиваем закрытие курса в конце дня
One = False;
}
else
{
if ((Close[i] <= PredD - x) AND (IfPredD)) //если уже был предыдущий день
{
if (NOT One)
{
//открываем позицию максимум один раз за текущий день
One = True;
Buy[i] = 1; //открываем позицию
}
}
}
}
|
В таком виде он вообще не работает.
Ты бы точно объяснил что надо...
Потому, что я не понял.
Если надо чтобы сделка закрывалась на следующий день после открытия в конце дня, то так
Код: |
EndDay = Day() != Ref(Day(),1);
Buy = DayOfWeek() == 2;
pos = Ref(Flip(Buy, EndDay), -1);
Sell = pos == 0 AND EndDay;
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Serg
Зарегистрирован: 04.08.2010
Сообщения: 14
|
попробую так как вы просили...
Суть такова что когда было открытие, в даном случае Buy, то нужно продержать сделку до того времени когда сработают стопы или принудительно закрыть на следующий день.
в этот коде закрытие происходит в конце текущего дня, это просто сделать. а вот как сделать чтобы работало так как мне надо, это уже проблема для меня((((
Код: |
EndDay = Day() != Ref(Day(),1); //заполняем массив единицами в местах, где даты меняются
Cur_ED = IIf(EndDay == 1, Close, 0); //заполняем массив курсами в местах, где элементы массива ar_EndDay == 1
Sell = endday; //в конце дня всегда закрываем позицию, если даже и не было до этого открытой позиции, в этом случае Equity(1) удалит лишние все лишние закрытия
One = False; //- если эту переменную используем, то у нас максимум - одна сделка в день, иначе - любое количество сделок в день
PredD = 0;
IfPredD = False;
for( i = 0; i < BarCount-1; i++ )
{
if(Cur_ED[i] != 0)//в конце дня
{
if (NOT IfPredD) IfPredD = True;
PredD = Cur_ED[i]; //присваиваем закрытие курса в конце дня
One = False;
}
else
{
if ((Close[i] <= PredD - x)AND
(IfPredD)) //если уже был предыдущий день
{
if (NOT One)
{
//открываем позицию максимум один раз за текущий день
One = True;
Buy[i] = 1; //открываем позицию
}
}
}
}
//устанавливаем стоп при достижении потери z
ApplyStop(stopTypeLoss, stopModePoint, z, 1, False, 1);
//устанавливаем стоп при достижении прибыли y
ApplyStop(stopTypeProfit, stopModePoint, y, 0, False, 1);
//активируем стопы (вычисляем остановки) и удаляем лишние сигналы
Equity(1);
PlotShapes(IIf(Buy==1, shapeUpArrow, shapeNone), colorGreen);
//показываем закрытые позиции на графике в виде стрелок
PlotShapes(IIf(Sell, shapeDownArrow, shapeNone), colorRed); |
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ну я же в предыдущем сообщении дал код который закрывает на следующий день. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Serg
Зарегистрирован: 04.08.2010
Сообщения: 14
|
000 писал(а): |
Ну я же в предыдущем сообщении дал код который закрывает на следующий день. |
я для примера взял часовые данные за год, и в один промежуток времени закрытие происходит через 2 дня.
20.07.2010 поз открылась, по идеи должна была 21 закрыться, но закрытие произлошло 22.
перед стопами вставил такой код
Код: |
pos = Ref(Flip(Buy, EndDay), -1);
Sell = pos == 0 AND EndDay; |
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Проверил на газпроме.
Открыл позу в 12 часов 20/07/10 Закрылась в конце дня 21го
Код: |
EndDay = Day() != Ref(Day(),1);
Buy = DateNum() == 1100720 AND TimeNum() == 120000;
pos = Ref(Flip(Buy, EndDay), -1);
Sell = pos == 0 AND EndDay;
Equity(1);
Plot(Sell, "", colorRed);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Serg
Зарегистрирован: 04.08.2010
Сообщения: 14
|
Спасибо, вам Олег. вроде как работает, а той проскок был глюк.
А можно вот глядя на первый код, сделать тоже самое только без цыклов. Этот код не мой, хотелось бы как то попроще сделать.
Суть его в том, что от закрытия предыдущего дня производиться покупка если курс упал на Х пунктов и закрывается по стопам или в конце второго дня. И на оборот если поднялся то продаем. Одна сделка в день только.
Или без цыклов ни как? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Типа так. Не проверял, но по идее такой код должен блокировать больше одной покупки в день.
Код: |
EndDay = Day() != Ref(Day(),1);
Buy1 = ...; // правила покупки
pos = Flip(Buy1, EndDay);
Buy = Buy1 AND pos == 0;
...
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Serg
Зарегистрирован: 04.08.2010
Сообщения: 14
|
все таки происходит перескок, тоесть открылась сделка 12.07.2010 а закрылась 14.07 по профиту, хотя должна была закрыться 13.07 в конце дня.
Там вроде должен был прикрепиться файл по тем данным где я проводил тестирование. Тест проводился по коду размещенному выше в даной теме.
Можете сказать где глюк? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Проверил на этих данных.
Вот этот код
Код: |
EndDay = Day() != Ref(Day(),1);
Buy = DateNum() == 1100712;
pos = Ref(Flip(Buy, EndDay), -1);
Sell = pos == 0 AND EndDay;
Equity(1);
Plot(Sell, "", colorRed);
|
Закрылась 13го....
А у тебя 14го во сколько закрылась? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Serg
Зарегистрирован: 04.08.2010
Сообщения: 14
|
закрытие 14.07 в 15:13, сработал профит, но должно закрыться 13 в конце дня.
Может в коде самой системы какой то глюк? уже не знаю, что и думать... |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Могу предположить вот что.
13-го на последнем баре дня тоже был сигнал на покупку, он собственно и заблокировал выход 13-го... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Serg
Зарегистрирован: 04.08.2010
Сообщения: 14
|
000 писал(а): |
Могу предположить вот что.
13-го на последнем баре дня тоже был сигнал на покупку, он собственно и заблокировал выход 13-го... |
Спасибо. поработаю над этой версией. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Serg
Зарегистрирован: 04.08.2010
Сообщения: 14
|
000 писал(а): |
Могу предположить вот что.
13-го на последнем баре дня тоже был сигнал на покупку, он собственно и заблокировал выход 13-го... |
Да, Олег вы правы...действительно есть сигнал на покупку 13, и поэтому оно считает от этой даты.
Подскажите как разрешить этот вопрос? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Код: |
Buy = DateNum() == 1100720 AND TimeNum() == 120000;
Sell = 0;
EndDay = Day() != Ref(Day(),1);
pos = 0;
NumED = 0;
for( i = 0; i < BarCount-1; i++ )
{
if(Buy[i] AND pos == 0)
{
pos = 1;
}
else if(pos == 1)
{
Buy[i] = 0;
if(EndDay[i])
{
NumED ++;
if(NumED == 2)
{
Sell[i] = 1;
pos = 0;
NumED = 0;
}
}
}
}
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|