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



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

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

Здравствуйте, помогите, пожалуйста, не знаю где копать. Есть робот который кидает сигналы в файл в ввиде 0,1 т.е. если есть сигнал пишет 1, если нет то 0. Записывает последовательно в строку Buy Sell Short Cover, на каждом баре. Пишет последний выданный сигнал. Ну например 0100, означает что есть, или был несколько баров назад сигнал к продаже, и после него не было встречено других сигналов. Должен делать это не чаще одного раза в минуту(таймфрейм минутный). Специально для сигналов делаю Ref(условие,-1), чтобы выдавались по уже сформировавшимся барам, иногда работает все как надо без каких либо эксцесов, но иногда начинает глючить. Например есть основной сигнал к покупке и тут в середине свечи начинает переключаться то покупка то продажа, и так несколько раз, при этом стрелочки не появляются(по сигналам стрелки рисует, работает как индикатор на графике), т.е. как была стрелка на покупку так и осталась, а в файлике сигналы переключаются. Скорее всего как то не так пишу сигналы в файл, но не могу придумать как по другому вот код:

Код:
b=Buy1 OR Buy2 OR Buy3 OR Buy4;
s=sell1 OR Sell2 OR Sell3;
sh=short1 OR Short2 OR Short3 OR Short4;
Co=cover1 OR cover2 OR Cover3;
ApplyStop(stopTypeProfit, stopModePoint, take,  1, volatile = False, ReEntryDelay = delay);

Buy=Ref(b,-1) AND StartDay;
Sell=Ref(s,-1) OR EndDay;
Short=Ref(sh,-1) AND StartDay;
Cover=Ref(Co,-1) OR EndDay;
Equity(1, 0);

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,-30);
PlotShapes(IIf(Short,shapeHollowDownArrow,0),4,0,Graph0,-30);
ifbuy=IIf(Buy,1,0); 
ifsell=IIf(Sell,1,0); 
ifshort=IIf(Short,1,0); 
ifcover=IIf(Cover,1,0);

for(i=BarCount-1;i>1;i=i-1)
{
   if(ifBuy[i]==1 OR ifSell[i]==1 OR ifShort[i]==1 OR ifCover[i]==1)
   {
   fd=fopen("E:/1.txt","w");
   fputs(StrFormat("%g%g%g%g",ifBuy[i],ifSell[i],ifShort[i],ifCover[i]),fd);
   fclose(fd);
   break;
   }
}

fd1=fopen("E:/2.txt","w");
fputs(StrFormat("%g\n",MMVBo[BarCount-1]),fd1);
fputs(StrFormat("%g\n",Open[BarCount-1]),fd1);
fclose(fd1);
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Так. Давай смотреть.
Первое. Совсем не понятно зачем вот этот блок.
Код:

ifbuy=IIf(Buy,1,0); 
ifsell=IIf(Sell,1,0); 
ifshort=IIf(Short,1,0); 
ifcover=IIf(Cover,1,0);

Хуже от него не делается, но и пользы никакой. Ну допустим ты переводишь значение стопового сигнала в 1.
Дальше. Вот у тебя сформировались массивы сигналов Buy, Sell, Short, Cover
Дальше ты прогоняешь цикл с первого бара
Вот этот
Код:

for(i=BarCount-1;i>1;i=i-1)
{
   if(ifBuy[i]==1 OR ifSell[i]==1 OR ifShort[i]==1 OR ifCover[i]==1)
   {
   fd=fopen("E:/1.txt","w");
   fputs(StrFormat("%g%g%g%g",ifBuy[i],ifSell[i],ifShort[i],ifCover[i]),fd);
   fclose(fd);
   break;
   }
}

Как только встречается первый сигнал
if(ifBuy[i]==1 OR ifSell[i]==1 OR ifShort[i]==1 OR ifCover[i]==1)
записывается стока
fputs(StrFormat("%g%g%g%g",ifBuy[i],ifSell[i],ifShort[i],ifCover[i]),fd);
и цикл покидается.
break;
Т.е записывается не строка с последним сигналом, а строка с первым сигналом.
AFL для скорости обрабатывает не весь массив цен, а только тот который он посчитает нужным. Т.е. по умолчанию цикл будет работать не с первого бара, а немного отступив назад от видимой части графика. Соответственно и первый сигнал в разных случаях ему попадется разный. Вероятно поэтому и пишет разное.
Для того, чтобы AFL обрабатывал ВЕСЬ массив цен надо в начале кода поставить SetBarsRequired(500000, 500000);
...
Надеюсь понятно написал. Very Happy

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



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

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

Цитата:
Так. Давай смотреть.
Первое. Совсем не понятно зачем вот этот блок.
Код:

ifbuy=IIf(Buy,1,0);
ifsell=IIf(Sell,1,0);
ifshort=IIf(Short,1,0);
ifcover=IIf(Cover,1,0);


Хуже от него не делается, но и пользы никакой. Ну допустим ты переводишь значение стопового сигнала в 1.

Ну да чтобы вместо 3 писалось 1.
Цитата:

Дальше ты прогоняешь цикл с первого бара
Вот этот
Код:

for(i=BarCount-1;i>1;i=i-1)
{
if(ifBuy[i]==1 OR ifSell[i]==1 OR ifShort[i]==1 OR ifCover[i]==1)
{
fd=fopen("E:/1.txt","w");
fputs(StrFormat("%g%g%g%g",ifBuy[i],ifSell[i],ifShort[i],ifCover[i]),fd);
fclose(fd);
break;
}
}


Как только встречается первый сигнал
if(ifBuy[i]==1 OR ifSell[i]==1 OR ifShort[i]==1 OR ifCover[i]==1)
записывается стока
fputs(StrFormat("%g%g%g%g",ifBuy[i],ifSell[i],ifShort[i],ifCover[i]),fd);
и цикл покидается.
break;
Т.е записывается не строка с последним сигналом, а строка с первым сигналом.

Так цикл то вроде с последнего бара назад считается, поэтому первый встреченный сигнал и будет последним актуальным. По поводу setbarsrequired не знал таких тонкостей завтра попробую, спасибо.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

У ёё. Не обратил внимание что цикл в обратную сторону. А зачем ходить дальше последней свечки? Может просто смотреть последную и если там сигнал есть, то писать, а если нет то ничего не делать? Тогда и цикл не нужен. Просто берем LastValue()

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



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

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

000 писал(а):
У ёё. Не обратил внимание что цикл в обратную сторону. А зачем ходить дальше последней свечки? Может просто смотреть последную и если там сигнал есть, то писать, а если нет то ничего не делать? Тогда и цикл не нужен. Просто берем LastValue()

Да ведь действительно, чето-то я нагородил не понятно зачем перепесываю файл на каждой свече, а можно ведь только на тех на которых есть сигнал, и все равно в файле должно оставаться последнее актуальное значение, по идее. Идея такова была, что терминал иногда отсоединяется или тормозит, поэтому в файлике должен всегда оставаться последнй актуальный сигнал, чтобы при отвисании или соединении робот вставал в нужную позу или крылся.
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen