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

 
BeerGod:

Перевидите переменную которую нужно отобразить в принт или каммент в string DoubleToStr( double value, int digits) и выставляйте нужную точность.

https://docs.mql4.com/ru/convert/DoubleToStr

https://docs.mql4.com/ru/common/comment


Ок, спасибо. Тоже думал делать так, либо строчить через ObjecCreate()..
 
okvseok:

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

спасибо! 

  Можно так попробовать:
//+----------------------------------------------------------------------------+
// Убыточно ли закрылся последний ордер, и подсчет количества
int fHistory(){
  int loss = 0;
  for(int i=OrdersHistoryTotal()-1; i >= 0; i--){               // Выборка в истории
     if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true){    // Если есть следующий в истории
        if(OrderMagicNumber()!=magN) continue;                // Ордера не нашего эксперта

        if(OrderProfit() < 0 ) loss = loss++;                 // Если убыток по посл.ордеру - считаем
        
        if(OrderProfit() > 0 ) return(loss);                  // Если прибыль, вернем количество убыточных
     }
  }
  return(-1);
}
 

а сколько раз нужно вызывать OrderSelect перед тем как пользоваться OrderProfit(), OrderType() и тд  ? достаточно ли одного раза внутри Start или же каждый раз перед использованием OrderProfit, OrderType и тд...нужно вызывать OrderSelect ?? 

и нужно ли вызывать OrderSelect непосредственно перед OrderProfit или можно где угодно вначале, лишь бы было ??

 
hoz:

 Я вопрос писал, видать никто не заметил. Не хотел такой длинный вопрос сюда писать, чтоб не путать всех. Просьба обратить внимание...

https://www.mql5.com/ru/forum/142983 

Попробуй так:

int OrderCloseCount(double ordOpPrice, datetime ordOpTime)
{
  // slippage= Взять из OrderSend
  int timePlusMinus=20; // Пусть будет 20 сек.
  int count = 0;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0 ; i--)
  {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderSymbol() != Symbol()) continue;
          if (MathAbs(OrderOpenPrice()-ordOpPrice) <= slippage*Point && MathAbs(OrderOpenTime()-ordOpTime))< timePlusMinus)
              count++;
  }
  
   return (count);
}

 Потому что нет гарантии что Ваши ордера открылись точно по одной цене и точно в одно время.

 
hoz:

 Я вопрос писал, видать никто не заметил. Не хотел такой длинный вопрос сюда писать, чтоб не путать всех. Просьба обратить внимание...

https://www.mql5.com/ru/forum/142983 

Я уже в той ветке вам расписал приблизительный алгоритм (тут его слегка подкорректировал для большего понимания учёта некоторых нюансов) и не нужно городить огород:


Алгоритм прост как бублик.

При частичном закрытии не меняется Magic. Тикет меняется, а магик - нет.

Есть открытая поза, есть уровни, на которых эта поза должна частями закрываться.

Допустим Level1, Level2 и Level3.

Если поза Buy в профите и Bid >= Level1 && Bid< Level2 ---> закрываем первую часть позиции (лотом, меньшим, чем лот этой позиции, при условии, что оставшийся лот не будет меньше минимального лота), далее:

Если Bid >= Level2 && Bid< Level3 ---> закрываем вторую часть позиции (лотом, меньшим, чем лот этой позиции, при условии, что оставшийся лот не будет меньше минимального лота), далее:

Если Bid >= Level3 && Bid<Level4 ---> закрываем третью часть позиции (лотом, меньшим, чем лот этой позиции, при условии, что оставшийся лот не будет меньше минимального лота), далее:

1. Если при частичном закрытии на уровне Bid>=LevelX лот стал меньше минимального ---> закрываем всю позицию

2. Если после третьего закрытия на уровне Bid>=Level3 ещё осталась позиция, либо сопровождаем оставшуюся позу тралом после преодоления Level4, либо закрываем её всю сразу.

Это всё.

Для Sell смотрим по Ask: Ask<=Level1 && Ask>Level2 ... и т.д. ...

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

При этом не нужно в памяти (в переменных) эксперта хратить значения этих уровней, что очень удобно - если эксперт по какой-либо причине завершит работу, то после возобновления он не потеряет данные об уровнях - он их для каждой позиции будет на лету пересчитывать.

И ещё: после частичного закрытия не забывайте подтягивать защитный стоп. После закрытия на уровне1 - стоп в безубыток, после закрытия на уровне2 - стоп на уровень1, после закрытия на уровне 3 - стоп на уровень2 и т.д. ...


 
Всем привет! Есть ли у кого пример эксперта с применением пользовательского индикатора?
 
dimarik0000:
Всем привет! Есть ли у кого пример эксперта с применением пользовательского индикатора?
А в чём проблема?
 
artmedia70:
А в чём проблема?


Читал статью о переносе пользовательского индикатора в код эксперта и запутался, стоит ли это делать? или достаточно только какие то определённые параметры индикатора в коде указать?
 
dimarik0000:

Читал статью о переносе пользовательского индикатора в код эксперта и запутался, стоит ли это делать? или достаточно только какие то определённые параметры индикатора в коде указать?
Если опыта мало, то лучше используйте iCustom(), либо досконально изучите и осмыслите принцип работы индюкатора, прежде, чем его логику в эксперта пихать.
 

713
borilunad 15.01.2013 12:10 

Не могли бы Вы разрешить одну загадку: Почему, когда вставил в условия эту функцию || isCloseLastPosByTake() == True ||  эксперт в тестере начал очень тормозить, в раз 10!? Это одно из 4-х взаимоисключающих условий, потому не могу употребить цепочку с if, как при суммированных условиях, для более быстрой работы кода. Что бы Вы могли мне посоветовать? Заранее благодарен Вам за совет!

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