Ваши вопросы по языку MQL4

AlexeyVik

Программист mql4 mql5
От 0 до OrdersTotal()-1.
for(int y=0; y<OrdersTotal(); y++)

Или в обратном порядке. Если будет закрытие ордеров в этом цикле, то именно этот вариант рабочий.
for(int y=OrdersTotal()-1; y>=0; y--)
Андрей, ну ты-же знаешь, что если нельзя, но очень нужно — то можно.
Вот вариант удаления ордеров в цикле от 0 до < OrdersTotal()
Код:
Expand Collapse Copy
/********************Script program start function*******************/
void OnStart()
 {
  for(int i = 0; i < OrdersTotal(); i++)
   {
    if(OrderSelect(i, SELECT_BY_POS))
     {
      int ticket = OrderTicket();
      if(OrderDelete(ticket))
        i--;
     }
   }
 }/******************************************************************/
 

Ugar

Гуру форума
Андрей, ну ты-же знаешь, что если нельзя, но очень нужно — то можно.
Вот вариант удаления ордеров в цикле от 0 до < OrdersTotal()
Код:
Expand Collapse Copy
/********************Script program start function*******************/
void OnStart()
 {
  for(int i = 0; i < OrdersTotal(); i++)
   {
    if(OrderSelect(i, SELECT_BY_POS))
     {
      int ticket = OrderTicket();
      if(OrderDelete(ticket))
        i--;
     }
   }
 }/******************************************************************/
Как давно я так не извращался. Прям ностальгия накрыла.
Обычно, когда порядок закрытия не важен, использую обратный порядок.
 

AlexeyVik

Программист mql4 mql5
Как давно я так не извращался. Прям ностальгия накрыла.
Обычно, когда порядок закрытия не важен, использую обратный порядок.
Ну да, извращение… Я просто хотел показать новичкам возможности. Хотел показать, что не надо тупо зазубривать какие-то варианты, просто надо думать.
И к стати, такой порядок закрытия сетки ордеров рисует в тестере сначала пику вверх, а потом возврат к текущему значению депозита. А обратный, от OrdersTotal()-1 до 0 рисует пику вниз и возврат к текущему депозиту. Просто выглядит не так пугающе…
 
  • Like
Реакции: Ugar

star603

Новичок форума
на 100% работать не будет...

for(int y=1; y<=OrdersTotal(); y++)
Чтобы проще - ордера хранятся в массиве с размером OrdersTotal, т.е. для перебора всех ордеров индекс меняется с 0 до OrdersTotal.
if(OrderSelect(y, SELECT_BY_TICKET)==true && OrderMagicNumber()==Magic)
ты выбираешь ордер по тикету или по индексу? тут уж попробуй определиться сам) про то, что не происходит проверка по символу промолчу
потому, как символ важен, так как значение MarketInfo(Symbol(),MODE_FREEZELEVEL) у разных символов вообще говоря не совпадает... ну и всякое по мелочи - например уровень минимального стопа
Согласен есть не недочеты не спорю. Стараюсь использовать принты после каждой строчки и компиляцию так выявляются ошибки.
Есть вопрос как модернизировать ордера если ты (я) указал сл и тп указал 0. То есть без профита и лосей.?
 

star603

Новичок форума
Код:
Expand Collapse Copy
double Stopi0()//Установка стопов по фиксированному значению стоплоса
  {
   for(int y=1; y<=OrdersTotal(); y++)
     {
      if(OrderSelect(y, SELECT_BY_TICKET)==true && OrderMagicNumber()==Magic)
        {
         if(OrderType()==OP_BUY)
           {
            O = OrderOpenPrice();
            S = OrderTakeProfit();
                Comment(O);
           };
          if(OrderType()==OP_SELL)
           {
           };
        }
     }
   return(StopLoss2);
  };

Комент выводиться, а ставлю бай пос не выводиться комент не понятно почему. Может каких то проверок не хватает?
 

Ugar

Гуру форума
Код:
Expand Collapse Copy
double Stopi0()//Установка стопов по фиксированному значению стоплоса
  {
   for(int y=1; y<=OrdersTotal(); y++)
     {
      if(OrderSelect(y, SELECT_BY_TICKET)==true && OrderMagicNumber()==Magic)
        {
         if(OrderType()==OP_BUY)
           {
            O = OrderOpenPrice();
            S = OrderTakeProfit();
                Comment(O);
           };
          if(OrderType()==OP_SELL)
           {
           };
        }
     }
   return(StopLoss2);
  };

Комент выводиться, а ставлю бай пос не выводиться комент не понятно почему. Может каких то проверок не хватает?
Так писали уже. Цикл неправильный. Во первых пропущен индекс 0. Во вторых ордера с индексом OrdersTotal() не бывает.
Правильно от 0, до OrdersTotal()-1.
Если перебор ордеров по возрастанию то цикл должен выглядеть так:
for(int y=0; y<OrdersTotal(); y++)
 

mobidik

-----
Код:
Expand Collapse Copy
double Stopi0()//Установка стопов по фиксированному значению стоплоса
  {
   for(int y=1; y<=OrdersTotal(); y++)
     {
      if(OrderSelect(y, SELECT_BY_TICKET)==true && OrderMagicNumber()==Magic)
        {
         if(OrderType()==OP_BUY)
           {
            O = OrderOpenPrice();
            S = OrderTakeProfit();
                Comment(O);
           };
          if(OrderType()==OP_SELL)
           {
           };
        }
     }
   return(StopLoss2);
  };

Комент выводиться, а ставлю бай пос не выводиться комент не понятно почему. Может каких то проверок не хватает?
Как пример:
C-подобный:
Expand Collapse Copy
double Stopi0()//Установка стопов по фиксированному значению стоплоса
  {
    string txt = "";
    double O = 0;
    double P = 0;
    int    T = 0;
    
    for(i=OrdersTotal()-1; i>=0; i--)
     {   
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
          if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
             if(OrderType()==OP_BUY)
              {
                O = OrderOpenPrice();
                S = OrderTakeProfit();
                T = OrderTicket();
                
                txt+="BUY ["+(string)T+"] OpenPrice: "+DoubleToStr(O,Digits)+" / Profit: "+DoubleToStr(P,2)+"\n";
              }
              
             if(OrderType()==OP_SELL)
              {
                O = OrderOpenPrice();
                S = OrderTakeProfit();
                T = OrderTicket();
                
                txt+="SELL ["+(string)T+"] OpenPrice: "+DoubleToStr(O,Digits)+" / Profit: "+DoubleToStr(P,2)+"\n";
             }
           }
        }
     }
    
    Comment(txt);
  
    return(0);
  };
 

star603

Новичок форума
Есть вопрос как модернизировать ордера если ты (я) указал сл и тп указал 0. То есть без профита и лосей.?
 

mobidik

-----
_Symbol и txt+= этого не пойму
_Symbol и Symbol() - записи равносильны.
txt - стринговая переменная. То, как у Вас был создан комент, то при каждом новом его выводе, предыдущий будет заменен на текущий, т.е., в итоге Вы получите запись только о самом последнем, в переборе цикла, ордере. Если в рынке есть несколько ордеров, а Вам нужна инфа по всем, то как быть? Нужно сперва собрать всю инфу, а уже потом вывести её в комент, вот и происходит сбор инфы в переменную txt, которая потом выводится в коменте. Как-то так, надеюсь, понятно.
 

mobidik

-----
Есть вопрос как модернизировать ордера если ты (я) указал сл и тп указал 0. То есть без профита и лосей.?
Для этого есть ф-ция: OrderModify();
Делается в цикле, проверяется каждая позиция на наличие нужного ТП/СЛ, если нет - производим модификацию позиции.

PS.
Впрочем, можно и без цикла, все зависит где и когда будем модифицировать позу.
 

star603

Новичок форума
Код:
Expand Collapse Copy
double Stopi0()//Установка стопов по фиксированному значению стоплоса
  {
   for(int y=0; y<=OrdersTotal()-1; y++)
     {
      if(OrderSelect(y, SELECT_BY_POS) && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)
        {
         if(OrderType()==OP_BUY)
           {
            if(MarketInfo(_Symbol,MODE_STOPLEVEL)>StopLoss)           
                Comment("1");
            else if(MarketInfo(_Symbol,MODE_STOPLEVEL)<StopLoss)
                 Comment("2");
           };
          if(OrderType()==OP_SELL)
           {
           };
        }
     }
   return(StopLoss2);
  };
Сколько не менял бы стоплос все равно выдается 1 в коментах а не два
 

star603

Новичок форума
Код:
Expand Collapse Copy
double Stopi0()//Установка стопов по фиксированному значению стоплоса
  {
   for(int y=0; y<=OrdersTotal()-1; y++)
     {
      if(OrderSelect(y, SELECT_BY_POS) && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)
        {
         if(OrderType()==OP_BUY)
           {
             O = OrderOpenPrice();
             S = Bid;
             double D = MarketInfo(_Symbol,MODE_STOPLEVEL);
             double E = StopLoss*Point;
             double Y = NormalizeDouble(S-D-E,Digits);
             Print(S,"-",D,"-",E,"-",Y);
             //S = Bid - MarketInfo(_Symbol,MODE_STOPLEVEL)-StopLoss*Point;
            Print(Bid,S);
           };
          if(OrderType()==OP_SELL)
           {
           };
        }
     }
   return(StopLoss2);
  };

Почему выдает так чередуясь:
Код:
Expand Collapse Copy
2022.08.20 19:05:53.186    2004.01.01 20:18:45  Umr EURUSD,Daily: 1.2341.234
2022.08.20 19:05:53.186    2004.01.01 20:18:45  Umr EURUSD,Daily: 1.234-2.0-0.0--0.766
2022.08.20 19:05:53.093    2004.01.01 20:15:00  Umr EURUSD,Daily: 1.23371.2337
2022.08.20 19:05:53.093    2004.01.01 20:15:00  Umr EURUSD,Daily: 1.2337-2.0-0.0--0.7663

а не так как я хочу:
Код:
Expand Collapse Copy
2022.08.20 19:05:53.186    2004.01.01 20:18:45  Umr EURUSD,Daily: 1.234-2.0-0.0--0.766
2022.08.20 19:05:53.093    2004.01.01 20:15:00  Umr EURUSD,Daily: 1.2337-2.0-0.0--0.7663

скажите пожалуйста что я не учел
 

star603

Новичок форума
Код:
Expand Collapse Copy
и как так это получается?

2022.08.20 19:05:53.186    2004.01.01 20:18:45  Umr EURUSD,Daily: 1.2341.234
 

star603

Новичок форума
Вставь этот принт вместо своего
Код:
Expand Collapse Copy
Print(DoubleToStr(S,Digits),"-",DoubleToStr(D,Digits),"-",DoubleToStr(E,Digits),"-",DoubleToStr(Y,Digits));
Так нагляднее спасибо. А такое откуда берется :
Код:
Expand Collapse Copy
2022.08.20 19:05:53.186    2004.01.01 20:18:45  Umr EURUSD,Daily: 1.2341.234
 

MakarFX

Элитный участник
Так нагляднее спасибо. А такое откуда берется :
Код:
Expand Collapse Copy
2022.08.20 19:05:53.186    2004.01.01 20:18:45  Umr EURUSD,Daily: 1.2341.234
Ты показываешь принты по разным событиям.
И что ты хочешь чтобы тебе ответили.

Удали в коде все ненужные принты и смотри что не так.
 

star603

Новичок форума
Код:
Expand Collapse Copy
double Stopi0()//Установка стопов по фиксированному значению стоплоса
  {
   for(int y=0; y<=OrdersTotal()-1; y++)
     {
      if(OrderSelect(y, SELECT_BY_POS) && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)
        {
         if(OrderType()==OP_BUY)
           {
             O = OrderOpenPrice();
             StopLoss2 = Bid-MarketInfo(_Symbol,MODE_STOPLEVEL)*Point+OrderStopLoss()-StopLoss*Point;
           };
          if(OrderType()==OP_SELL)
           {
           };
        }
     }
   return(StopLoss2);
  };

Если это пользовательская фукнкия которая включается через енум список , то вопрос мне нужно одельно прописать пользовательскую функцию для модернизации ордера? Ведь если я напишу модерннизаюцию следующей строкой он же не сможет вернуть весь ордер целиком.
 
Верх