Условие равенства верно при неравных значениях. Почему?

 

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

Ошибки, баги, вопросы

shev1404, 2020.05.13 12:16

Добрый день.

Наткнулся на непонятную вещь и не пойму в чем дело.

Есть две функции, которые используются в разных стратегиях. По логике вещей код в проверках типа

if(m_position.PositionType()==POSITION_TYPE_SELL  && m_position.Magic()==magic)

выполняться не должен, если одно из условий не верно. Но он почему-то выполняется, если магик номер позиции и переданный в функцию магик НЕ РАВНЫ.

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


void OpenNextBuyPositionBySignal(CTrade &m_trade,long magic,double ExtDP,double iuv,double imv,int itp,int isl,double etp,double esl,double ev,double &rev,string numstr,ulong &last_pt)
{
   for(int i=PositionsTotal()-1;i>=0;i--)
     if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
       if(m_position.Symbol()==m_symbol.Name())
       {
          if(m_position.PositionType()==POSITION_TYPE_SELL  && m_position.Magic()==magic)
          {
             if((m_position.Profit()+m_position.Swap()+m_position.Commission())<0)
             {
                if(IsSetBuy(magic,ExtDP)==true)
                {
                    double cdist=MathFloor(MathAbs((m_position.PriceOpen()-m_position.PriceCurrent())/ExtDP));
                    Print("#1122 cdist ",numstr,": ",cdist);
                    Print("#2211! m_position.PriceOpen(): ",m_position.PriceOpen());
                    Print("#2212! m_position.PriceCurrent(): ",m_position.PriceCurrent());
                    Print("#2213! ExtDP: ",ExtDP);
                    Print("#2214! magic: ",magic);
                    Print("#2215! ev: ",ev);
                    Print("#2216! iuv: ",iuv);
                    Print("#2217! m_position.Volume(): ",m_position.Volume());
                    Print("#2218! m_position.Magic(): ",m_position.Magic());
                    
                   
                    if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)<=imv)
                       ev=NormalizeDouble(m_position.Volume()+iuv*cdist,2);
                     if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)>imv)
                        ev=NormalizeDouble(imv,2);
                     rev=ev;
                     double sl=0.0;
                     double tp=0.0;
                     if(itp>0) tp=m_symbol.Ask()+etp;
                     if(isl>0) sl=m_symbol.Bid()-esl;
                     //m_trade.SetExpertMagicNumber(magic);
                     if(OpenBuy(m_trade,ev,sl,tp,numstr))
                     {
                        last_pt=POSITION_TYPE_BUY;
                        FileWrite(filehandle,numstr+", ",TimeCurrent(),", ",GetLastPositionsType(magic),", ",GetPositionTicket(magic,POSITION_TYPE_BUY)); 
                        Print("#516! Position BUY after down SELL "+numstr);                                 
                        //Sleep(3000);
                        continue;
                     }
                  }
               }
            }
            if(m_position.PositionType()==POSITION_TYPE_BUY  && m_position.Magic()==magic)
            {
               if((m_position.Profit()+m_position.Swap()+m_position.Commission())<0)
               {
                  if(IsSetBuy(magic,ExtDP)==true)
                  {
                     double cdist=MathFloor(MathAbs((m_position.PriceOpen()-m_position.PriceCurrent())/ExtDP));
                     Print("#1123 cdist ", numstr," : ",cdist);
                     Print("#3211! m_position.PriceOpen(): ",m_position.PriceOpen());
                     Print("#3212! m_position.PriceCurrent(): ",m_position.PriceCurrent());
                     Print("#3213! ExtDP: ",ExtDP);
                     Print("#3214! magic: ",magic);
                     Print("#3215! ev: ",ev);
                     Print("#3216! iuv: ",iuv);
                     Print("#3217! m_position.Volume(): ",m_position.Volume());
                     Print("#3218! m_position.Magic(): ",m_position.Magic());
                    
                     if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)<=imv)
                        ev=NormalizeDouble(m_position.Volume()+iuv*cdist,2);
                     if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)>imv)
                        ev=NormalizeDouble(imv,2); 
                     rev=ev;                          
                     double sl=0.0;
                     double tp=0.0;
                     if(itp>0) tp=m_symbol.Ask()+etp;
                     if(isl>0) sl=m_symbol.Bid()-esl;
                     //m_trade.SetExpertMagicNumber(magic);
                     if(OpenBuy(m_trade,ev,sl,tp,numstr))
                     {
                        last_pt=POSITION_TYPE_BUY;
                        FileWrite(filehandle,numstr+", ",TimeCurrent(),", ",GetLastPositionsType(magic),", ",GetPositionTicket(magic,POSITION_TYPE_BUY)); 
                        Print("#517! Position BUY After down BUY "+numstr);                                 
                        //Sleep(3000);
                        continue;
                     }
                  }
               } 
            }
         }
}


