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

 
borilunad :


너무 간단해야합니다! M5는 열려 있고 상단은 약간 부풀어 있으며 그 아래 M1은 올바른 설명을 보여줍니다.

그들이 말했듯이 아침은 저녁보다 현명합니다! 좋은 아침!


여기에서 그들은 질문을 하고 소프트웨어 구현에 대한 답변을 얻습니다.

그리고 당신은 잎에서 코멘트를 읽을 수 있습니다;)

 
오류가 어디에 있는지 알려주십시오. 찾을 수 없습니다.
이미 주문 수정 코드를 다시 작성했는데 오류가 남아 있습니다.
나는 그 오류가 로그에서 나온 것이 아님을 강조합니다. 로그에는 하나의 오류가 없습니다.
테스트 중 결과에서 오류를 발견했습니다.
예시:
1.4654의 가격으로 매수 포지션 (주문 번호 1)을 열었습니다.
결과에 추가로 수정(주문 번호 1) 가격 1.4654 및 TakeProfit 1.4752라고 나와 있습니다.
결과에서 추가로 닫기(주문 번호 1) 가격 1.4704 및 TakeProfit 1.4752로 표시됩니다.
이익 = 50.00

StopLoss를 설정하지 않았기 때문에 TakeProfit에 의해서만 닫혀야 하지만 손실 위치의 예입니다.
1.4820의 가격에 매수 포지션(주문 번호 271)을 열었습니다.
결과에 추가로 수정(주문 번호 271) 가격 1.4820 및 TakeProfit 1.4918이라고 나와 있습니다.
결과에서 추가로 닫기(주문 번호 1) 가격 1.4737 및 TakeProfit 1.4918로 표시됩니다.
이익 = - 83.46

내가 100을 넣는 모든 곳에서 TakeProfit

손절매가 설정되지 않았습니다.

수정하는 방법을 모르겠습니다.

이 EA의 코드를 컴파일할 때 = 0 오류 및 0 경고.

내가 사용한 주문 수정 코드는 다음과 같습니다.

 //|  Описание : Модификация ордера. Версия функции для тестов на истории.      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена открытия позиции, установки ордера                            |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    ex - дата истечения                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder( double pp=- 1 , double sl= 0 , double tp= 0 , datetime ex= 0 ){
   int     dg= MarketInfo ( OrderSymbol (), MODE_DIGITS), er;
   double op= NormalizeDouble ( OrderOpenPrice () , dg);
   double os= NormalizeDouble ( OrderStopLoss ()  , dg);
   double ot= NormalizeDouble ( OrderTakeProfit (), dg);
   color   cl;

   if (pp<= 0 ) pp= OrderOpenPrice ();
   if (sl< 0 ) sl= OrderStopLoss ();
   if (tp< 0 ) tp= OrderTakeProfit ();
  
  pp= NormalizeDouble (pp, dg);
  sl= NormalizeDouble (sl, dg);
  tp= NormalizeDouble (tp, dg);

   if (pp!=op || sl!=os || tp!=ot) {
     if ( MathMod ( OrderType (), 2 )== 0 ) cl=clModifyBuy;
     if (! OrderModify ( OrderTicket (), pp, sl, tp, ex, cl)) {
      er= GetLastError ();
       Print ( "Error(" ,er, ") modifying order: " ,Error(error_code));
       Print ( "Ask=" ,Ask, " Bid=" ,Bid, " sy=" , OrderSymbol (),
             " op=" +GetNameOP( OrderType ()), " pp=" ,pp, " sl=" ,sl, " tp=" ,tp);
    }
  }
}
 
이 Expert Advisor는 Excel 스프레드시트 - \experts\file 폴더에 저장된 Orders.csv 파일을 통해 작동한다는 사실을 잊어버렸습니다.
 
alex12 :
오류가 어디에 있는지 알려주십시오. 찾을 수 없습니다.
이미 주문 수정 코드를 다시 작성했는데 오류가 남아 있습니다.
나는 그 오류가 로그에서 나온 것이 아님을 강조합니다. 로그에는 하나의 오류가 없습니다.
테스트 중 결과에서 오류를 발견했습니다.
예시:
1.4654의 가격으로 매수 포지션(주문 번호 1)을 열었습니다.
결과에 추가로 수정(주문 번호 1) 가격 1.4654 및 TakeProfit 1.4752라고 나와 있습니다.
결과에서 추가로 닫기(주문 번호 1) 가격 1.4704 및 TakeProfit 1.4752로 표시됩니다.
이익 = 50.00

StopLoss를 설정하지 않았기 때문에 TakeProfit에 의해서만 닫혀야 하지만 손실 위치의 예입니다.
1.4820의 가격에 매수 포지션(주문 번호 271)을 열었습니다.
결과에 추가로 수정(주문 번호 271) 가격 1.4820 및 TakeProfit 1.4918이라고 나와 있습니다.
결과에서 추가로 닫기(주문 번호 1) 가격 1.4737 및 TakeProfit 1.4918로 표시됩니다.
이익 = - 83.46

