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

 
Artyom Trishkin # :

CopyRates()에 대한 첫 번째 호출은 기록 데이터의 펌핑을 시작했습니다(일주일에 실행하지 마십시오. 그러면 동일한 결과를 다시 얻게 될 것입니다. 음, 아마도 일주일은 아니지만 얼마 후).
서버에 얼마나 많은 데이터가 있는지 확인하고 사용 가능한 양을 어드바이저와 비교하기만 하면 됩니다. 필요한 것보다 적으면 다음 틱 전에 종료합니다. 다시 확인하십시오. 특정 시도 횟수 동안 필요한 기록을 얻을 수 없는 경우 필요에 따라 이 오류를 처리합니다.

정보 주셔서 감사합니다!

시간이 되시면 해결 방법에 대해 답변해 드리겠습니다.

N 캔들백의 역사에서 Close[N]+50*Point 및 Close[N]-50*Point라는 두 가지 다른 방향의 목표가 설정됩니다.
그런 다음 가격이 목표 중 하나에 도달해야 한다는 조건(if (High[i]> Close[N]+50*Point) 또는 (if (Low[i]<   닫기[N]-50*포인트)
조건이 충족되면 Close[N] 에서 High[i]까지의 거리가 x[high]=High[i] 배열에 입력됩니다.
그런 다음 무작위로 언제든지 차트 중 하나로 돌진합니다.

그리고 Print( x[high])로 확인할 때 10개 중 1~2개 값이 50 미만으로 나타납니다! 하나는 12개, 다른 하나는 49개입니다. 하지만 +50 * 포인트는 엄격하게 표시됩니다. 8-9는 정확하고(50 이상) 1-2는 비정상입니다. 테스터를 통하는 것이 아니라 실제 차트에서 어드바이저(트레이딩 기능 없음)를 던지지만 위의 경우에만 히스토리와 함께 작동하고 이렇게 씁니다.

값이 클수록 이러한 오류가 줄어듭니다. 전파가 방해가 되는건 아닐까 생각했는데... MT4에서는 역사에 전파가 없는것 같네요

 
Artis98 # :

친애하는 포럼 사용자 및 경험 많은 프로그래머 여러분, 안녕하세요! 어드바이저를 끝내는 데 도움이 필요합니다)) 플리즈, 어드바이저 코드에 2가지를 추가하는 방법을 알려주세요.

1. 상황은 다음과 같습니다. - TP와 SL 그리고 특정 로트(0.01로 하자)로 주문(1st)을 엽니다. 이 주문이 이익실현으로 마감되면 아무 것도 변경되지 않습니다. 그러나 이(1차) 주문이 SL에 의해 마감되면 이(2차) 바로 다음 주문이 2배 증가하여 로트가 열립니다(0.01*2=0.02). 이 2차 주문이 이익실현으로 마감되면 다음 주문(3차)이 일반 로트로 열립니다. 2배 증가된 로트는 SL에 의해 이전 주문(1차)이 마감된 후 다음 주문(2차)에 대해서만 필요합니다. 3번째 주문에서 두 번째 연속으로 SL 마감이 있는 경우, 로트는 TP 마감이 있을 때까지 두 배로 유지됩니다. 추가해야 하는 논리를 자세히 설명했으면 합니다.


2. 그리고 두 번째로 추가할 것은 SL의 움직임입니다. 이제 구체적인 예를 들어 설명하겠습니다. 기본 매개변수가 TP + 300, SL - 500인 주문이 있다고 가정해 보겠습니다. 가격은 올바른 방향으로 가고 + 주문 개시 가격에서 100핍. 가격이 주문 개시 가격에서 +100에 도달하자마자 SL은 베이스 -500에서 +90으로 이동해야 합니다. 저것들. 가격이 주문 시가에서 + 100핍에 도달하면 S, L을 설정하여 주문을 손익분기점으로 전환합니다. +90핍. 그 후 가격이 올바른 방향으로 더 나아가 + 50핍을 더 통과하면 - SL이 50핍 이동 => 이제 주문 개시 가격에서 + 140핍에 있어야 합니다. 저것들. SL은 기본 위치에서 처음으로 주문 시가에서 +90핍 이동한 다음 +50핍 이동(-500 => + 90 => + 140 => + 190 등)하면 이동합니다. 따라서 가격이 TP에 도달하기 전에 또는 추세 움직임이 반전되어 SL을 녹아웃할 때 모든 것이 진행됩니다.


모든 것을 자세히 설명했기를 바랍니다. 도움이 되기를 진심으로 바랍니다. 이러한 누락된 요소를 추가하면 어드바이저가 준비됩니다.)) 질문이 있는 경우 - 질문))) 아래에 어드바이저 코드의 일부를 게시합니다.

첫 번째 요점: 포지션을 열기 전에 이전 포지션이 어떻게 청산되었는지 확인하십시오. SL의 경우 로트는 두 배여야 합니다. 로트는 이전 위치의 로트가 아니라 설정 또는 코드의 어딘가에 지정된 로트에서 두 배로 증가합니다. 그런 다음 열기 전에 상태 확인을 받게 됩니다. 이전 위치가 SL에 의해 마감된 경우 이중 로트로 위치를 엽니다.