void OpenNextSellPositionBySignal(CTrade &m_trade,long magic,double ExtDP,double iuv,double imv,int itp,int isl,double etp,double esl,double ev,double &rev,string numstr,ulong &last_pt)
{
   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name())
         {
            if(m_position.PositionType()==POSITION_TYPE_BUY  && m_position.Magic()==magic)
            {
               if((m_position.Profit()+m_position.Swap()+m_position.Commission())<0)
               {
                  if(IsSetSell(magic,ExtDP)==true)
                  {
                     double cdist=MathFloor(MathAbs((m_position.PriceCurrent()-m_position.PriceOpen())/ExtDP));
                     Print("#1124 cdist ", numstr," : ",cdist);
                     Print("#4211! m_position.PriceOpen(): ",m_position.PriceOpen());
                     Print("#4212! m_position.PriceCurrent(): ",m_position.PriceCurrent());
                     Print("#4213! ExtDP: ",ExtDP);
                     Print("#4214! magic: ",magic);
                     Print("#4215! ev: ",ev);
                     Print("#4216! iuv: ",iuv);
                     Print("#4217! m_position.Volume(): ",m_position.Volume());
                     Print("#4218! m_position.Magic(): ",m_position.Magic());
                   
                     if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)<=imv)
                        ev=NormalizeDouble(m_position.Volume()+iuv*cdist,2);
                     if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)>imv)
                        ev=NormalizeDouble(imv,2);
                     rev=ev;
                     double sl=0.0;
                     double tp=0.0;
                     if(itp>0) tp=m_symbol.Bid()-etp;
                     if(isl>0) sl=m_symbol.Ask()+esl;
                     //m_trade.SetExpertMagicNumber(magic);
                     if(OpenSell(m_trade,ev,sl,tp,numstr))
                     {
                        last_pt=POSITION_TYPE_SELL;
                        FileWrite(filehandle,numstr+", ",TimeCurrent(),", ",GetLastPositionsType(magic),", ",GetPositionTicket(magic,POSITION_TYPE_SELL)); 
                        Print("#518! Position SELL After down BUY "+numstr);                             
                        //Sleep(3000);
                        continue;
                      }
                   }
                }
             }
             if(m_position.PositionType()==POSITION_TYPE_SELL  && m_position.Magic()==magic)
             {
                if((m_position.Profit()+m_position.Swap()+m_position.Commission())<0)
                {
                   if(IsSetSell(magic,ExtDP)==true)
                   {
                      double cdist=MathFloor(MathAbs((m_position.PriceCurrent()-m_position.PriceOpen())/ExtDP));
                      Print("#1125 cdist ", numstr," : ",cdist);
                      Print("#5211! m_position.PriceOpen(): ",m_position.PriceOpen());
                      Print("#5212! m_position.PriceCurrent(): ",m_position.PriceCurrent());
                      Print("#5213! ExtDP: ",ExtDP);
                      Print("#5214! magic: ",magic);
                      Print("#5215! ev: ",ev);
                      Print("#5216! iuv: ",iuv);
                      Print("#5217! m_position.Volume(): ",m_position.Volume());
                      Print("#5218! m_position.Magic(): ",m_position.Magic());
                    
                      if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)<=imv)
                         ev=NormalizeDouble(m_position.Volume()+iuv*cdist,2);
                      if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)>imv)
                         ev=NormalizeDouble(imv,2); 
                      rev=ev;                             
                      double sl=0.0;
                      double tp=0.0;
                      if(itp>0) tp=m_symbol.Bid()-etp;
                      if(isl>0) sl=m_symbol.Ask()+esl;
                      //m_trade.SetExpertMagicNumber(magic);
                      if(OpenSell(m_trade,ev,sl,tp,numstr))
                      {
                        last_pt=POSITION_TYPE_SELL;
                        FileWrite(filehandle,numstr+", ",TimeCurrent(),", ",GetLastPositionsType(magic),", ",GetPositionTicket(magic,POSITION_TYPE_SELL)); 
                        Print("#519! Position SELL After down SELL "+numstr);                                 
                        //Sleep(3000);
                        continue;
                      }
                   }
                }
             }
          }
}



        журнал
