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

 

나는 버퍼를 다룰 수 없고, 통계를 수집하고, 통계 수집이 올바르게 작동하며 표시기는 심지어 차트의 모든 것을 (각 촛불 아래 텍스트로) 그립니다. 그러나 통계로 채우기 위해 버퍼를 생성하자마자 무언가가 오류 'CntM5Buffer' - 매개변수 변환이 허용되지 않습니다. Trent_flat.mq5 서른 21, 나는 이 버퍼들을 다룰 수 없다 :(


 //+------------------------------------------------------------------+
//|                                                   Trent_flat.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link        " https://www.mql5.com "
#property version    "1.00"
#property indicator_chart_window
#property indicator_buffers 1

#include   <statistic_func.mqh>
#include <obj_text.mqh>


int CntM5Buffer[];


ENUM_TIMEFRAMES TF = PERIOD_M5 ;
int bars_on_history = 50 ;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,CntM5Buffer, INDICATOR_CALCULATIONS );
//--- установим индексацию для буфера как в таймсерии
   ArraySetAsSeries (CntM5Buffer, true );
//---
   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 start = 1 ;
   Comment ( "RATES_TOTAL = " , rates_total, "\n PREV_CALCULATED = " , prev_calculated, "\nR - P = " , rates_total-prev_calculated);
   if (rates_total - prev_calculated > 0 )
     {

       int total_bars;
       if (rates_total-prev_calculated > bars_on_history)
        {
         total_bars = bars_on_history;
        }
       else
        {
         total_bars = rates_total - prev_calculated;
        }

      Get_TF_statistic(TF,total_bars,CntM5Buffer);

     }

   return (rates_total);
  }
//+------------------------------------------------------------------+



 

설명해주세요. 무슨 문제가 있습니까?

이 코드는 터미널을 로드합니다

   for ( int i=limit;i>= 0 ;i--)
     {
      RSI_01Buffer[i]= iRSI ( NULL , 0 ,RSI_Period,RSI_Price,i);
      RSI_02Buffer[i]=iMAOnArray(RSI_01Buffer, 0 ,RSI_Period, 0 , MODE_SMA ,i);
     }

이 코드는 날아간다

   for ( int i=limit;i>= 0 ;i--)
      RSI_01Buffer[i]= iRSI ( NULL , 0 ,RSI_Period,RSI_Price,i);
   for ( int i=limit;i>= 0 ;i--)
     {
      RSI_02Buffer[i]=iMAOnArray(RSI_01Buffer, 0 ,RSI_Period, 0 , MODE_SMA ,i);
     }
 
MakarFX :

설명해주세요. 무슨 문제가 있습니까?

이 코드는 터미널을 로드합니다

이 코드는 날아간다

첫 번째 코드가 올바르지 않습니다.

먼저 "RSI_01Buffer" 배열을 수집/채운 다음 "iMAOnArray" 계산을 위한 함수에 전달해야 합니다.

두 번째 코드에서는 모든 것이 정확합니다.

 
Vitaly Muzichenko :

첫 번째 코드가 올바르지 않습니다.

먼저 "RSI_01Buffer" 배열을 수집/채운 다음 "iMAOnArray" 계산을 위한 함수에 전달해야 합니다.

두 번째 코드에서는 모든 것이 정확합니다.

매우 감사합니다. 나는 이것을 처음 접하고 당황했다.
 
Taras Slobodyanik :

표시기는 하나의 스레드에서 작동하며, 그 중 하나가 대기 중이면 터미널이 정지할 때까지 다른 모든 표시기가 대기합니다.
MT가 시작될 때 표시기의 초기화는 터미널 변수 의 초기화 전에 발생할 수 있습니다.

감사해요. 하지만 다른 옵션은 모르겠습니다.

 
Andrey Sokolov :

감사해요. 하지만 다른 옵션은 모르겠습니다.

정답은 아주 간단합니다...

 
Artyom Trishkin :

정답은 아주 간단합니다...

