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

 

안녕하세요, 모든 전문가와 방법을 아는 사람!

지표에서 데이터를 가져 오는 데 문제가 있습니다-누가 할 수 있는지 도와주세요....

기능 목표: 지정된 기간 동안 지표"볼린저 밴드"의 외부 선 사이의 평균 거리를 점 단위로 계산합니다.

문제의 본질 : 어떤 이유로 동일한 가격 값이 지표의 다른 버퍼에 기록되어이 막대의 모든 라인의 실제 값과 일치하지 않기 때문에 지정된 막대의 지표 라인에서 가격의 실제 값을 얻을 수 없습니다. 결과적으로 알 수없는 일부 가격 값이 다른 버퍼 (다른 요청시)에 기록되어 함수의 전체 추가 작업이 무효화됩니다.
또한이 함수와 정확히 동일한 방법을 사용하여 다른 지표에서 지표를 얻을 수 있었지만 여기서는 작동하지 않습니다....

int Bollinger_Bands(int _Average_Period, int _Number)
{
   double   Buffer_BASE_LINE[];                                                                          // Массив Буффера Линии BASE_LINE
   double   Buffer_UPPER_BAND[];                                                                         // Массив Буффера Линии UPPER_BAND
   double   Buffer_LOWER_BAND[];                                                                         // Массив Буффера Линии LOWER_BAND
   int      Bar_Cash             = _Average_Period;                                                                       // Количество плучаемых значений от индикатора
   int      Bands_Handel         = 0;                                                                       // Хендл индикатора Bollinger_Bands
   //---//
   double   Base_Line            = 0;                                                                       // Значение линии BASE_LINE
   double   Upper_Line           = 0;                                                                       // Значение линии UPPER_BAND
   double   Lower_Line           = 0;                                                                       // Значение линии LOWER_BAND
   //---//
   double   Band_Size_Buffer[];											// Буфер расчётных значений разницы между линиями индикатора 
   int      Band_Size_Total      = 0;										// Итог среднего значения расстояния между линиями в пунктах
   ENUM_APPLIED_PRICE   applied_price = PRICE_CLOSE; // тип цены 
   //---//
      ArrayResize(Band_Size_Buffer,_Average_Period+1);  
      ArrayResize(Buffer_UPPER_BAND,_Average_Period+1);
      ArrayResize(Buffer_LOWER_BAND,_Average_Period+1);
      //---//
         Bands_Handel = iBands(_Symbol,PERIOD_CURRENT,20,2,0,applied_price);
         //---//      
            CopyBuffer(Bands_Handel,0,_Number,_Average_Period,Buffer_BASE_LINE);       ArraySetAsSeries(Buffer_BASE_LINE,true);
            CopyBuffer(Bands_Handel,1,_Number,_Average_Period,Buffer_UPPER_BAND);      ArraySetAsSeries(Buffer_UPPER_BAND,true);
            CopyBuffer(Bands_Handel,2,_Number,_Average_Period,Buffer_LOWER_BAND);      ArraySetAsSeries(Buffer_LOWER_BAND,true);
            //---//

         //---//  Тут получение значений для выбранного номера бара из переменной которая передаётся в функцию (использовал как проверку получения данных по линиям)
         Base_Line   = NormalizeDouble(Buffer_BASE_LINE[_Number], _Digits);      //Alert("Base_Line[",_Number,"] = ",Base_Line);
         Upper_Line  = NormalizeDouble(Buffer_UPPER_BAND[_Number], _Digits);     //Alert("Upper_Line[",_Number,"] = ",Upper_Line);
         Lower_Line  = NormalizeDouble(Buffer_LOWER_BAND[_Number], _Digits);     //Alert("Lower_Line[",_Number,"] = ",Lower_Line);
             //---//
         
         
         //---// ** А это расчёт среднего расстояния между внешними линиями Боллинджера за указанный период. Получается 0 потому что одно число отнимается само от себя.
         for(int i=_Average_Period; i>=0; i--) { 
         //---//
            Upper_Line  = NormalizeDouble(Buffer_UPPER_BAND[i], _Digits);     //Alert("Upper_Line[",i,"] = ",Upper_Line);
            Lower_Line  = NormalizeDouble(Buffer_LOWER_BAND[i], _Digits);     //Alert("Lower_Line[",i,"] = ",Lower_Line);
            //---//
               Band_Size_Buffer[i] = NormalizeDouble( ((Upper_Line - Lower_Line) / _Point), 2);     //Alert("Band_Size_Buffer[",i,"] = ",Band_Size_Buffer[i]);
              }//---//
         
               Band_Size_Total = (int) MathMean(Band_Size_Buffer);
               //---//

   
 return(Band_Size_Total);
}
 

표준 라이브러리 사용과 혼동이 있습니다.
표준 라이브러리를 사용하여 주문을 연 후 티켓을 받으려면 어떻게 해야 하나요?
서버 응답이 이미 여기에 수신되었는지 확인할 수 있나요? 서버의 응답을 기다리는 동안 터미널이 중단되나요? 명확하지 않습니다.

                     if(!m_trade.BuyLimit(...))
                       {
                        ...
                       }
                     else
                       {
                       int ticket=m_trade.RequestOrder();  // ??? 
                        ...
                        a[n]=ticket; 
                       }

MQ4에서는 모든 것이 간단했습니다:

         ticket=OrderSend(...);
         if(ticket>0)
           {
            ...
            a[n]=ticket;
           }
 