Заранее спасибо за ответ.

 
  1. Кто такой "IsSetBuy" и что он делает с переданным magic?
  2. Почему нет распечатки сразу при входе в функцию значения переданного magic?
  3. Почему нет распечатки после строки "            if(m_position.PositionType()==POSITION_TYPE_SELL  && m_position.Magic()==magic)" значения m_position.Magic() и magic?
 
Vladimir Karputov:
Кто такой "IsSetBuy" и что он делает с переданным magic?

Функция проверки дистанции от последней позиции с нужным мне магиком...

По логике вещей до этой функции дойти дело не должно, так как магик позиции не равен магику, переданного в функцию.

Я за эту проверку говорю, где идет сравнение магиков. В это условие вообще зайти не должно, если они не равны, а заходит:

if(m_position.PositionType()==POSITION_TYPE_BUY  && m_position.Magic()==magic)
Как раз по вашему третьему вопросу распечатка есть. Там явно указано, где магик, переданный в функцию, а где магик позиции...
 
shev1404:

Функция проверки дистанции от последней позиции с нужным мне магиком...

По логике вещей до этой функции дойти дело не должно, так как магик позиции не равен магику, переданного в функцию.

Я за эту проверку говорю, где идет сравнение магиков. В это условие вообще зайти не должно, если они не равны, а заходит:

Как раз по вашему третьему вопросу распечатка есть. Там явно указано, где магик, переданный в функцию, а где магик позиции...

Выполните все три пункта - и нет так как это думаете Вы, а именно так как написал я.

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

Условие равенства верно при неравных значениях. Почему?

Vladimir Karputov, 2020.05.14 13:02

  1. Кто такой "IsSetBuy" и что он делает с переданным magic?
  2. Почему нет распечатки сразу при входе в функцию значения переданного magic?
  3. Почему нет распечатки после строки "            if(m_position.PositionType()==POSITION_TYPE_SELL  && m_position.Magic()==magic)" значения m_position.Magic() и magic?

 

