Советники: iMA price crossing - страница 2

 
Vladimir Karputov:

Не поясню, пока не научитесь пользоваться поиском по коду. Как только научитесь - сразу объясню.

(Совет: текст вида "строка номер такая-то" - это простой набор букв, который не несёт никакой информации).

Если Вам нужны куски кода с переменной, вот:

input bool     InpPrintLog          = false;       // Print log
if(InpPrintLog)...

Дальше в коде эта переменная встречается ИСКЛЮЧИТЕЛЬНО в виде условия в операторе if.

Если я Вас неправильно понял, поясните, пожалуйста, что я должен найти поиском (я умею им пользоваться)

 

Справка: Input переменные


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Советники: iMA price crossing

odyn, 2020.02.26 11:16

***

Поясните, пожалуйста, логику применения переменной InpPrintLog.

Она принимает значение false (стр. 52 кода) и затем я не нашел нигде выражения, где бы InpPrintLog могла изменить свое значение. 

***


Input переменная не может менять своё значение в коде. Это правило.

Документация по MQL5: Основы языка / Переменные / Input переменные
Документация по MQL5: Основы языка / Переменные / Input переменные
  • www.mql5.com
указывается перед типом данных. Изменять значение переменной с модификатором input внутри mql5-программы нельзя, такие переменные доступны только для чтения. Изменять значения input-переменных может только пользователь из окна свойств программы. Внешние переменные всегда переинициализируются непосредственно перед вызовом OnInit().   Существует...
 

Да, я понял, что изменить переменную может только пользователь. 

Могу я Вас попросить обьяснить смысл переменной?

Заранее благодарю за ответ  и прошу прощения за тупые вопросы. Но, возможно, когда-то и Вы задавали подобные, когда учились  ))

 
odyn:

Да, я понял, что изменить переменную может только пользователь. 

Могу я Вас попросить обьяснить смысл переменной?

Заранее благодарю за ответ  и прошу прощения за тупые вопросы. Но, возможно, когда-то и Вы задавали подобные, когда учились  ))

Смысл переменной 'InpPrintLog' - расширенный режим вывода логов.

 

Уважаемый Владимир!

Пожалуйста, поясните - почему после else ВЫ поставили еще одно if?  Ведь по логике само наличие else уже должно означать, что условие предыдущего if не выполнено?

if(!SPosition[i].transaction_confirmed)//если транзакция подтверждена
              {
               if(InpPrintLog)//если InpPrintLog равняетя true
                  Print(__FILE__," ",__FUNCTION__,", OK: ","transaction_confirmed: ",SPosition[i].transaction_confirmed);
               return;
              }
            else //если транзакцие НЕподтверждена
               if(SPosition[i].transaction_confirmed) //-- почему здесь if?
                 {
                  ArrayRemove(SPosition,i,1);
                  return;
                 }
 
odyn:

Уважаемый Владимир!

Пожалуйста, поясните - почему после else ВЫ поставили еще одно if?  Ведь по логике само наличие else уже должно означать, что условие предыдущего if не выполнено?

Не люблю чёрных лебедей и поэтому пишу условия с гарантией, а не надеясь на «по-умолчанию».
 

Уважаемый Владимир,

не могли бы вы промотреть, правильно ли я определил назначение и отдельные действия в функции? (В комментах)