Nauris Zukas 표준 라이브러리 사용과 혼동이 있습니다.
표준 라이브러리를 사용하여 주문을 연 후 티켓을 받으려면 어떻게 해야 하나요?
서버 응답이 이미 여기에 수신되었는지 확인할 수 있나요? 서버의 응답을 기다리는 동안 터미널이 중단되나요? 이해가 되지 않습니다.

MQ4에서는 모든 것이 간단했습니다:

온트레이드트랜잭션() 이벤트 처리를 사용하는 것이 좋습니다.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Функции обработки событий - Функции - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov #:

온트레이드트랜스잭션() 이벤트 핸들러를 사용하는 것이 좋습니다.

고마워요! 그런 다음 몇 가지 함수를 다시 실행해야 합니다.

mql5에서 슬리피지를 계산하는 함수를 어디선가 본 적이 있을까요?

 
Nauris Zukas #:

고마워요! 그럼 몇 가지 기능을 다시 실행해야겠네요.

mql5에서 미끄러짐을 계산하는 함수를 어디선가 본 적이 있나요?

왜 찾아야 하나요? 온트레이드트랜잭션에서는 주문이 들어온 이벤트를 포착하고 주문 가격을 읽은 다음 거래를 포착하고 거래 가격을 읽고 이 가격의 차액을 구합니다.

글로벌 수준에서 변수를 생성하고 주문을 보낼 때 가격을 쓰고 OnTradeTransaction에서 거래 가격을 가져올 수도 있습니다 ...

 

Alexey Viktorov #:

글로벌 수준에서 변수를 생성하고 주문이 전송될 때 가격을 입력한 다음 OnTradeTransaction.... 에서 거래 가격을 가져올 수도 있습니다.

이 옵션은 확실히 없습니다. 많은 주문을 보낼 경우 티켓 없이 가격이 필요한데 OnTradeTransaction은 어떻게 처리하나요?

 
Nauris Zukas #:

이 옵션은 확실히 없습니다. 많은 주문을 보낼 경우 티켓 없이 가격을 책정할 수 있나요? 온트레이드트랜잭션은 이를 어떻게 처리하나요?

포지션 ID에 따라 문제없이 정렬됩니다.

거래를 받고, 포지션 ID를 가져와서 이 ID로 기록에서 주문과 거래를 가져와서 주문과 거래 가격을 IN으로 읽으면 됩니다.

설명서를 읽어보세요. 거기에서 많은 흥미로운 것을 찾을 수 있습니다.

 

Alexey Viktorov #:

거래를 받고, 포지션 ID를 가져와서 이 ID로 기록에서 주문과 거래를 가져와서 주문과 거래 가격을 IN으로 읽습니다.

간단합니다! 그러나 저장된 가격으로 두 번째 옵션은 주문을 보내는 동안 글로벌 수준에서 주문을 보낸 다음 OnTradeTransaction에서 거래 가격을 가져옵니다...이것은 저에게 명확하지 않습니다. 주문을 보내는 동안 (주문에) 연결되지 않은 가격을 저장하는 이유는 무엇입니까?


간단히 말해서, 저는 이렇게 할 것입니다 - 거래를 가져온 다음 다른 모든 것을 가져옵니다.

 
Adam Dee "볼린저 밴드" 지표의 외부 선 사이의 평균 거리를 포인트 단위로 계산합니다.

문제의 본질 : 어떤 이유로 동일한 가격 값이 지표의 다른 버퍼에 기록되어이 막대의 모든 라인의 실제 값과 일치하지 않기 때문에 지정된 막대의 지표 라인에서 가격의 실제 값을 얻을 수 없습니다. 결과적으로 알 수없는 일부 가격 값이 다른 버퍼 (다른 요청시)에 기록되어 함수의 전체 추가 작업이 무효화됩니다.
또한이 함수와 정확히 동일한 방법을 사용하여 다른 지표에서 지표를 얻을 수 있었지만 여기서는 작동하지 않습니다....

볼린저는 SMA +- N * 표준 편차입니다.

표준 편차와 SMA에 대한 자체 지표가 있습니다. 그러나 그것들 없이도 모두 계산됩니다. 참고서를 가져 가면 여기에 공식이 있습니다. 여기에서 기본값에 따라 현재 4 시그마에 해당하는 "선 사이의 평균 포인트 거리"를 찾을 수 있습니다.
그리고 평균 (어느 기간 동안?), 계산하는 데 신경을 쓰시나요?

사실상 표준 편차의 평균을 알고 싶을 것입니다.

 
Nauris Zukas #:

이것은 분명합니다! 그러나 주문을 보내는 동안 글로벌 수준에서 가격을 저장 한 다음 거래 가격을 얻기 위해 OnTradeTransaction에서 가격을 저장하는 두 번째 옵션은 명확하지 않습니다... 이것은 저에게 명확하지 않습니다. 주문을 전송하는 동안 (주문에) 연결되지 않은 가격을 저장하는 이유는 무엇입니까?


간단히 말해, 거래를 받은 다음 다른 모든 것을 가져오는 방식입니다.

이것은 모든 것이 제 시간에있을 때 차분한 거래에 대해 말했습니다... 이것을 고려하지 않고...

트레이딩, 자동매매 시스템 및 테스트 트레이딩 전략에 관한 포럼

초보자의 질문 MQL5 MT5 메타트레이더 5

나우리스 주카스, 2022.06.11 17:49

이 옵션은 확실히 나왔습니다. 많은 주문을 보낼 경우 티켓이 없는 경우 가격은 얼마인가요, 온트레이드트랜잭션은 어떻게 처리하나요?


사유: