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

 
안녕하세요 친애하는 프로그래머!

다음과 같은 분석이 필요했습니다. 프로그램은 제공된 매개변수를 분석하고 결과를 날짜 세트가 있는 테이블 형태로 별도의 창에 표시해야 합니다. 저것들. 프로그램은 이력을 분석하고 필요한 날짜를 발행해야 합니다.

MQL4에서 이것이 가능한가요, 아니면 다른 언어로 작성된 프로그램을 사용하여 히스토리를 내보내고 데이터를 분석하는 것이 더 나은가요?

미리 감사드립니다!
 
GygaByte :


정확하지만 실습에서 알 수 있듯이 항상 그런 것은 아닙니다.

소수점 다섯 번째 자리 = 5(1.хххх5)이면 값이 여전히 왜곡됩니다.

질문은 여전히 관련이 있습니다 ...

추신 일반적으로 MagicNumber에 가격 값을 할당해야 하고... MagicNumber 유형이 int이므로 다음과 같이 변환하려고 합니다.

다른 사람이 조언할 수 있습니까?

고맙습니다.

다른 반올림으로 출력하므로 전체 숫자가 표시되지 않으며 무언가가 왜곡되어 있다고 생각합니다. 기본적으로 실수를 표시할 때 출력 숫자 는 소수점 이하 네 번째 자리에서 반올림됩니다. 소수점 이하 5자리에서 출력을 명시적으로 반올림해야 합니다.

 Alert ( "bid= " ,bid, " bid_minus= " ,DoubleToStr(bid_minus,Digits), " bid_plus= " ,DoubleToStr(bid_plus,Digits), " Bid = " ,DoubleToStr(Bid,Digits));

DoubleToStr()이 없고 DoubleToStr()이 있는 입찰 출력을 보십시오.

 
hoz :

Artyom과 Boris, 제 질문을 "씹어주셔서" 감사합니다. 이번에도 그랬듯이 아주 간단한 일에도 실수할 수 있는 시기가 있어요..

Shchas 새로운 질문이 있었습니다.

여기에 함수를 추가했습니다. 미결 주문 수 t 를 계산하는 함수에 추가하고, 주어진 이익에서 주어진 유형의 주문을 검색하고 그 이익을 주어진 값(현재 0) 과 비교하는 함수를 추가했습니다. 또한, 미결 주문이 없으면 FindOrders() 함수의 매개변수를 통해 True 값을 갖는 플래그 2개를 반환하므로 주문을 보낼 수 있으며, 주문이 있으면 수익을 확인하여 수익이 값이 지정된 값보다 크면 이익이 지정된 값보다 작으면 FindOrders() 함수의 매개 변수를 통해 False 값을 가진 2개의 플래그가 반환되므로 일부에 있을 때입니다. 방향에 무익한 주문이 있으면 무익한 방향으로 충전이 없습니다.

나중에 신호 함수에서 FindOrders() 함수를 호출합니다.

주문이 전혀 열리지 않도록 이동되었습니다. 논리가 맞는 것 같습니다. 내가 어디에서 잘못되었는지 직접 볼 수 있습니까?

별도의 기능으로 모든 것을 쉽게 만들 수 있다는 것을 이해하고 있습니다. 하지만 왜 이렇게 작동하지 않는지 이해하고 싶습니다.

Victor, 나는 당신의 알고리즘을 완전히 이해할 수 없지만 조언은 할 수 있습니다! 이것은 논리에 오류가 있는 경우에도 발생합니다. 귀하의 조건에 모호성 또는 상호 배타성이 있는 경우 프로그램이 중지됩니다. 원하는 것을 이해했지만 코드의 논리를 올바르게 구축할 수는 없습니다. 명확성을 위해 화살표로 종이에 순차적으로 그림을 그려 이러한 결함을 찾으십시오. 계획한 조건의 전체 순서를 충족하십시오! 행운을 빕니다!
 
borilunad :
Victor, 나는 당신의 알고리즘을 완전히 이해할 수 없지만 조언은 할 수 있습니다! 이것은 논리에 오류가 있는 경우에도 발생합니다. 귀하의 조건에 모호성 또는 상호 배타성이 있는 경우 프로그램이 중지됩니다. 원하는 것을 이해했지만 코드의 논리를 올바르게 구축할 수는 없습니다. 명확성을 위해 화살표로 종이에 순차적으로 그림을 그려 이러한 결함을 찾으십시오. 계획한 조건의 전체 순서를 충족하십시오! 행운을 빕니다!


그래서 그것은 모두 논리에 관한 것입니다. 미결 주문이 없으면 신호에 따라 주문이 시작되어야 합니다.

그리고 미결 주문이 있는 경우 특정 방향(구매 또는 판매)의 주문 이익이 특정 값보다 크면 특정 신호에 따라 주문을 열어야 합니다. 적어도 부정적인 것은 아닙니다. (나는 테스트를 위해 거기에 0 을 넣었다).

하나의 논리적 잼을 찾았습니다. 다음은 일어난 일입니다.

 //+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders( bool & long , bool & short )
{
   int t, total = OrdersTotal () - 1 ;
   
   for ( int i=total; i>= 0 ; i--)
   {
       if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) continue ;
           if (OrderSymbol() != Symbol ()) continue ;
               if (OrderMagicNumber() != i_magic) continue ;
              {
                 if (OrderType() == OP_BUY)         // Найден ордер типа OP_BUY
                 {
                     if (OrderProfit() < 0 )         // Если профит ордера ниже заданного значения,..
                         long = false ;               // .. покупка запрещена
                 }

                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (OrderProfit() < 0 )         // Если профит ордера ниже заданного значения,..
                         short = false ;             // .. продажа запрещена
                 }
                 t++;
              }
   }
   
   return (t);
}

//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   bool short = true ,
         long = true ;
        
   if (FindOrders( short , long ) > 3 )
       return (-1);

   if (GetRSI( 1 ) < i_RSIToUpLimit)
       if (GetRSI( 0 ) > i_RSIToUpLimit)
      {
         if ( long == true )
             return (SIGNAL_BUY);
      }

   if (GetRSI( 1 ) > i_RSIToDnLimit)
       if (GetRSI( 0 ) < i_RSIToDnLimit)
      {
         if ( short == true )
             return (SIGNAL_SELL);
      }
            
   return (-1);
}

이제 매도 주문이 사이드 뷰에서 올바르게 열리고 롱이 전혀 열리지 않습니다. 플래그가 두 변수 모두 1 로 설정되는 동안 사실 .

 

MT4 결성해서 그런 오해가..

mt4 브로커 프로그램(즉, 지난 주에 사용한 3)이 시작되면서 Windows 창 "사용자 계정으로 실행"이 내 컴퓨터에 나타납니다("다음 계정으로 실행"이 사용되는 것과 동일합니다. 어떤 작업을 선택하든, mt4가 정상적으로 열립니다.

이 창 없이 mt4.exe 실행을 반환하는 방법은 무엇입니까? 무슨 일이 일어나고 있는지 알고 있거나 이해하는 사람이 있습니까?

 

모든 보류 중인 주문 을 신속하게 취소해야 하는 필요성에 직면하여 좋은 오후입니다. OrderClose 는 지연을 무시합니다. 어떤 연산자를 사용하는 것이 더 편리하고 그러한 가능성이 있습니까?

 
Notter :

안녕하세요. 보류 중인 모든 주문을 신속하게 취소해야 하는 상황에 직면했습니다. OrderClose 는 지연을 무시합니다. 어떤 연산자를 사용하는 것이 더 편리하고 그러한 가능성이 있습니까?


시장가 주문만 청산할 수 있으며 보류 중인 주문을 삭제하려면 OrderDelete 연산자가 필요합니다.
 

호즈

고맙습니다!

 
hoz :


그래서 그것은 모두 논리에 관한 것입니다. 미결 주문이 없으면 신호에 따라 주문이 시작되어야 합니다.

그리고 미결 주문이 있는 경우 특정 방향(구매 또는 판매)의 주문 이익이 특정 값보다 크면 특정 신호에 따라 주문을 열어야 합니다. 적어도 부정적인 것은 아닙니다. (나는 테스트를 위해 거기에 0 을 넣었다).

하나의 논리적 잼을 찾았습니다. 다음은 일어난 일입니다.

이제 매도 주문이 사이드 뷰에서 올바르게 열리고 롱이 전혀 열리지 않습니다. 플래그가 두 변수 모두 1 로 설정되는 동안 사실 .

빅터, 확인! 매수 매도를 주석 처리한 후, 공매도가 어떻게 작동하는지 로그에서 확인하십시오! 그리고 그 반대의 경우도 마찬가지입니다. 그러면 차이점이 무엇인지 알게 될 것이고 왜 작동하지 않는지 알게 될 것입니다!
 
borilunad :
빅터, 확인! 매수 매도를 주석 처리한 후, 공매도가 어떻게 작동하는지 로그에서 확인하십시오! 그리고 그 반대의 경우도 마찬가지입니다. 그러면 차이점이 무엇인지 알게 될 것이고 왜 작동하지 않는지 알게 될 것입니다!


보리스, int GetGeneralSignal() 함수에서 조건 중 하나를 주석 처리하면 여는 것이 명확해집니다.

나는 추적했다. 현재 미결 주문의 수익성이 빨간색일 때 플래그는 값을 변경하지 않습니다. 다음은 짧은 플래그와 플래그의 값을 false 로 설정해야 하는 다시 작성된 함수입니다. 부정적인 주문이 있는 경우 포지션 개설 금지:

 //+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders( bool & long , bool & short )
{
   int t, total = OrdersTotal () - 1 ;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for ( int i=total; i>= 0 ; i--)
   {
       if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) continue ;
           if (OrderSymbol() != Symbol ()) continue ;
               if (OrderMagicNumber() != i_magic) continue ;
              {
                 if (OrderType() == OP_BUY)         // Найден ордер типа OP_BUY
                 {
                     Print ( "if (OrderType() == OP_BUY)" );
                     profitL = OrderProfit();
                     if (profitL < OrderProfit())
                         if (profitL < 0 )
                         long = false ;
                 }

                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     Print ( "if (OrderType() == OP_SELL)" );
                     profitS = OrderProfit();
                     if (profitS < OrderProfit())
                         if (profitS < 0 )
                         long = false ;
                 }
                 t++;
              }
   }
   
   return (t);
}

호출 함수는 다음과 같습니다.

 //+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   bool short = true ,
         long = true ;
        
   if (FindOrders( short , long ) > 15 )
       return (SIGNAL_NO);

   Print ( "long = " , long );
   Print ( "short = " , short );
      
   if (GetRSI( 1 ) < i_RSIToUpLimit)
       if (GetRSI( 0 ) > i_RSIToUpLimit)
      {
         if ( long == true )
             return (SIGNAL_BUY);
      }
           
   if (GetRSI( 1 ) > i_RSIToDnLimit)
       if (GetRSI( 0 ) < i_RSIToDnLimit)
      {
         if ( short == true )
             return (SIGNAL_SELL);
      }
            
   return (SIGNAL_NO);
}