Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 379

 
Taras Slobodyanik:

Ich sehe keine Null, Sie haben irgendwo gepatzt.


Geben beide Drucker die gleichen Werte aus?

Da es in meinem Code keine Druckfunktionen gibt und diese Zeilen hintereinander folgen, ändern sich die Werte in keiner Weise.

Aber Var ergibt 0 und Code ergibt den benötigten Wert

 
LuckySith:

Aber ich gebe den Wert, den ich zuweise, sofort aus. Der Code sieht also im Wesentlichen wie folgt aus:

a=b;

Drucken (a);

Drucken (b);

Aber a ist gleich Null, während b korrekt gedruckt wird

Wenn int a und double b>0 und b<1 bei der Zuweisung eines reellen Wertes an eine Integer-Variable der Bruchteil verworfen wird, ist es möglich

 
STARIJ:

Dies ist möglich, wenn int a und double b>0 und b<1 bei der Zuweisung eines reellen Wertes an eine Integer-Variable der Bruchteil verworfen wird


b ist größer als eins viel größer als eins

a ist ein Array vom Typ double

 

Das Problem ist gelöst.

Ich habe das Array auf die folgende Weise erstellt:


double line[];

Mit dieser Option erschien bei der Zuweisung von line[0]=x; das Nullelement immer noch leer zu sein.


Als ich schrieb


Doppellinie[20];


Alles funktioniert so, wie es sollte. Ich verstehe nicht, warum ich im ersten Fall einfach ein unbeschränktes Array erstellt habe; was ist der Unterschied?

 
LuckySith:

Das Problem ist gelöst.

Ich habe das Array auf die folgende Weise erstellt:


double line[];

Mit dieser Option erschien bei der Zuweisung von line[0]=x; das Nullelement immer noch leer zu sein.


Als ich schrieb


Doppellinie[20];


Alles funktioniert so, wie es sollte. Ich verstehe nicht, warum ich im ersten Fall einfach ein unbeschränktes Array erstellt habe; was ist der Unterschied?

Sie haben ein dynamisches Array erstellt, dessen Größe Sie selbst festlegen und kontrollieren sollten.

 
Artyom Trishkin:

Sie haben ein dynamisches Array erstellt, aber Sie müssen die Größe selbst festlegen und kontrollieren.

Die Richtlinie #property strict beschleunigt die Suche nach diesem Fehler. Das Programm endet mit einer Meldung wie: array out of range in 'C.mq4' (31,32)
 

Ist niemand da, um zu helfen? Die Sackgasse, in der ich mich befinde, ist hier zu finden:in die Datei geschrieben werden müssen?

Der Softwarecode ist hier beschrieben:https://www.mql5.com/ru/forum/160683/page378#comment_6053255

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
  • 2017.11.14
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
LRA:

Indikator durch Daten aus Datei - diese Zeile in die Suche eingegeben und gefunden


Um Daten aus einer Datei abzurufen, müssen Sie diese zunächst ausfüllen.

 

Aua... Gute Leute! Hilfe, bitte! Ich lerne, wie man programmiert. Ohne Ihre Hilfe ist es eine Sackgasse.

Ich versuche, die Indikatordaten in eine Datei zu schreiben, damit ich sie später zur Erstellung eines Indikators verwenden kann. Der Indikator wird als Linie gezeichnet, die auf der Differenz zwischen dem Volumen der positiven Ticks und dem Volumen der negativen Ticks für den aktuellen Balken basiert.

Ich habe MQL4 Reference verwendet, um Informationen darüber zu erhalten, wie man ein Datenfeld in eine Datei hochlädt. Am Ende habe ich einen Code voller Fehler erhalten. Ich kann das Wesen der Fehler nicht verstehen, und im Allgemeinen habe ich den Hinweis aus dem Nachschlagewerk nicht richtig verwendet oder nicht. Kann jemand helfen?

input string             InpFileName="111.csv";      // Имя файла 
input string             InpDirectoryName="Data";     // Имя каталога 

datetime Время=0;   // Время прошлого бара
double Bid1;
double   Buf_1[];
// double ExtBuffer;
long V1; // объем для текущего тика вверх
long V2; // накопленный объем для всех тиков вверх текущего бара
long V3; // объем текущего тика вниз
long V4; // накопленный объем для всех тиков вниз для текущего бара
long V5;  // отрицательные и положительные iVolume нарастающим итогом


void OnInit()
{
   IndicatorDigits(0);
   SetIndexBuffer(0,Buf_1);
   //SetIndexBuffer(1,Buf_2);
   Bid1=Bid;
   V5 = 0;
    
}
 
 
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   datetime Вр=Time[0];   // Время текущего бара
   if(Вр>Время)           // Если новый бар
   {
      Время=Вр;           // Запомнить
//      Buf_1[0]=0;         // и обнулить последний элемент буфера
   }
   
   datetime date_Buf_1; // массив дат индикатора 
   datetime time_Buf_1; // массив времени 