내가 100을 넣는 모든 곳에서 TakeProfit

손절매가 설정되지 않았습니다.

수정하는 방법을 모르겠습니다.

이 EA의 코드를 컴파일할 때 = 0 오류 및 0 경고.

내가 사용한 주문 수정 코드는 다음과 같습니다.

테스터의 거래 마감이 표시된 형식으로 작성되면 이것은 orderclose 함수의 결과일 가능성이 큽니다(TP 및 SL은 이와 관련이 없음)
 

가치를 찾는 데 도움

하나 지난 X = 5일 동안 의 최대 일일 변동성(일일 고가 - 레이) .

2 지난 X = 130일 동안 의 평균 일일 변동성

3 그리고 최대 일일 변동성A = 75 ~ B = 150 범위에 있도록 if 조건에서 이러한 값을 어떻게 쓸 수 있습니까? - 평균 일일 변동성

 double Dmax= 0.0 ; 
double DAvg= 0.0 ;
int a = 0 ; 
int d =d+ 1 ;  
while (a < 5 ) 
  { 
    Dmax = iHigh ( Symbol (), PERIOD_D1 ,d)- iLow ( Symbol (), PERIOD_D1 ,d); 
    a++; 
  } 
//Comment( "T ("+Dmax+")");

while (a < 130 ) 
   {  
 
DAvg += ( iHigh ( Symbol (), PERIOD_D1 ,d- 1 )- iLow ( Symbol (), PERIOD_D1 ,d- 1 ))/ 130 ; 
    a++; 
}
Comment ( "T (" +DAvg+ ")" );
 
sergeev :

1. 먼저 창에 몇 개의 막대가 맞는지 확인하십시오. https://docs.mql4.com/en/windows/WindowBarsPerChart

2. 그런 다음 첫 번째 막대의 날짜를 찾으십시오. https://docs.mql4.com/en/windows/WindowFirstVisibleBar

3. 이 초기 막대와 막대의 수를 알고 이 막대를 살펴보고 그 중 최대값과 최소값을 결정합니다.

4. 이익


옵션 번호 2

https://docs.mql4.com/en/windows/WindowPriceMax

https://docs.mql4.com/en/windows/WindowPriceMin 두 번째 옵션

빠르고 자세한 답변 정말 감사합니다.저도 첫 번째 옵션을 선호했지만 창의 막대 수를 계산하는 방법을 몰랐습니다.두 번째 옵션이 더 간결합니다.

그러나 이전 막대에서 마지막 최대값과 최소값을 "잡는" 방법은 무엇입니까?미리 감사합니다!

 
MK07 :


그러나 이전 막대에서 마지막 최대값과 최소값을 "잡는" 방법은 무엇입니까?미리 감사합니다!

현재 막대에서 도달한 최대값과 최소값만 기억하면 되며 새 막대 가 나타나고 이전 막대가 되면 기억된 변수에서 최대값과 최소값을 취합니다.

 
sergeev :

현재 막대에서 도달한 최대값과 최소값만 기억하면 되며 새 막대가 나타나고 이전 막대가 되면 기억된 변수에서 최대값과 최소값을 취합니다.


하지만 어떻게? 내 지표에서 이 작업을 여러 번 시도했지만 작동하지 않습니다! 변수 Z에 max 값을 할당한다고 가정합니다. 새 막대 가 나타나고(추적 가능) 즉시 Z에 새 값이 할당되고 value (Z-1)은 "lost"입니다. 여기에서 Z에 새 값을 할당할 때 일종의 확인이 필요한 것 같습니다(새 막대가 나타나지 않았습니까?). 나는 당신의 전문성과 인내에 의존합니다! 노고에 감사드립니다.
 

변수 z를 정적으로 선언하거나 전역 영역에서 선언합니다.

새 값을 할당하기 전에 새 막대 를 확인하고 값과 현재 값의 차이를 확인한 다음 새 값을 할당해야 합니다.

 
smshev :
테스터의 거래 마감이 표시된 형식으로 작성되면 이것은 orderclose 함수의 결과일 가능성이 큽니다(TP 및 SL은 이와 관련이 없음)

감사합니다. 하지만 코드에 오류가 없습니다.

 int CloseOrder( int ticket, double lots)
              {
               int err,i1;
               double price;
               OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES);
               if (lots< MarketInfo ( Symbol (),MODE_MINLOT))lots= MarketInfo ( Symbol (),MODE_MINLOT);
               while (i1< 10 )
                   {
                     RefreshRates ();
                     if ( OrderType ()== 0 )price=Bid;
                     if ( OrderType ()== 1 )price=Ask;
                     if ( OrderType ()> 1 ){ OrderDelete (ticket); return ( 0 );}
                     OrderClose (ticket,lots, NormalizeDouble (price, Digits ),Slippage, Goldenrod );
                    err = GetLastError ();
                     if (err == 0 ) break ;
                     Print ( WindowExpertName (), Symbol (),Error(err), "  при закрытии ордера" );
                     Sleep ( 100 );
                    i1++;
                   }
               return ( 0 );
              }
사유: