초보자의 질문 MQL4 MT4 MetaTrader 4 - 페이지 115

 

사람들은 그러한 질문을 가지고 있습니다. 변수의 값을 1차원 배열에 넣는 방법은 무엇입니까?

도움말을 보내지 마십시오. 유사한 작업에 대한 예가 없습니다.


특정 조건에서 변경되는 변수가 있다고 가정해 보겠습니다.

이 변수의 마지막 3개 값을 배열에 기록해야 합니다. mql4에서는 어떻게 구현됩니까?


나는 int mas[3]를 씁니다.

매스[]=a; 변경되는 조건 후 루프 내부,

논리적으로 해야 하지만 nifiga는 작동하지 않습니다. 컴파일러가 ']'를 발행합니다. 표현식이 예상됩니다. 대괄호 안의 mas[]=a에 알 수 없는 표현식을 넣어야 합니다.

루프의 각 반복에서 변수 값으로 배열을 채우는 MQL4의 함수가 있습니까?


 
Igor Makanu :

서신의 시작 부분을 찾지 못해 죄송하지만 복잡한 조건과 계산을 피하도록 즉시 조언하고 싶습니다. 이는 코드를 읽을 수 없게 만들고 결과적으로 논리적 오류 검색을 복잡하게 만듭니다. 다음과 같은 코드:

위태로운 것이 무엇인지 이해 한다면 내가 제공한 코드를 조금 더 수정할 수 있습니다. ( OrderType () == OP_BUY....

그러면 논리적 오류를 찾는 것이 훨씬 쉬울 것입니다. IMHO

OrderSend => return 뒤에 삽입

또는 스위치를 통해 선택하십시오.

 switch ( OrderType () )
{ OP_BUY : { if ( 1 ) { .... break ; }
             if ( 2 ) { .... break ; }
           }
   OP_SELL : { if ( 3 ) { .... break ; }
               if ( 4 ) { .... break; }
            }
}
 
Vladimir Tkach :

시도하고 작동하지 않습니다.

사용자 지정 표시기 호출에 입력 매개변수가 거의 없습니다 . 모닝 플랫 표시기에 외부 변수가 몇 개 있는지 계산합니까? (extern) - iCustom을 사용할 때 전달해야 하는 동일한 수의 매개변수입니다.

 
John Smith :
.....

나는 int mas[3]=a; 변경되는 조건 후 루프 내부,

논리적으로 해야 하지만 nifiga는 작동하지 않습니다.

한 번에 모든 작업을 수행하는 것이 아니라 단계별로 수행하는 방법을 배웁니다.

예시 :

 int mas[ 3 ]={ 0 }; // инициализация масива 

.....           // основной код
if ( найдена новая величина а )
{ mas[ 2 ]=mas[ 1 ];   // самая старая величина а
  mas[ 1 ]=mas[ 0 ];
  mas[ 0 ]=a;       // новая величина а
}
.....           // основной код
 
Igor Makanu :

사용자 지정 표시기 호출에 입력 매개변수가 거의 없습니다 . 모닝 플랫 표시기에 외부 변수가 몇 개 있는지 계산합니까? (extern) - iCustom을 사용할 때 전달해야 하는 동일한 수의 매개변수입니다.

나는 이미 그들 모두를 겪었습니다.

다른 방식으로 문제를 해결했습니다. 지표에서 Expert Advisor로 가격을 계산하는 코드를 삽입했습니다.

 
Igor Makanu :

그것이 바로 그것입니다. 코드의 논리는 동일합니다. 조건을 분할하면 논리 오류가 있는 위치를 빠르게 찾을 수 있습니다.

별도의 조건으로 코드 최적화 를 수행합니다. 조건은 귀하의 예에서와 같이 4번이 아니라 한 번 확인됩니다.

다음을 통해 전문가 저널에 결과물 제출

코드의 어느 부분이 실행되고 어떤 매개변수가 있는지 보기 위해 로그를 작성합니다.

답변 해주셔서 감사합니다. 조건을 극한까지 짓밟았다. 댓글로 논리를 확인했습니다. 첫 번째 오픈 포지션을 청산하기 위한 조건에 따라 포지션이 청산되는 것으로 밝혀졌다. 즉, 폐쇄 조건이 1인 BUY 또는 CELL을 처음 개설한 다음 두 번째 유사한 위치가 열렸지만 폐쇄 조건이 2인 경우 이 폐쇄 조건은 무시되고 두 번째 위치는 다른 마법에도 불구하고 , 또한 조건 1에 따라 닫힙니다. 그리고 어떻게 해야 합니까?

 
Vladimir Tkach :

나는 이미 그들 모두를 겪었습니다.

다른 방식으로 문제를 해결했습니다. 지표에서 Expert Advisor로 가격을 계산하는 코드를 삽입했습니다.

글쎄, 그래서 나는 당신이 iCustom()을 올바르게 호출하지 않았다는 것을 알아차렸다. 그것은 다음과 같아야 한다:

min= iCustom ( Symbol (), 0 , "Morning Flat" ,StartHour,EndHour,TargetLevel,UpColor,DnColor,TargetUpColor,TargetDnColor, 1 , 0 );

표시기를 호출 할 때 7개의 매개변수를 전달하고 3개의 매개변수로 호출했습니다.

표시기 호출은 그대로 두고 표시기 자체를 수정합니다. 표시기 코드에서 불필요한 외부 변수와 그래픽 개체를 제거합니다.


novichok2018 :

댓글로 논리를 확인했습니다. 첫 번째 오픈 포지션을 청산하기 위한 조건에 따라 포지션이 청산되는 것으로 밝혀졌다.

축하합니다! 올바른 방향으로 가고 있지만 디버깅 단계에서 주석( Commetn() ) 대신 로그(Print())에 출력하는 것이 좋습니다.

코드를 보여줘

 
Igor Makanu :

글쎄, 그래서 나는 당신이 iCustom()을 올바르게 호출하지 않았다는 것을 알아차렸다. 그것은 다음과 같아야 한다:

표시기를 호출 할 때 7개의 매개변수를 전달하고 3개의 매개변수로 호출했습니다.

표시기 호출은 그대로 두고 표시기 자체를 수정합니다. 표시기 코드에서 불필요한 외부 변수와 그래픽 개체를 제거합니다.


축하합니다! 올바른 방향으로 가고 있지만 디버깅 단계에서 주석( Commetn() ) 대신 로그(Print())에 출력하는 것이 좋습니다.

코드를 보여줘

 int total= OrdersTotal ();
       for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)
      {
         if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
         {
         if ( TimeCurrent ()> OrderOpenTime ()+ 100 )
           { 
             if ( OrderType ()== OP_BUY )
              {
               if ( OrderMagicNumber == 101 )
                 {
                 if ( MathAbs (WPR1)< 5 )
                 rez =   OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( MarketInfo ( OrderSymbol (), MODE_BID ), int ( MarketInfo ( OrderSymbol (), MODE_DIGITS ))),slippage,Yellow); 
                 }
               if ( OrderMagicNumber == 111 )
                 {
                   if ( MathAbs (WPR1)< 20 ) 
                  rez =   OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( MarketInfo ( OrderSymbol (), MODE_BID ), int ( MarketInfo ( OrderSymbol (), MODE_DIGITS ))),slippage,Yellow);
                 }
              }
                 
             if ( OrderType ()== OP_SELL )
              {
               if ( OrderMagicNumber == 222 )
                 {
                   if ( MathAbs (WPR1)> 97.55 )
                  rez =   OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( MarketInfo ( OrderSymbol (), MODE_ASK ), int ( MarketInfo ( OrderSymbol (), MODE_DIGITS ))),slippage,Yellow); 
                 }
               if ( OrderMagicNumber == 201 )
                 {
                   if ( MathAbs (WPR1)> 96 )
                  rez =   OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( MarketInfo ( OrderSymbol (), MODE_ASK ), int ( MarketInfo ( OrderSymbol (), MODE_DIGITS ))),slippage,Yellow);
                 } 
              }
            }               
         }
       continue ;  
      }   

