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



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

СообщениеДобавлено: Вс Июл 18, 2010 2:55 pm Ответить с цитатой Вернуться к началу

Здравствуйте.

Благодаря примерам и ссылкам на Вашем форуме написал первую стратегию.

AmiBroker действительно очень удобный и мощный язык, правда не сразу всё понятно.

Я пока не совсем всё понимаю, поэтому заранее извиняюсь за столь подробное описание проблематики

Задача была такая.

Общее описание.
Выяснить, на сколько пунктов от уровня предыдущего закрытия дня должен подняться (опуститься) курс EUR/USD, чтобы потом произошла коррекция, то есть спуск (подъем), необходимой величины, чтобы можно было использовать ее для открытия сделки на продажу (покупку).
Проанализировать наиболее эффективные уровни Take/Profit (T/P) и Stopp/Loss (S/L).

Пример частного случая.
Курс поднялся, потом произошла коррекция (то есть опустился), открыли позицию.
Допустим, закрытие курса на 01.06.2010 было 1,2200, в течение дня 02.06.2010 (с 00:00 до 10:00) курс дошел до уровня 1,2250 (промежуточные падения и спуски нас не интересуют), то есть поднялся на 50 пунктов, где и открылась позиция sell EUR/USD. С уровня 1,2250 курс упал до 1,2240, где позиция и закрылась.

Детальное описание.
1. В точке закрытие предыдущего дня +(–) Х пунктов открыть позицию на продажу (покупку).
2. В точке открытие позиции –(+) Y пунктов позиция закрывается и забирается прибыль (прибыль - это Take/Profit).
3. Если условие 2 не сработало до конца дня, то позиция закрывается на закрытии дня.
4. S/L (Stopp/Loss) – это точка открытие позиции +(–) Z пунктов.
Для первого теста X = 35, Y = 10, Z = 30. Далее нужно проанализировать программу для X от 35 до 100, с шагом 5, для Y от 10 до 30, с шагом 5, Z от 30 до 100, с шагом 5, то есть X = 55, Y = 10, Z = 30; X = 60, Y = 10, Z = 30 и т.д.

Я написал следующий код:

//Внутридневной анализ валютной пары EUR/USD, данные 1-мин.

//рисуем график для текущего символа
Plot(Close, "Close", colorRed, styleThick);

printf( "Количество баров: %g\n", BarCount);

//инициализируем массив открытий длинных позиций
Buy = 0;
//инициализируем массив закрытий длинных позиций
Sell = 0;

//вычисляем уровень курса в конце предыдущего дня
ar_EndDay = Day() != Ref(Day(), - 1); //заполняем массив единицами в местах, где даты меняются
ar_delta = IIf(ar_EndDay == 1, Close, 0); //заполняем массив курсами в местах, где элементы массива EndDay == 1

//заполняем массив Buy единицами (открываем сделки если текущий курс превышает курс на закрытие предыдущего дня на 0.0035 пунктов)
//может быть это можно сделать и с помощью встроенных функций, но пока не придумал, как это возможно ??????????????????????
IsOpenedPosInCurDay = 0;
PrevDay = 0;
for( i = 1; i < BarCount; i++ )
{
if(ar_delta[i] != 0)//в начале текущего дня
{
PrevDay = ar_delta[i]; //присваиваем закрытие курса в конце предыдущего дня
IsOpenedPosInCurDay = 0;

//Здесь наверное надо тслеживать закрытие сделки (если она не закрылась в течение дня)
//Пока не знаю, как это сделать ?????????????????????????
}
else
{
if (Close[i] >= PrevDay + 0.0035) //, у нас пункт равен 0.0001, поэтому 0.0001*35=0.0035
{
if (IsOpenedPosInCurDay == 0) //открываем позицию один раз за текущий день. Не уверен, что правильно это делаю
{
Buy[i] = 1; //открываем позицию
IsOpenedPosInCurDay = 1;
}
}
}
}
printf( "EndDay %g\n", ar_EndDay);
printf( "delta %g\n", ar_delta);
printf( "PrevDay %g\n", PrevDay);
printf( "Close %g\n", Close);
printf( "Buy %g\n", Buy);

//показываем открытые позиции
PlotShapes(IIf(Buy == 1, shapeUpArrow, shapeNone), colorBlue);

//устанавливаем величину потерь
Loss = 0.0030; //0.0001*30
//устанавливаем стоп при достижении этой потери
ApplyStop(stopTypeLoss, stopModePoint, Loss, 1, False, 1);

//устанавливаем величину прибыли
Profit = 0.0010; //0.0001*10
//устанавливаем стоп при достижении этой прибыли
ApplyStop(stopTypeProfit, stopModePoint, Profit, 0, False, 1);

//активируем стопы (вычисляем остановки)
Equity(1);

//отображаем закрытые позиции на графике в виде красных стрелок
PlotShapes(IIf(Sell, shapeDownArrow, shapeNone), colorRed);


Подскажите, пожалуйста, правильно ли я написал, если что не так, то как это можно исправить. Может приведённый цикл for можно заменить на встроенные функции?

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


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

СообщениеДобавлено: Пн Июл 19, 2010 12:07 am Ответить с цитатой Вернуться к началу

Посмотрел код. В общем все написано хорошо. Грамотно и правильно.
Может можно и попроще написать, но зачем если и так нормально. Зато сам.
По поводу
Цитата:

//Здесь наверное надо тслеживать закрытие сделки (если она не закрылась в течение дня)
//Пока не знаю, как это сделать ?????????????????????????


А зачем? напиши в коде Sell = конец дня. И всего делов. Если поза не закрылась по стопу, то закроется в конце дня, если и так закрылась, то этот sell просто не сработает.

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



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

СообщениеДобавлено: Пн Июл 19, 2010 11:49 am Ответить с цитатой Вернуться к началу

Спасибо за внимание. Я сомневался на счёт правильности, честно говоря.

Для закрытия сделок в конце дня дописал:
Sell = ar_EndDay; //в конце дня всегда закрываем позицию

Ещё хотел спросить:
если за текущий день мне нужно отрыть не одну сделку в день как я писал в коде, а сколько сработает за день по условию if (Close[i] >= PrevDay + 0.0035), то есть так:

if (Close[i] >= PrevDay + 0.0035)
Buy[i] = 1; //открываем позицию

Я все открытые позиции отображаю стрелками на графике и у меня получается, что открываются несколько позиций подряд.
Скажите, последующее использование ApplyStop и Equity(1) устранит лишние открытия сделок? Или это как-то надо самому делать?
И можно ли вообще сделать так, чтобы подсвечивались стрелками не все открытия сделок, а только нужные?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вс Июл 25, 2010 10:53 pm Ответить с цитатой Вернуться к началу

devprosoftware писал(а):

Я все открытые позиции отображаю стрелками на графике и у меня получается, что открываются несколько позиций подряд.
Скажите, последующее использование ApplyStop и Equity(1) устранит лишние открытия сделок? Или это как-то надо самому делать?
И можно ли вообще сделать так, чтобы подсвечивались стрелками не все открытия сделок, а только нужные?

Не вполне понял вопрос...

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen