Ошибки, баги, вопросы - страница 2137

 

Ошибка при считывании профита (или я уже что-то не понимаю). 

Есть функция в рамках советника: 

bool Fn_profit_summ(double &profit_summ, bool is_buy, ulong magic, bool prnt=false){
   profit_summ = 0;
   string str=(is_buy?"B":"S")+" -> "; 
   //-----------------------------             
   int total = PositionsTotal();          
   for(int i=total-1; i>=0; i--){
      const ulong tic= PositionGetTicket(i); if(tic<=0)     return(false); //--- asinchr
      if(!PositionSelectByTicket(tic)                   )   return(false); //--- asinchr 
      bool is_buy_ = (PositionGetInteger(POSITION_TYPE  )==POSITION_TYPE_BUY); 
      if( is_buy_                             !=  is_buy)   continue; 
      if( PositionGetInteger(POSITION_MAGIC ) !=  magic )   continue;
      if( PositionGetSymbol (POSITION_SYMBOL) != _Symbol)   continue;
      profit_summ += PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_SWAP);
      str+=IntegerToString(tic)+" - "+DoubleToString((PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_SWAP)), 2)+"/";
      }
   //-----------------------------
   if( prnt) Print(str+" --> "+DoubleToString(profit_summ, 2));
   return(true);}

В логе вижу: 

2018.02.21 01:44:04.315 2018.02.14 04:59:49   S -> 273 - -5.62/ --> -5.62

Все бы ничего, но это профит ордера бай, а не селл

Тикет точно ордера селл (273, как в логе)


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

(если я переработала и мне уже чудится - поправте, пожалуйста. Искренне надеюсь что это так и настоко критичного бага нет)

 
Galina Bobro:

Ошибка при считывании профита (или я уже что-то не понимаю). 

Есть функция в рамках советника: 

В логе вижу: 

Все бы ничего, но это профит ордера бай, а не селл

Тикет точно ордера селл (273, как в логе)


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

(если я переработала и мне уже чудится - поправте, пожалуйста. Искренне надеюсь что это так и настоко критичного бага нет)

string str=(!is_buy?"B":"S")+" -> ";
 
Kirill Belousov:
Это к чему? Зачем мне "если бай выводить S"?
 

Часто работаю с кастомными символами. Например, нужно вести отладку на таком. Для этого требуется сюда ввести его название


Но названия кастомных символов (да и не только кастомных) бывают длинные/сложные, что тяжело при вбивании их с клавиатуры. Механизма же копирования названия символа в буфер нигде нет. Поэтому предлагаю добавить в это меню пункт "Копировать название символа"


ЗЫ Добавьте в Визуализатор Тестера миллисекунды, пожалуйста!

 
fxsaber:

ЗЫ Добавьте в Визуализатор Тестера миллисекунды, пожалуйста!

Добавим

 

Ошибка при выполнении

struct A {
template<typename T>
        void Print(   T t ) { ::Print( 2 ); }
        ~A() { Print( 1 ); }
};
void OnStart() { A a; }

Результат  : 1

Ожидалось: 2

 
A100:

Ожидалось: void A::Print<int>(int):1

Скорее всего, связано с хитрожопностью штатной Print. Вы  еще iCustom перегрузите таким же образом. Думаю, там результат будет подобный же.

namespace для Print, Comment, Alert, iCustom, ... - нечто особенное, похоже.

 
fxsaber:

Скорее всего, связано с хитрожопностью штатной Print.

Не связано

void Print2( int )           { Print( 1 ); }
struct A {
template<typename T>
        void Print2(   T t ) { Print( 2 ); }
        ~A() { Print2( 1 ); }
};
void OnStart() { A a; }

Результат тот же

 

SymbolInfoTick для кастомных символов выдает пустой тик (когда не было сделано ни одного CustomTicksAdd), даже когда есть тики в Истории.

Предлагаю на стороне Терминала после любого CustomTicksReplace последний тик (или только его время) Истории делать SymbolInfoTick.


Прошу разработчиков высказать свое мнение по этому поводу, на кого данное действие логично вешать - Терминал или юзера?

Мне видится, что на Терминал, т.к. это избавит Юзера от редко-уловимых багов в его коде (поймал такой).

Сейчас, например, последнее время символа приходится находить таким образом

  ulong GetOriginalLastTime( void ) const
  {
    MqlTick Tick[1] = {0};

    ::SymbolInfoTick(this.Symb, Tick[0]);
    
    if (!Tick[0].time_msc)
      ::CopyTicks(this.Symb, Tick, COPY_TICKS_ALL, 0, 1);

    return(Tick[0].time_msc);
  }
 
A100:

Не связано

Результат тот же

Да, баг. Никогда не сталкивался с ним, т.к. к методам всегда приписываю this.