Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 82

 
trader781:
сделал по быстрому, тебе выдаст последний убыточный, что с ним делать и какие параметры подправить под себя уже думаю разберешся

спасибо, разобрался вроде..

Как теперь сделать чтобы лот везвращать к исходному значению после тейк профита?

if (OrderProfit()>0 && OrderType()<2)
            {
            lot=0.1
            }
так не получается)
 
wishmast:

спасибо, разобрался вроде..

Как теперь сделать чтобы лот везвращать к исходному значению после тейк профита?

if (OrderProfit()>0 && OrderType()<2)
            {
            lot=0.1
            }
так не получается)

у меня такая схема

if (OrdersTotal()==0)

открыть первоначальным лотом 

}

else

...

то есть если нет ордеров то старым лотом уже не откроет

можно конечно запоминать каждый, но тут не говорят как это делать.
 
Vitalie Postolache:
Счётчик надо завести и сбрасывать его на начальное значение при достижении заданного порога:

Спасибо. 

Помогите решить задачу.
Есть 3 позиции бай, появилась позиция селл нужно закрыть позицию селл и самую старую позицию бай. Две бай позиции должны остаться.
У меня закрываются все

void OnTick()
  {
//---
int b_STOP,s_STOP,b=0,s=0;

  for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY) b++;
        if (OrderType()==OP_SELL) s++;
        if (OrderType()==OP_BUYSTOP) b_STOP++;
        if (OrderType()==OP_SELLSTOP) s_STOP++;      
      }  
     if (OrderType()==OP_BUY)
     {
     if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция
     {
      OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
      CLOSEORDER(OP_SELL);
     }
     }
    }
  }

 

Обьясните, почему не работает функция OrderProfit()<0 ?

   for(int q=OrdersHistoryTotal()-1; q>=0; q--)
      {
      if(OrderSelect(q,SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderType()<2 && OrderMagicNumber()==magic)
            {
            if (OrderProfit()<0)
               {
               if (DayOfWeek()==1)
                  {
                  day1++;
                  Print ("Понедельник SL=",day1);
                  }
               if (DayOfWeek()==2)
                  {
                  day2++;
                  Print ("Вторник SL=",day2);
                  }
               }
            }
         }
      
      }

 хочу смотреть сколько стоплоссов по дням недели

for(int l=OrdersHistoryTotal()-1; l>=0; l--)
        {
        if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
           {
           if(OrderProfit()<0 && OrderType()<2)
              {
              oldticket=OrderTicket();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot=OrderLots()*4;
              }
           if (OrderProfit()>0 && OrderType()<2)
              {
              lot=0.01;
              }
           }
        }

 и здесь я так понимаю по той же причине не работает

 
wishmast:

Обьясните, почему не работает функция OrderProfit()<0 ?

   for(int q=OrdersHistoryTotal()-1; q>=0; q--)
      {
      if(OrderSelect(q,SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderType()<2 && OrderMagicNumber()==magic)
            {
            if (OrderProfit()<0)
               {
               if (DayOfWeek()==1)
                  {
                  day1++;
                  Print ("Понедельник SL=",day1);
                  }
               if (DayOfWeek()==2)
                  {
                  day2++;
                  Print ("Вторник SL=",day2);
                  }
               }
            }
         }
      
      }

 хочу смотреть сколько стоплоссов по дням недели

for(int l=OrdersHistoryTotal()-1; l>=0; l--)
        {
        if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
           {
           if(OrderProfit()<0 && OrderType()<2)
              {
              oldticket=OrderTicket();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot=OrderLots()*4;
              }
           if (OrderProfit()<0 && OrderType()<2)
              {
              lot=0.01;
              }
           }
        }

 и здесь я так понимаю по той же причине не работает

Потому, что DayOfWeek() возвращает порядковый номер дня недели последнего известного времени сервера.

А вам нужно день недели времени закрытия ордера: TimeDayOfWeek(OrderCloseTime());

 
Artyom Trishkin:

Потому, что DayOfWeek() возвращает порядковый номер дня недели последнего известного времени сервера.

А вам нужно день недели времени закрытия ордера: TimeDayOfWeek(OrderCloseTime());

а результат такой же, будто происходит игнорирование if (OrderProfit()<0) и идет зацикливание, у переменных большие значения получаются.

2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430208
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963666
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430207
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963665

а по поводу цикла с лотом? копировал неправильно сюда, исправил знак if (OrderProfit()>0 && OrderType()<2), но это сути не меняет, без этого условия цикл правильно работает. почему так?
 

 
wishmast:

а результат такой же, будто происходит игнорирование if (OrderProfit()<0) и идет зацикливание, у переменных большие значения получаются.

2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430208
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963666
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430207
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963665

а по поводу цикла с лотом? копировал неправильно сюда, исправил знак if (OrderProfit()>0 && OrderType()<2), но это сути не меняет, без этого условия цикл правильно работает. почему так?
 

Где у вас объявлены day1 и day2 ?
 
Artyom Trishkin:
Где у вас объявлены day1 и day2 ?
как глобальные, в самом начале, до функции OnTick () и до всех функций
 
Artyom Trishkin:
Где у вас объявлены day1 и day2 ?

я так подозреваю как то не правильно я выбираю ордер, что не работает (OrderProfit()<0), как то конкретнее указать какой ордер мне нужен. Не понимаю почему он пропускает ордер, когда последний закрылся по тейку и других там нет. может быть если в истории перебирать как то по другому нужно цикл строить?

for(int w=OrdersHistoryTotal()-1; w>=0; w--)
      {
      if(OrderSelect(w,SELECT_BY_POS,MODE_HISTORY))

 потому что в советники циклы с похожими условиями, и работают как надо, но работает по OrdersTotal() 

for(int n=OrdersTotal()-1;n>=0;n--)            
         {                                          
         if(OrderSelect(n,SELECT_BY_POS))            
            {                                        
            if(OrderMagicNumber()==magic)                  
               {
               if(OrderType()>OP_SELL)
 
sile:
Спасибо. 

Помогите решить задачу.
Есть 3 позиции бай, появилась позиция селл нужно закрыть позицию селл и самую старую позицию бай. Две бай позиции должны остаться.
У меня закрываются все

void OnTick()
  {
//---
int b_STOP,s_STOP,b=0,s=0;

  for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY) b++;
        if (OrderType()==OP_SELL) s++;
        if (OrderType()==OP_BUYSTOP) b_STOP++;
        if (OrderType()==OP_SELLSTOP) s_STOP++;      
      }  
     if (OrderType()==OP_BUY)
     {
     if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция
     {
      OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
      CLOSEORDER(OP_SELL);
     }
     }
    }
  }

В пределах одного цикла такая задача не решается. В этом цикле запоминаете в массив тикеты ордеров на удаление, в другом цикле - удаляйте по тикетам.

Кроме того, у вас с фигурными скобками неразбериха, работаете с ордерами за границами блока OrderSelect{}, это неправильно.

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