//+-----------------------------------------------------------------------------+ //| триггер по двум последним лоссам | //+-----------------------------------------------------------------------------+ int Last2Loss(string Sy="",int Typ=-1,int Magic=-1){ int x, y, time, time2, profit,ticket; static int res=1,preword; if(preword==OrdersHistoryTotal()){return(res);} preword=OrdersHistoryTotal(); for(x=OrdersHistoryTotal();x>=0;x--){ if(OrderSelect(x,SELECT_BY_POS,MODE_HISTORY)){ if(OrderSymbol()==Sy||Sy==""){ if(OrderType()==Typ||Typ==-1){ if(OrderMagicNumber()==Magic||Magic==-1){ if(OrderCloseTime()>time){ time=OrderCloseTime(); profit=OrderProfit(); ticket=OrderTicket(); } } } } } } if(profit>=0){return(res);} for(x=OrdersHistoryTotal();x>=0;x--){ if(OrderSelect(x,SELECT_BY_POS,MODE_HISTORY)){ if(OrderSymbol()==Sy||Sy==""){ if(OrderType()==Typ||Typ==-1){ if(OrderMagicNumber()==Magic||Magic==-1){ if(OrderCloseTime()<=time&&OrderCloseTime()>time2){ if(OrderTicket()!=ticket){ time2=OrderCloseTime(); profit=OrderProfit(); } } } } } } } if(profit>=0){return(res);} res=-1; return(res); }
Можно пойти двумя путями - наращивать количество модулей проверки, или загонять данные об ордерах в массив сортировать их там, и делать проверку на количество.
Можно попроще ?
как нибудь так:
1. смотрим историю
2. смотрим losses
3. if (losses>0) res=-1
4. return (res)
только вот не могу понять технологию, как сделать чтобы res на каждом баре не возвращался =1, а именно менялся опять после отрицательных сделок.
Вопрос стоял переключать состояние триггера, только после двух последних подряд идущих лосей.
хорошо давай разберем эту функцию
//+-----------------------------------------------------------------------------+ //| триггер по двум последним лоссам | //+-----------------------------------------------------------------------------+ int Last2Loss(string Sy="",int Typ=-1,int Magic=-1){ //обьявление переменных int x, y, time, time2, profit,ticket; static int res=1,preword; //блок определения изхменения количества ордеров в истории if(preword==OrdersHistoryTotal()){return(res);}// если количество не изменилось выход preword=OrdersHistoryTotal();// запоминаем количество ордеров в истории // поиск последнего закрытого ордера for(x=OrdersHistoryTotal();x>=0;x--){ if(OrderSelect(x,SELECT_BY_POS,MODE_HISTORY)){ if(OrderSymbol()==Sy||Sy==""){ if(OrderType()==Typ||Typ==-1){ if(OrderMagicNumber()==Magic||Magic==-1){ if(OrderCloseTime()>time){ time=OrderCloseTime(); profit=OrderProfit();//запоминаем профит ticket=OrderTicket();//запоминаем тикет } } } } } } if(profit>=0){return(res);}//если ордер с профитом то выход без изменений //если нет, то ищем предыдущий ордер for(x=OrdersHistoryTotal();x>=0;x--){ if(OrderSelect(x,SELECT_BY_POS,MODE_HISTORY)){ if(OrderSymbol()==Sy||Sy==""){ if(OrderType()==Typ||Typ==-1){ if(OrderMagicNumber()==Magic||Magic==-1){ if(OrderCloseTime()<=time&&OrderCloseTime()>time2){//ищем ордер с временем закрытия раньше или одновременно с первым if(OrderTicket()!=ticket){//сверяемся с тикетом предыдущего ордера time=OrderCloseTime(); profit=OrderProfit();//запоминаем профит } } } } } } } if(profit>=0){return(res);}//если ордер с профитом то выход без изменений res=-1;// если добрались сюда значит два последних ордера были лосевыми - меняем значение триггера return(res); }
Рустам. Только начало цикла переделай. for(x=OrdersHistoryTotal();x>=0;x--) на for(x=OrdersHistoryTotal()-1;x>=0;x--)
И концовочку можно наоборот сделать
res*=-1;
return(res);
Но тогда первоначальное значение должно быть равной 1.
можно и так, и даже так правильнее, но если он не найдет ордера с номером OrdersHistoryTotal(), то быстренько проскочит эту итерацию, а static int res=1 и так
можно выделить поиск каждого следующего ордера в истории в отдельную функчию передавая ей время и тикет предыдущего ордера и в цикле проверять последовательность лосей, и тогда изменя коунтер цикла выбирать количество ордеров для проверки.
можно и так, и даже так правильнее, но если он не найдет ордера с номером OrdersHistoryTotal(), то быстренько проскочит эту итерацию, а static int res=1 и так
можно выделить поиск каждого следующего ордера в истории в отдельную функчию передавая ей время и тикет предыдущего ордера и в цикле проверять последовательность лосей, и тогда изменя коунтер цикла выбирать количество ордеров для проверки.
так можно ?:
//+------------------------------------------------------------------+
//| Выбор направления торговли |
//+------------------------------------------------------------------+
double TraidingLine()
{
int line=1;
if (isLine == true) // если флаг true то проводится изменение направления торговли
{
int orders=HistoryTotal(); // history orders total
int losses=0; // number of losses orders without a break
//---- select lot size
//---- calcuulate number of losses orders without a break
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Ошибка в истории!");
break;
}
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
continue;
if(OrderProfit()>0) break;
if(OrderProfit()<0) losses++;
}
if(losses>0) line=-1;
}
return(line);
}
Так не правильно. тебе ведь надо найти последние ордера, те. их надо фильтровать по времени закрытия начиная с самого свежего, а у тебя получается если вообще есть лосевые ордера.
и эта строка : if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) по условию пропускает в себя ордера не текущего символа, и еще и отложенники
Так не правильно. тебе ведь надо найти последние ордера, те. их надо фильтровать по времени закрытия начиная с самого свежего, а у тебя получается если вообще есть лосевые ордера.
и эта строка : if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) по условию пропускает в себя ордера не текущего символа, и еще и отложенники
Ясно. Спасибо.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Подскажите код, пожалуйста.
Чтобы функция возвращала изначально значение А=1, после двух последних лосов А=-1.
Потом А=-1 снова до двух последних лоссов, потом снова А=1 И так далее.
Хочу сделать чтобы после серии потерь менялось правило на противоположное.