void CalculateAllPositions(int &count_buys,double &volume_buys,double &volume_biggest_buys,
                           int &count_sells,double &volume_sells,double &volume_biggest_sells)
  {
   count_buys  = 0;
   volume_buys   = 0.0;
   volume_biggest_buys  = 0.0;
   count_sells = 0;
   volume_sells  = 0.0;
   volume_biggest_sells = 0.0;
   for(int i=PositionsTotal()-1; i>=0; i--)//перебор для каждой открытой позиции
      if(m_position.SelectByIndex(i)) // выбор позиции для дальнейшего доступа к свойствам
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)//проверка, правильно ли выбрано название  сивола и мажик-номер
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)//если тип позиции - длинная
              {
               count_buys++;//увеличиваем на единицу счетчик длинных позиций
               volume_buys+=m_position.Volume();//добавляем к общему обьему  обьем данной позиции
               if(m_position.Volume()>volume_biggest_buys)//выбираем наибольшую по обьему длинную позицию
                  volume_biggest_buys=m_position.Volume();
               continue;
              }
            else
               if(m_position.PositionType()==POSITION_TYPE_SELL)//если тип позиции - короткая
                 {
                  count_sells++;//увеличиваем на единицу счетчик длинных позиций
                  volume_sells+=m_position.Volume();//добавляем к общему обьему кор. позиций  обьем данной позиции
                  if(m_position.Volume()>volume_biggest_sells)//выбираем наибольшую по обьему короткую позицию
                     volume_biggest_sells=m_position.Volume();
                 }
           }
  }
 
odyn:

Уважаемый Владимир,

не могли бы вы промотреть, правильно ли я определил назначение и отдельные действия в функции? (В комментах)

Почти правильно. Исправления:

void CalculateAllPositions(int &count_buys,double &volume_buys,double &volume_biggest_buys,
                           int &count_sells,double &volume_sells,double &volume_biggest_sells)
  {
   count_buys  = 0;
   volume_buys   = 0.0;
   volume_biggest_buys  = 0.0;
   count_sells = 0;
   volume_sells  = 0.0;
   volume_biggest_sells = 0.0;
   for(int i=PositionsTotal()-1; i>=0; i--)//перебор для каждой открытой позиции
      if(m_position.SelectByIndex(i)) // выбор позиции для дальнейшего доступа к свойствам
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)//проверка, правильно ли выбрано название  сивола и мажик-номер
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)//если тип позиции - длинная
              {
               count_buys++;//увеличиваем на единицу счетчик длинных позиций
               volume_buys+=m_position.Volume();//добавляем к общему объему позиций BUY объем данной позиции
               if(m_position.Volume()>volume_biggest_buys)//выбираем наибольшую по объему длинную позицию
                  volume_biggest_buys=m_position.Volume();
               continue;
              }
            else
               if(m_position.PositionType()==POSITION_TYPE_SELL)//если тип позиции - короткая
                 {
                  count_sells++;//увеличиваем на единицу счетчик длинных позиций
                  volume_sells+=m_position.Volume();//добавляем к общему объему позиций SELL объем данной позиции
                  if(m_position.Volume()>volume_biggest_sells)//выбираем наибольшую по объему короткую позицию
                     volume_biggest_sells=m_position.Volume();
                 }
           }
  }
 
Vladimir Karputov:

Почти правильно. Исправления:

Большое спасибо за ответ.

 

Уважаемый Владимир!

В структуре имеется переменная lot_coefficient. Она инициируется нулем.

struct STRUCT_POSITION
  {
   ENUM_POSITION_TYPE pos_type;              // position type
   double            volume;                 // position volume (if "0.0" -> the lot is "Money management")
   double            lot_coefficient;        // lot coefficient
   bool              waiting_transaction;    // waiting transaction, "true" -> it's forbidden to trade, we expect a transaction
   ulong             waiting_order_ticket;   // waiting order ticket, ticket of the expected order
   bool              transaction_confirmed;  // transaction confirmed, "true" -> transaction confirmed
   //--- Constructor
                     STRUCT_POSITION()
     {
      pos_type                   = WRONG_VALUE;
      volume                     = 0.0;
      lot_coefficient            = 0.0;
      waiting_transaction        = false;
      waiting_order_ticket       = 0;
      transaction_confirmed      = false;
     }
  };
STRUCT_POSITION SPosition[];

Затем в нескольких местах эта переменная используэтся для условий оператора if:

 if(SPosition[index].lot_coefficient>0.0)
     {
      long_lot=LotCheck(long_lot*SPosition[index].lot_coefficient,
                        m_symbol);

Не могли бы Вы обьяснить, ЗАЧЕМ это делается? 

Насколько я понимаю, переменная нигде в коде не меняет значение. Или я неправ?