Ну хоть кто-нибудь!!!

От hackas, 9 апреля, 2014 в Архив

Автор#1

просьба написать функцию для сигнала!я в этом деле новенький :-/просьба помочь.пусть индикатором будет простая скользящая MA. Нужно чтоб сигнал увеличивался.То есть появился первый сигнал, значит он равен 1,проверили наличие противоположного сигнала,если нет,то ищем допустим через 30 баров еще один сигнал,если есть то сбрасываем сигнал на ноль!Появился еще один сигнал в ту же сторону присвоили ему 2,проверили наличие противоположного сигнала,если его нет через 30 баров ищем тот же сигнал,если есть то сбрасываем сигнал на ноль!Как только появляется 3-ий сигнал,присваиваем ему 3 и проверяем наличие противоположного сигнала,если есть то сбрасываем сигнал на ноль,если его нет то sb или ss присваиваем true и этот сигнал передаем в функцию открытия ордера,если появляется 4 сигнал то та же картина как и с 3 присваиваем ему 4 и проверяем наличие противоположного сигнала,если есть то сбрасываем сигнал на ноль,если его нет то sb или ss присваиваем true и передаем его в функцию открытия ордера!
я тут что непонятное написал а дальше вообще беспонятий как,я еже где только не просил написать такую функцию,очень нужно кому не сложно помогите не учу пожалуйста!Заранее благодарен! :)
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
bool signal()
{
int sigb = 0;
int sigs = 0;
bool sb = false;
bool ss = false;

RefreshRates;
double ma = iMA (NULL,0, period_ma, ma_shift, ma_method, applied_price ,0);

if (ma if (ma > Bid) ss = true; //т.к. входим в рынок только с 3 сигнала!
if(sb)
{
sigb = 1; //
{
if(sb)
{
sigb = 2;
}
}

}
if (ma > Bid) ss = true;


}
return(0);
//ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн

Изменено 9 апреля, 2014 пользователем hackas

#2

А так не пойдет:


static int sb, ss;
int ticket;

if (ma if (ma > Bid) ss++; //т.к. входим в рынок только с 3 сигнала!
if(sb>2) {
ticket = OrderSend(NULL, OP_BUY, lot, Ask ну и т.д.
if (ticket > 0) sb = 0; //если открылся обнуляем счетчик
}
if(ss>2) {
ticket = OrderSend(NULL, OP_SELL ...
if (ticket > 0) ss = 0;
}
Автор#3

спасибо большое!вот по сделал как Вы подсказали!bool signal()
if(Ma > Bid) sigb++; //проверяем наличие первого сигнала,если сигнал есть то присваиваем ему 1,
if(Ma
RefreshRates();
//if(sigb >0 && sigb 0){sigb = 0;}
//if(sigs >0 && sigs 0){sigb = 0;}

if(sigb > 2 && sigs == 0)
{
sb = true;
return(sb);
}
RefreshRates();
if(sigs > 2 && sigb == 0)
{
ss = true;
return(ss);тут я не знаю правильно нет сделал передачу сигнала? а в стартовой фунции сделал вот так if(sb == signal())OpenOrders(OP_BUY);
}
теперь проблема другая,почему то открывает сделки на первом сигнале,наверно число сигнала увеличивается сразу же на первом,поэтому надо как то это ограничить,только как? :-/ :-/ :-/есть какие-нибудь мысли?

#4

У Вас эта конструкция будет работать криво...
Представьте: прошел 1 сигнал Бай вчера, а сегодня 3 сигнала Селл и входа не будет - т.к. 1 сигнал Бай блокирует.
Вам нужно определиться с очисткой счетчика от предыдущих сигналов, которые не выросли в сделку. Может по времени, может по обратному пересечению средних - думайте.
Если этот код в отдельной процедуре, то Вы должны передавать в вызывающий код управляющий сигнал, т.е. примерно так:

int sig = Signal_Open();                               //это в вызывающем коде
if (sig >= 0) { OpenOrders(sig); sig = -1; }

int Signal_Open() { //а так оформить вызываемую функцию
...
if(sigb > 2 && sigs == 0)
{
sigb = 0;
return(OP_BUY);
}
if(sigs > 2 && sigb == 0)
{
sigs = 0;
return(OP_SELL);
}
return(-1);
}

не используйте слишком часто RefreshRates(); - лишнее.

Изменено 10 апреля, 2014 пользователем 0ll

Автор#5

а можно как то сделать поиск сигнала через заданное кол-во баров?
#6

а можно как то сделать поиск сигнала через заданное кол-во баров?

Можно все - алгоритм стратегии нужен - потом решение появится

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025