누군가가 MT5 차트의 오른쪽에서 오늘의 사이드 볼륨을 건너 MT4에서 찾았을 수도 있습니다. 여기 https://www.mql5.com/en/code/9777 . 두 가지 옵션이 있습니다. 변수를 다시 작성하거나 준비된 변수를 찾으십시오. 글쎄, 아니면 나는 주문의 요점이 보이지 않는다,,,,,,, 하나의 균형 이론을 확인해야 한다 ,,,, 왼쪽에서 어제의 프로필을 그리는 MT5에 대한 이 작업에 대한 데이터베이스에서 발견 그러나 한 가지 중요한 결점은 오늘날 일어나고 있는 일을 설명 하지 못하는 것입니다. 그래서 나는 현재 거래 순간에 무슨 일이 일어나고 있는지에 대한 정보로 차트 템플릿을 보완하고 싶습니다.
Maria Baburina : 나는 그것을 읽었다. Traal_Start__Upgr, Tral_Size__Upgr 및 외부 변수를 이중으로 정의하면 어떻게 작동하는지 살펴보았습니다. 저것들. 모든 것이 캐스팅 및 데이터 손실 없이 동일한 유형일 때. 결과는 동일합니다. 내가 뭘 잘못 이해했나?
시각 장애인과 청각 장애인의 대화. 누군가가 확인할 수 있게 하려면 다른 시스템에서 컴파일하고 확인할 수 있는 가능한 최소 코드가 필요합니다. 코드 없음 - 말할 것도 없습니다.
결과적으로, 당신은 틀렸습니다. CAM 터미널이 OnCalculate를 호출할 때만 액세스할 수 있습니다. 동시에 MT4에서는 조건이 더 유연합니다. OnCalculate를 한 번만 호출하면 충분합니다. 그리고 MT5에서는 SetIndexBuffer 이후 매번 ITSELF 터미널의 OnCalculate 호출을 기다려야 합니다. 증거
#property strict#property indicator_chart_window#property indicator_buffers1#ifdef __MQL5__#property indicator_plots1#endif
#ifdef __MQL5__#define TRUEtrue#define FALSEfalse#endif
class CLASS
{
public :
double Buffer[];
CLASS( void )
{
:: SetIndexBuffer ( 0 , this .Buffer);
}
#define TIMESERIES(X) \
:: ArraySetAsSeries (X, TRUE ); \
Size = :: MathMin (Copy ##X(::Symbol(), :: Period (), 0 , bars, X), Size);
staticint FullOnCalculate( void )
{
int Spread[];
long RealVolume[];
int Size = INT_MAX ;
#ifdef __MQL4__constint bars = :: Bars ;
#endif
#ifdef __MQL5__constint bars = :: Bars (:: Symbol (), :: Period ());
#endif
TIMESERIES(Spread)
TIMESERIES(RealVolume)
#ifdef __MQL4__return (:: OnCalculate (Size, 0 , Time , Open , High , Low , Close , RealVolume, Volume , Spread));
#endif
#ifdef __MQL5__datetimeTime [];
doubleOpen [];
doubleHigh [];
doubleLow [];
doubleClose [];
long TickVolume[];
TIMESERIES( Time )
TIMESERIES( Open )
TIMESERIES( High )
TIMESERIES( Low )
TIMESERIES( Close )
TIMESERIES(TickVolume)
return (:: OnCalculate (Size, 0 , Time , Open , High , Low , Close , RealVolume, TickVolume, Spread));
#endif
}
};
CLASS* Class;
bool FirstRunOnCalculate = TRUE ; // Необходимо TRUE, т.к. вызов OnCalculate только самим терминалом инициирует индикаторный буферvoidOnChartEvent ( constint id, constlong & lparam, constdouble & dparam, conststring & sparam )
{
if (id == CHARTEVENT_CHART_CHANGE )
{
Print ( __FUNCTION__ );
:: OnDeinit ();
::Class = new CLASS;
if (!FirstRunOnCalculate)
CLASS::FullOnCalculate(); // Тут будет задница для MT5 (в MT4 - без проблем), т.к. после SetIndexBuffer в MT5 надо дожидаться вызова OnCalculate САМИМ терминалом
}
return ;
}
voidOnDeinit ( constint Reason = 0 )
{
if (:: CheckPointer (::Class) == POINTER_DYNAMIC )
delete ::Class;
return ;
}
intOnCalculate ( constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[] )
{
Print ( __FUNCTION__ );
if (FirstRunOnCalculate)
FirstRunOnCalculate = FALSE ;
if (:: CheckPointer (::Class) != POINTER_INVALID )
::Class.Buffer[ 0 ] = 0 ; // array out of range - MT5-ERROR!!!return (rates_total);
}
MT4에서 이 표시기는 문제 없이 갈 것이고, MT5에서는 오류와 함께 즉시 충돌할 것입니다. 결과적으로 MT4에서는 ITSELF 터미널이 OnCalculate에 대한 첫 번째 호출을 기다린 다음 SetIndexBuffer를 통한 재정의를 포함하여 버퍼로 원하는 모든 작업을 수행하는 것으로 충분합니다. 그러나 MT5에서는 EVERY SetIndexBuffer 이후에 터미널 ITSELF에서 OnCalculate에 대한 첫 번째 호출을 다시 기다려야 합니다.
이 기능은 설명서 어디에서도 다루지 않습니다. 그리고, 마찬가지로, "초보자"의 정의에 맞지 않습니다.
MT5가 MT4와 동일한 동작을 할 것으로 기대할 수 있습니까? 저것들. ITSELF 터미널에서 OnCalculate에 대한 첫 번째 호출 후 문제 없이 SetIndexBuffer를 호출 할 수 있도록 하시겠습니까?
결과적으로, 당신은 틀렸습니다. CAM 터미널이 OnCalculate를 호출할 때만 액세스할 수 있습니다. 동시에 MT4에서는 조건이 더 유연합니다. OnCalculate를 한 번만 호출하면 충분합니다. 그리고 MT5에서는 SetIndexBuffer 이후 매번 ITSELF 터미널의 OnCalculate 호출을 기다려야 합니다. 증거
MT4에서 이 표시기는 문제 없이 갈 것이고, MT5에서는 오류와 함께 즉시 충돌할 것입니다. 결과적으로 MT4에서는 ITSELF 터미널이 OnCalculate에 대한 첫 번째 호출을 기다린 다음 SetIndexBuffer를 통한 재정의를 포함하여 버퍼로 원하는 모든 작업을 수행하는 것으로 충분합니다. 그러나 MT5에서는 EVERY SetIndexBuffer 이후에 터미널 ITSELF에서 OnCalculate에 대한 첫 번째 호출을 다시 기다려야 합니다.
이 기능은 설명서 어디에서도 다루지 않습니다. 그리고, 마찬가지로, "초보자"의 정의에 맞지 않습니다.
MT5가 MT4와 동일한 동작을 할 것으로 기대할 수 있습니까? 저것들. ITSELF 터미널에서 OnCalculate에 대한 첫 번째 호출 후 문제 없이 SetIndexBuffer를 호출 할 수 있도록 하시겠습니까?
장황하게 말하지 마십시오. 자연스럽게 OnCalculate를 호출하는 것은 터미널 자체에 의한 호출을 의미합니다.
OnCalculate() 함수는 Calculate 이벤트 를 기반으로 지표 값을 계산해야 하는 경우 사용자 지정 지표에서만 호출됩니다. 이것은 일반적으로 지표가 계산되는 기호에 대해 새 틱이 도착할 때 발생합니다. 이 경우 지표는 이 기호의 가격 차트에 첨부할 필요가 없습니다.
Close[2] 대신 두 번째 막대에 표시기 값을 입력하고(예: iRSI(.......,2) ) Close[1] 대신 표시기 값을 첫 번째 막대에 넣습니다. 그리고 uroven은 레벨 값 입니다.
나머지는 이미 당신에게 말했습니다.
상태:
ProfitSellDBL은 여기에서 계산됩니다.
Profit_Upgr = 0.01
Traal_Start__Upgr은 int 유형의 외부 변수로 설정되고 5와 같습니다.
Traal_Size__Upgr은 유사하게 4와 같습니다.
TV - 틱 값, =10
SumLotSellDBL = 0.04
나는 그것을 읽었다. Traal_Start__Upgr, Tral_Size__Upgr 및 외부 변수를 이중으로 정의하면 어떻게 작동하는지 살펴보았습니다. 저것들. 모든 것이 캐스팅 및 데이터 손실 없이 동일한 유형일 때. 결과는 동일합니다. 내가 뭘 잘못 이해했나?
시각 장애인과 청각 장애인의 대화. 누군가가 확인할 수 있게 하려면 다른 시스템에서 컴파일하고 확인할 수 있는 가능한 최소 코드가 필요합니다. 코드 없음 - 말할 것도 없습니다.
추가됨: 디버깅 사용( Debugging ) :
• 프리셋
• 중단점
• 디버깅 시작
• 관찰된 표현
• 호출 스택 보기
• 단계별 디버깅
• 디버깅 일시 중지, 재개 및 종료
• 기록에 대한 디버깅
거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼
오류, 버그, 질문
비교 , 2016.04.03 18:21
런타임 에러
넷에서 이것은 쾅! 상위 5위 안에 드는 것입니다. 이것은 쿼드에 비해 또 다른 아키텍처 제한 사항입니까? 이것에 대한 토론에 대한 링크를 제공하십시오. 내가 직접 찾지 못했습니다.
OnCalculate 의 터미널 자체(수동이 아님)에 의한 첫 번째 호출 후에만 표시기 버퍼 에 무언가를 할당할 수 있다는 것을 올바르게 이해하고 있습니까?
OnCalculate()를 호출한 후 표시기 버퍼에 액세스할 수 있습니다. 이 경우 표시기 버퍼 자체는 전역 변수 영역에 선언되어야 합니다 .
내가 찾던 것을 찾은 것 같지만 고대 코드에서 오류가 발생합니다.
수정을 도와주세요 ...... 쉬운 경우
화면 오른쪽에 배치하는 데 도움이 된다면 일반적으로
OnCalculate()를 호출한 후 표시기 버퍼에 액세스할 수 있습니다.
결과적으로, 당신은 틀렸습니다. CAM 터미널이 OnCalculate를 호출할 때만 액세스할 수 있습니다. 동시에 MT4에서는 조건이 더 유연합니다. OnCalculate를 한 번만 호출하면 충분합니다. 그리고 MT5에서는 SetIndexBuffer 이후 매번 ITSELF 터미널의 OnCalculate 호출을 기다려야 합니다. 증거
MT4에서 이 표시기는 문제 없이 갈 것이고, MT5에서는 오류와 함께 즉시 충돌할 것입니다. 결과적으로 MT4에서는 ITSELF 터미널이 OnCalculate에 대한 첫 번째 호출을 기다린 다음 SetIndexBuffer를 통한 재정의를 포함하여 버퍼로 원하는 모든 작업을 수행하는 것으로 충분합니다. 그러나 MT5에서는 EVERY SetIndexBuffer 이후에 터미널 ITSELF에서 OnCalculate에 대한 첫 번째 호출을 다시 기다려야 합니다.
이 기능은 설명서 어디에서도 다루지 않습니다. 그리고, 마찬가지로, "초보자"의 정의에 맞지 않습니다.
MT5가 MT4와 동일한 동작을 할 것으로 기대할 수 있습니까? 저것들. ITSELF 터미널에서 OnCalculate에 대한 첫 번째 호출 후 문제 없이 SetIndexBuffer를 호출 할 수 있도록 하시겠습니까?
결과적으로, 당신은 틀렸습니다. CAM 터미널이 OnCalculate를 호출할 때만 액세스할 수 있습니다. 동시에 MT4에서는 조건이 더 유연합니다. OnCalculate를 한 번만 호출하면 충분합니다. 그리고 MT5에서는 SetIndexBuffer 이후 매번 ITSELF 터미널의 OnCalculate 호출을 기다려야 합니다. 증거
MT4에서 이 표시기는 문제 없이 갈 것이고, MT5에서는 오류와 함께 즉시 충돌할 것입니다. 결과적으로 MT4에서는 ITSELF 터미널이 OnCalculate에 대한 첫 번째 호출을 기다린 다음 SetIndexBuffer를 통한 재정의를 포함하여 버퍼로 원하는 모든 작업을 수행하는 것으로 충분합니다. 그러나 MT5에서는 EVERY SetIndexBuffer 이후에 터미널 ITSELF에서 OnCalculate에 대한 첫 번째 호출을 다시 기다려야 합니다.
이 기능은 설명서 어디에서도 다루지 않습니다. 그리고, 마찬가지로, "초보자"의 정의에 맞지 않습니다.
MT5가 MT4와 동일한 동작을 할 것으로 기대할 수 있습니까? 저것들. ITSELF 터미널에서 OnCalculate에 대한 첫 번째 호출 후 문제 없이 SetIndexBuffer를 호출 할 수 있도록 하시겠습니까?