초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 824

 
lil_lil :

감사해요!

/

.


아하, 배열을 통하지 않고 똑같이 결정하셨습니다.

참고: 배열을 통한 솔루션(표시기에서 First[], Second[] 및 Third[] 배열로 마지막 3개 값 복사) - 두 iMA의 교차 - OnTick():

 //--- We look for crossing of two indicators
   double    First[];
   double    Second[];
   double    Third[];
   ArraySetAsSeries (First, true );     // index [0] - the most right bar on a charts
   ArraySetAsSeries (Second, true );   // index [0] - the most right bar on a charts
   ArraySetAsSeries (Third, true );     // index [0] - the most right bar on a charts
   int       buffer_num= 0 ;           // indicator buffer number 
   int       start_pos= 0 ;             // start position 
   int       count= 3 ;                 // amount to copy 
   if (!iMAGet(handle_iMA_First,buffer_num,start_pos,count,First))
       return ;
   if (!iMAGet(handle_iMA_Second,buffer_num,start_pos,count,Second))
       return ;
   if (InpFilterMA)
       if (!iMAGet(handle_iMA_Third,buffer_num,start_pos,count,Third))
         return ;
//--- step 1: check in the arrays bars [0] and [1]
   if (First[ 0 ]>Second[ 0 ] && First[ 1 ]<Second[ 1 ]) // buy
     {
       if (InpFilterMA)
         if (Third[ 0 ]>=First[ 0 ])
             return ;
       if (! RefreshRates ())
        {
         PrevBars= iTime ( 1 );
         return ;
        }
       double sl=m_symbol. Bid ()-InpStopLoss*m_adjusted_point;
       double tp=m_symbol. Ask ()+InpTakeProfit*m_adjusted_point;
      OpenBuy(sl,tp);
       return ;
     }
   else if (First[ 0 ]<Second[ 0 ] && First[ 1 ]>Second[ 1 ]) // sell
     {
       if (InpFilterMA)
         if (Third[ 0 ]<=First[ 0 ])
             return ;
       if (! RefreshRates ())
        {
         PrevBars= iTime ( 1 );
         return ;
        }
       double sl=m_symbol. Ask ()+InpStopLoss*m_adjusted_point;
       double tp=m_symbol. Bid ()-InpTakeProfit*m_adjusted_point;
      OpenSell(sl,tp);
       return ;
     }
//--- step 2: on a step of 1 crossing haven't found. check in the arrays bars [0] and [2]
   if (First[ 0 ]>Second[ 0 ] && First[ 2 ]<Second[ 2 ]) // buy
     {
       //--- search in history
       if (SearchPositions( iTime (start_pos+ 3 ), iTime (start_pos)))
         return ;
       if (! RefreshRates ())
        {
         PrevBars= iTime ( 1 );
         return ;
        }
       double sl=m_symbol. Bid ()-InpStopLoss*m_adjusted_point;
       double tp=m_symbol. Ask ()+InpTakeProfit*m_adjusted_point;
      OpenBuy(sl,tp);
       return ;
     }
   else if (First[ 0 ]<Second[ 2 ] && First[ 1 ]>Second[ 2 ]) // sell
     {
       //--- search in history
       if (SearchPositions( iTime (start_pos+ 3 ), iTime (start_pos)))
         return ;
       if (! RefreshRates ())
        {
         PrevBars= iTime ( 1 );
         return ;
        }
       double sl=m_symbol. Ask ()+InpStopLoss*m_adjusted_point;
       double tp=m_symbol. Bid ()-InpTakeProfit*m_adjusted_point;
      OpenSell(sl,tp);
       return ;
     }


귀하의 경우(한 번에 하나의 값을 가져옴) 루프는 다음과 같이 보일 것입니다.

   int       signal= 0 ;                                 // "-1" -> Sell; "0" -> Not signal; "1" -> Buy
   double    MA1_curr=iMAGet(handle_iMA_1, 0 );           // the value of the 1st MA on i bar
   double    MA2_curr=iMAGet(handle_iMA_2, 0 );           // the value of the 1st MA on i bar
   for ( int i= 0 ;i< 100 ;i++)
     {
       double    MA1_prev=iMAGet(handle_iMA_1,i+ 1 );     // the value of the 1st MA on i+1 th bar
       double    MA2_prev=iMAGet(handle_iMA_2,i+ 1 );     // the value of the 1st MA on i+1 th bar
       //---
      signal= 0 ;                                       // "-1" -> Sell; "0" -> Not signal; "1" -> Buy
       if (MA1_prev<MA2_prev && MA1_curr>MA2_curr)
         signal= 1 ;
       else if (MA1_prev>MA2_prev && MA1_curr<MA2_curr)
         signal=- 1 ;
       //---
      MA1_curr=MA1_prev;
      MA2_curr=MA2_prev;
     }

MA1_curr - 막대 #i의 MA1 표시기 값, MA1_prev - 막대 #i+1의 MA1 표시기 값
MA2_curr - 막대 #i의 MA2 표시기 값, MA2_prev - 막대 #i+1의 MA2 표시기 값

