Jede Variable kann bei ihrer Definition initialisiert werden. Wenn die Variable nicht explizit initialisiert wird, kann der Wert, der in der Variable gespeichert wird, jeder beliebige sein. Eine implizite Initialisierung wird nicht durchgeführt.
Speziell für diesen Zweck habe ich einen einfachen Code erstellt.
Ich habe zwei Builds von 687 (auf verschiedenen Brokern), versucht, beide mit dem gleichen Ergebnis zu kompilieren (aber manchmal bekomme ich 30 richtig), kann ich nicht verstehen, ob ich dumm bin oder der Ski ist nicht in Bewegung!
Ich weiß nicht einmal, gerade entladen gerade jetzt geladen MT5 kompiliert, gleiche Sache.
Ich kann das Video abnehmen (die werden denken, ich mache mich darüber lustig).
P.S. Jetzt habe ich es gerade getippt, es hat wieder 30 Mal funktioniert, ich habe es kompiliert und jetzt funktioniert es noch ein paar Mal null (Magie)
Ich versuche, MQL5 zu verwenden.Ich habe exp_tema.mq5 disassembliert und den Code geändert. Jetzt sollte ich in log MA von jeder Kerze (letzten 20) zu drucken. Aber ich verstehe nicht, warum einige Einträge im Protokoll fehlen. Mir ist aufgefallen, dass , wenn ma[3] im Protokoll fehlt, auch kein ma[13] vorhanden ist. Warum ist das so? Wo liegt hier der Fehler?
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);
}
Ich habe einen Vorschlag für die Entwickler - machen Sie Standardwerte für alle eingebauten Typen. C++ ist kein Modell in diesem Sinne.
Damit sparen Sie sich und denjenigen, die die Fragen beantworten, eine Menge Zeit und Nerven (siehe oben).
while((a/b)<1 && !IsStopped())//---------
Was entspricht einem?
Standardmäßig (im obigen Beispiel) ist a=2,652664430987377e-314 , aber in diesem Fall arbeitet sich die while-Schleife zu a+b=30 vor.
Natürlich können Sie sofort double a=1 zuweisen;
Aber die Situation ändert sich nicht.
Die Ausgabe ist immer a+b=30
Und return gibt 0 zurück, der Debugger zeigt alles an.
Worin bestehen diese Störungen, oder übersehe ich etwas?
Initialisierung von Variablen:
Jede Variable kann bei ihrer Definition initialisiert werden. Wenn die Variable nicht explizit initialisiert wird, kann der Wert, der in der Variable gespeichert wird, jeder beliebige sein. Eine implizite Initialisierung wird nicht durchgeführt.
Fia:
Die Ausgabe ist immer a+b=30
Und return gibt 0 zurück, der Debugger zeigt alles an.
Ich kann es kaum glauben.
Was hält Sie davon ab, es sich anzusehen?
Speziell für diesen Zweck habe ich einen einfachen Code erstellt.
Ich habe zwei Builds von 687 (auf verschiedenen Brokern), versucht, beide mit dem gleichen Ergebnis zu kompilieren (aber manchmal bekomme ich 30 richtig), kann ich nicht verstehen, ob ich dumm bin oder der Ski ist nicht in Bewegung!
Ich weiß nicht, was ich denken soll.
Bislang war es nicht möglich, diese zu reproduzieren. Fangen wir also ganz am Anfang an.
Welche Bitrate, OS?
Noch kein Glück mit der Reproduktion.
Welche Bitrate, OS?
Win7 64 bit
Ich weiß nicht einmal, gerade entladen gerade jetzt geladen MT5 kompiliert, gleiche Sache.
Ich kann das Video abnehmen (die werden denken, ich mache mich darüber lustig).
P.S. Jetzt habe ich es gerade getippt, es hat wieder 30 Mal funktioniert, ich habe es kompiliert und jetzt funktioniert es noch ein paar Mal null (Magie)
Guten Tag.
Ich versuche, MQL5 zu verwenden.Ich habe exp_tema.mq5 disassembliert und den Code geändert. Jetzt sollte ich in log MA von jeder Kerze (letzten 20) zu drucken. Aber ich verstehe nicht, warum einige Einträge im Protokoll fehlen. Mir ist aufgefallen, dass , wenn ma[3] im Protokoll fehlt, auch kein ma[13] vorhanden ist. Warum ist das so? Wo liegt hier der Fehler?
Win7 64 bit
Ich weiß nicht, ich habe gerade MT5 entladen, eine Kopie davon ausgeführt und es ist dasselbe.
Ich kann ein Video abspielen oder so (ich glaube, ich verarsche dich nur).
Sie brauchen keinen Screenshot.
Machen Sie einen detaillierten Ausdruck im Code, damit wir im Protokoll sehen können, was die Zwischenvariablen sind gleich.