// --- считаю объем для положительных и отрицательных тиков      
   if(Bid >= Bid1) 
{
   if(Bid > Bid1) // если тик положительный..
{   
   V1 = iVolume(NULL, 0, 0); // если повышающий цену тик, то находим его объем
   V2 = V1 + V2;
}
  else
{
   V1 = 0;                // если Bid1 = Bid2, т.е. изменение цены = 0, то iVolume этого тика присваиваем 0;
   V2 = V1 + V2;      
}               
}              
   else 
{
   V3 = iVolume(NULL, 0, 0); // если понижающий цену тик 
   V4 = V3 + V4;             // то находим его объем  
}
  
   V5 = V2-V4;               // определяем разницу (дельту) между объемами положительных и отрицательных тиков
   Bid1=Bid;
   Buf_1 [0] = V5; // в буфер сгружаем  дельту

//   ExtBuffer = Buf_1 [0];
//   double macurrent=iMAOnArray(ExtBuffer,0,5,0,MODE_LWMA,0); 

// запись в файл данных буфера

//--- установим для массивов признак таймсерии 
   ArraySetAsSeries(Buf_1,true); 
   ArraySetAsSeries(date_Buf_1,true);
   
//--- скопируем таймсерию 
   int copied=CopyTime(NULL,0,0,0,date_Buf_1);    

//--- подготовим массив Buf_1 
   ArrayResize(Buf_1,copied); 
//--- скопируем значения линии индикатора  
   for(int i=0;i<copied;i++) 
     { 
      Buf_1[i]= V5; 
     } 
//--- откроем файл для записи значений индикатора 
   ResetLastError(); 
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV); 
   if(file_handle!=INVALID_HANDLE) 
     { 
      PrintFormat("Файл %s открыт для записи",InpFileName); 
      PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH)); 
      //--- сначала запишем значения индикатора 
      FileWrite(file_handle,Buf_1); 
      //--- запишем время и значения в файл 
      for(int i=0;i<Buf_1;i++) 
         FileWrite(file_handle,time_Buf_1[i],Buf_1[i]); 
      //--- закрываем файл 
      FileClose(file_handle); 
      PrintFormat("Данные записаны, файл %s закрыт",InpFileName); 
     } 
   else 
      PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError()); 
  }
   
  return(rates_total);
}
 
YarTrade: Ich versuche, die Daten des Indikators in eine Datei zu schreiben, damit ich sie später für die Erstellung des Indikators verwenden kann. Der Indikator wird als Linie gebildet, die auf der Differenz zwischen dem Volumen der positiven Ticks und dem Volumen der negativen Ticks für den aktuellen Balken basiert.

Wenn Sie glauben, dass jemand, der sich Ihren Code ansieht, schnell einen Fehler finden kann, irren Sie sich. Der Compiler sucht nach Fehlern. Der Programmtext sollte formatiert werden - MetaEditor verfügt über ein Styling-Tool für diesen Zweck. Wenn Sie einen anderen Stil bevorzugen, verwenden Sie z. B. das Programm AStyle.exe. Nach dem Styling werden Sie schnell feststellen, dass das Programm 1) eine zusätzliche schließende Klammer hat. 2) Deklarierte Variable: datetime date_Buf_1; // Indikator Datums-Array - damit dies ein Array ist, muss es [size] oder [] für ein dynamisches Array sein und dann muss die Größe auf ArrayResize gesetzt werden, wie es scheint. Und dies sollte vor der Verwendung eines Arrays geschehen - siehe oben Beiträge darüber. 3) FileOpen(InpDirectoryName+"//"+InpFileName - scheint, als ob die Sticks in die andere Richtung gekippt werden sollten. Und auf InpDirectoryName+"//" sollten Sie besser verzichten - Sie finden die Datei ohnehin im Ordner "Files".

in Zeile: int copied=CopyTime(NULL,0,0,0,date_Buf_1); der Compiler wird böse, start=end=0 number=0

Стилизатор - Работа с исходным кодом - Разработка программ - Справка по MetaEditor
Стилизатор - Работа с исходным кодом - Разработка программ - Справка по MetaEditor
  • www.metatrader5.com
Данная функция предназначена для оформления исходного кода в соответствии с рекомендуемым стандартом. Это позволяет сделать код более читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще анализировать в последующем как его автору, так и другим пользователям. Для того чтобы запустить стилизатор, необходимо выполнить...