크로스오버를 얻을 때(신호 변수가 "-1" 또는 "1"과 같음) - i의 값은 크로스오버가 발생한 막대의 번호가 됩니다.

이것은 가장 간단한 교차 검색 알고리즘이지만 가장 정확하지는 않습니다.

 
Vladimir Karputov :

예, 당신은 배열을 통하지 않고 똑같이 결정했습니다 ...


감사합니다. 다른 Expert Advisor MA Cross 가 예시로 사용되었습니다.

그 중 3, 5, ... n바를 넘은 후 진입을 하고 싶습니다.

블라디미르 카르푸토프 :

귀하의 경우(한 번에 하나의 값을 가져옴) 루프는 다음과 같이 보일 것입니다.

교차로가 발견될 때 루프에서 출구가 없는 이유는 무엇입니까?

이러한 조건을 루프 외부에 배치할 수 있습니까?

 if (signal==- 1 )num_bar_b=i;
 if (signal== 1 )num_bar_s=i;

.

 

안녕하세요. 견적 내역을 가져오기 위해 Finam 서버 또는 MFD.ru에서 내역 데이터를 다운로드하는 형식을 알려주십시오. 전혀 할 수 없습니다 .. txt에서 csv로만 저장할 수 있습니다.

 
Eol :

안녕하세요. 견적 내역을 가져오기 위해 Finam 서버 또는 MFD.ru에서 내역 데이터를 다운로드하는 형식을 알려주십시오. 전혀 할 수 없습니다 .. txt에서 csv로만 저장할 수 있습니다.


MetaTrader 5에서 아무 것도 다운로드할 필요가 없습니다. :) - 거래 서버에 연결하는 즉시 실제 틱 기록에 액세스할 수 있습니다. CopyTicks 를 바라보세요

 
Vladimir Karputov :

MetaTrader 5에서 아무 것도 다운로드할 필요가 없습니다. :) - 거래 서버에 연결하는 즉시 실제 틱 기록에 액세스할 수 있습니다. CopyTicks 를 바라보세요


10년 동안 러시아 주식에 대한 몇 분이 필요합니다.. 제 중개인이 그렇게 많이 주지도 않고 있을 것 같지도 않습니다.

 
5.0 빌드 1755

문제에 대한 설명

좋은 저녁입니다. MQL5에 대해 질문이 있습니다. 도와주시면 감사하겠습니다.
그리고 아직 5에 대한 교과서가 없습니다.
질문은 ~이야.


#property indicator_level1 30 - 매개변수를 설정합니다. 차트에 지표를 로드할 때 . 그것은 나를 재설정합니다.
프로그램 코드에서 ColorBuffer[] 함수를 사용하여 라인이 이 매개변수 아래로 떨어지면 라인을 다른 색상으로 변경합니다.

그리고 문제가 생겼습니다. 지표를 입력하고 이 매개변수를 다른 매개변수로 변경하면 지표를 로드할 때에도 필요한 곳에 레벨선이 다시 그려지고 지표 자체가 이전에 설정한 매개변수에 따라 모든 것을 계산합니다.

프로그램 실행 중에 변경할 수 있도록 이 수준에 어떻게 액세스해야 합니까?

- 이미 매개변수를 확인하려고 했습니다. 그리고 전체 표시기 회로를 다시 계산하십시오.
Vseravno는 내가 필요에 따라 다시 그리기를 원하지 않습니다!

돕다!
:)

시퀀싱

RSI.mqh

#속성 표시기_레벨1 30

#속성 표시기_레벨2 70