죄송합니다 - 이대로라면? 그게 맞을까요, 안 맞을까요? - (나도 똑같이 배우고 이해하고 올바르게 구현하려고 노력하고 있습니다.)

 //+------------------------------------------------------------------+
//|                                                  Demo_iBands.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link        " https://www.mql5.com "
#property version    "1.00"

//--- входные параметры
input int                   bands_period= 20 ;           // период скользящей средней
input int                   bands_shift= 0 ;             // сдвиг
input double                deviation= 2.0 ;             // кол-во стандартных отклонений
input ENUM_APPLIED_PRICE    applied_price= PRICE_CLOSE ; // тип цены
//--- переменная для хранения хэндла индикатора iBands
int     handle;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- создадим хэндл индикатора
   handle= iBands ( _Symbol , _Period ,bands_period,bands_shift,deviation,applied_price);
//--- если не удалось создать хэндл
   if (handle== INVALID_HANDLE )
     {
       //--- сообщим о неудаче и выведем номер ошибки
       PrintFormat ( "Не удалось создать хэндл индикатора iBands для пары %s/%s, код ошибки %d" ,
                   _Symbol ,
                   EnumToString ( _Period ),
                   GetLastError ());
       //--- работа индикатора завершается досрочно
       return ( INIT_FAILED );
     }
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   if (handle!= INVALID_HANDLE )
       IndicatorRelease (handle);
//--- почистим график при удалении индикатора
   Comment ( "" );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//--- индикаторные буферы
//--- get current Bands
   double          UpperBuffer[];
   double          LowerBuffer[];
   double          MiddleBuffer[];
   if ( CopyBuffer (handle, BASE_LINE ,-bands_shift, 1 ,MiddleBuffer)!= 1 ||
       CopyBuffer (handle, UPPER_BAND ,-bands_shift, 1 ,UpperBuffer)!= 1 ||
       CopyBuffer (handle, LOWER_BAND ,-bands_shift, 1 ,LowerBuffer)!= 1 )
     {
       Print ( "CopyBuffer from Bands failed, no data" );
       return ;
     }
//--- сформируем сообщение
   Print ( "MiddleBuffer =" ,MiddleBuffer[ 0 ], "UpperBuffer =" ,UpperBuffer[ 0 ], "LowerBuffer =" ,LowerBuffer[ 0 ]);
  }
//+------------------------------------------------------------------+
 
SanAlex :

죄송합니다 - 이대로라면? 그게 맞을까, 안 맞을까? - (나도 똑같이 배우고 이해하고 올바르게 구현하려고 노력하고 있습니다.)

에! 나는 거의 배웠습니다 - 심지어 포지션을 열 수도 있습니다

02 데모_iBands

 //+------------------------------------------------------------------+
//|                                                  Demo_iBands.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link        " https://www.mql5.com "
#property version    "1.00"

#define   BAND_MAGIC 1234501

#include <Trade\Trade.mqh>
CTrade ExtTrade;
input group               "---- Lots Parameters ----"
input double              InpLots         = 0.1 ;         // Lots
input group               "---- Bands Parameters ----"
input int                 bands_period    = 20 ;           // период скользящей средней
input int                 bands_shift     = 0 ;           // сдвиг
input double              bands_deviation = 2.0 ;         // кол-во стандартных отклонений
input ENUM_APPLIED_PRICE applied_price   = PRICE_CLOSE ; // тип цены
//--- переменная для хранения хэндла индикатора iBands
bool    ExtHedging= false ;
int     handle= 0 ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- prepare trade class to control positions if hedging mode is active
   ExtHedging=(( ENUM_ACCOUNT_MARGIN_MODE ) AccountInfoInteger ( ACCOUNT_MARGIN_MODE )== ACCOUNT_MARGIN_MODE_RETAIL_HEDGING );
   ExtTrade.SetExpertMagicNumber(BAND_MAGIC);
   ExtTrade.SetMarginMode();
   ExtTrade.SetTypeFillingBySymbol( Symbol ());
//--- создадим хэндл индикатора
   handle= iBands ( _Symbol , _Period ,bands_period,bands_shift,bands_deviation,applied_price);
//--- если не удалось создать хэндл
   if (handle== INVALID_HANDLE )
     {
       //--- сообщим о неудаче и выведем номер ошибки
       PrintFormat ( "Не удалось создать хэндл индикатора iBands для пары %s/%s, код ошибки %d" ,
                   _Symbol ,
                   EnumToString ( _Period ),
                   GetLastError ());
       //--- работа индикатора завершается досрочно
       return ( INIT_FAILED );
     }
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   if (handle!= INVALID_HANDLE )
       IndicatorRelease (handle);
//--- почистим график при удалении индикатора
   Comment ( "" );
  }
//+------------------------------------------------------------------+
//| Check for open position conditions                               |
//+------------------------------------------------------------------+
void CheckForOpen( void )
  {
   MqlRates rt[ 2 ];
//--- go trading only for first ticks of new bar
   if ( CopyRates ( _Symbol , _Period , 0 , 2 ,rt)!= 2 )
     {
       Print ( "CopyRates of " , _Symbol , " failed, no history" );
       return ;
     }
   if (rt[ 1 ].tick_volume> 1 )
       return ;
//--- get current Bands
   double MiddleBuffer[],UpperBuffer[],LowerBuffer[];
   if ( CopyBuffer (handle, BASE_LINE ,-bands_shift, 1 ,MiddleBuffer)!= 1 ||
       CopyBuffer (handle, UPPER_BAND ,-bands_shift, 1 ,UpperBuffer)!= 1 ||
       CopyBuffer (handle, LOWER_BAND ,-bands_shift, 1 ,LowerBuffer)!= 1 )
     {
       Print ( "CopyBuffer from Bands failed, no data" );
       return ;
     }
//--- check signals
   ENUM_ORDER_TYPE signal= WRONG_VALUE ;
   if (((rt[ 0 ].open>MiddleBuffer[ 0 ] && rt[ 0 ].close<MiddleBuffer[ 0 ])||
       (rt[ 0 ].open>UpperBuffer[ 0 ] && rt[ 0 ].close<UpperBuffer[ 0 ])||
       (rt[ 0 ].open>LowerBuffer[ 0 ] && rt[ 0 ].close<LowerBuffer[ 0 ])))
      signal= ORDER_TYPE_SELL ;     // sell conditions
   else
     {
       if (((rt[ 0 ].open<MiddleBuffer[ 0 ] && rt[ 0 ].close>MiddleBuffer[ 0 ])||
          (rt[ 0 ].open<UpperBuffer[ 0 ] && rt[ 0 ].close>UpperBuffer[ 0 ])||
          (rt[ 0 ].open<LowerBuffer[ 0 ] && rt[ 0 ].close>LowerBuffer[ 0 ])))
         signal= ORDER_TYPE_BUY ;   // buy conditions
     }
//--- additional checking
   if (signal!= WRONG_VALUE )
     {
       if ( TerminalInfoInteger ( TERMINAL_TRADE_ALLOWED ) && Bars ( _Symbol , _Period )> 100 )
         ExtTrade.PositionOpen( _Symbol ,signal,InpLots,
                               SymbolInfoDouble ( _Symbol ,signal== ORDER_TYPE_SELL ? SYMBOL_BID : SYMBOL_ASK ),
                               0 , 0 );
     }
  }
//+------------------------------------------------------------------+
//| Check for close position conditions                              |
//+------------------------------------------------------------------+
void CheckForClose( void )
  {
   MqlRates rt[ 2 ];
//--- go trading only for first ticks of new bar
   if ( CopyRates ( _Symbol , _Period , 0 , 2 ,rt)!= 2 )
     {
       Print ( "CopyRates of " , _Symbol , " failed, no history" );
       return ;
     }
   if (rt[ 1 ].tick_volume> 1 )
       return ;
//--- get current Bands
   double MiddleBuffer[],UpperBuffer[],LowerBuffer[];
   if ( CopyBuffer (handle, BASE_LINE ,-bands_shift, 1 ,MiddleBuffer)!= 1 ||
       CopyBuffer (handle, UPPER_BAND ,-bands_shift, 1 ,UpperBuffer)!= 1 ||
       CopyBuffer (handle, LOWER_BAND ,-bands_shift, 1 ,LowerBuffer)!= 1 )
     {
       Print ( "CopyBuffer from Bands failed, no data" );
       return ;
     }
//--- positions already selected before
   bool signal= false ;
   long type= PositionGetInteger ( POSITION_TYPE );
   if (((type==( long ) POSITION_TYPE_BUY && rt[ 0 ].open>MiddleBuffer[ 0 ] && rt[ 0 ].close<MiddleBuffer[ 0 ])||
       (type==( long ) POSITION_TYPE_BUY && rt[ 0 ].open>UpperBuffer[ 0 ] && rt[ 0 ].close<UpperBuffer[ 0 ])||
       (type==( long ) POSITION_TYPE_BUY && rt[ 0 ].open>LowerBuffer[ 0 ] && rt[ 0 ].close<LowerBuffer[ 0 ])))
      signal= true ;
   if (((type==( long ) POSITION_TYPE_SELL && rt[ 0 ].open<MiddleBuffer[ 0 ] && rt[ 0 ].close>MiddleBuffer[ 0 ])||
       (type==( long ) POSITION_TYPE_SELL && rt[ 0 ].open<UpperBuffer[ 0 ] && rt[ 0 ].close>UpperBuffer[ 0 ])||
       (type==( long ) POSITION_TYPE_SELL && rt[ 0 ].open<LowerBuffer[ 0 ] && rt[ 0 ].close>LowerBuffer[ 0 ])))
      signal= true ;
//--- additional checking
   if (signal)
     {
       if ( TerminalInfoInteger ( TERMINAL_TRADE_ALLOWED ) && Bars ( _Symbol , _Period )> 100 )
         ExtTrade.PositionClose( _Symbol , 3 );
     }
//---
  }
//+------------------------------------------------------------------+
//| Position select depending on netting or hedging                  |
//+------------------------------------------------------------------+
bool SelectPosition()
  {
   bool res= false ;
//--- check position in Hedging mode
   if (ExtHedging)
     {
       uint total= PositionsTotal ();
       for ( uint i= 0 ; i<total; i++)
        {
         string position_symbol= PositionGetSymbol (i);
         if ( _Symbol ==position_symbol && BAND_MAGIC== PositionGetInteger ( POSITION_MAGIC ))
           {
            res= true ;
             break ;
           }
        }
     }
//--- check position in Netting mode
   else
     {
       if (! PositionSelect ( _Symbol ))
         return ( false );
       else
         return ( PositionGetInteger ( POSITION_MAGIC )==BAND_MAGIC); //---check Magic number
     }
//--- result for Hedging mode
   return (res);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ( void )
  {
//---
   if (SelectPosition())
      CheckForClose();
   else
      CheckForOpen();
//---
  }
//+------------------------------------------------------------------+
 

일반적으로 문서를 이해하는 방법을 알려주시겠습니까? 텍스트로 된 간단한 그래픽 개체의 예에서도 많은 코드가 포함된 예제를 던지고 어떤 매개변수가 필요하고 어떤 매개변수가 필요하지 않은지, 일부 텍스트를 설정하거나 추세를 설정하거나 심지어 버퍼를 처리하기 위해 표시기를 이해하지 못하는 최소 매개변수를 입력해야 하고 어리석게 복사하여 붙여넣고 *** 코드를 작성해야 합니다.

 
Алексей КоКоКо :

일반적으로 문서를 이해하는 방법을 알려주시겠습니까? 텍스트로 된 간단한 그래픽 개체의 예에서도 많은 코드가 포함된 예제를 던지고 어떤 매개변수가 필요하고 어떤 매개변수가 필요하지 않은지, 일부 텍스트를 설정하거나 추세를 설정하거나 심지어 버퍼를 처리하기 위해 표시기를 이해하지 못하는 최소 매개변수를 입력해야 하고 어리석게 복사하여 붙여넣고 *** 코드를 작성해야 합니다.


이제 최소한 많은 문서가 있습니다. 기사, 예 .....