제거된 지문입니다.

 
novichok2018 :

제거된 지문입니다.

코드의 전체 논리를 모르지만 각 주문이 닫힌 후 break를 통해 루프를 종료 해야 합니다. 다음 틱에서 조건에 대한 주문을 다시 확인합니다 . 주문이 마감된 후 OrderSelect() 가 어떻게 작동하는지 모르겠습니다. 주문이 마감된 경우 동일한 항목이 선택되었습니까? 아니면 오류가 발생합니까?

여기에서 원칙적으로 문제는 한 번에 모든 것을 확인하고 닫으려는 것입니다. 몇 가지 솔루션이 있습니다. 사용

스위치()

또는 함수에서 주문 마감을 정렬합니다(주문을 위한 기성품 기능이 있습니다 https://www.mql5.com/en/forum/131859/page2#434206 )

또는 코드에서 주문을 종료한 후 break를 사용하십시오.

Полезные функции от KimIV
Полезные функции от KimIV
  • 2008.03.11
  • www.mql5.com
В этой теме я буду выкладывать коды своих функций на языке программирования MQL4, приводить примеры их использования и отвечать на вопросы, связанн...
 
Igor Makanu :

코드의 전체 논리를 모르지만 각 주문이 닫힌 후 break를 통해 루프를 종료 해야 합니다. 다음 틱에서 조건에 대한 주문을 다시 확인합니다 . 주문이 마감된 후 OrderSelect() 가 어떻게 작동하는지 모르겠습니다. 주문이 마감된 경우 동일한 항목이 선택되었습니까? 아니면 오류가 발생합니까?

여기에서 원칙적으로 문제는 한 번에 모든 것을 확인하고 닫으려는 것입니다. 몇 가지 솔루션이 있습니다. 사용

스위치()

또는 기능으로 주문을 마감합니다(주문을 위한 기성품 기능이 있습니다 https://www.mql5.com/ru/forum/107476 )

또는 코드에서 주문을 닫은 후 break를 사용하십시오.

고맙습니다. 휴식이 도움이 된 것 같습니다. 다음에 무슨 일이 일어날지 봅시다.