MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 979

 
Rustam Bikbulatov :
안녕하세요, 조언이 필요합니다. 내 마지막 텍스트가 표시되지 않는 이유는 무엇입니까? 여기서 무슨 문제가 있습니까? 수정 방법을 알려주세요!

항상 하나의 개체 이름만 사용하는 경우 루프를 만드는 이유는 무엇입니까?

 for ( int no1= 0 ; no1< ObjectsTotal ( OBJ_TEXT ); no1++)
  {
   if ( ObjectName ( 0 ) == "Profit1" + iBarShift ( NULL , 1440 , 0 ))
     {
       double name;
      name = ObjectDescription ( 0 ) ;;
       Comment (name);
     }
  }
 

Iurii Tokman :

no1<= ObjectsTotal ( OBJ_TEXT );

따라서 그것은 확실히 불가능합니다. 배열의 한계를 넘어선 출력이 있을 것입니다. 10개의 개체가 있는 경우 마지막 개체의 인덱스는 9가 됩니다. 개수가 0부터 시작하기 때문입니다.

 
Artyom Trishkin :

항상 하나의 개체 이름만 사용하는 경우 루프를 만드는 이유는 무엇입니까?

이 개체의 끝에서 두 번째 텍스트를 정확히 결정하는 방법을 알려주실 수 있습니까?

 
Rustam Bikbulatov :

이 개체의 끝에서 두 번째 텍스트를 정확히 결정하는 방법을 알려주실 수 있습니까?

당신이 원하는 것을 이해하기 어렵습니다.

 
void Profit()
  {
   ObjectCreate ( "Profit" + iBarShift ( NULL , 1440 , 0 ), OBJ_TEXT , 1 , TimeCurrent (), 0.6 );
   ObjectSetText( "Profit" + iBarShift ( NULL , 1440 , 0 ),DoubleToStr(AccountProfit(), 2 ), 11 , "Arial" , clrWhite );
   ObjectSetInteger ( 0 , "Profit" + iBarShift ( NULL , 1440 , 0 ), OBJPROP_ANCHOR , ANCHOR_RIGHT_LOWER );
   return ;
  }
void Profit1()
  {
   double   Prof = ObjectDescription( "Profit1" + iBarShift ( NULL , 1440 , 0 ));
   double   P = -Prof;
   ObjectCreate ( "Profit1" + iBarShift ( NULL , 1440 , 0 ), OBJ_TEXT , 1 , TimeCurrent (), 0.1 );
   ObjectSetText( "Profit1" + iBarShift ( NULL , 1440 , 0 ),DoubleToStr( MathMax (-AccountProfit(),-P), 1 ), 11 , "Arial" , clrWhite );
   ObjectSetInteger ( 0 , "Profit1" + iBarShift ( NULL , 1440 , 0 ), OBJPROP_ANCHOR , ANCHOR_RIGHT_LOWER );
   return ;
  }
void Profit2()
  {
   ObjectCreate ( "Profit2" + iBarShift ( NULL , 1440 , 0 ), OBJ_TEXT , 1 , TimeCurrent (),- 0.4 );
   ObjectSetText( "Profit2" + iBarShift ( NULL , 1440 , 0 ), iBarShift ( NULL , 1440 , 0 )- 1000 , 11 , "Arial" , clrWhite );
   ObjectSetInteger ( 0 , "Profit2" + iBarShift ( NULL , 1440 , 0 ), OBJPROP_ANCHOR , ANCHOR_RIGHT_LOWER );
   return ;
  }
void Profit3()
  {
   for ( int no1= 0 ; no1<= ObjectsTotal ( OBJ_TEXT ); no1++)
     {
       if ( ObjectFind ( 1 , "Profit2" + iBarShift ( NULL , 1440 , 0 ))!= 0 )
        {

         string    obj_name;
         obj_name = ObjectName ( 3 );
         string    name;
         name = ObjectDescription(obj_name);
         Comment (obj_name);
        }
     }

   ObjectCreate ( "Profit3" + iBarShift ( NULL , 1440 , 0 ), OBJ_TEXT , 1 , TimeCurrent (),- 0.9 );
   ObjectSetText( "Profit3" + iBarShift ( NULL , 1440 , 0 ),DoubleToStr(name, 1 ), 11 , "Arial" , clrWhite );
   ObjectSetInteger ( 0 , "Profit3" + iBarShift ( NULL , 1440 , 0 ), OBJPROP_ANCHOR , ANCHOR_RIGHT_LOWER );
   return ;
  }

Provit - 하루 동안 테스트 중 총 이익을 보여줍니다.

Provit1 - 하루 최대 드로다운을 남겨둡니다.

Provit2 - 하나에서 시작하는 일반적인 디지털 시리즈.

프로빗3 - 골! Provit1을 합산하고 Provit2로 나눕니다. 전체 테스트 시간에 대한 일일 평균 감소량을 알고 싶습니다. Provit3에 대한 도움말

 

동료 - 종료 오류는 무엇이고 이를 처리하는 방법은 무엇입니까? 이익이 초과되면 아래 코드가 있습니다. 모든 단방향 포즈를 닫습니다. 고맙습니다.

        
             
 // ЗАКРЫВАЕМ ВИРТУАЛЬНЫЕ ТР БАЙ позы            
     if (takeprofit < ProfitB)    
      {   
         Print ( " ЗАКРЫТИЕ BUY POSITIONS. общий ProfitB = " , ProfitB, " мин общий takeprofit buys positions = " , takeprofit);   
         for (i= OrdersTotal ()- 1 ; i>= 0 ; i--)         
           if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
           if (OrderSymbol()== Symbol () &&  Magic_Прямой==OrderMagicNumber()) 
            {             
             if (OrderType()==OP_BUY)    
                             //if(OrderOpenPrice()+takeprofit*Point<=MarketInfo(Symbol(),MODE_BID) || 
                             //   OrderOpenPrice()-stoploss*Point>=MarketInfo(Symbol(),MODE_BID))   
                     
               if (OrderClose(OrderTicket(),OrderLots(),MarketInfo( Symbol (),MODE_BID), NormalizeDouble (MarketInfo( Symbol (), MODE_SPREAD )* 2 , Digits ()), clrGray ))  
                   Print ( " закрытие бай, тикет = " , OrderTicket());
               else    Print ( " ошибка закрытия бай, Error = " , GetLastError ());          
            }
       }     
      
       if (takeprofit < ProfitS)     
        { 
         Print ( " ЗАКРЫТИЕ СЕЛЛов. общий ProfitS = " , ProfitS, " мин общий takeprofit СЕЛЛов = " , takeprofit);   
 
         for (i= OrdersTotal ()- 1 ; i>= 0 ; i--)      
           if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
           if (OrderSymbol()== Symbol () &&  Magic_Прямой==OrderMagicNumber()) 
            {                       
             if (OrderType()==OP_SELL)    
                             //  if(OrderOpenPrice()-takeprofit*Point>=MarketInfo(Symbol(),MODE_ASK) ||
                             //     OrderOpenPrice()+stoploss  *Point<=MarketInfo(Symbol(),MODE_ASK))                
             
               if (OrderClose(OrderTicket(),OrderLots(),MarketInfo( Symbol (),MODE_ASK), NormalizeDouble (MarketInfo( Symbol (), MODE_SPREAD )* 2 , Digits ()), clrGray )) 
                   Print ( " закрытие SELL,  тикет = " , OrderTicket());
               else    Print ( " ошибка закрытия sell, Error = " , GetLastError ());     
            }       
         }    
           
 
Roman Shiredchenko :

동료 - 종료 오류는 무엇이고 이를 처리하는 방법은 무엇입니까? 이익이 초과되면 아래 코드가 있습니다. 모든 단방향 포즈를 닫습니다. 고맙습니다.

무슨 오류? 화면이 같지 않다

이론적으로는 작동해야 하지만 스프레드를 고려하고 미끄러짐으로 망쳐버리는 그런 정교한 마감을 본 적이 없습니다. 닫기 오류가 더 중요하고 다시 인용하면 연결이 일반적으로 사라집니다.


대신에 OrderClose(....) 및 Kim의 ClosePosBySelect()를 제거하십시오. https://www.mql5.com/ru/forum/131859/page2#comment_3359664

그것을 사용하면 작동하지 않는 곳이 분명해질 것입니다. 닫기 조건이나 서버에서 어떤 재미가 있는지

 
Igor Makanu :

무슨 오류? 화면이 같지 않다

이론적으로는 작동해야 하지만 스프레드를 고려하고 미끄러짐으로 망치는 그런 정교한 마감은 본 적이 없습니다. 닫기 오류가 더 중요하고 다시 인용하면 연결이 일반적으로 사라집니다.


OrderClose(....)를 제거하고 대신 Kim의 ClosePosBySelect()에 티켓을 전달하면 닫히는 조건이나 재미있는 서버에서 작동하지 않는 위치가 분명해질 것입니다.

거기에서 제로 가격으로 마감됩니다. 따라서 MarketInfo 함수가 반환하는 내용을 제어해야 하지만 제어할 수 없습니다. 그러나 평소와 같이 4에서 어떤 사람들은 쓰기에 익숙합니다. 그들은 무언가를 얻었지만 확인하지 않았지만 인수로 보냈습니다.

 
Artyom Trishkin :

거기에서 제로 가격으로 마감됩니다. 따라서 MarketInfo 함수가 반환하는 내용을 제어해야 하지만 제어할 수 없습니다. 그러나 평소와 같이 4에서 어떤 사람들은 쓰기에 익숙합니다. 그들은 무언가를 얻었지만 확인하지 않았지만 인수로 보냈습니다.

나는 그가 모든 것을 스스로 인쇄할 수 있을지 의심 스럽기 때문에 ClosePosBySelect()를 사용하여 OrderSelect() 를 통해 선택한 주문의 확인된 마감을 사용하도록 제안했습니다. 그는 이것을 할 수 있습니다. 적어도 그는 다음으로 코드를 수집하는 방법을 보았습니다. 생성자)))

추신: 하나의 주문을 두 번 닫는다는 의혹은 여전히 있지만 Kimovskaya 기능은 저널에 지문을 기록합니다 . 아니요, 두 번째 조건에 따라 별도의 마감 주기가 있는 것 같습니다.

 
Igor Makanu :

나는 그가 모든 것을 스스로 인쇄할 수 있을지 의심스럽기 때문에 OrderSelect()를 통해 선택한 주문의 확인된 마감을 사용하도록 제안했습니다.

예, Igor의 기능이 사용자 자신을 위해 모든 것을 할 것이라는 것은 분명합니다(그리고 일부는 사용자를 엉망으로 만들기도 합니다). 그러나 그 자신은 아무것도하는 법을 배우지 않을 것입니다. 물론 그들의 선택이지만.

사유: