Автор |
Сообщение |
devprosoftware
Зарегистрирован: 13.07.2010
Сообщения: 4
|
Здравствуйте.
Благодаря примерам и ссылкам на Вашем форуме написал первую стратегию.
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
|
Посмотрел код. В общем все написано хорошо. Грамотно и правильно.
Может можно и попроще написать, но зачем если и так нормально. Зато сам.
По поводу
Цитата: |
//Здесь наверное надо тслеживать закрытие сделки (если она не закрылась в течение дня)
//Пока не знаю, как это сделать ?????????????????????????
|
А зачем? напиши в коде Sell = конец дня. И всего делов. Если поза не закрылась по стопу, то закроется в конце дня, если и так закрылась, то этот sell просто не сработает. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
devprosoftware
Зарегистрирован: 13.07.2010
Сообщения: 4
|
Спасибо за внимание. Я сомневался на счёт правильности, честно говоря.
Для закрытия сделок в конце дня дописал:
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
|
devprosoftware писал(а): |
Я все открытые позиции отображаю стрелками на графике и у меня получается, что открываются несколько позиций подряд.
Скажите, последующее использование ApplyStop и Equity(1) устранит лишние открытия сделок? Или это как-то надо самому делать?
И можно ли вообще сделать так, чтобы подсвечивались стрелками не все открытия сделок, а только нужные? |
Не вполне понял вопрос... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|