[ARCHIVE!] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 4. - 페이지 412

 

MQL 튜토리얼 에서 표준 함수 장의 차트 작업 섹션에서 WindowHandle 함수는 " ... 지정된 차트를 포함하는 시스템 창 핸들을 반환합니다 ."라는 설명과 함께 제공됩니다.

질문 : "창 시스템 핸들"은 무엇을 의미하며 무엇을 위한 것입니까?

피. _ 에스 _ 포럼을 어지럽히지 않기 위해 답변에 미리 감사드립니다.

 
7777877 :

MQL 튜토리얼 에서 표준 함수 장의 차트 작업 섹션에서 WindowHandle 함수는 " ... 지정된 차트를 포함하는 시스템 창 핸들을 반환합니다 ."라는 설명과 함께 제공됩니다.

질문 : "창 시스템 핸들"은 무엇을 의미하며 무엇을 위한 것입니까?

피. _ 에스 _ 포럼을 어지럽히지 않기 위해 답변에 미리 감사드립니다.


답변:

창 핸들은 숫자입니다

창 핸들은 창에 대한 후속 작업에 필요합니다.

 
int start()
{
   for ( int i= OrdersHistoryTotal ()- 1 ;i>= 0 ; i--)
  {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY))
    {
       if ( TimeDay ( OrderOpenTime ())==Day()
        && TimeMonth ( OrderOpenTime ())== Month ()
        && TimeYear ( OrderOpenTime ())== Year ())
         if ( OrderType ()==OP_SELL && OrdersTotal ()== 0 || OrdersHistoryTotal ()== 0 )
         {
             OrderSend ( Symbol (), OP_BUY, 0.1 , Ask, 5 ,Bid- 25 * Point ,Bid+ 25 * Point , "" , 0 , 0 , Blue );
         }
         if ( OrderType ()==OP_BUY && OrdersTotal ()== 0 || OrdersHistoryTotal ()== 0 )
         {
             OrderSend ( Symbol (), OP_SELL, 0.1 , Bid, 5 ,Ask- 25 * Point ,Ask+ 25 * Point , "" , 0 , 0 , Red );
         }
    }
  }
   return ( 0 );
}

안녕하세요! 코드 문제! 순서대로 판매, 베이, 판매 등을 열려면 주문이 필요합니다. 그러나 계산은 전날의 주문 순서를 고려하지 않고 새로운 방식으로 다음날 하루 동안 수행됩니다! 그것은 새로운 날 새로운 사이클입니다! 위의 코드는 다음과 같아야 한다고 생각합니다! 지금은 고문이 단일 주문을 열지 않습니다! 무슨일인지 이해가 안되네요... 아시는분 알려주세요!!

 
제대로 하는 방법을 알려주세요.
 새 날이 오면 보류 중인 주문을 닫고 싶습니다. 실행되지 않으면 ... 썼지만 뭔가 잘 되지 않습니다. 오류 4051 
   if ( iTime ( Symbol (), PERIOD_D1 , 0 ) != New_Day_DateTime)
   {
         New_Day_DateTime = iTime ( Symbol (), PERIOD_D1 , 0 ); 
         GlobalVariableSet ( "gNew_Day_DateTime" ,New_Day_DateTime); 
  
for ( i= 1 ;i<= OrdersTotal (); i++)         
     {
       if ( OrderSelect (i- 1 ,SELECT_BY_POS)==true) 
        {                                      

         if ( OrderSymbol ()!= Symb) continue ;    
          Tip= OrderType ();                   
         if (Tip== 0 ) continue ;           

            Limit_Stop=Tip;
             if ( OrderMagicNumber ()== 3 )                     
            {Ticket_B= OrderTicket ();}
        }                                    
     }                                       

   while (true)                                
     {
       if (Limit_Stop==- 1 )                      
        {
         break ;                                      
        }
       Ans_B= OrderDelete (Ticket_B);             

       if (Ans_B==true)                          
        {
         break ;                                 
     }   }
        
for ( i= 1 ; i<= OrdersTotal (); i++)         
     {        
     if ( OrderSelect (i- 1 ,SELECT_BY_POS)==true) 
        {                                      

         if ( OrderSymbol ()!= Symb) continue ;    
          Tip= OrderType ();                   
         if (Tip== 1 ) continue ;                 

       if ( OrderMagicNumber ()== 4 ) 
      {Ticket_S= OrderTicket ();}              
     }
     }
   while (true)                                
     {
       if (Limit_Stop==- 1 )                      
        {
         break ;                                      
        }
        Ans_S= OrderDelete (Ticket_S);            

       if (Ans_S==true) 
        {
         break ; 
        }
}
 
Egori4 :


따라서 보류 중인 주문을 열 때 보류 중인 주문 의 만료 시간을 23:59로 설정하면 자동으로 닫힙니다.

nt OrderSend( 문자열 기호, int cmd, 이중 볼륨, 이중 가격, int 슬리피지, 이중 손절매, 이중 이익 실현, string comment=NULL, int magic=0, datetime 만료=0 , color arrow_color=CLR_NONE)

 
lowech :

안녕하세요! 코드 문제! 순서대로 판매, 베이, 판매 등을 열려면 주문이 필요합니다. 그러나 계산은 전날의 주문 순서를 고려하지 않고 새로운 방식으로 다음날 하루 동안 수행됩니다! 그것은 새로운 날 새로운 사이클입니다! 위의 코드는 다음과 같아야 한다고 생각합니다! 지금은 고문이 단일 주문을 열지 않습니다! 무슨일인지 이해가 안되네요... 아시는분 알려주세요!!


그리고 특히 기록이 비어 있는 경우 그가 주문을 열어야 하는 이유는 무엇입니까? 그리고 인간적으로 코드를 삽입하는 방법을 배우십시오. 저는 다른 사람의 게시물을 편집하는 것을 좋아하지 않습니다.
 
Sepulca :
감사합니다! 노력할게...
 

이 Expert Advisor를 추가하는 방법

//+----------------------------------------------- --------------------+

//| CCI.mq4 |

//| Copyright 2012, MetaQuotes Software Corp. |

//| http://www.metaquotes.net |

//+----------------------------------------------- --------------------+

#property copyright "Copyright 2012, MetaQuotes Software Corp."

#속성 링크 "http://www.metaquotes.net"



외부 이중 LotTrend = 0.1;

외부 정수 TP=100;

외부 int SL=250;


//+----------------------------------------------- --------------------+

//| 전문가 초기화 기능 |

//+----------------------------------------------- --------------------+

정수 초기화()

{

//----

//----

리턴(0);

}

//+----------------------------------------------- --------------------+

//| 전문가 초기화 해제 기능 |

//+----------------------------------------------- --------------------+

정수 초기화()

{

//----

//----

리턴(0);

}

//+----------------------------------------------- --------------------+

//| 전문가 시작 기능 |

//+----------------------------------------------- --------------------+

정수 시작()

{

if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)

{

if (입찰가>iMA(Symbol(),PERIOD_M15,100,0,1,4,0)

)

{

OrderSend(Symbol(),OP_BUY,LotTrend,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Green);

}

if (입찰가<iMA(Symbol(),PERIOD_M15,100,0,1,4,0)

)

{

OrderSend(Symbol(),OP_SELL,LotTrend,Bid,0,Bid+SL*Point,Bid-TP*Point,0,0,0,Green);

}

}



//----

리턴(0);

}

//+----------------------------------------------- --------------------+

1. 양초 종가에서만 거래를 개시(가격이 SMA를 넘을 때)

 

안녕하세요! MQL4의 지표에 대한 한 가지 질문에 대해 우려하고 있으며 완전히 이해할 수 없습니다. 예를 들어 간단한 프랙탈 지표가 있습니다.

 //+===========================================================================+ 
//|                                                                  FRAC.mq4 | 
//+===========================================================================+ 
// Параметры: 
// 
// По умолчанию frac_5 - оранжевый, frac_3 - темно-синий. 
//----- 
// History    - определяет на сколько глубоко в историю вам нужно отображение  
//              индикатора (в количестве свечей). Минимальное значение = 2. 
//-----  
// frac_3     - если значение "on", то frac_3 отображается, иначе нет. 
//-----  
// frac_5     - если значение "on", то frac_5 отображается, иначе нет. 
//+===========================================================================+ 
#property indicator_chart_window 
#property indicator_buffers             4      
#property indicator_color1  MidnightBlue 
#property indicator_color2  MidnightBlue  
#property indicator_color3        Orange 
#property indicator_color4        Orange 
//-----         
extern int          history     =     500 ; 
extern string        frac_3     =     "on" ;   
extern string        frac_5     =     "on" ;
extern int           metka      =       20 ;
//-----         
double FRAC_3_POS[]; 
double FRAC_3_NEG[]; 
double FRAC_5_POS[]; 
double FRAC_5_NEG[]; 

//+===========================================================================+ 

int init() 
   { 
     SetIndexBuffer ( 0 , FRAC_3_POS);  
              
     SetIndexStyle   ( 0 , DRAW_ARROW , 0 , 3 ); 
      
     SetIndexArrow   ( 0 , 217 ); 
   //-----         
     SetIndexBuffer ( 1 , FRAC_3_NEG);    
            
     SetIndexStyle   ( 1 , DRAW_ARROW , 0 , 3 ); 
      
     SetIndexArrow   ( 1 , 218 ); 
   //-----         
     SetIndexBuffer ( 2 , FRAC_5_POS);      
          
     SetIndexStyle   ( 2 , DRAW_ARROW , 0 , 3 ); 
      
     SetIndexArrow   ( 2 , 217 ); 
   //-----         
     SetIndexBuffer ( 3 , FRAC_5_NEG);        
        
     SetIndexStyle   ( 3 , DRAW_ARROW , 0 , 3 ); 
      
     SetIndexArrow   ( 3 , 218 ); 
      
     return ( 0 ); 
   } 

//+===========================================================================+ 

int start() 
   { 
     int i,Counted_bars; 
     
    Counted_bars = IndicatorCounted (); 
     
     i = Bars - Counted_bars - 1 ; 
     
     if (history < 2 ) 
      
         history = 2 ; 
                   
     if (i > history - 1 ) 
      
         i = history - 1 ;
         //i=Bars -  1;
     //----- 
     if ( Digits <= 3 ) 
       
         double K = 0.01 ; 
       
     else        K = 0.0001 ;     
              
     while (i >= 0 ) 
          { 
           double FR_3P= 0 , FR_3N= 0 , 
                  FR_5P= 0 , FR_5N= 0 ; 
           //-----         
           if (High[i+ 1 ] >= High[i+ 2 ] && High[i+ 1 ] >= High[i]) 
            
               FR_3P = High[i+ 1 ] + metka*K; 
           //-----         
           if (Low[i+ 1 ] <= Low[i+ 2 ] && Low[i+ 1 ] <= Low[i]) 
            
               FR_3N = Low[i+ 1 ] - metka*K; 
           //-----         
           if (High[i+ 2 ] >= High[i+ 4 ] && High[i+ 2 ] >= High[i+ 3 ] && High[i+ 2 ] >= High[i+ 1 ] && High[i+ 2 ] >= High[i]) 
            
               FR_5P = High[i+ 2 ] + metka*K; 
           //-----         
           if (Low[i+ 2 ] <= Low[i+ 4 ] && Low[i+ 2 ] <= Low[i+ 3 ] && Low[i+ 2 ] <= Low[i+ 1 ] && Low[i+ 2 ] <= Low[i]) 
            
               FR_5N = Low[i+ 2 ] - metka*K; 
           //-----  
           if (frac_3 != "on" ) 
              { 
               FR_3P = EMPTY; 
                 
               FR_3N = EMPTY; 
              }  
           //-----  
           if (frac_5 != "on" ) 
              { 
               FR_5P = EMPTY; 
                 
               FR_5N = EMPTY; 
              }       
           //-----  
            
               FRAC_3_POS[i+ 1 ] = FR_3P; 
                
               FRAC_3_NEG[i+ 1 ] = FR_3N; 
                
               FRAC_5_POS[i+ 2 ] = FR_5P; 
                
               FRAC_5_NEG[i+ 2 ] = FR_5N; 
               
               i--; 
          } 
       return ( 0 ); 
   } 
//+===========================================================================+ 

이 형식으로 컴파일하면 차트의 왼쪽 테두리를 확장하고 기록을 로드할 때 실패하기 시작하고 표시되지 않아야 하는 위치에 표시가 표시됩니다(첨부 파일의 스크린샷 참조). 코드의 일부를 주석 처리하는 경우:

 if (history < 2 ) 
      
         history = 2 ; 
                   
     if (i > history - 1 ) 
      
         i = history - 1 ;

그런 다음 그러한 결함이 사라집니다... 표시기 배열의 "비어 있지 않은" 요소만 채워지고 표시기 값이 레이블이 없는 곳에서 0으로 설정되지 않은 경우 기록이 로드될 때 동일한 결함이 나타납니다...

왜 이런 일이 발생합니까? 기록을 로드할 때 전체 지표를 다시 계산해야 하는 이유는 무엇입니까? 그리고 "빈"요소 ind의 값을 무효화해야 하는 이유. 정렬?

막대가 왼쪽에서 오른쪽으로 인덱싱된 경우 히스토리를 로드할 때 막대 인덱스가 변경되고 재계산 없이 표시기가 잘못 표시되면 이러한 글리치는 이해할 수 있을 것입니다... 그러나 MT4에서는 막대가 인덱싱됩니다. 오른쪽에서 왼쪽으로, 이는 기록을 로드할 때 해당 막대의 인덱스가 동일하게 유지되어야 함을 의미합니다(및 표시기 값도 마찬가지). 그렇다면 표시기를 다시 계산하는 이유는 무엇이며 이러한 레이블 이동은 어디에서 오는 것입니까?

 

동료 여러분, 다음 질문에 대한 답을 알려 주십시오.
내 손으로 4개의 구매 주문을 열고, 설정된 주문을 입찰 가격으로 삭제하는 어드바이저를 시작하고, 슬리피지가 100포인트로 설정되고, 주기에서 삭제, 흐름 확인이 바쁘고 견적 업데이트가 존재하는지 확인합니다. 전체 주기에서 주문이 삭제되지 않는 이유는 무엇입니까? 로그는 삭제가 start() 함수의 여러 초기화를 필요로 함을 보여줍니다.
고문 코드

 int start()  
  {
   Print ( "Пришёл новый тик" );
   int total= OrdersTotal ();
   Print ( "Всего ордеров = " +total);
   for ( int i= 0 ;i<total;i++)
       if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
         {
         //Print("Всего ордеров = "+OrdersTotal());
         Print ( "удаляем ордер = " +i+ " тикет ордера = " + OrderTicket ());
         while ( IsTradeContextBusy ())
            {
             Print ( "Торговый поток занят" );
             Sleep ( 100 );
            }
         RefreshRates ();       
         OrderClose ( OrderTicket (), OrderLots (),Bid, 100 , 0 );
         Print ( "ошибка=" + GetLastError ());
         }  
   return ( 0 );
  }
       

어드바이저 로그는 다음과 같습니다.

17:16:59 임시 EURUSD,M1: 성공적으로 로드됨
17:17:51 temp EURUSD,M1: 새 틱이 도착했습니다.
17:17:51 임시 EURUSD,M1: 총 주문 수 = 4
17:17:51 임시 EURUSD,M1: 주문 삭제 = 0 주문 티켓 = 2808657
17:17:52 임시 EURUSD,M1: #2808657 닫기 #2808657 1.28969에 1.28973에 1.00 EURUSD 매수
17:17:52 임시 EURUSD,M1: 오류=0
17:17:52 임시 EURUSD,M1: 주문 삭제 = 1 주문 티켓 = 2808659
17:17:52 임시 EURUSD,M1: #2808659 닫기 #2808659 1.28974에 1.28975에 1.00 EURUSD 매수
17:17:52 임시 EURUSD,M1: 오류=0
17:17:54 temp EURUSD,M1: 새 틱이 도착했습니다.
17:17:54 임시 EURUSD,M1: 총 주문 수 = 2
17:17:54 임시 EURUSD,M1: 주문 삭제 = 0 주문 티켓 = 2808658
17:17:54 임시 EURUSD,M1: #2808658 닫기 #2808658 1.28969에 1.28976에 1.00 EURUSD 매수
17:17:54 임시 EURUSD,M1: 오류=0
17:17:56 temp EURUSD,M1: 새 틱이 도착했습니다.
17:17:56 임시 EURUSD,M1: 총 주문 수 = 1
17:17:56 임시 EURUSD,M1: 주문 삭제 = 0 주문 티켓 = 2808660
17:17:56 임시 EURUSD,M1: #2808660 닫기 #2808660 1.28976에 1.28977에 1.00 EURUSD 매수
17:17:56 임시 EURUSD,M1: 오류=0

사유: