prev_calculated - 페이지 9 1234567891011121314 새 코멘트 Alexey Viktorov 2016.10.19 07:19 #81 Alexey Kozitsyn : 예, 주기에 대해, 아마도 너무 많습니다. 그러나 prev_calculated = 0(이전에 채워진 버퍼 사용)으로 이 버퍼에서 일부 값이 재설정되면 아마도 이것은 실수일 수 있습니다. 이제 확인해보자... 정확하게 재설정되지는 않지만 전체 기록에 대한 전체 지표가 다시 계산됩니다. 따라서 맨 오른쪽 버퍼 인덱스만 채워야 하지만 왼쪽으로 이동하면 이러한 값이 유지되어야 하는 경우 두 가지 옵션이 있습니다. 1. 지시자 버퍼를 초기화 할 때 방해가 되고 정리가 필요한 쓰레기로 가득 차 있다. 2. 청소했지만 prev_calculated = 0이면 버퍼가 다시 지워지고 누적된 모든 값이 제거됩니다. 일반적으로 솔루션은 매우 간단합니다. prev_calculated = 0 플래그와 함께 이 문제를 해결합니다. Dmitry Fedoseev 2016.10.19 07:23 #82 Alexey Viktorov : ... 일반적으로 솔루션은 매우 간단합니다. prev_calculated = 0 플래그와 함께 이 문제를 해결합니다. 결정하지 않습니다. 몇 개의 막대가 지속되는 연결 해제가 있을 것이며, 여러 막대는 가비지로 초기화되지 않을 것입니다. [삭제] 2016.10.19 07:24 #83 Alexey Viktorov : 가장하지 마십시오 ... 모든 것이 명확하지만 그림은 특히 당신을위한 것입니다 컴퓨터가 꺼지지 않고 작동하고 차트가 닫히지 않고 차트에서 표시기가 제거되지 않았습니다 ... 질문: 2분 막대는 어디로 갔습니까??? 코드에 버그가 있을 가능성이 큽니다. 이제 테스트 표시기를 작성했습니다. 새로 고침 버튼으로 재설정할 때 버퍼의 크기가 변경되지 않고 버퍼의 데이터가 변경되지 않습니다... #property indicator_buffers 1 #property indicator_plots 1 #property indicator_chart_window #property indicator_type1 DRAW_NONE //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double buf[]; const double _price= 98000 ; bool _firstLaunch= true ; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit () { SetIndexBuffer ( 0 ,buf); //--- 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[]) { if (prev_calculated== 0 ) { if (_firstLaunch) { Print ( __FUNCTION__ , ": Первый запуск! Размер буфера = " , ArraySize (buf)); ArrayInitialize (buf,_price); _firstLaunch= false ; } else { Print ( __FUNCTION__ , ": prev_calculated после обновления = " ,prev_calculated, ". Размер буфера = " , ArraySize (buf)); //--- Проверяем отличие значений от эталонного for ( int i=rates_total- 1 ; i>= 0 ; i--) if (buf[i]!=_price) Print ( __FUNCTION__ , ": Значение #" ,i, " '" + DoubleToString (buf[i], _Digits )+ "' отличается от эталонного '" + DoubleToString (_price, _Digits )); } } else { if (rates_total>prev_calculated) buf[rates_total- 1 ]=_price; } return (rates_total); } prev_calculated Any questions from newcomers MQL4 및 MQL5에 대한 Dmitry Fedoseev 2016.10.19 07:25 #84 prev_calculated에서 Rates_total로 버퍼를 지워야 합니다. [삭제] 2016.10.19 07:26 #85 아니면, 위에서 Dmitry가 말했듯이 여러 마디에서 연결이 끊어졌습니다... 그런데, 연결이 끊어지면 prev_calculated도 0을 반환합니까? Alexey Viktorov 2016.10.19 07:28 #86 Dmitry Fedoseev : 스튜디오 코드. 웃으면서 설명합시다. 나는 이미 재미있다. /********************************************************************\| BalansEquityTest.mq5 || Viktorov || v4forex@yandex.ru |\********************************************************************/ #property copyright "Viktorov" #property link "v4forex@yandex.ru" #property version "1.00" #property indicator_separate_window #property indicator_buffers 6 #property indicator_plots 3 #property indicator_type1 DRAW_COLOR_LINE #property indicator_color1 clrGold , clrGreen , clrRed #property indicator_width1 2 #property indicator_label1 "Balance" #property indicator_type2 DRAW_HISTOGRAM2 #property indicator_color2 clrCrimson #property indicator_width2 2 #property indicator_label2 "EquityMin" #property indicator_type3 DRAW_HISTOGRAM2 #property indicator_color3 clrDarkViolet #property indicator_width3 2 #property indicator_label3 "EquityMax" double balance[]; double clrBalance[]; double equityMaxB[]; double equityMinB[]; double equityMax[]; double equityMin[]; double maxEquity, minEquity; bool flag = true ; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit () { //--- indicator buffers mapping SetIndexBuffer ( 0 , balance, INDICATOR_DATA ); SetIndexBuffer ( 1 , clrBalance, INDICATOR_COLOR_INDEX ); SetIndexBuffer ( 2 , equityMin, INDICATOR_DATA ); SetIndexBuffer ( 3 , equityMinB, INDICATOR_DATA ); SetIndexBuffer ( 4 , equityMax, INDICATOR_DATA ); SetIndexBuffer ( 5 , equityMaxB, INDICATOR_DATA ); PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0.0 ); PlotIndexSetDouble ( 1 , PLOT_EMPTY_VALUE , 0.0 ); PlotIndexSetDouble ( 2 , PLOT_EMPTY_VALUE , 0.0 ); PlotIndexSetDouble ( 3 , PLOT_EMPTY_VALUE , 0.0 ); PlotIndexSetDouble ( 4 , PLOT_EMPTY_VALUE , 0.0 ); ArraySetAsSeries (balance, true ); ArraySetAsSeries (clrBalance, true ); ArraySetAsSeries (equityMax, true ); ArraySetAsSeries (equityMaxB, true ); ArraySetAsSeries (equityMin, true ); ArraySetAsSeries (equityMinB, true ); IndicatorSetInteger ( INDICATOR_DIGITS , 2 ); IndicatorSetString ( INDICATOR_SHORTNAME , "Show Money" ); //--- 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[]) { //--- if (prev_calculated == 0 ) { Print ( "prev_calculated = " , prev_calculated); if (flag) { ArrayInitialize (balance, 0.0 ); ArrayInitialize (equityMax, 0.0 ); ArrayInitialize (equityMaxB, 0.0 ); ArrayInitialize (equityMin, 0.0 ); ArrayInitialize (equityMinB, 0.0 ); flag = false ; } return (rates_total); } double bal = NormalizeDouble ( AccountInfoDouble ( ACCOUNT_BALANCE ), 2 ); double equity = NormalizeDouble ( AccountInfoDouble ( ACCOUNT_EQUITY ), 2 ); if (rates_total > prev_calculated) { minEquity = 0 ; maxEquity = 0 ; } minEquity = NormalizeDouble ( fmin ((minEquity == 0 ? bal : minEquity), equity), 2 ); maxEquity = NormalizeDouble ( fmax (maxEquity, equity), 2 ); balance[ 0 ] = bal; clrBalance[ 0 ] = 0.0 ; equityMinB[ 0 ] = balance[ 0 ]; equityMin[ 0 ] = minEquity; equityMaxB[ 0 ] = balance[ 0 ]; equityMax[ 0 ] = maxEquity; if (balance[ 0 ] > balance[ 1 ]) clrBalance[ 0 ] = 1.0 ; if (balance[ 0 ] < balance[ 1 ]) clrBalance[ 0 ] = 2.0 ; Comment ( PositionsTotal ()); //--- return value of prev_calculated for next call return (rates_total); } //+------------------------------------------------------------------+ 밤 동안 prev_calculate의 재설정이 너무 많았습니다. 2016.10 . 19 08 : 42 : 23.309 BalansEquityTest (EURUSD,M1) prev_calculated = 0 2016.10 . 19 05 : 47 : 04.915 BalansEquityTest (EURUSD,M1) prev_calculated = 0 2016.10 . 19 05 : 47 : 04.075 BalansEquityTest (EURUSD,M1) prev_calculated = 0 2016.10 . 19 04 : 46 : 15.300 BalansEquityTest (EURUSD,M1) prev_calculated = 0 2016.10 . 19 04 : 46 : 15.030 BalansEquityTest (EURUSD,M1) prev_calculated = 0 2016.10 . 19 04 : 45 : 37.590 BalansEquityTest (EURUSD,M1) prev_calculated = 0 2016.10 . 19 04 : 45 : 37.100 BalansEquityTest (EURUSD,M1) prev_calculated = 0 2016.10 . 19 01 : 40 : 31.224 BalansEquityTest (EURUSD,M1) prev_calculated = 0 2016.10 . 19 00 : 00 : 32.196 BalansEquityTest (EURUSD,M1) prev_calculated = 0 2016.10 . 19 00 : 00 : 31.806 BalansEquityTest (EURUSD,M1) prev_calculated = 0 2016.10 . 18 20 : 33 : 02.954 BalansEquityTest (EURUSD,M1) prev_calculated = 0 // Это время последнего запуска индикатора. prev_calculated Questions from Beginners MQL5 Coding help [삭제] 2016.10.19 07:28 #87 Dmitry Fedoseev : prev_calculated에서 Rates_total로 버퍼를 지워야 합니다. 이것이 내 대답이라면 표시기가 처음 실행될 때 버퍼가 주어진 값으로 완전히 초기화됩니다. 새로운 막대 가 형성되면 새로운 값이 추가됩니다. Dmitry Fedoseev 2016.10.19 07:31 #88 Alexey Kozitsyn : 아니면, 위에서 Dmitry가 말했듯이 여러 마디에서 연결이 끊어졌습니다... 그런데, 연결이 끊어지면 prev_calculated도 0을 반환합니까? 옛날 옛적에는 모든 문제에 대해 prev_calculated가 0을 반환했습니다. 그런 다음 포럼에서 항상 0으로 재설정할 수는 없으며 어떤 경우에는 마지막 계산까지 가능하다는 토론이 있었습니다. value, Slava가 주제에 참여하고 문제를 처리하기로 약속했습니다. 얼마 후 prev_calculated에 중간 값이 있는 경우가 있습니다. 지금은 상황이 어떤지 모르겠지만 prev_calculated가 반환하는 내용을 매일 따르지는 않습니다. Dmitry Fedoseev 2016.10.19 07:32 #89 Alexey Kozitsyn : 이것이 내 대답이라면 표시기가 처음 실행될 때 버퍼가 주어진 값으로 완전히 초기화됩니다. 새로운 막대 가 형성되면 새로운 값이 추가됩니다. 당신에게 아닙니다. [삭제] 2016.10.19 07:44 #90 Alexey Viktorov : 나는 이미 재미있다. /********************************************************************\| BalansEquityTest.mq5 || Viktorov || v4forex@yandex.ru |\********************************************************************/ #property copyright "Viktorov" #property link "v4forex@yandex.ru" #property version "1.00" #property indicator_separate_window #property indicator_buffers 6 #property indicator_plots 3 #property indicator_type1 DRAW_COLOR_LINE #property indicator_color1 clrGold , clrGreen , clrRed #property indicator_width1 2 #property indicator_label1 "Balance" #property indicator_type2 DRAW_HISTOGRAM2 #property indicator_color2 clrCrimson #property indicator_width2 2 #property indicator_label2 "EquityMin" #property indicator_type3 DRAW_HISTOGRAM2 #property indicator_color3 clrDarkViolet #property indicator_width3 2 #property indicator_label3 "EquityMax" double balance[]; double clrBalance[]; double equityMaxB[]; double equityMinB[]; double equityMax[]; double equityMin[]; double maxEquity, minEquity; bool flag = true ; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit () { //--- indicator buffers mapping SetIndexBuffer ( 0 , balance, INDICATOR_DATA ); SetIndexBuffer ( 1 , clrBalance, INDICATOR_COLOR_INDEX ); SetIndexBuffer ( 2 , equityMin, INDICATOR_DATA ); SetIndexBuffer ( 3 , equityMinB, INDICATOR_DATA ); SetIndexBuffer ( 4 , equityMax, INDICATOR_DATA ); SetIndexBuffer ( 5 , equityMaxB, INDICATOR_DATA ); PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0.0 ); PlotIndexSetDouble ( 1 , PLOT_EMPTY_VALUE , 0.0 ); PlotIndexSetDouble ( 2 , PLOT_EMPTY_VALUE , 0.0 ); PlotIndexSetDouble ( 3 , PLOT_EMPTY_VALUE , 0.0 ); PlotIndexSetDouble ( 4 , PLOT_EMPTY_VALUE , 0.0 ); ArraySetAsSeries (balance, true ); ArraySetAsSeries (clrBalance, true ); ArraySetAsSeries (equityMax, true ); ArraySetAsSeries (equityMaxB, true ); ArraySetAsSeries (equityMin, true ); ArraySetAsSeries (equityMinB, true ); IndicatorSetInteger ( INDICATOR_DIGITS , 2 ); IndicatorSetString ( INDICATOR_SHORTNAME , "Show Money" ); //--- 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[]) { //--- if (prev_calculated == 0 ) { Print ( "prev_calculated = " , prev_calculated); if (flag) { ArrayInitialize (balance, 0.0 ); ArrayInitialize (equityMax, 0.0 ); ArrayInitialize (equityMaxB, 0.0 ); ArrayInitialize (equityMin, 0.0 ); ArrayInitialize (equityMinB, 0.0 ); flag = false ; } return (rates_total); } double bal = NormalizeDouble ( AccountInfoDouble ( ACCOUNT_BALANCE ), 2 ); double equity = NormalizeDouble ( AccountInfoDouble ( ACCOUNT_EQUITY ), 2 ); if (rates_total > prev_calculated) { minEquity = 0 ; maxEquity = 0 ; } minEquity = NormalizeDouble ( fmin ((minEquity == 0 ? bal : minEquity), equity), 2 ); maxEquity = NormalizeDouble ( fmax (maxEquity, equity), 2 ); balance[ 0 ] = bal; clrBalance[ 0 ] = 0.0 ; equityMinB[ 0 ] = balance[ 0 ]; equityMin[ 0 ] = minEquity; equityMaxB[ 0 ] = balance[ 0 ]; equityMax[ 0 ] = maxEquity; if (balance[ 0 ] > balance[ 1 ]) clrBalance[ 0 ] = 1.0 ; if (balance[ 0 ] < balance[ 1 ]) clrBalance[ 0 ] = 2.0 ; Comment ( PositionsTotal ()); //--- return value of prev_calculated for next call return (rates_total); } //+------------------------------------------------------------------+ 잠재적으로 jamb는 다음과 같을 수 있습니다. if (rates_total > prev_calculated) { minEquity = 0 ; maxEquity = 0 ; } minEquity = NormalizeDouble ( fmin ((minEquity == 0 ? bal : minEquity), equity), 2 ); maxEquity = NormalizeDouble ( fmax (maxEquity, equity), 2 ); 새 막대가 오면 값을 0으로 재설정합니다. 그러나 권장하지 않는 방식으로 minEquity와 0이 같은지 확인합니다. 내 말의 확인 - 당신의 그림. 그것은 당신이 말했듯이 "쓰레기"값이 거의 0에 있음을 보여줍니다. 그리고 당연히 "가비지" 값이 있는 데이터 창을 그림에 추가하는 것이 좋습니다. 1234567891011121314 새 코멘트 트레이딩 기회를 놓치고 있어요: 무료 트레이딩 앱 복사용 8,000 이상의 시그널 금융 시장 개척을 위한 경제 뉴스 등록 로그인 공백없는 라틴 문자 비밀번호가 이 이메일로 전송될 것입니다 오류 발생됨 Google으로 로그인 웹사이트 정책 및 이용약관에 동의합니다. 계정이 없으시면, 가입하십시오 MQL5.com 웹사이트에 로그인을 하기 위해 쿠키를 허용하십시오. 브라우저에서 필요한 설정을 활성화하시지 않으면, 로그인할 수 없습니다. 사용자명/비밀번호를 잊으셨습니까? Google으로 로그인
예, 주기에 대해, 아마도 너무 많습니다. 그러나 prev_calculated = 0(이전에 채워진 버퍼 사용)으로 이 버퍼에서 일부 값이 재설정되면 아마도 이것은 실수일 수 있습니다. 이제 확인해보자...
정확하게 재설정되지는 않지만 전체 기록에 대한 전체 지표가 다시 계산됩니다. 따라서 맨 오른쪽 버퍼 인덱스만 채워야 하지만 왼쪽으로 이동하면 이러한 값이 유지되어야 하는 경우 두 가지 옵션이 있습니다.
1. 지시자 버퍼를 초기화 할 때 방해가 되고 정리가 필요한 쓰레기로 가득 차 있다.
2. 청소했지만 prev_calculated = 0이면 버퍼가 다시 지워지고 누적된 모든 값이 제거됩니다.
일반적으로 솔루션은 매우 간단합니다. prev_calculated = 0 플래그와 함께 이 문제를 해결합니다.
...
일반적으로 솔루션은 매우 간단합니다. prev_calculated = 0 플래그와 함께 이 문제를 해결합니다.
가장하지 마십시오 ... 모든 것이 명확하지만 그림은 특히 당신을위한 것입니다
컴퓨터가 꺼지지 않고 작동하고 차트가 닫히지 않고 차트에서 표시기가 제거되지 않았습니다 ...
질문: 2분 막대는 어디로 갔습니까???
코드에 버그가 있을 가능성이 큽니다. 이제 테스트 표시기를 작성했습니다. 새로 고침 버튼으로 재설정할 때 버퍼의 크기가 변경되지 않고 버퍼의 데이터가 변경되지 않습니다...
#property indicator_plots 1
#property indicator_chart_window
#property indicator_type1 DRAW_NONE
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double buf[];
const double _price= 98000 ;
bool _firstLaunch= true ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
SetIndexBuffer ( 0 ,buf);
//---
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[])
{
if (prev_calculated== 0 )
{
if (_firstLaunch)
{
Print ( __FUNCTION__ , ": Первый запуск! Размер буфера = " , ArraySize (buf));
ArrayInitialize (buf,_price);
_firstLaunch= false ;
}
else
{
Print ( __FUNCTION__ , ": prev_calculated после обновления = " ,prev_calculated, ". Размер буфера = " , ArraySize (buf));
//--- Проверяем отличие значений от эталонного
for ( int i=rates_total- 1 ; i>= 0 ; i--)
if (buf[i]!=_price)
Print ( __FUNCTION__ , ": Значение #" ,i, " '" + DoubleToString (buf[i], _Digits )+
"' отличается от эталонного '" + DoubleToString (_price, _Digits ));
}
}
else
{
if (rates_total>prev_calculated)
buf[rates_total- 1 ]=_price;
}
return (rates_total);
}
prev_calculated에서 Rates_total로 버퍼를 지워야 합니다.
스튜디오 코드. 웃으면서 설명합시다.
나는 이미 재미있다.
| BalansEquityTest.mq5 |
| Viktorov |
| v4forex@yandex.ru |
\********************************************************************/
#property copyright "Viktorov"
#property link "v4forex@yandex.ru"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots 3
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_color1 clrGold , clrGreen , clrRed
#property indicator_width1 2
#property indicator_label1 "Balance"
#property indicator_type2 DRAW_HISTOGRAM2
#property indicator_color2 clrCrimson
#property indicator_width2 2
#property indicator_label2 "EquityMin"
#property indicator_type3 DRAW_HISTOGRAM2
#property indicator_color3 clrDarkViolet
#property indicator_width3 2
#property indicator_label3 "EquityMax"
double balance[];
double clrBalance[];
double equityMaxB[];
double equityMinB[];
double equityMax[];
double equityMin[];
double maxEquity, minEquity;
bool flag = true ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
//--- indicator buffers mapping
SetIndexBuffer ( 0 , balance, INDICATOR_DATA );
SetIndexBuffer ( 1 , clrBalance, INDICATOR_COLOR_INDEX );
SetIndexBuffer ( 2 , equityMin, INDICATOR_DATA );
SetIndexBuffer ( 3 , equityMinB, INDICATOR_DATA );
SetIndexBuffer ( 4 , equityMax, INDICATOR_DATA );
SetIndexBuffer ( 5 , equityMaxB, INDICATOR_DATA );
PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0.0 );
PlotIndexSetDouble ( 1 , PLOT_EMPTY_VALUE , 0.0 );
PlotIndexSetDouble ( 2 , PLOT_EMPTY_VALUE , 0.0 );
PlotIndexSetDouble ( 3 , PLOT_EMPTY_VALUE , 0.0 );
PlotIndexSetDouble ( 4 , PLOT_EMPTY_VALUE , 0.0 );
ArraySetAsSeries (balance, true );
ArraySetAsSeries (clrBalance, true );
ArraySetAsSeries (equityMax, true );
ArraySetAsSeries (equityMaxB, true );
ArraySetAsSeries (equityMin, true );
ArraySetAsSeries (equityMinB, true );
IndicatorSetInteger ( INDICATOR_DIGITS , 2 );
IndicatorSetString ( INDICATOR_SHORTNAME , "Show Money" );
//---
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[])
{
//---
if (prev_calculated == 0 )
{
Print ( "prev_calculated = " , prev_calculated);
if (flag)
{
ArrayInitialize (balance, 0.0 );
ArrayInitialize (equityMax, 0.0 );
ArrayInitialize (equityMaxB, 0.0 );
ArrayInitialize (equityMin, 0.0 );
ArrayInitialize (equityMinB, 0.0 );
flag = false ;
}
return (rates_total);
}
double bal = NormalizeDouble ( AccountInfoDouble ( ACCOUNT_BALANCE ), 2 );
double equity = NormalizeDouble ( AccountInfoDouble ( ACCOUNT_EQUITY ), 2 );
if (rates_total > prev_calculated)
{
minEquity = 0 ;
maxEquity = 0 ;
}
minEquity = NormalizeDouble ( fmin ((minEquity == 0 ? bal : minEquity), equity), 2 );
maxEquity = NormalizeDouble ( fmax (maxEquity, equity), 2 );
balance[ 0 ] = bal;
clrBalance[ 0 ] = 0.0 ;
equityMinB[ 0 ] = balance[ 0 ];
equityMin[ 0 ] = minEquity;
equityMaxB[ 0 ] = balance[ 0 ];
equityMax[ 0 ] = maxEquity;
if (balance[ 0 ] > balance[ 1 ])
clrBalance[ 0 ] = 1.0 ;
if (balance[ 0 ] < balance[ 1 ])
clrBalance[ 0 ] = 2.0 ;
Comment ( PositionsTotal ());
//--- return value of prev_calculated for next call
return (rates_total);
}
//+------------------------------------------------------------------+
밤 동안 prev_calculate의 재설정이 너무 많았습니다.
2016.10 . 19 05 : 47 : 04.915 BalansEquityTest (EURUSD,M1) prev_calculated = 0
2016.10 . 19 05 : 47 : 04.075 BalansEquityTest (EURUSD,M1) prev_calculated = 0
2016.10 . 19 04 : 46 : 15.300 BalansEquityTest (EURUSD,M1) prev_calculated = 0
2016.10 . 19 04 : 46 : 15.030 BalansEquityTest (EURUSD,M1) prev_calculated = 0
2016.10 . 19 04 : 45 : 37.590 BalansEquityTest (EURUSD,M1) prev_calculated = 0
2016.10 . 19 04 : 45 : 37.100 BalansEquityTest (EURUSD,M1) prev_calculated = 0
2016.10 . 19 01 : 40 : 31.224 BalansEquityTest (EURUSD,M1) prev_calculated = 0
2016.10 . 19 00 : 00 : 32.196 BalansEquityTest (EURUSD,M1) prev_calculated = 0
2016.10 . 19 00 : 00 : 31.806 BalansEquityTest (EURUSD,M1) prev_calculated = 0
2016.10 . 18 20 : 33 : 02.954 BalansEquityTest (EURUSD,M1) prev_calculated = 0 // Это время последнего запуска индикатора.
prev_calculated에서 Rates_total로 버퍼를 지워야 합니다.
아니면, 위에서 Dmitry가 말했듯이 여러 마디에서 연결이 끊어졌습니다... 그런데, 연결이 끊어지면 prev_calculated도 0을 반환합니까?
옛날 옛적에는 모든 문제에 대해 prev_calculated가 0을 반환했습니다. 그런 다음 포럼에서 항상 0으로 재설정할 수는 없으며 어떤 경우에는 마지막 계산까지 가능하다는 토론이 있었습니다. value, Slava가 주제에 참여하고 문제를 처리하기로 약속했습니다.
얼마 후 prev_calculated에 중간 값이 있는 경우가 있습니다. 지금은 상황이 어떤지 모르겠지만 prev_calculated가 반환하는 내용을 매일 따르지는 않습니다.
이것이 내 대답이라면 표시기가 처음 실행될 때 버퍼가 주어진 값으로 완전히 초기화됩니다. 새로운 막대 가 형성되면 새로운 값이 추가됩니다.
나는 이미 재미있다.
| BalansEquityTest.mq5 |
| Viktorov |
| v4forex@yandex.ru |
\********************************************************************/
#property copyright "Viktorov"
#property link "v4forex@yandex.ru"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots 3
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_color1 clrGold , clrGreen , clrRed
#property indicator_width1 2
#property indicator_label1 "Balance"
#property indicator_type2 DRAW_HISTOGRAM2
#property indicator_color2 clrCrimson
#property indicator_width2 2
#property indicator_label2 "EquityMin"
#property indicator_type3 DRAW_HISTOGRAM2
#property indicator_color3 clrDarkViolet
#property indicator_width3 2
#property indicator_label3 "EquityMax"
double balance[];
double clrBalance[];
double equityMaxB[];
double equityMinB[];
double equityMax[];
double equityMin[];
double maxEquity, minEquity;
bool flag = true ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
//--- indicator buffers mapping
SetIndexBuffer ( 0 , balance, INDICATOR_DATA );
SetIndexBuffer ( 1 , clrBalance, INDICATOR_COLOR_INDEX );
SetIndexBuffer ( 2 , equityMin, INDICATOR_DATA );
SetIndexBuffer ( 3 , equityMinB, INDICATOR_DATA );
SetIndexBuffer ( 4 , equityMax, INDICATOR_DATA );
SetIndexBuffer ( 5 , equityMaxB, INDICATOR_DATA );
PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0.0 );
PlotIndexSetDouble ( 1 , PLOT_EMPTY_VALUE , 0.0 );
PlotIndexSetDouble ( 2 , PLOT_EMPTY_VALUE , 0.0 );
PlotIndexSetDouble ( 3 , PLOT_EMPTY_VALUE , 0.0 );
PlotIndexSetDouble ( 4 , PLOT_EMPTY_VALUE , 0.0 );
ArraySetAsSeries (balance, true );
ArraySetAsSeries (clrBalance, true );
ArraySetAsSeries (equityMax, true );
ArraySetAsSeries (equityMaxB, true );
ArraySetAsSeries (equityMin, true );
ArraySetAsSeries (equityMinB, true );
IndicatorSetInteger ( INDICATOR_DIGITS , 2 );
IndicatorSetString ( INDICATOR_SHORTNAME , "Show Money" );
//---
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[])
{
//---
if (prev_calculated == 0 )
{
Print ( "prev_calculated = " , prev_calculated);
if (flag)
{
ArrayInitialize (balance, 0.0 );
ArrayInitialize (equityMax, 0.0 );
ArrayInitialize (equityMaxB, 0.0 );
ArrayInitialize (equityMin, 0.0 );
ArrayInitialize (equityMinB, 0.0 );
flag = false ;
}
return (rates_total);
}
double bal = NormalizeDouble ( AccountInfoDouble ( ACCOUNT_BALANCE ), 2 );
double equity = NormalizeDouble ( AccountInfoDouble ( ACCOUNT_EQUITY ), 2 );
if (rates_total > prev_calculated)
{
minEquity = 0 ;
maxEquity = 0 ;
}
minEquity = NormalizeDouble ( fmin ((minEquity == 0 ? bal : minEquity), equity), 2 );
maxEquity = NormalizeDouble ( fmax (maxEquity, equity), 2 );
balance[ 0 ] = bal;
clrBalance[ 0 ] = 0.0 ;
equityMinB[ 0 ] = balance[ 0 ];
equityMin[ 0 ] = minEquity;
equityMaxB[ 0 ] = balance[ 0 ];
equityMax[ 0 ] = maxEquity;
if (balance[ 0 ] > balance[ 1 ])
clrBalance[ 0 ] = 1.0 ;
if (balance[ 0 ] < balance[ 1 ])
clrBalance[ 0 ] = 2.0 ;
Comment ( PositionsTotal ());
//--- return value of prev_calculated for next call
return (rates_total);
}
//+------------------------------------------------------------------+
잠재적으로 jamb는 다음과 같을 수 있습니다.
{
minEquity = 0 ;
maxEquity = 0 ;
}
minEquity = NormalizeDouble ( fmin ((minEquity == 0 ? bal : minEquity), equity), 2 );
maxEquity = NormalizeDouble ( fmax (maxEquity, equity), 2 );
새 막대가 오면 값을 0으로 재설정합니다. 그러나 권장하지 않는 방식으로 minEquity와 0이 같은지 확인합니다.
내 말의 확인 - 당신의 그림. 그것은 당신이 말했듯이 "쓰레기"값이 거의 0에 있음을 보여줍니다.
그리고 당연히 "가비지" 값이 있는 데이터 창을 그림에 추가하는 것이 좋습니다.