Alexey Viktorov : 이것은 문서에 없습니다! 따라서 이들은 자유로운 주제에 대한 에세이입니다. 자동 초기화에 대한 내 진술뿐만 아니라 훨씬 더 시원합니다. 적어도 내 것은 경고와 함께 ...
문서에서 모든 것을 설명할 수는 없습니다.
"prev_calculate==0"을 얻었습니다. 이는 전체 표시기 버퍼 를 거쳐야 함을 의미합니다. "prev_calculate!=0"이 이 경우 가장 오른쪽 막대 또는 몇 개의 새로운 막대만 계산한다는 의미인 경우(사용 제한 ):
constint &spread[]) { //--- if (prev_calculated== 0 ) { Print ( "prev_calculated==0" ); for ( int i= 0 ;i<rates_total;i++) { //--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) )
} return (rates_total); } //--- экономный пересчёт только самого правого бара или новых баров int limit=rates_total-prev_calculated+ 1 ;
//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров for ( int i=0;i<limit;i++) { ExtBuffer[i]=чевой-то там; }
"prev_calculate==0"을 얻었습니다. 이는 전체 표시기 버퍼 를 거쳐야 함을 의미합니다. "prev_calculate!=0"이 이 경우 가장 오른쪽 막대 또는 몇 개의 새로운 막대만 계산한다는 의미인 경우(사용 제한 ):
constint &spread[]) { //--- if (prev_calculated== 0 ) { Print ( "prev_calculated==0" ); for ( int i= 0 ;i<rates_total;i++) { //--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) )
} return (rates_total); } //--- экономный пересчёт только самого правого бара или новых баров int limit=rates_total-prev_calculated+ 1 ;
//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров for ( int i=0;i<limit;i++) { ExtBuffer[i]=чевой-то там; }
무엇을 의미 하는가??? 가장 오른쪽 막대 외에 다른 값은 필요하지 않습니다. 하지만 !!! 그러면 이 맨 오른쪽이 왼쪽으로 이동하면 거기에 넣은 이 데이터를 저장해야 합니다...
모든 버퍼를 작성할 필요는 없지만 내 바램을 고려하여 하나를 작성할 수 있습니다. 이것이 첫 번째 실행인 경우 전체 기록이 비어 있어야 합니다. 스와핑 히스토리의 결과로 prev_calculated 의 0이 발생하면 버퍼에 있던 모든 것이 변경되지 않은 상태로 유지되어야 합니다. 구멍이 있어도.
struct BROWNIE { int i_Prew_Calculated; // кол-во посчитанных баров bool b_First_Run; // флаг первого запуска bool b_History_Updated; // флаг обновления истории
intOnCalculate ( constint rates_total, constint prev_calculated, constdatetime & Time [], constdouble & Open [], constdouble & High [], constdouble & Low [], constdouble & Close [], constlong &TickVolume[], constlong & Volume [], constint &Spread[] ) { if (go_Brownie.b_First_Run) { /* обработка 1го запуска */ } if (go_Brownie.b_History_Updated) { /* обработка обновления истории */ } go_Brownie.f_Update(prev_calculated);
return (rates_total); }
면책 조항: 코드는 단순한 아이디어이며 차트에서 실행하지 않았습니다.
OnDeinit에는 샘플이 있습니다. 버퍼를 사용하지 않는 표시기에 대한 처리는 시간 프레임 및 기호에 대해 신경 쓰지 않으며, 시간 프레임/기호가 변경될 때마다 처음부터 모든 것을 시작할 필요가 없습니다. 예를 들어 기존 그래픽 요소와 함께 작동하고 계정 상태, 주문 등에 대한 정보를 표시합니다.
---
그런데
Karputov Vladimir :
그런 다음 표시기 버퍼를 파일에 저장한 다음(이력을 스와핑하는 경우) 파일과 막대를 읽고 동기화하는 것만 남습니다.
이것은 문서에 없습니다! 따라서 이들은 자유로운 주제에 대한 에세이입니다. 자동 초기화에 대한 내 진술뿐만 아니라 훨씬 더 시원합니다. 적어도 내 것은 경고와 함께 ...
문서에서 모든 것을 설명할 수는 없습니다.
"prev_calculate==0"을 얻었습니다. 이는 전체 표시기 버퍼 를 거쳐야 함을 의미합니다. "prev_calculate!=0"이 이 경우 가장 오른쪽 막대 또는 몇 개의 새로운 막대만 계산한다는 의미인 경우(사용 제한 ):
{
//---
if (prev_calculated== 0 )
{
Print ( "prev_calculated==0" );
for ( int i= 0 ;i<rates_total;i++)
{
//--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) )
}
return (rates_total);
}
//--- экономный пересчёт только самого правого бара или новых баров
int limit=rates_total-prev_calculated+ 1 ;
//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров
for ( int i=0;i<limit;i++)
{
ExtBuffer[i]=чевой-то там;
}
문서에서 모든 것을 설명할 수는 없습니다.
"prev_calculate==0"을 얻었습니다. 이는 전체 표시기 버퍼 를 거쳐야 함을 의미합니다. "prev_calculate!=0"이 이 경우 가장 오른쪽 막대 또는 몇 개의 새로운 막대만 계산한다는 의미인 경우(사용 제한 ):
{
//---
if (prev_calculated== 0 )
{
Print ( "prev_calculated==0" );
for ( int i= 0 ;i<rates_total;i++)
{
//--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) )
}
return (rates_total);
}
//--- экономный пересчёт только самого правого бара или новых баров
int limit=rates_total-prev_calculated+ 1 ;
//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров
for ( int i=0;i<limit;i++)
{
ExtBuffer[i]=чевой-то там;
}
무엇을 의미 하는가??? 가장 오른쪽 막대 외에 다른 값은 필요하지 않습니다. 하지만 !!! 그러면 이 맨 오른쪽이 왼쪽으로 이동하면 거기에 넣은 이 데이터를 저장해야 합니다...
모든 버퍼를 작성할 필요는 없지만 내 바램을 고려하여 하나를 작성할 수 있습니다. 이것이 첫 번째 실행인 경우 전체 기록이 비어 있어야 합니다. 스와핑 히스토리의 결과로 prev_calculated 의 0이 발생하면 버퍼에 있던 모든 것이 변경되지 않은 상태로 유지되어야 합니다. 구멍이 있어도.
예비 결론:
왜 헛소리를 합니까? 이러한 초기화가 OnCalculate에 입력되면 사이클 없이 쾅 소리와 함께 0으로 재설정됩니다. 하지만 prev_calculated가 리셋되면 작업 중에 누적된 모든 데이터가 리셋됩니다...
무엇을 의미 하는가??? 가장 오른쪽 막대 외에 다른 값은 필요하지 않습니다. 하지만 !!! 그러면 이 맨 오른쪽이 왼쪽으로 이동하면 거기에 넣은 이 데이터를 저장해야 합니다...
...
나는 이미 다음과 같은 방법을 제안했습니다.
여는 시간 에 의한 동기화이지만 여기에 뉘앙스가 있을 수 있습니다. 예를 들어 막대 여는 시간(파일에 저장)은 2016.09.05입니다. 25:02 , 그리고 이제 시간이 2016.09.05인 차트에 막대가 있습니다. 25:01.
지표는 데이터베이스나 저장소가 아닙니다.
따라서 표시기가 기록에 대해 계산할 수 없는 데이터를 표시하면 표시기 버퍼를 파일에 저장한 다음(이력 교환의 경우) 파일과 막대를 읽고 동기화하면 됩니다.나는 이미 다음과 같은 방법을 제안했습니다.
지표는 데이터베이스나 저장소가 아닙니다.
따라서 표시기가 기록에 대해 계산할 수 없는 데이터를 표시하면 표시기 버퍼를 파일에 저장한 다음(이력 교환의 경우) 파일과 막대를 읽고 동기화하면 됩니다.... 파일에 쓰지 않는 것이 좋으며 GV에서는 더욱 그렇습니다.
Vladimir, 이 주제를 prev_calculated의 전문가로 선정했으므로 이 특정 주제에 유용하도록 만드십시오. 먼저 이 변수로 인해 일반적으로 발생하는 문제를 식별해야 합니다. 이러한 문제에 익숙하지 않은 경우 공식화하겠습니다.
---
그리고 - 적어도 그것이 말하는 도움말에서
당신은 이것을 위해 그것을 사용할 수 없습니다 - 그것은 언제든지 무화과를 보여줄 수 있습니다. 그 이유는 (도움말에 작성 + 개발자가 말한) 체크섬이 변경되면 일반적으로 기록 페이징으로 인해 변수가 0으로 재설정되기 때문입니다.
---
b - Prev_calculated == 0을 OnCalculate의 첫 번째 실행에 대한 플래그로 사용할 수 없습니다. 같은 이유로
---
c - 그리고 히스토리 페이징 플래그로 prev_calculated == 0도 사용할 수 없습니다.
---
사용자의 갈퀴 마모를 줄이려면 간단하고 명확하게 공식화하는 것이 바람직 합니다. 현재 OnCalculate 호출에서 히스토리 페이징이 발생하지 않은 경우 prev_calculated에는 이전 호출에서 처리된 막대 수가 포함됩니다. 발생하면 재설정됩니다.
---
나열된 3개의 플러그 모두 목발로 우회할 수 있습니다. 그러나 정의상 MT5에는 목발이 있을 수 없기 때문에 Vladimir인 당신은 이 3가지 작업에 대한 아름다운 솔루션을 생각해 냈을 것입니다. 다음과 같은 추악한 것:
#property indicator_buffers 0
#property indicator_plots 0
struct BROWNIE {
int i_Prew_Calculated; // кол-во посчитанных баров
bool b_First_Run; // флаг первого запуска
bool b_History_Updated; // флаг обновления истории
BROWNIE() {
i_Prew_Calculated = WRONG_VALUE ;
b_First_Run = true ;
b_History_Updated = false ;
}
void f_Reset( bool b_Reset_First_Run = true ) {
i_Prew_Calculated = WRONG_VALUE ;
if (b_Reset_First_Run) b_First_Run = true ;
b_History_Updated = false ;
}
void f_Update( int i_New_Prew_Calculated = WRONG_VALUE ) {
if (i_New_Prew_Calculated > - 1 ) {
b_History_Updated = i_New_Prew_Calculated == 0 && i_Prew_Calculated > WRONG_VALUE ;
if (b_First_Run) b_First_Run = false ;
if (i_Prew_Calculated == WRONG_VALUE ) i_Prew_Calculated = i_New_Prew_Calculated;
else if (i_New_Prew_Calculated > 0 ) i_Prew_Calculated = i_New_Prew_Calculated;
}
}
};
BROWNIE go_Brownie;
int OnInit ( void ) { return ( INIT_SUCCEEDED );}
void OnDeinit ( const int reason) {
go_Brownie.f_Reset(reason != REASON_CHARTCHANGE );
}
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 &TickVolume[],
const long & Volume [],
const int &Spread[]
) {
if (go_Brownie.b_First_Run) { /* обработка 1го запуска */ }
if (go_Brownie.b_History_Updated) { /* обработка обновления истории */ }
go_Brownie.f_Update(prev_calculated);
return (rates_total);
}
면책 조항: 코드는 단순한 아이디어이며 차트에서 실행하지 않았습니다.
OnDeinit에는 샘플이 있습니다. 버퍼를 사용하지 않는 표시기에 대한 처리는 시간 프레임 및 기호에 대해 신경 쓰지 않으며, 시간 프레임/기호가 변경될 때마다 처음부터 모든 것을 시작할 필요가 없습니다. 예를 들어 기존 그래픽 요소와 함께 작동하고 계정 상태, 주문 등에 대한 정보를 표시합니다.
---
그런데
그런 다음 표시기 버퍼를 파일에 저장한 다음(이력을 스와핑하는 경우) 파일과 막대를 읽고 동기화하는 것만 남습니다.
... 파일에 쓰지 않는 것이 좋으며 GV에서는 더욱 그렇습니다.
아마도 이것이 당신에게 어울릴 것입니까?
나는 세부 사항을 탐구하지 않았지만 이것은이 코드 줄로 해결됩니다. 인덱스 시프트를 사용하여 배열 자체를 복사합니다.
ArrayCopy (arr, arr, 0 , 1 , 4 );
// и дальнейшее заполнение 4го индекса массива.