MQL5를 알아내려고 합니다. exp_tema.mq5 를 구문 분석하고 코드를 다시 수정했습니다. 이제 각 양초(마지막 20)의 로그 MA에 인쇄해야 합니다. 하지만 로그에 일부 항목이 누락된 이유를 이해할 수 없습니다. 주목 , 로그에 ma[3]이 없으면 ma[13]도 없습니다. 왜 이런 일이 발생합니까? 실수는 어디에 있습니까?
inputstring Symb0 = "EURUSD" ;
inputbool Trade0 = true ;
int MA_Shift0= 1 ;
inputint MA_Per0 = 100 ;
//+-----------------------------------+inputstring Symb1 = "USDCHF" ;
inputbool Trade1 = true ;
int MA_Shift1= 1 ;
inputint MA_Per1 = 100 ;
bool MA ( int Number,
string Symbol_, // имя символаbool Trade,
int MA_Per, // период для расчета средней линииint MA_Shift // смещение индикатора по горизонтали
)
{
//---- проверка запрета на торговлюif (!Trade) return ( true );
//---- объявление переменной для хранения итогового размера массивов переменныхstaticint Size_= 0 ;
//---- объявление массива для хранения хэндлов индикаторов как статической переменнойstaticint Handle[];
staticint Recount[],MinBars[];
double ma[ 20 ];
if (Number+ 1 >Size_) // вход в блок инициализации только на первом старте
{
Size_=Number+ 1 ; // для этого номера вход в блок закрыт//---- изменение размеров массивов переменныхArrayResize (Handle,Size_);
ArrayResize (Recount,Size_);
ArrayResize (MinBars,Size_);
//---- определение минимально количества баров, достаточного для расчета
MinBars[Number]= 3 *MA_Per;
//---- предварительное обнуление ячеек массивов//---- используем массив как таймсериюArraySetAsSeries (ma, true );
//---- получение хендла индикатора
Handle[Number]= iMA (Symbol_, 0 ,MA_Per,MA_Shift, MODE_SMA , PRICE_CLOSE );
Print ( "+++++++++Handle[Number]= " ,Handle[Number]);
}
//---- проверка количества баров на достаточность для расчета if ( Bars (Symbol_, 0 )<MinBars[Number]) return ( true );
//---- Получение торговых сигналов if (IsNewBar(Number,Symbol_, 0 ) || Recount[Number]) // вход в блок на смене бара или при неудачном копировании данных
{
//---- используя хэндлы индикатора, копируем значения индикаторного буфера//---- в специально подготовленный для этого статический массивif ( CopyBuffer (Handle[Number], 0 , 0 , 20 ,ma)< 0 )
{
Recount[Number]= true ; // так как данные не получены, то следует вернуться // в этот блок получения торговых сигналов на следующем тике!return ( false ); // выходим из функции TradeSignalCounter() без получения торговых сигналов
}
//---- все операции копирования из индикаторного буфера завершены успешно
Recount[Number]= false ; // можно не возвращаться в этот блок до очередной смены бараPrint ( "+++++++++ma[0]= " ,ma[ 0 ]);
Print ( "+++++++++ma[1]= " ,ma[ 1 ]);
Print ( "+++++++++ma[2]= " ,ma[ 2 ]);
Print ( "+++++++++ma[3]= " ,ma[ 3 ]);
Print ( "+++++++++ma[4]= " ,ma[ 4 ]);
Print ( "+++++++++ma[5]= " ,ma[ 5 ]);
Print ( "+++++++++ma[6]= " ,ma[ 6 ]);
Print ( "+++++++++ma[7]= " ,ma[ 7 ]);
Print ( "+++++++++ma[8]= " ,ma[ 8 ]);
Print ( "+++++++++ma[9]= " ,ma[ 9 ]);
Print ( "+++++++++ma[10]= " ,ma[ 10 ]);
Print ( "+++++++++ma[11]= " ,ma[ 11 ]);
Print ( "+++++++++ma[12]= " ,ma[ 12 ]);
Print ( "+++++++++ma[13]= " ,ma[ 13 ]);
Print ( "+++++++++ma[14]= " ,ma[ 14 ]);
Print ( "+++++++++ma[15]= " ,ma[ 15 ]);
Print ( "+++++++++ma[16]= " ,ma[ 16 ]);
Print ( "+++++++++ma[17]= " ,ma[ 17 ]);
Print ( "+++++++++ma[18]= " ,ma[ 18 ]);
Print ( "+++++++++ma[19]= " ,ma[ 19 ]);
}
return ( true );
}
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit ()
{
//---//---return ( 0 );
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit ( constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick ()
{
//---
MA( 0 ,Symb0,Trade0,MA_Per0,MA_Shift0);
MA( 1 ,Symb1,Trade1,MA_Per1,MA_Shift1);
}
//+------------------------------------------------------------------+//+------------------------------------------------------------------+//| IsNewBar() function |//+------------------------------------------------------------------+bool IsNewBar( int Number, string symbol, ENUM_TIMEFRAMES timeframe)
{
//----staticdatetime Told[];
datetime Tnew[ 1 ];
//---- объвление переменной для хранения размеров массивов переменныхstaticint Size_= 0 ;
//---- изменение размеров массивов переменныхif (Number+ 1 >Size_)
{
uint size=Number+ 1 ;
//----if ( ArrayResize (Told,size)==- 1 )
{
string word= "" ;
StringConcatenate (word, "IsNewBar( " ,Number,
" ): Ошибка!!! Не удалось изменить размеры массивов переменных!!!" );
Print (word);
//---- int error= GetLastError ();
ResetLastError ();
if (error> 4000 )
{
StringConcatenate (word, "IsNewBar( " ,Number, " ): Код ошибки " ,error);
Print (word);
}
//----
Size_=- 2 ;
return ( false );
}
}
CopyTime (symbol,timeframe, 0 , 1 ,Tnew);
if (Tnew[ 0 ]!=Told[Number])
{
Told[Number]=Tnew[ 0 ];
return ( true );
}
//----return ( false );
}
개발자에게 제안할 것이 있습니다. 모든 내장 유형에 대해 기본값을 설정하십시오. C++는 이런 의미에서 롤 모델이 아닙니다.
음, 결국, 위와 같은 질문이 없는 상태에서 자신과 답변하는 사람들을 구하는 것은 정말 많은 시간과 신경을 써야 합니다.
while((a/b)<1 && !IsStopped())//---------
같음 은 무엇입니까?
기본값(위의 예에서)은 a=2.652664430987377e-314 이지만 while 루프는 a+b=30으로 끝납니다.
물론 즉시 double=1을 할당할 수 있습니다.
그러나 상황은 나와 함께 변하지 않습니다.
출력은 항상 +b=30입니다.
반환은 0 을 반환하고 디버거에서 모두 볼 수 있습니다.
어떤 종류의 결함이나 내가 뭔가를 오해하고 있습니까 ???
변수 초기화 :
모든 변수는 정의될 때 초기화될 수 있습니다. 변수가 명시적으로 초기화되지 않은 경우 이 변수에 저장된 값은 무엇이든 될 수 있습니다 . 암시적 초기화는 없습니다.
Fia :
출력은 항상 +b=30입니다.
반환은 0 을 반환하고 디버거에서 모두 볼 수 있습니다.
믿기 어렵습니다.
복용 및 확인을 방해하는 것은 무엇입니까?
이 목적을 위해 특히 코드가 소박합니다.
내 두 빌드 687(다른 브로커에서)에서 나는 이것을 둘 다에서 컴파일하려고 시도했지만 결과는 동일합니다(그러나 때때로 30을 올바르게 준 것으로 밝혀졌습니다). 가지마!?
확인하세요. 더 이상 어떻게 생각해야 할지 모르겠습니다.
아직 재현할 수 없습니다. 그리고 처음부터 시작하겠습니다.
어떤 비트, OS?
아직 재현할 수 없습니다.
어떤 비트, OS?
Win7 64비트
나도 몰라, 이제 방금 로드된 MT5 컴파일을 언로드했는데 모든 것이 동일합니다.
나는 비디오 chtol을 제거할 수 있습니다(그렇지 않으면 그들이 내가 농담하는 것으로 생각할 것입니다).
PS 이제 찔렀습니다. 다시 한 번 30이 제공되고 컴파일되고 이미 0으로 몇 번 더 제공됩니다 (신비주의)
안녕하세요.
MQL5를 알아내려고 합니다. exp_tema.mq5 를 구문 분석하고 코드를 다시 수정했습니다. 이제 각 양초(마지막 20)의 로그 MA에 인쇄해야 합니다. 하지만 로그에 일부 항목이 누락된 이유를 이해할 수 없습니다. 주목 , 로그에 ma[3]이 없으면 ma[13]도 없습니다. 왜 이런 일이 발생합니까? 실수는 어디에 있습니까?
Win7 64비트
나도 몰라, 이제 방금 로드된 MT5 컴파일을 언로드했는데 모든 것이 동일합니다.
나는 비디오 chtol을 제거할 수 있습니다(그렇지 않으면 그들이 내가 농담하는 것으로 생각할 것입니다).
당신은 비전가가 필요하지 않습니다.
중간 변수가 무엇인지 로그에서 볼 수 있도록 코드에서 장황하게 인쇄 하십시오.