두 번째: 이 스레드에서 이미 오랫동안 후행 정지를 생성하기 위한 샘플을 배치했습니다. 바라보다. 내 프로필의 사용자 메시지가 더 좋습니다. 여기에서 100개 이상의 페이지를 스크롤하는 것보다 빠르게 찾을 수 있습니다. 그런 다음 발견된 예를 기반으로 자신만의 트롤을 만들어 봅니다.

 
Artyom Trishkin # :

CopyRates()에 대한 첫 번째 호출은 기록 데이터의 펌핑을 시작했습니다(일주일에 실행하지 마십시오. 그러면 동일한 결과를 다시 얻게 될 것입니다. 음, 아마도 일주일은 아니지만 얼마 후).
서버에 얼마나 많은 데이터가 있는지 확인하고 사용 가능한 양을 어드바이저와 비교하기만 하면 됩니다. 필요한 것보다 적으면 다음 틱 전에 종료합니다. 다시 확인하십시오. 특정 시도 횟수 동안 필요한 기록을 얻을 수 없는 경우 필요에 따라 이 오류를 처리합니다.

로드된 막대의 수를 프로그래밍 방식으로 얻을 수 있습니까?

나 자신은 각 기간에 대한 따옴표 아카이브의 날짜를보고 계산에서 벗어나지 않으려 고 노력합니다.

이 형식에서는 작업이 필요하지 않을 수 있습니다. 필요한 수의 막대가 로드될 때 플래그를 수신하는 것이 더 정확하지만 특정 악기에서는 전혀 로드되지 않을 수 있습니다.

 
Artyom Trishkin # :

첫 번째 요점: 포지션을 열기 전에 이전 포지션이 어떻게 청산되었는지 확인하십시오. SL의 경우 로트는 두 배여야 합니다. 로트는 이전 위치의 로트가 아니라 설정 또는 코드의 어딘가에 지정된 로트에서 두 배로 증가합니다. 그런 다음 열기 전에 상태 확인을 받게 됩니다. 이전 위치가 SL에 의해 마감된 경우 이중 로트로 위치를 엽니다.

코드에서 이미 이것을 변경했다고 생각합니다.

 //+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
 double Lots()   // Расчет объема лота
  {
   int n= 0 ;
   double Lotscount;
   double OL=Lot;
   
   
   if (Lot> 0 ) return (LOT());           // "если во внешней переменной "Lot" стоит число больше 0 => будет фиксированный лот без авт. расчёта" 
   Lotscount=AccountFreeMargin()/ 10000 ;   // раcчёт лота - свободная маржа/9000 => 100/9000=0.01 лота 
   Lotscount= MathMin ( 15 , MathMax ( 0.01 ,Lotscount));
     if (Lotscount< 0.1 ) Lotscount= NormalizeDouble (Lotscount, 2 );
     else 
     {
       if (Lotscount< 1 ) Lotscount= NormalizeDouble (Lotscount, 1 );
       else        Lotscount= NormalizeDouble (Lotscount, 0 );
     }
     
     for ( int j = OrdersHistoryTotal()- 1 ; j >= 0 ; j--)
   {
       if ( OrderSelect (j, SELECT_BY_POS,MODE_HISTORY))
      {
           if (OrderSymbol() == Symbol () && OrderMagicNumber() == MagicNumber)
         {
             if (OrderProfit()< 0 ) 
             {
               if (n== 0 ) OL= NormalizeDouble (OrderLots()*K_Martin,DigitsLot);
               n++; 
               if (OrderProfit()> 0 ) return (Lotscount);
            }
             else
            {
               if (n== 0 ) { Comment ( "2" ); return (Lotscount);}
               else { Comment ( "3" ); return (OL);}
            }
         }
      }
   }
       return (Lotscount);
 }
//------------------------------------------------------------------
double LOT()
{
   int n= 0 ;
   double OL=Lot;
   for ( int j = OrdersHistoryTotal()- 1 ; j >= 0 ; j--)
   {
       if ( OrderSelect (j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == MagicNumber)
         {
             if (OrderProfit()< 0 ) 
            {
               if (n== 0 ) OL= NormalizeDouble (OrderLots()*K_Martin,DigitsLot);
               n++; 
               if (OrderProfit()> 0 ) return (Lot); }
            }
             else
            {
               if (n== 0 ) { Comment ( "2" ); return (Lot);}
               else { Comment ( "3" ); return (OL);}
            }
         }
      }
   }
   return (OL);
}

아니면 그렇지 않습니까? 또한 로트와 관련된 두 가지를 변경하는 방법을 모르겠습니다. 첫 번째는 이중 로트가 있는 주문이 한 주문(SL이 있는 주문 다음 주문)에서만 한 번만 열리도록 만드는 것입니다. 그리고 추가하는 방법을 모르는 두 번째 것은 2개의 SL이 연속으로 있는 경우(2개의 주문이 SL에 의해 연속으로 마감됨) 세 번째 주문이 열리지 않도록 만드는 것입니다. 다른 2(2*2*2), 그러나 두 번째 순서와 같이 한 번(2*2)입니다.

 
Artis98 # :

나는 이것을 이미 코드에서 변경했다고 생각합니다.

아니면 그렇지 않습니까? 또한 로트와 관련된 두 가지를 변경하는 방법을 모르겠습니다. 첫 번째는 이중 로트가 있는 주문이 한 주문(SL이 있는 주문 다음 주문)에서만 한 번만 열리도록 만드는 것입니다. 그리고 추가하는 방법을 모르는 두 번째 것은 2개의 SL이 연속으로 있는 경우(2개의 주문이 SL에 의해 연속으로 마감됨) 세 번째 주문이 열리지 않도록 만드는 것입니다. 다른 2(2*2*2), 그러나 두 번째 순서와 같이 한 번(2*2)입니다.

두 가지 유형의 주문이 있습니다. 1번 - 일반 로트 주문과 2번 - 로트가 증가한 주문입니다. SL형 1호만 로트증가

"코멘트"의 스토어 주문 유형 예. 그리고 집에서 더 잘 기억하십시오. 일반적으로 좋은 습관은 주문에 대한 모든 것을 스스로 기억하는 것입니다.

 
Maxim Kuznetsov # :

두 가지 유형의 주문이 있습니다. 1번 - 일반 로트 주문과 2번 - 로트가 증가한 주문입니다. SL형 1호만 로트증가

"코멘트"의 스토어 주문 유형 예. 그리고 집에서 더 잘 기억하십시오. 일반적으로 좋은 습관은 주문에 대한 모든 것을 스스로 기억하는 것입니다.

그는 아무 것도 암기할 필요가 없습니다(특히 암기는 후속 복구가 필요하기 때문에). 이전 포지션이 어떻게 마감되었는지 아는 것으로 충분합니다. 모든 것. 두세 개, 백 개를 연속으로 알 필요가 없으며 손절매로 닫혀 있는 행이 아니라 마지막 하나만 알 필요가 있습니다. 손절매로 마감된 경우 다음 거래는 이중 로트여야 합니다. 그러나 로트는 이전 위치의 로트가 아닌 프로그램에 지정된 일반 로트의 2배여야 합니다. 그런 다음 - 포지션이 손절매로 마감되지 않은 경우 일반 로트로 다음 포지션을 엽니다. 포지션이 손절매로 마감된 경우 다음 포지션을 두 배로 엽니다. 모든 것. 더 이상 알 필요가 없습니다.

 
Artyom Trishkin # :

그는 아무 것도 암기할 필요가 없습니다(특히 암기는 후속 복구가 필요하기 때문에). 이전 포지션이 어떻게 마감되었는지 아는 것으로 충분합니다. 모든 것. 두세 개, 백 개를 연속으로 알 필요가 없고, 손절매로 닫혀 있는 행이 아니라 마지막 하나만 알 필요가 있습니다. 손절매로 마감된 경우 다음 거래는 이중 로트여야 합니다. 그러나 로트는 이전 위치의 로트가 아닌 프로그램에 지정된 일반 로트의 2배여야 합니다. 그런 다음 - 포지션이 손절매로 마감되지 않은 경우 일반 로트로 다음 포지션을 엽니다. 포지션이 손절매로 마감된 경우 다음 포지션을 두 배로 엽니다. 모든 것. 더 이상 알 필요가 없습니다.

사람들에게 나쁜 것을 가르치지 마십시오.

데이터를 기억하고 작업해야 합니다.

 
Artyom Trishkin # :

이전 포지션이 어떻게 마감되었는지 아는 것으로 충분합니다. 모든 것. 두세 개, 백 개를 연속으로 알 필요가 없으며 손절매로 닫혀 있는 행이 아니라 마지막 하나만 알 필요가 있습니다. 손절매로 마감된 경우 다음 거래는 이중 로트여야 합니다. 포지션이 손절매로 마감된 경우 다음 포지션을 두 배로 엽니다.

이것이 내가 필요로 하는 것입니다. 실제로 문제입니다. 코드에서 어떻게 작성합니까?

 

안녕하세요!
누군가 컴파일러가 MT5가 아닌 MT4용으로 컴파일하도록 강제하는 방법을 알고 있습니까?

파일 확장자가 *.mq4이면 모든 것이 정상이고 *.mqh이면 컴파일러가 이를 *.mq5로 인식하기 시작하고 오류가 나타납니다.

 
Sergey Zhukov # :

안녕하세요!
누군가 컴파일러가 MT5가 아닌 MT4용으로 컴파일하도록 강제하는 방법을 알고 있습니까?

파일 확장자가 *.mq4이면 모든 것이 정상이고 *.mqh이면 컴파일러가 이를 *.mq5로 인식하기 시작하고 오류가 나타납니다.

여기에서 파일을 받으세요. 듣도보도 못한 새롭네요.