Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 110

 
artmedia70:
А где в этой функции вы Стоплосс последнего закрытого считываете? Там нету ничего.

Вот здесь. Напрямую указывал.
OrderSelect(1,SELECT_BY_POS,MODE_HISTORY);
      take=OrderTakeProfit();
       ts=take;
 
borilunad:
Спать всем! Утро вечена мудренее! У меня уже час ночи с гаком! Спокойной ночи! А Артём уже проспал спать!

Да вот тока я уже 5 дней делаю как ты и уже начал по ночам думать. Спокойный ночи.
 
Ооо! В журнале появляется ошибка 130. Это же неправильные стопы? НО новый стоп лосс - 1.3282. Стоп лосс который на текущий момент - 1.3275 (это и цена открытии ордера), а на текущий момент котировка - 1.3297. Где ошибка?
 

Здравствуйте. Почему в предопределенной переменной "Point", не определяются нули в журнале тестера стратегий, в конце, круглых чисел?

Пример:

static double lBUY;

lBUY=100*Point; //Так-же можно написать 10,20,180 или 520.

if(lBUY==0.01)

{

Alert("НУЛИ НЕ ПИШУТСЯ В КОНЦЕ Point ",lBUY);

}

 
artmedia70:
Сибиряк я, угу. Под Красноярском.


СибирЯК, значит, почти, замлЯК))
 
webip:

Да вот тока я уже 5 дней делаю как ты и уже начал по ночам думать.

Проще сказать кто по ночам не думает, ежели на оборот. У меня такая же ситуация. Тем более, ночью никто не мешает вообще. Кстати, я как-то читал, что типа ночью мозг лучше думает. Это типа учёные узнали...
 
semiromid:

Здравствуйте. Почему в предопределенной переменной "Point", не определяются нули в журнале тестера стратегий, в конце, круглых чисел?

Пример:

static double lBUY;

lBUY=100*Point; //Так-же можно написать 10,20,180 или 520.

if(lBUY==0.01)

{

Alert("НУЛИ НЕ ПИШУТСЯ В КОНЦЕ Point ",lBUY);

}



И что Алерт выдаёт по факту?
 
artmedia70:
DoubleToStr(число,разрядность) вам в помощь


Большое спасибо! Мне это было необходимо для сравнения характеристик свечей (больше, меньше и т.д.)Прикрутил -работает. Только не могу взять в толк как он так сравнивает тип данных string? или double to string не переводит число в строку? :-D


PS. В индикаторе это не пашет - только в скрипте... Проблема в том, что хотя в программе на графике характеристики бара передаются с 5 знаками после запятой, при вызове High[i] - вылезает только 4 знака после запятой.

Пишу:

Alert ("doubletostr High = ", DoubleToStr(High[1],5));
if (DoubleToStr(High[2],5)>(DoubleToStr(High[3],5)))
{
Alert ("Больше");
}
if (DoubleToStr(High[2],5)<(DoubleToStr(High[3],5)))
{
Alert ("Меньше");

}

Пашет, результат пишет с пятью знаками, больше/меньше считает. Проблема в том, что в индикаторе строковый массив не выведется на график. Поэтому...

...пишу:

Alert ("Normalizedouble High = ", NormalizeDouble(High[1],5));

Не пашет - результат - > 1,1234

Я не понимаю разработчиков - зачем так всё было усложнять? Почему если он на графике показывает столько знаков то и вызываемой функции он пять знаков не нацарапает? Может есть какой-то простой выход?

 

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

Вот что вышло:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos(int delta)
{
   datetime lastOrderCloseTime = 0,               // Время закрытия последнего открытого ордера
            lastOOTHist = -1;                     // Время открытия последнего открытого ордера из истории
   
   for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() > 1) continue;               // Все удалённые отложки нас не интересуют..
  
      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
      {
         lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
         int j = i;
      }
   }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
   {
      if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
      if (MathAbs(OrderProfit() - OrderClosePrice()) > delta * pt) return (false);
      else
      {
         lastOOTHist = OrderOpenTime();
         Comment("FUNC isCloseByTakeLastOpenPos : lastOOTHist = ", lastOOTHist);
      }
   }
   else
   {
     // Comment("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");
      Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");
      return(false);
   }
  
   for(int h=OrdersTotal()-1; h>=0; h--)
   {
      if (OrderSelect(h, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderMagicNumber() != i_magic)   continue;
         if (OrderSymbol() != Symbol())       continue;
         if (OrderType() > 1)                 continue;
         if (lastOOTHist < OrderOpenTime()) return(false);  // Выбранная рыночная позиция открыта позже закрытой по тейку
      }
      else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);}
   }
   
   return (true);
}

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

 if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
   {
      if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
      if (MathAbs(OrderProfit() - OrderClosePrice()) > delta * pt) return (false);
      else
      {
         lastOOTHist = OrderOpenTime();
         Comment("FUNC isCloseByTakeLastOpenPos : lastOOTHist = ", lastOOTHist);
      }
   }
   else
   {
      Comment("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");
      Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");
      return(false);
   }

Постоянно коммент срабатывает именно:

Comment("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");

Я его закоментил, погнал дальше. Замечено, что данный коммент:

Comment("FUNC isCloseByTakeLastOpenPos : lastOOTHist = ", lastOOTHist);

Вообще не срабатывает никогда, даже когда есть закрытая позиция последняя. Что может быть не так?

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

 if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
   {
      if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
      if (MathAbs(OrderProfit() - OrderClosePrice()) > delta * pt) return (false);
      else
      {
         lastOOTHist = OrderOpenTime();
         Comment("FUNC isCloseByTakeLastOpenPos : lastOOTHist = ", lastOOTHist);
      }
   }
   else
   {
     // Comment("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");
      Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");
      return(false);
   }

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

 
hoz:

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

Вот что вышло:

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

Постоянно коммент срабатывает именно:

Я его закоментил, погнал дальше. Замечено, что данный коммент:

Вообще не срабатывает никогда, даже когда есть закрытая позиция последняя. Что может быть не так?

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

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

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