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

 
Alexey Viktorov :

따라서 mql5에서도 동일합니다. 약간 확장되기도 합니다. 그게 당신에게 필요한 것 아닌가요?

SYMBOL_TRADE_TICK_VALUE

SYMBOL_TRADE_TICK_VALUE_PROFIT

더블

SYMBOL_TRADE_TICK_VALUE_PROFIT

수익성 있는 포지션에 대한 계산된 틱 값

더블

SYMBOL_TRADE_TICK_VALUE_LOSS

손실 위치에 대한 계산된 틱 값

더블

SYMBOL_TRADE_TICK_SIZE

최소 가격 변경

더블

젠장, 나는 일반적으로 바보 입니다. 대신 TICK_VALUE TICK_SIZE를 밀어 넣었습니다 ... 자러 가야합니다
 
얘들아, 여기 뭐가 문제야, 도와줘!?
 
알렉세이 빅토로프:

가장 먼저 눈에 들어온 것은 버퍼의 순서였습니다.

빌드 버퍼는 항상 연속적이어야 합니다. 즉, 데이터 버퍼의 번호가 2와 3인 경우색상 버퍼 의 번호는 4여야 합니다.

이것이 유일한 실수가 아닌 경우 더 자세히 살펴보겠습니다.

좋아, 실제로 지침에서 그러한 기능을 찾았습니다. 여기:

MQL5 참조 / 사용자 지정 표시기 / SetIndexBuffer
".....

bool SetIndexBuffer (
    정수                                          index , // 버퍼 인덱스
    더블                                    버퍼[] , // 배열
    ENUM_INDEXBUFFER_TYPE    데이터 형식        // 저장할 내용
);

옵션

인덱스

【인】 표시기 버퍼 번호입니다. 번호는 0부터 시작합니다. 번호는 #property indicator_buffers 에 선언된 값보다 작아야 합니다.

완충기[]

【인】 사용자 지정 표시기 프로그램에서 선언된 배열입니다.

데이터 형식

【인】 표시기 배열에 저장된 데이터 유형입니다. 기본값은 INDICATOR_DATA (계산된 표시기 값)입니다. INDICATOR_COLOR_INDEX 값을 사용할 수도 있습니다. 이 경우 이 버퍼 는 이전 표시기 버퍼에 대한 색상 인덱스를 저장하기 위한 것입니다. #property indicator_colorN 라인에 최대 64 가지 색상 을 설정할 수 있습니다. INDICATOR_CALCULATIONS 값은 이 버퍼가 표시기의 중간 계산에 포함되며 렌더링용이 아님을 의미합니다.

 

리메이크 하려고 하면 더 엉망이 되었습니다. 히스토그램은 완전히 사라지고 선형 표시기 는 말할 것도 없이 이상해졌습니다. 신호는 50 이상으로 끊어졌고 주요 신호는 더 낮았습니다. 코드에도 이러한 컷오프가 없습니다.

 
Artyom Trishkin :

히스토그램이 아니라 색상 버퍼로 작업할 수 있는 링크를 알려 드렸습니다. 히스토그램을 추상화하고 색상 작업 방법에 중점을 둡니다.

나는 그것을 연구했고 새로운 것을 배우지 못했습니다. 분명히 (나에게 새로운) 그것은 당연하게도 모든 입문자에게 자명합니다. 위에서 설명한 인덱싱 중 버퍼의 상호 배열 기능 외에는 찾을 수 없었습니다. 나는 이 순서를 따랐고, 더 비참한 그림을 얻었다.

아래 사진, 파일첨부

 //+------------------------------------------------------------------+
//|                                       Stoch_HISTOGRAM_MQL5_4.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"

//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots    3

#property indicator_type1    DRAW_COLOR_HISTOGRAM2
#property indicator_color1    clrGreen , clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1 

#property indicator_type1    DRAW_LINE        // основная
#property indicator_color1    clrLightSeaGreen
#property indicator_style1    STYLE_SOLID
#property indicator_width2    3 

#property indicator_type2    DRAW_LINE        // сигнальная
#property indicator_color2    clrYellow
#property indicator_style2    STYLE_SOLID
#property indicator_width3    2 

//--- input parameters
input int InpKPeriod= 5 ;   // K period
input int InpDPeriod= 3 ;   // D period
input int InpSlowing= 3 ;   // Slowing

//--- indicator buffers
double     ColorHistogram_2Buffer1[]; 
double     ColorHistogram_2Buffer2[]; 
double     ColorHistogram_2Colors[];
double     ExtMainBuffer[];
double     ExtSignalBuffer[];
double     ExtHighesBuffer[];
double     ExtLowesBuffer[];
color      colors[]={ clrRed , clrGreen };
int        cl;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit ()
  {
//--- indicator buffers mapping

   SetIndexBuffer ( 0 ,ColorHistogram_2Buffer1, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,ColorHistogram_2Buffer2, INDICATOR_DATA );
   SetIndexBuffer ( 2 ,ColorHistogram_2Colors, INDICATOR_COLOR_INDEX );
   SetIndexBuffer ( 3 ,ExtMainBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 4 ,ExtSignalBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 5 ,ExtHighesBuffer, INDICATOR_CALCULATIONS );
   SetIndexBuffer ( 6 ,ExtLowesBuffer, INDICATOR_CALCULATIONS );  
   
   //ArraySetAsSeries(ExtMainBuffer,true);
   //ArraySetAsSeries(ExtSignalBuffer,true);
   //ArraySetAsSeries(ExtHighesBuffer,true);
   //ArraySetAsSeries(ExtLowesBuffer,true);
   //ArraySetAsSeries(ColorHistogram_2Buffer1,true);
   //ArraySetAsSeries(ColorHistogram_2Buffer2,true);
   //ArraySetAsSeries(ColorHistogram_2Colors,true);
   
   PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0 );
//--- set accuracy
   IndicatorSetInteger ( INDICATOR_DIGITS , 2 );
//--- set levels
   IndicatorSetInteger ( INDICATOR_LEVELS , 3 );
   IndicatorSetDouble ( INDICATOR_LEVELVALUE , 0 , 20 );
   IndicatorSetDouble ( INDICATOR_LEVELVALUE , 1 , 50 );
   IndicatorSetDouble ( INDICATOR_LEVELVALUE , 2 , 80 );
//--- set maximum and minimum for subwindow 
   IndicatorSetDouble ( INDICATOR_MINIMUM , 0 );
   IndicatorSetDouble ( INDICATOR_MAXIMUM , 100 );
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString ( INDICATOR_SHORTNAME , "Stoch_HISTOGRAM(" +( string )InpKPeriod+ "," +( string )InpDPeriod+ "," +( string )InpSlowing+ ")" );
   PlotIndexSetString ( 3 , PLOT_LABEL , "Main" );
   PlotIndexSetString ( 4 , PLOT_LABEL , "Signal" );
   //PlotIndexSetString(2,PLOT_LABEL,"UP");
   //PlotIndexSetString(3,PLOT_LABEL,"LOW");
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger ( 3 , PLOT_DRAW_BEGIN ,InpKPeriod+InpSlowing- 2 );
   PlotIndexSetInteger ( 4 , PLOT_DRAW_BEGIN ,InpKPeriod+InpDPeriod);
   PlotIndexSetInteger ( 5 , PLOT_DRAW_BEGIN ,InpKPeriod+InpSlowing- 2 );
   PlotIndexSetInteger ( 6 , PLOT_DRAW_BEGIN ,InpKPeriod+InpSlowing- 2 );
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Stochastic Oscillator                                            |
//+------------------------------------------------------------------+
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,k,start;
//--- check for bars count
   if (rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
       return ( 0 );
//---
   start=InpKPeriod- 1 ;
   if (start+ 1 <prev_calculated) start=prev_calculated- 2 ;
   else
     {
       for (i= 0 ;i<start;i++)
        {
         ExtLowesBuffer[i]= 0.0 ;
         ExtHighesBuffer[i]= 0.0 ;
        }
     }
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
   for (i=start;i<rates_total && ! IsStopped ();i++)
     {
       double dmin= 1000000.0 ;
       double dmax=- 1000000.0 ;
       for (k=i-InpKPeriod+ 1 ;k<=i;k++)
        {
         if (dmin>low[k])  dmin=low[k];
         if (dmax<high[k]) dmax=high[k];
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }
//--- %K
   start=InpKPeriod- 1 +InpSlowing- 1 ;
   if (start+ 1 <prev_calculated) start=prev_calculated- 2 ;
   else
     {
       for (i= 0 ;i<start;i++) ExtMainBuffer[i]= 0.0 ;
     }
//--- main cycle
   for (i=start;i<rates_total && ! IsStopped ();i++)
     {
       double sumlow= 0.0 ;
       double sumhigh= 0.0 ;
       for (k=(i-InpSlowing+ 1 );k<=i;k++)
        {
         sumlow +=(close[k]-ExtLowesBuffer[k]);
         sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
        }
       if (sumhigh== 0.0 ) ExtMainBuffer[i]= 100.0 ;
         else ExtMainBuffer[i]=sumlow/sumhigh* 100 ;
       if (ExtMainBuffer[i]> 50 ){
         cl= 1 ;
         ColorHistogram_2Buffer1[i]= 50 ; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print ( "ExtMainBuffer[i]=" ,ExtMainBuffer[i],
           " cl=" ,cl,
           " ColorHistogram_2Buffer1[i]=" ,ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=" ,ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=" ,ColorHistogram_2Colors[i]);
         } 
       if (ExtMainBuffer[i]< 50 ){
         cl= 0 ;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]= 50 ; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print ( "ExtMainBuffer[i]=" ,ExtMainBuffer[i],
           " cl=" ,cl,
           " ColorHistogram_2Buffer1[i]=" ,ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=" ,ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=" ,ColorHistogram_2Colors[i]);
         } 
     }
//--- signal
   start=InpDPeriod- 1 ;
   if (start+ 1 <prev_calculated) start=prev_calculated- 2 ;
   else
     {
       for (i= 0 ;i<start;i++) ExtSignalBuffer[i]= 0.0 ;
     }
   for (i=start;i<rates_total && ! IsStopped ();i++)
     {
       double sum= 0.0 ;
       for (k= 0 ;k<InpDPeriod;k++) sum+=ExtMainBuffer[i-k];
      ExtSignalBuffer[i]=sum/InpDPeriod;
     }
//--- OnCalculate done. Return new prev_calculated.
   return (rates_total);
  }
//+------------------------------------------------------------------+ 
파일:
 

안녕하세요.

막다른 골목에 있기 때문에 "신뢰할 수 있는" 주문 개시 알고리즘을 어디에서 볼 수 있는지 알려주세요.

문제는 계정(Alpari)이 StopLevel 및 FreezeLevel 수준이 0이고 이러한 제한 사항( https://book.mql4.com/en/appendix/limits )만 사용하면 구매할 때 손절매가 발생한다는 것입니다. Bid 수준에서 설정할 수 있으며 Ask 수준에서 판매할 때는 그렇지 않습니다. 이 경우 OrderSend는 "가격 없음" 오류(ERR_OFF_QUOTES, 코드 136)를 반환합니다.

동시에 스탑이 없거나 스탑이 50포인트 이상인 거래는 문제 없이 열립니다.

경험상 최소 SlopLoss 크기가 19포인트라는 것을 알았습니다. 프로그래밍 방식으로 이 들여쓰기를 결정하는 방법을 모르겠습니다.

 
이 수준은 시작 가격이 아니라 주문의 마감 가격에서 설정해야 합니다. 그리고 이러한 수준을 설정할 때의 종가는 설정된 값과 같아야 합니다.
 
klok79 :

안녕하세요.

막다른 골목에 있기 때문에 "신뢰할 수 있는" 주문 개시 알고리즘을 어디에서 볼 수 있는지 알려주세요.

문제는 계정(Alpari)이 StopLevel 및 FreezeLevel 수준이 0이고 이러한 제한 사항( https://book.mql4.com/en/appendix/limits )만 사용하면 구매할 때 손절매가 발생한다는 것입니다. Bid 수준에서 설정할 수 있으며 Ask 수준에서 판매할 때는 그렇지 않습니다. 이 경우 OrderSend는 "가격 없음" 오류(ERR_OFF_QUOTES, 코드 136)를 반환합니다.

동시에 스탑이 없거나 스탑이 50포인트 이상인 거래는 문제 없이 열립니다.

경험상 최소 SlopLoss 크기가 19포인트라는 것을 알았습니다. 이 들여쓰기를 프로그래밍 방식으로 결정하는 방법을 모르겠습니다.

시도 MinStopLoss = 현재 가격 +/- (MaxValue(2*Spread, StopLevel));

 
디버깅이 중지될 때 객체가 파괴되지 않는 이유는 무엇입니까? 내가 이해하는 한 OnDeinit()는 전혀 호출되지 않습니다. 디버그 중지 후 매번 터미널을 종료해야 합니다.
 

안녕하세요. 아래는 문제 코드입니다. adx_sig[9] 배열은 자주 업데이트됩니다. 제 시간에 데이터를 업데이트하는 의존도를 얻고 싶었습니다. 하지만 문제가 발생했습니다.

 //+------------------------------------------------------------------+
//|                                                          123.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
input int                   ADX_adx_period          = 14 ;                                                 // adx period ADX 
input int                   ADX_lower_level         = 20 ;                                                 // Lower level ADX 
int h_adx[ 9 ];
double adx1_buffer[ 3 ];
double adx2_buffer[ 3 ];
double adx3_buffer[ 3 ];
ENUM_TIMEFRAMES handle_period[ 9 ]={ PERIOD_CURRENT , PERIOD_M1 , PERIOD_M5 , PERIOD_M15 , PERIOD_M30 , PERIOD_H1 , PERIOD_H4 , PERIOD_D1 , PERIOD_W1 };
int adx_sig[ 9 ];
int OnInit ()
  {
//---
   for ( int i= 0 ; i< ArraySize (handle_period); i++)
     {
       //--- Установим хэндлы для индикаторов
      h_adx[i]= iADX ( _Symbol ,handle_period[i],ADX_adx_period);
         if (h_adx[i]< 0 ) 
        {
         Alert ( "Ошибка при создании индикаторов - : " , GetLastError (), "!!" );
        }
     }   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
     for ( int i= 0 ; i< ArraySize (handle_period); i++)
     {
       //--- Удаляем хэндлы для индикаторов
       IndicatorRelease (h_adx[i]);
     }
     //---
       
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   for ( int i_sig= 0 ; i_sig< ArraySize (handle_period); i_sig++)
     {
       if ( CopyBuffer (h_adx[i_sig], 0 , 0 , 3 ,adx1_buffer)< 3 ) Print ( "CopyBuffer adx1_buffer " , GetLastError ());
       if ( CopyBuffer (h_adx[i_sig], 1 , 0 , 3 ,adx2_buffer)< 3 ) Print ( "CopyBuffer adx2_buffer " , GetLastError ());
       if ( CopyBuffer (h_adx[i_sig], 2 , 0 , 3 ,adx3_buffer)< 3 ) Print ( "CopyBuffer adx3_buffer " , GetLastError ());
       if (adx3_buffer[ 1 ]<adx2_buffer[ 1 ] && adx3_buffer[ 1 ]>=ADX_lower_level && adx3_buffer[ 1 ]>adx3_buffer[ 2 ])adx_sig[i_sig]= 1 ;
       else if (adx3_buffer[ 1 ]>adx2_buffer[ 1 ] && adx3_buffer[ 1 ]>=ADX_lower_level && adx3_buffer[ 1 ]<adx3_buffer[ 2 ])adx_sig[i_sig]=- 1 ;
       else adx_sig[i_sig]= 0 ;
      }
       PrintFormat ( "ADX sig0=%i sig1=%i sig2=%i sig3=%i sig4=%i sig5=%i sig6=%i sig7=%i sig8=%i" ,adx_sig[ 0 ],adx_sig[ 1 ],adx_sig[ 2 ],adx_sig[ 3 ],adx_sig[ 4 ],adx_sig[ 5 ],adx_sig[ 6 ],adx_sig[ 7 ],adx_sig[ 8 ]); 
  }