[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 582

 
Desead:


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

 

 кстати ещё мысль вот по этому поводу:

Ура, я , кажется проблему удаления ордеров у себя решил. Отдельной функцией считаю количество "нужных"(подлежащих удалению) ордеров -- Total --, вызываю эту функцию, затем while с условием  ( Total>0) потом, цикл удаления for(int i=Total-1 ;i<=0l;i--), опять ф-я подсчета "нужных" , счетчик попыток удаления с выходом из   while при достижении заданного уровня. Так удаляются все. 

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


Почему никак? Например,создайте глобальную переменную на уровне терминала, присвойте ей значение и прверяйте в начале старт, а перед выключением меняйте значение этой переменной через сервис -->глобальные переменные.
 
BeerGod:

А так ?


а можно спросить заодно, что они пытаются вот этим накрутить?

 

for(int i=0; i<OrdersTotal(); i++) 

 

такое ощущение что методом перебора делается попытка подсчета открытых позиций...

 

Доброго дня!!  Не найду красивого решения ситуации. Вот типичная постановка ордеров. Но если я в параметры роботу передам ноль, то есть стопов и тейкпрофитов нет, то ничего не получится.

 if(!srabotka){
           OrderSend (Symbol( ), OP_BUY, lot ,NormalizeDouble(Ask, Digits), 5, NormalizeDouble( Ask- (stop*Point),Digits),   NormalizeDouble( Ask+( 45*Point),Digits), NULL, 450, 0, CLR_NONE);
           int Error=GetLastError();if (Error==0){  
           Sleep(2000); RefreshRates(); 
           OrderSend (Symbol( ), OP_SELL,  lot ,NormalizeDouble(Bid, Digits), 5, NormalizeDouble( Bid+ (stop*Point),Digits), NormalizeDouble( Bid-( 45*Point),Digits), NULL, 450, 0, CLR_NONE); 
           Error=GetLastError();
           if (Error==0){  profit = NormalizeDouble( Ask+( 45*Point),Digits); //tsena=Ask; perenos = false;  
           srabotka= true; }}}
           
           if (Error!=0){ string errorcomment = "Ошибка открытия  ордера OP_BUY"  + " " + Symbol() +  " " + ErrorDescript(Error); 
            Print (errorcomment);}
 

 Можно поставить ещё иф, и второй раз прописать ордерсенд с нолями, но это несколько громоздко.

 
lottamer:


а можно спросить заодно, что они пытаются вот этим накрутить?

 

for(int i=0; i<OrdersTotal(); i++) 

 

такое ощущение что методом перебора делается попытка подсчета открытых позиций...

 


Ну таки образом делает отбор ордеров по заданным параметрам.

например https://www.mql5.com/ru/forum/131859/page3#434221

Функция NumberOfPositions().

Эта функция возвращает количество открытых в данный момент позиций. Более точный отбор подсчитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
  • //+----------------------------------------------------------------------------+
    //|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
    //+----------------------------------------------------------------------------+
    //|  Версия   : 19.02.2008                                                     |
    //|  Описание : Возвращает количество позиций.                                 |
    //+----------------------------------------------------------------------------+
    //|  Параметры:                                                                |
    //|    sy - наименование инструмента   (""   - любой символ,                   |
    //|                                     NULL - текущий символ)                 |
    //|    op - операция                   (-1   - любая позиция)                  |
    //|    mn - MagicNumber                (-1   - любой магик)                    |
    //+----------------------------------------------------------------------------+
    int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
      int i, k=OrdersTotal(), kp=0;
    
      if (sy=="0") sy=Symbol();
      for (i=0; i<k; i++) {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
          if (OrderSymbol()==sy || sy=="") {
            if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
              if (op<0 || OrderType()==op) {
                if (mn<0 || OrderMagicNumber()==mn) kp++;
              }
            }
          }
        }
      }
      return(kp);
    }

 
lottamer:


а можно спросить заодно, что они пытаются вот этим накрутить?

for(int i=0; i<OrdersTotal(); i++) 

такое ощущение что методом перебора делается попытка подсчета открытых позиций...

...а Вы не отдавайтесь в плен ощущениям, а отталкивайтесь от правил. В данном случае в цикле идёт перебор параметров (в "списке" ордеров) связанных с целочисленной переменной i и с каждой итерацией её значение увеличивается на 1. Идёт перебор по порядковому номеру ордера. :)))
 
BeerGod:

Ну таки образом делает отбор ордеров по заданным параметрам.

например https://www.mql5.com/ru/forum/131859/page3#434221

Функция NumberOfPositions().

Эта функция возвращает количество открытых в данный момент позиций. Более точный отбор подсчитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.


спасибо...добавлю себе ту ветку форума в ЗАКЛАДКИ. сплошная польза! :)) 
 
Desead:


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

 

 кстати ещё мысль вот по этому поводу:

Ура, я , кажется проблему удаления ордеров у себя решил. Отдельной функцией считаю количество "нужных"(подлежащих удалению) ордеров -- Total --, вызываю эту функцию, затем while с условием  ( Total>0) потом, цикл удаления for(int i=Total-1 ;i<=0l;i--), опять ф-я подсчета "нужных" , счетчик попыток удаления с выходом из   while при достижении заданного уровня. Так удаляются все. 

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


Подсчет ордеров производится каждый раз после завершения цикла for по удалению ордеров, есть счетчик итераций цикла while с выходом из цикла по break , при достижении значения счетчика,величины,указанной вами во внешней переменной, можно перед выходом добавить обработку ошибок с выводом результата через
Alert(...)
или
Print( ...)  
ну и как мне тут посоветовали добавить проверку на разрешение торговли. Так что зацикливания здесь никак не получится. 


 
Dimka-novitsek:

Доброго дня!!  Не найду красивого решения ситуации. Вот типичная постановка ордеров. Но если я в параметры роботу передам ноль, то есть стопов и тейкпрофитов нет, то ничего не получится.

 Можно поставить ещё иф, и второй раз прописать ордерсенд с нолями, но это несколько громоздко.

 

У Вас всё по-взрослому - на уровне искусства!!! ;)

А если по-серьёзному, - научитесь задумываться над тем, что только что написали. При нулевых значения СТОПов по Вашей формуле стоплосс и тэйк профит равны цене открытия ордера, что НЕДОПУСТИМО. Ещё какие-нибудь решения сможете предложить (а на пацанском: "сможете напрячь мозх"??? :)))

 
Dimka-novitsek:

Доброго дня!!  Не найду красивого решения ситуации. Вот типичная постановка ордеров. Но если я в параметры роботу передам ноль, то есть стопов и тейкпрофитов нет, то ничего не получится.

 Можно поставить ещё иф, и второй раз прописать ордерсенд с нолями, но это несколько громоздко.


 

 


if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0; 
 
rigonich:


...зря Вы так (Вы не оставили человеку шансов): если у человека не стимулировать работу серого вещества, он всю жизнь проведёт "на паперти" - "Подскажите, Христа ради!" :)))