Автор |
Сообщение |
ID
Советник
Зарегистрирован: 07.01.2008
Сообщения: 370
|
Привет!....
Настало время для меня конкретно разобраться с циклами. Как их использовать и проч.
Началось все с решения простой задачи, которая публиковалась здесь http://amisite.ru/phpBB2/viewtopic.php?p=859#859.
Прошу всех сочуствующих помочь (особенно 000).
поехали...
Код: |
buy=cond1;
profit=0.01; |
здесь все понятно. Если выполнилось условие конд1 мы купим. Профит 100 пипсов. Далее...
Код: |
sell=0;
position=0;
profit=0.01; |
Вот первые вопросы:
1. sell=0; и profit=0; Это просто обозначение переменной?
2. зачем опять пишем profit=0.01 ? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Код: |
Buy = cond1;
profit = 0.01;
Sell = 0;
position = 0;
profit = 0.01;
for(i = 1; i<BarCount; i++)
{
if(! position) // если система не в рынке
{
if(Buy[i])
{
position = 1; // открыта позиция
pricebuy = BuyPrice[i]; // запоминаем цену открытия позиции
}
}
else // если система в рынке
{
Buy[i] = 0; // убираем лишние покупки
if(H[i] > pricebuy + profit) // проверка условия выхода
{
Sell[i] = 1; // продажа
position = 0; // система не в рынке
}
}
}
|
Цитата: |
Вот первые вопросы:
1. sell=0; и profit=0; Это просто обозначение переменной?
2. зачем опять пишем profit=0.01 ?
|
1. Да это просто инициализация переменной\массива
2. profit=0.01 пишем потому, что ошиблись и написали его лишний раз
Код: |
for(i = 1; i<BarCount; i++) |
Последовательно пробегаем по всем барам начиная с крайнего левого и заканчивая последним
На каждом баре проверяем if(! position) // если система не в рынке
Понятнее написать if(position != 1)
position в данном случае не не массив а переменная.
Тогда смотрим нет ли на этом баре сигнала покупки
if(Buy[i])
Если есть, то
position = 1; система теперь находится в лонге
и цена покупки
pricebuy = BuyPrice[i];
На следующем баре (следующий круг цикла) position будет равен 1 и выполнение начнется с
else // если система в рынке
Buy[i] = 0; // убираем лишние покупки
Это если вдруг были еще сигналы на покупку пока система в рынке то они удаляются
if(H[i] > pricebuy + profit) // проверка условия выхода
если условия выхода выполнились, то
Sell[i] = 1; // продажа
position = 0; // система не в рынке
Вроде понятно написал. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
ID
Советник
Зарегистрирован: 07.01.2008
Сообщения: 370
|
Олег, привет...
Спасибо за предыдущийц пост.
Маленько разобрался с циклами. Написал такой код:
Код: |
SetOption("AllowPositionShrinking",1); // Вкл (1) выкл (0)возможность открытия позиции, если денег не хватает
SetOption("InitialEquity",10000); // Начальный капитал
SetOption("AllowSameBarExit",1); // Вкл (1) выкл (0) возможность выхода на баре входа
SetOption("ActivateStopsImmediately",1); // Вкл (1) выкл (0) активацию стопа на баре входа
SetOption("FuturesMode",1); // Вкл (1) выкл (0) режим "Тестирование фьючерсов"
SetOption("ReverseSignalForcesExit",1); // Вкл (1) выкл (0) вход в противоположную позицию при противп. сигнале
SetOption("PriceBoundChecking",0); // Вкл (1) выкл (0) проверку соответствия bp/sp/shp/cp диапазону h-l
SetTradeDelays(0,0,0,0); // Задержка торгов
PositionSize = 100;
MarginDeposit = 1;
RoundLotSize = 100;
PointValue = 100;
m1= MA(C,22);
m2= MA(C,65);
Buy = Ref(m1>m2 AND Ref(m2>m1,-1),-1);;
BuyPrice= O+0.0003;
Sell= 0;
position= 0;
profit= 0.0100;
loss= 0.0100;
for(i=1;i<BarCount;i++)
{
if(position!=1)
{
if(Buy[i])
{
position= 1;
pricebuy= BuyPrice[i];
}
}
else
{
Buy[i]=0;
if(H[i]>=pricebuy+profit)
{
Sell[i]=1;
SellPrice[i]=pricebuy+profit;
position=0;
}
else
{
if(L[i]<=pricebuy-loss)
{
Sell[i]=1;
SellPrice[i]=pricebuy-Loss;
position=0;
}
}
}
} |
Этот код уже со стопаком.
Вопрос: вышепредставленный код не отслеживает стопак или профит, если данные ордера сработали на баре входа (см. рис). Можно ли как-нибудь решить этот трабл?
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вот в этом месте цикла
Код: |
if(position!=1)
{
if(Buy[i])
{
position= 1;
pricebuy= BuyPrice[i];
}
}
|
Сразу вставляй проверку на срабатывание стопа. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
ID
Советник
Зарегистрирован: 07.01.2008
Сообщения: 370
|
Я еще вот так придумал:
Код: |
m1= MA(C,22);
m2= MA(C,65);
Buy = m1>m2 AND Ref(m2>m1,-1);
BuyPrice= Ref(O+0.0003,1);
Sell= 0;
position= 0;
profit= 0.0100;
loss= 0.0100;
for(i=1;i<BarCount;i++)
{
if(position!=1)
{
if(Buy[i])
{
position= 1;
pricebuy= BuyPrice[i];
}
}
else
{
Buy[i]=0;
if(H[i]>=pricebuy+profit)
{
Sell[i]=1;
SellPrice[i]=pricebuy+profit;
position=0;
}
else
{
if(L[i]<=pricebuy-loss)
{
Sell[i]=1;
SellPrice[i]=pricebuy-Loss;
position=0;
}
}
}
} |
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
ID
Советник
Зарегистрирован: 07.01.2008
Сообщения: 370
|
000 писал(а): |
Вот в этом месте цикла
Код: |
if(position!=1)
{
if(Buy[i])
{
position= 1;
pricebuy= BuyPrice[i];
}
}
|
Сразу вставляй проверку на срабатывание стопа. |
Олег, а пример проверки можешь привести.
Я уже голову сломал. Не хотит. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
ID писал(а): |
Я еще вот так придумал:
Код: |
m1= MA(C,22);
m2= MA(C,65);
Buy = m1>m2 AND Ref(m2>m1,-1);
BuyPrice= Ref(O+0.0003,1);
Sell= 0;
position= 0;
profit= 0.0100;
loss= 0.0100;
for(i=1;i<BarCount;i++)
{
if(position!=1)
{
if(Buy[i])
{
position= 1;
pricebuy= BuyPrice[i];
}
}
// НА ТОМ БАРЕ ГДЕ СРАБОТАЛА ПОКУПКА
// ДАЛЬШЕ ЭТОГО МЕСТА КОД ВЫПОЛНЯТЬСЯ НЕ БУДЕТ
// ПОЭТОМУ ПРОВЕРКУ НА СТОП НА БАРЕ ВХОДА НАДО ДЕЛАТЬ РАНЬШЕ
else
{
Buy[i]=0;
if(H[i]>=pricebuy+profit)
{
Sell[i]=1;
SellPrice[i]=pricebuy+profit;
position=0;
}
else
{
if(L[i]<=pricebuy-loss)
{
Sell[i]=1;
SellPrice[i]=pricebuy-Loss;
position=0;
}
}
}
} |
|
Код: |
m1= MA(C,22);
m2= MA(C,65);
Buy = m1>m2 AND Ref(m2>m1,-1);
BuyPrice= Ref(O+0.0003,1);
Sell= 0;
position= 0;
profit= 0.0100;
loss= 0.0100;
for(i=1;i<BarCount;i++)
{
if(position!=1)
{
if(Buy[i])
{
position= 1;
pricebuy= BuyPrice[i];
if(L[i] <= pricebuy - loss) // сначала проверяем лосс,
// чтобы если есть условия для срабатывания и профита и лосса сработал именно лосс
{
Sell[i] = 1;
SellPrice[i] = pricebuy - loss;
position = 0;
}
else if(H[i] >= pricebuy + profit)
{
Sell[i] = 1;
SellPrice[i] = pricebuy + profit;
position = 0;
}
}
}
else
{
Buy[i]=0;
if(L[i] <= pricebuy - loss)
{
Sell[i] = 1;
SellPrice[i] = pricebuy - Loss;
position = 0;
}
else if(H[i] >= pricebuy + profit)
{
Sell[i] = 1;
SellPrice[i] = pricebuy + profit;
position = 0;
}
}
}
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вариант попроще
Код: |
m1= MA(C,22);
m2= MA(C,65);
Buy = m1>m2 AND Ref(m2>m1,-1);
BuyPrice= Ref(O+0.0003,1);
Sell= 0;
position= 0;
profit= 0.0100;
loss= 0.0100;
for(i=1;i<BarCount;i++)
{
if(position != 1)
{
if(Buy[i])
{
position = 1;
pricebuy = BuyPrice[i];
}
}
else
{
Buy[i] = 0;
}
// ЕСЛИ НАПИСАТЬ ТАК, ТО ЦИКЛ БУДЕТ ВЫПОЛНЯТЬСЯ ДАЛШЕ И НА БАРЕ ВХОДА
// СООТВЕТСТВЕННО ПРОВЕРКА НА СТОПЫ БУДЕТ ВЫПОЛНЕНА И НА БАРЕ ВХОДА
if(position == 1) // проще написать if(positions)
{
if(L[i] <= pricebuy - loss)
{
Sell[i] = 1;
SellPrice[i] = pricebuy - loss;
position = 0;
}
else if(H[i] >= pricebuy + profit)
{
Sell[i] = 1;
SellPrice[i] = pricebuy + profit;
position = 0;
}
}
}
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
ID
Советник
Зарегистрирован: 07.01.2008
Сообщения: 370
|
|
Посмотреть профиль Отправить личное сообщение |
|
Bobi
Зарегистрирован: 07.06.2008
Сообщения: 46
|
а вот меня вопрос мучает: как код обрабатывается?
Т.е. нужно либо ВСЁ циклом делать или можно вперемешку с встроенными функциями? Ну типа
если я напишу
CondBuy = C>O;
CondSell = C<O;
for (i=1;i<BarCount;i++))
{
if (Buy[i])
Buy[i]=1;
и т.д и т.п.
}
Сколько раз мой цикл пересчитается в этом случае? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Bobi
Зарегистрирован: 07.06.2008
Сообщения: 46
|
000 писал(а): |
// ЕСЛИ НАПИСАТЬ ТАК, ТО ЦИКЛ БУДЕТ ВЫПОЛНЯТЬСЯ ДАЛШЕ И НА БАРЕ ВХОДА
// СООТВЕТСТВЕННО ПРОВЕРКА НА СТОПЫ БУДЕТ ВЫПОЛНЕНА И НА БАРЕ ВХОДА
[/code] |
А будет ли тестер учитывать выход на баре входа заложенный в цикле? У меня никак не хочет пока не включишь Allow same bar exit |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Bobi
Зарегистрирован: 07.06.2008
Сообщения: 46
|
000 писал(а): |
Вариант попроще
|
по-моему эти строчки ничего не дают, поскольку есть проверка на наличие открытиых позиций , или я не прав:
Код: |
else
{
Buy[i] = 0;
}
|
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
Bobi
Зарегистрирован: 07.06.2008
Сообщения: 46
|
...мда, наверно я один тут такой, а все остальные в это время жарят сосиски и пьют пиво на даче |
|
|
Посмотреть профиль Отправить личное сообщение |
|
commenced
Советник
Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"
|
Bobi писал(а): |
...мда, наверно я один тут такой, а все остальные в это время жарят сосиски и пьют пиво на даче |
Не все, просто чтоб тебе чем то помочь нужно знать сам вопрос, я вот в циклах 0, все жду когда же ликбез пройдет на котором объеснят основы их написания, но похоже тему не правильно назвали. |
_________________ Юра |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
Bobi
Зарегистрирован: 07.06.2008
Сообщения: 46
|
commenced писал(а): |
Bobi писал(а): |
...мда, наверно я один тут такой, а все остальные в это время жарят сосиски и пьют пиво на даче |
Не все, просто чтоб тебе чем то помочь нужно знать сам вопрос |
хм. да вопросов целых три было. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|