Calculaite 설명 코드에서. 전체를 실행하는 마지막 부분에 For 선이 이 수준 아래에 있으면 선의 색상을 변경하는 기능을 추가했습니다.
ExtColorsBuffer[i]=0;
if (ExtRSIBuffer [i]> indicator_level2&& indicator_levelcolor!=NULL) {
ExtColorsBuffer[i]=1;
}
if (ExtRSIBuffer [i]< indicator_level1&& indicator_levelcolor!=NULL) {
ExtColorsBuffer[i]=2;

예상 결과


그림과 동일할 것으로 예상되지만 인디케이터 사용 중 설정에 들어가서 Indicator_level1/2 레벨을 변경하면 인디케이터가 다시 그려지므로 선이 레벨을 넘으면 색이 변합니다. 그리고 나는 여전히 초기 수준에서 그것을 가지고 있습니다 :(

추가 정보

...

파일:
rrgpusgf5g.png  69 kb
 
Ivan Stepanenko :
5.0 빌드 1755

문제에 대한 설명

좋은 저녁입니다. MQL5에 대해 질문이 있습니다. 도와주시면 감사하겠습니다.
그리고 아직 5에 대한 교과서가 없습니다.
질문은 ~이야.


#property indicator_level1 30 - 매개변수를 설정합니다. 차트에 지표를 로드할 때 . 그것은 나를 재설정합니다.
프로그램 코드에서 ColorBuffer[] 함수를 사용하여 라인이 이 매개변수 아래로 떨어지면 라인을 다른 색상으로 변경합니다.

그리고 문제가 생겼습니다. 지표를 입력하고 이 매개변수를 다른 매개변수로 변경하면 지표를 로드할 때에도 필요한 곳에 레벨선이 다시 그려지고 지표 자체가 이전에 설정한 매개변수에 따라 모든 것을 계산합니다.

프로그램 실행 중에 변경할 수 있도록 이 수준에 어떻게 액세스해야 합니까?

- 이미 매개변수를 확인하려고 했습니다. 그리고 전체 표시기 회로를 다시 계산하십시오.
Vseravno는 내가 필요에 따라 다시 그리기를 원하지 않습니다!

돕다!
:)

시퀀싱

RSI.mqh

#속성 표시기_레벨1 30

#속성 표시기_레벨2 70


Calculaite 설명 코드에서. 전체를 실행하는 마지막 부분에 For 선이 이 수준 아래에 있으면 선의 색상을 변경하는 기능을 추가했습니다.
ExtColorsBuffer[i]=0;
if (ExtRSIBuffer [i]> indicator_level2&& indicator_levelcolor!=NULL) {
ExtColorsBuffer[i]=1;
}
if (ExtRSIBuffer [i]< indicator_level1&& indicator_levelcolor!=NULL) {
ExtColorsBuffer[i]=2;

예상 결과


그림과 같을 것으로 예상되지만 인디케이터 사용 중 설정에 들어가서 Indicator_level1/2 레벨을 변경하면 인디케이터가 다시 그려지므로 선이 레벨을 넘으면 색이 변합니다. 그리고 나는 여전히 초기 수준에서 그것을 가지고 있습니다 :(

추가 정보

...

 IndicatorSetInteger ( INDICATOR_LEVELCOLOR , 0 , clrCrimson );       // Поменяет цвет самого первого по счёту уровня на цвет Crimson
IndicatorSetInteger ( INDICATOR_LEVELCOLOR , 1 , clrDeepSkyBlue );   // Поменяет цвет второго по счёту уровня на цвет DeepSkyBlue
 
Ivan Stepanenko :
5.0 빌드 1755

문제에 대한 설명

좋은 저녁입니다. MQL5에 대해 질문이 있습니다. 도와주시면 감사하겠습니다.
그리고 아직 5학년 교과서가 없습니다.
질문은 ~이야.

그리고 별도의 주제에 대한 답변이 마음에 들지 않은 것은 무엇입니까?

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

도움이 필요합니다. MQL5 #property indicator_level

알렉세이 빅토 로프 , 2018.01.31 09:06

이고르, 우리 둘 다 틀렸어. 나는 즉시 문제를 이해하지 못했습니다 ...

#property 지시문 외에도 함수를 사용하여 표시기 수준을 설정할 수 있습니다.

 IndicatorSetDouble ( INDICATOR_LEVELVALUE , 0 , 20 );

따라서 이 레벨은 표시기의 입력 매개변수에서 설정해야 합니다. 이 경우 레벨은 주어진 값에 따라 그려지며 이 값에 따라 레벨도 변경되어야 합니다.

테스트 옵션

 #property indicator_separate_window
#property indicator_buffers      1
#property indicator_type1        DRAW_LINE
#property indicator_plots        1
#property indicator_color1        clrGreenYellow
#property indicator_level1        0
#property indicator_levelcolor    clrPurple

input double level = 0.6 ;
double buf[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 , buf, INDICATOR_DATA );
   IndicatorSetDouble ( INDICATOR_LEVELVALUE , 0 , level);
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
   int i = 0 , limit = prev_calculated == 0 ? 0 : rates_total- 1 ;
     for (i = limit; i < rates_total; i++)
     {
      buf[i] = i% 2 ;
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+

입력 매개변수에 지정된 레벨에 따라 색상을 변경하는 것은 어렵지 않기를 바랍니다.
 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

알렉세이 로디오노프 , 2018.02.06 16:31

여기서 흥미로운 것을 발견했습니다.

 Print ("Баланс на счёте = ", AccountInfoDouble ( ACCOUNT_BALANCE ));
printf (" ACCOUNT_BALANCE =  %G", AccountInfoDouble ( ACCOUNT_BALANCE ));


pintf에서 % G를 제거하면 값이 표시되지 않지만 Print에서는 % G 없이 표시됩니다.

Print에서 잔액 값은 10000.0이고 printf에서는 정수 10000입니다.

저는 Print와 printf의 차이점이 무엇인지, 그리고 가장 중요한 것은 % G 없이 표시되지 않는 이유에 대한 질문에 더 관심이 있습니다. 설명서의 내용을 이해하지 못했습니다.


 

동료들을 환영합니다! 그런 질문이 있습니다. "forex money" 포럼의 서명에 신호 위젯 을 삽입하려고 하는데 거기에서 비활성화되어 있거나 HTML이 차단되어 있습니다. URL로 변환할 수 있는 방법이 있습니까? 정상적으로 삽입되어 표시되기 때문입니다.

다음은 <iframe frameborder="0" width="220" height="140" src="https://www.mql5.com/ru/signals/widget/signal/328l?t=green&quot;>< 코드입니다. / 아이프레임>

사유: