Подскажите код, плиз, функции возврата значения

 

Подскажите код, пожалуйста.

Чтобы функция возвращала изначально значение А=1, после двух последних лосов А=-1.

Потом А=-1 снова до двух последних лоссов, потом снова А=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){
              time2=OrderCloseTime();
              profit=OrderProfit();
            }  
          }
        }
      }
    }
  }
}
if(profit>=0){return(res);}
res=-1;
return(res);
}
 
xrust >>:

Руст, спасибо.

можно сделать так, чтобы кол-во лузовых сделок менять можно было ?

 
Можно пойти двумя путями - наращивать количество модулей проверки, или загонять данные об ордерах в массив сортировать их там, и делать проверку на количество.
 
xrust >>:
Можно пойти двумя путями - наращивать количество модулей проверки, или загонять данные об ордерах в массив сортировать их там, и делать проверку на количество.

Можно попроще ?

как нибудь так:

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 и так

можно выделить поиск каждого следующего ордера в истории в отдельную функчию передавая ей время и тикет предыдущего ордера и в цикле проверять последовательность лосей, и тогда изменя коунтер цикла выбирать количество ордеров для проверки.

 
xrust писал(а) >>

можно и так, и даже так правильнее, но если он не найдет ордера с номером 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) по условию пропускает в себя ордера не текущего символа, и еще и отложенники

 
xrust писал(а) >>

Так не правильно. тебе ведь надо найти последние ордера, те. их надо фильтровать по времени закрытия начиная с самого свежего, а у тебя получается если вообще есть лосевые ордера.

и эта строка : if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) по условию пропускает в себя ордера не текущего символа, и еще и отложенники

Ясно. Спасибо.

Причина обращения: