Найди ошибку

 

Предлагаю сюда постить куски кода с логическими ошибками.

Бывает ошибку сложно отловить по разным причинам.

как на пример вот в этом куске кода. Не сразу понял почему скрипт виснет. )

double WHistory()

{

//--- request trade history 

   HistorySelect(0,TimeCurrent()); 

//--- create objects 

   string   name; 

   uint     total=HistoryDealsTotal(); 

   ulong    ticket=0; 

   double   price; 

   double   profit; 

   datetime time; 

   string   symbol; 

   long     type; 

   long     entry; 

//--- for all deals 

   double Profit_PP=0;

   Print(total);

   for(uint i=total-1;i>=0;i--) 

     { 

        { 

         ticket=HistoryDealGetTicket(i);

         price =HistoryDealGetDouble(ticket,DEAL_PRICE); 

         time  =(datetime)HistoryDealGetInteger(ticket,DEAL_TIME); 

         symbol=HistoryDealGetString(ticket,DEAL_SYMBOL); 

         type  =HistoryDealGetInteger(ticket,DEAL_TYPE); 

         entry =HistoryDealGetInteger(ticket,DEAL_ENTRY); 

         profit=HistoryDealGetDouble(ticket,DEAL_PROFIT); 

         //--- only for current symbol 

         if(price && time && symbol==Symbol()) 

           { 

            //--- create price object 

            name="TradeHistory_Deal_"+string(ticket); 

            if(entry) 

            {

               //ObjectCreate(0,name,OBJ_ARROW_RIGHT_PRICE,0,time,price,0,0); 

               //получить id позиции

               long id=HistoryDealGetInteger(ticket,DEAL_POSITION_ID);

               for(uint k=i-1;k>=0;k--)

               {

                  ticket=HistoryDealGetTicket(k);

                  entry =HistoryDealGetInteger(ticket,DEAL_ENTRY); 

                  if(id ==HistoryDealGetInteger(ticket,DEAL_POSITION_ID)&&entry==0)

                  {

                     type  =HistoryDealGetInteger(ticket,DEAL_TYPE); 

                     if(type==DEAL_TYPE_BUY)

                     {

                        Profit_PP=Profit_PP+(price-HistoryDealGetDouble(ticket,DEAL_PRICE));

                        break;

                     }

                     else

                     {

                        Profit_PP=Profit_PP+(HistoryDealGetDouble(ticket,DEAL_PRICE)-price); 

                        break;

                     }

                  }

               }

               //найти закрывающую сделку с таким же id

            }

            /*else

                  ObjectCreate(0,name,OBJ_ARROW_LEFT_PRICE,0,time,price,0,0); 

            //--- set object properties 

            ObjectSetInteger(0,name,OBJPROP_SELECTABLE,0); 

            ObjectSetInteger(0,name,OBJPROP_BACK,0); 

            ObjectSetInteger(0,name,OBJPROP_COLOR,type?BuyColor:SellColor); 

            if(profit!=0) ObjectSetString(0,name,OBJPROP_TEXT,"Profit: "+string(profit)); */

           } 

        } 

     } 

     return(Profit_PP);

}


 

Предлагаю сразу постить в "правильном виде" 

double WHistory()

{

//--- request trade history 

   HistorySelect(0,TimeCurrent()); 

//--- create objects 

   string   name; 

   uint     total=HistoryDealsTotal(); 

   ulong    ticket=0; 

   double   price; 

   double   profit; 

   datetime time; 

   string   symbol; 

   long     type; 

   long     entry; 

//--- for all deals 

   double Profit_PP=0;

   Print(total);

   for(uint i=total-1;i>=0;i--) 

     { 

        { 

         ticket=HistoryDealGetTicket(i);

         price =HistoryDealGetDouble(ticket,DEAL_PRICE); 

         time  =(datetime)HistoryDealGetInteger(ticket,DEAL_TIME); 

         symbol=HistoryDealGetString(ticket,DEAL_SYMBOL); 

         type  =HistoryDealGetInteger(ticket,DEAL_TYPE); 

         entry =HistoryDealGetInteger(ticket,DEAL_ENTRY); 

         profit=HistoryDealGetDouble(ticket,DEAL_PROFIT); 

         //--- only for current symbol 

         if(price && time && symbol==Symbol()) 

           { 

            //--- create price object 

            name="TradeHistory_Deal_"+string(ticket); 

            if(entry) 

            {

               //ObjectCreate(0,name,OBJ_ARROW_RIGHT_PRICE,0,time,price,0,0); 

               //получить id позиции

               long id=HistoryDealGetInteger(ticket,DEAL_POSITION_ID);

               for(uint k=i-1;k>=0;k--)

               {

                  ticket=HistoryDealGetTicket(k);

                  entry =HistoryDealGetInteger(ticket,DEAL_ENTRY); 

                  if(id ==HistoryDealGetInteger(ticket,DEAL_POSITION_ID)&&entry==0)

                  {

                     type  =HistoryDealGetInteger(ticket,DEAL_TYPE); 

                     if(type==DEAL_TYPE_BUY)

                     {

                        Profit_PP=Profit_PP+(price-HistoryDealGetDouble(ticket,DEAL_PRICE));

                        break;

                     }

                     else

                     {

                        Profit_PP=Profit_PP+(HistoryDealGetDouble(ticket,DEAL_PRICE)-price); 

                        break;

                     }

                  }

               }

               //найти закрывающую сделку с таким же id

            }

            /*else

                  ObjectCreate(0,name,OBJ_ARROW_LEFT_PRICE,0,time,price,0,0); 

            //--- set object properties 

            ObjectSetInteger(0,name,OBJPROP_SELECTABLE,0); 

            ObjectSetInteger(0,name,OBJPROP_BACK,0); 

            ObjectSetInteger(0,name,OBJPROP_COLOR,type?BuyColor:SellColor); 

            if(profit!=0) ObjectSetString(0,name,OBJPROP_TEXT,"Profit: "+string(profit)); */

           } 

        } 

     } 

     return(Profit_PP);

}
 
Vladislav Andruschenko #:

Предлагаю сразу постить в "правильном виде" 

да, в курсе. нажимал кнопку КОД

но что-то вставилось как вставилось

 
Ошибка.
for(uint k=i-1;k>=0;k--)
 
fxsaber #:
Ошибка.

да, верно. после распринтовки понял где неправ

код брал из документации и переделал под себя, но не сменил тип.

но зависание было на первом цикле

 
Alexandr Bryzgalov #:


код брал из документации и переделал под себя, но не сменил тип.


Копипаст - зло!

 
for(uint i=total-1;i>=0;i--)

Это каноны C/C++ как нельзя делать)

if(price && time && symbol==Symbol()) 

зачем каждый раз получать текущий символ?

if(type==DEAL_TYPE_BUY)
{
  Profit_PP=Profit_PP+(price-HistoryDealGetDouble(ticket,DEAL_PRICE));
  break;
}
else
{
  Profit_PP=Profit_PP+(HistoryDealGetDouble(ticket,DEAL_PRICE)-price); 
  break;
}

почему бы break не вынести вниз?


PS. Вы еще можете ускорить цикл, если вынесете получение этих вещей внутри if:

 type  =HistoryDealGetInteger(ticket,DEAL_TYPE); 

 entry =HistoryDealGetInteger(ticket,DEAL_ENTRY); 

 profit=HistoryDealGetDouble(ticket,DEAL_PROFIT); 
        
 
Vladislav Andruschenko #:

Предлагаю сразу постить в "правильном виде" 

Это вы показали как делать НЕ надо, потому и написано в кавычках? Если уж учите других, то потрудились-бы удалить пустые строки. Ведь невозможно читать…

 
Alexey Viktorov #:

Это вы показали как делать НЕ надо, потому и написано в кавычках? Если уж учите других, то потрудились-бы удалить пустые строки. Ведь невозможно читать…

это у него от меня осталось. оказывается в панельке две кнопки "КОД"

я вставлял через правую