Примерно так:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OpenNextBuyPositionBySignal(CTrade &m_trade,long magic,double ExtDP,double iuv,double imv,int itp,int isl,double etp,double esl,double ev,double &rev,string numstr,ulong &last_pt)
  {
   for(int i=PositionsTotal()-1; i>=0; i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name())
           {
            Print("#_2214! magic: ",magic);
            if(m_position.PositionType()==POSITION_TYPE_SELL  && m_position.Magic()==magic)
              {
               Print("#_2214! magic: ",magic);
               Print("#_2218! m_position.Magic(): ",m_position.Magic());
               if((m_position.Profit()+m_position.Swap()+m_position.Commission())<0)
                 {
                  if(IsSetBuy(magic,ExtDP)==true)
 
shev1404:

Советую не опираться на Position совсем.

 
Vladimir Karputov:

Примерно так:

Откровенно говоря, я немного в недоумении. При входе в функцию магик нужный мне. При входе в условие проверки магик, переданный в функцию, и магик позиции одинаковые. То есть все хорошо. Но уже после проверки дистанции магик позиции невероятным образом оказывается другим. Как? Ниже код функции, чтобы было видно, что здесь только возврат и нет никакой замены.   И скрин журнала, информация после выделенной строки.

bool IsSetBuy(long magic,double dist)
  {
//--- the "total-1" element is the last open position
   bool isbuy=true;
   int total=PositionsTotal();
   for(int i=total-1;i>=0;i--)
   {
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==magic)
         {
               if(m_position.PositionType()==POSITION_TYPE_BUY)
               {
                  if((m_position.PriceOpen()-m_position.PriceCurrent())<dist)
                  {
                     isbuy=false;
                     return isbuy;
                  }
                  if((m_position.PriceOpen()-m_position.PriceCurrent())>dist)
                  {
                     isbuy=true;
                  }
               }
         }
     }
//---
      return isbuy;
   }
 
Dmi3:

Советую не опираться на Position совсем.

А что брать за отправную точку?
 
shev1404:

Откровенно говоря, я немного в недоумении. При входе в функцию магик нужный мне. При входе в условие проверки магик, переданный в функцию, и магик позиции одинаковые. То есть все хорошо. Но уже после проверки дистанции магик позиции невероятным образом оказывается другим. Как? Ниже код функции, чтобы было видно, что здесь только возврат и нет никакой замены.   И скрин журнала, информация после выделенной строки.

1. Вставляйте код и лог-файл правильно (картинкой вставлять не нужно)

2. Вы сами уже ответили на свой вопрос (кстати я сразу Вам об этом намекал )

Вывод: смотрите, что и зачем Вы делаете в своей функции и зачем меняете magic.
MQL5.community - Памятка пользователя
MQL5.community - Памятка пользователя
  • www.mql5.com
Теперь вы можете не только читать статьи и скачивать программы на языке MQL5, но и участвовать в обсуждении интересующих вас тем на Форуме, оставлять комментарии к статьям и опубликованным кодам. Кроме того, вы можете не только выкладывать собственные разработки в Code Base, но и публиковать Статьи, за которые мы предлагаем вознаграждение...
 

Также нужно всё-таки определиться: ищите Вы SELL позицию или всё таки BUY?

void OpenNextBuyPositionBySignal(CTrade &m_trade,long magic,double ExtDP,double iuv,double imv,int itp,int isl,double etp,double esl,double ev,double &rev,string numstr,ulong &last_pt)
  {
   for(int i=PositionsTotal()-1; i>=0; i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name())
           {
            Print("#2214! magic: ",magic);
            if(m_position.PositionType()==POSITION_TYPE_SELL  && m_position.Magic()==magic)
              {
               Print("#2214! magic: ",magic);
               Print("#2218! m_position.Magic(): ",m_position.Magic());
               if((m_position.Profit()+m_position.Swap()+m_position.Commission())<0)
                 {
                  if(IsSetBuy(magic,ExtDP)==true)
                    {

Функция называется 'OpenNextBuyPositionBySignal', затем сначала ищите позицию 'POSITION_TYPE_SELL' и вдруг сразу в 'IsSetBuy' Вы ищите позицию BUY.

bool IsSetBuy(long magic,double dist)
  {
//--- the "total-1" element is the last open position
   bool isbuy=true;
   int total=PositionsTotal();
   for(int i=total-1;i>=0;i--)
   {
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==magic)
         {
               if(m_position.PositionType()==POSITION_TYPE_BUY)
               {
                  if((m_position.PriceOpen()-m_position.PriceCurrent())<dist)
                  {
                     isbuy=false;
                     return isbuy;
                  }
                  if((m_position.PriceOpen()-m_position.PriceCurrent())>dist)
                  {
                     isbuy=true;
                  }
               }
         }
     }
//---
      return isbuy;
   }


То есть что Вы делаете: Ваша ошибка в том, что Вы ПЕРЕЗАПИСЫВАЕТЕ переменную m_position!!!


Исправьте логику программы.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
 
Vladimir Karputov:

Также нужно всё-таки определиться: ищите Вы SELL позицию или всё таки BUY?

Функция называется 'OpenNextBuyPositionBySignal', затем сначала ищите позицию 'POSITION_TYPE_SELL' и вдруг сразу в 'IsSetBuy' Вы ищите позицию BUY.

Я на свой вопрос не ответил к сожалению...

Здесь всё верно. Магик не меняется в функции.И еще момент, магики у меня не позиции Buy и Sell разделяют, а стратегии...

Если обратиться к моему первоначальному посту, то там я указал две функции:

1. 'OpenNextBuyPositionBySignal' - открытие позиций Buy по сигналу и соответственно в ней будет проверка 'IsSetBuy'. Позиция Buy может открыться как после Buy, так и после Sell. 

2. 'OpenNextSellPositionBySignal' - открытие позиций Sell по сигналу и соответственно в ней будет проверка 'IsSetSell'. Позиция Sell может открыться как после Sell, так и после Buy. 


Каким образом я её ПЕРЕЗАПИСЫВАЮ? Я что-то вашу логику не улавливаю? Объясните? Я всего лишь в цикле к ней обращаюсь и получаю информацию. Основная проверка идет на соответствие магика, то есть позиции с другим магиком в переборе участвовать не должны. Так? Или я уже ничего не понимаю после вашего вывода.

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