Tanımlandığında herhangi bir değişken başlatılabilir. Bir değişken açıkça başlatılmamışsa, bu değişkende depolanan değer herhangi bir şey olabilir . Örtük bir başlatma yoktur.
Bu amaç için özel olarak ortaya çıkan kod iddiasız.
İki derlememde 687 (farklı brokerlerde) bunu her ikisinde de derlemeye çalıştım, sonuç aynı (ama bazen 30'u doğru verdiğim ortaya çıktı), aptal mıyım yoksa kayaklar mı anlamıyorum gitme!?
MQL5'i anlamaya çalışıyorum. exp_tema.mq5 ayrıştırıldı ve kodu yeniden düzenledi. Şimdi her mumun MA günlüğüne yazdırılmalıdır (son 20 ). Ancak günlüğün neden bazı girişleri eksik olduğunu anlamıyorum. fark edildi , günlükte ma[3] yoksa, o zaman ma[13] olmayacaktır. Bu neden oluyor? Hata nerede?
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 );
}
Geliştiricilere bir önerim var - tüm yerleşik türler için varsayılan değerler yapın. C++ bu anlamda bir rol model değildir.
Ne de olsa, yukarıdan soruların yokluğunda kendinizi ve cevap verenleri kurtarmak gerçekten çok zaman ve sinir.
while((a/b)<1 && !IsStopped())//---------
eşittir nedir?
Varsayılan (yukarıdaki örnekte) a=2.652664430987377e-314 şeklindedir, ancak while döngüsü a+b=30 ile biter.
Elbette, hemen double a=1;
Ama benim durumum değişmiyor.
Çıktı her zaman a+b=30'dur
Ve return 0 değerini döndürür, hepsini hata ayıklayıcıda görebilirsiniz.
Ne tür aksaklıklar var ya da bir şeyi yanlış mı anlıyorum ???
Değişken başlatma :
Tanımlandığında herhangi bir değişken başlatılabilir. Bir değişken açıkça başlatılmamışsa, bu değişkende depolanan değer herhangi bir şey olabilir . Örtük bir başlatma yoktur.
Fia :
Çıktı her zaman a+b=30'dur
Ve return 0 değerini döndürür, hepsini hata ayıklayıcıda görebilirsiniz.
inanması zor.
Almayı ve kontrol etmeyi ne engeller?
Bu amaç için özel olarak ortaya çıkan kod iddiasız.
İki derlememde 687 (farklı brokerlerde) bunu her ikisinde de derlemeye çalıştım, sonuç aynı (ama bazen 30'u doğru verdiğim ortaya çıktı), aptal mıyım yoksa kayaklar mı anlamıyorum gitme!?
Bak, artık ne düşüneceğimi bilmiyorum.
Henüz çoğaltılamıyor. Ve en baştan başlayalım.
Ne bitliği, işletim sistemi?
Henüz çoğaltılamıyor.
Ne bitliği, işletim sistemi?
Win7 64bit
Bilmiyorum bile, şimdi indirdim yüklü MT5'i derlenmiş, her şey aynı.
chtol videosunu kaldırabilirim (aksi takdirde şaka yaptığımı düşünürler).
PS Şimdi dürttüm, 30 kez pes ettiğinde tekrar çalıştı, derlendi ve zaten birkaç kez daha sıfır veriyor (tasavvuf)
Tünaydın.
MQL5'i anlamaya çalışıyorum. exp_tema.mq5 ayrıştırıldı ve kodu yeniden düzenledi. Şimdi her mumun MA günlüğüne yazdırılmalıdır (son 20 ). Ancak günlüğün neden bazı girişleri eksik olduğunu anlamıyorum. fark edildi , günlükte ma[3] yoksa, o zaman ma[13] olmayacaktır. Bu neden oluyor? Hata nerede?
Win7 64bit
Bilmiyorum bile, şimdi indirdim yüklü MT5'i derlenmiş, her şey aynı.
chtol videosunu kaldırabilirim (aksi takdirde şaka yaptığımı düşünürler).
bir vizyoner olmanıza gerek yok.
Günlükte ara değişkenlerin neye eşit olduğunu görebilmemiz için kodda ayrıntılı bir Print yapın.