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

 
Vitaly Muzichenko:

So soll es zunächst sein.

Als Nächstes müssen wir eine ordnungsgemäße Fixierung, dass die Bar ausgearbeitet ist, aber hier müssen wir die gesamte Annäherung an den TOR zu berechnen.

Soweit ich das aus Ihrem Beitrag ersehen kann, müssen wir das tun:

Das Wesentliche ist, dass wir, wenn die Spanne größer als normal ist, wieder zuOnTick übergehen und bei einem neuen Tick die Spanne überprüfen, wenn sie normal ist, einen Auftrag senden und uns daran erinnern, dass auf diesem Balken ein Handel stattgefunden hat.

Es gibt auch einen zweiten Weg:

Im Allgemeinen müssen Sie die Logik definieren, wann die Aufzeichnung erfolgen soll, und erst wieder prüfen, wenn der "Neue Balken" gebildet ist.


Ich verstehe Sie, danke!

 

Meine Herren, können Sie mir einen Tipp geben? Ich habe versucht, die Daten des Indikators für die zweite Woche in eine Datei zu schreiben, um sie später zu lesen und einen Indikator auf der Grundlage der Daten zu erstellen. Der Indikator ist ein Trainingsindikator, ich berechne das Volumen für jeden Tick eines bestimmten Balkens. Ist der Tick positiv, wird sein Volumen mit "+" addiert, ist er negativ, mit "-". Ich addiere die erhaltenen Volumina und erhalte ein Delta und betrachte dieses Delta als kumulativ. Dadurch entsteht eine Kurve. Diese Kurve wird jedoch nur in Echtzeit erstellt. Sie kann nicht in die Geschichte eingeordnet werden. Zu diesem Zweck habe ich beschlossen, die Daten in eine Datei zu schreiben. In dieser Phase bin ich stecken geblieben. Ich habe es mit Mühe und Not geschafft, dass der Code keine Compilerfehler erzeugt. Das daraus resultierende Produkt funktioniert jedoch nicht. Davor funktionierte der Indikator. Nachdem ich den Code zum Schreiben der Datei angehängt habe, funktioniert der Indikator nicht mehr. Das Programm erstellt eine Datei mit einem unverständlichen Datensatz und bricht an dieser Stelle ab. Ich sitze schon den ganzen Tag hier und kann es nicht herausfinden. Kann mir jemand helfen?

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_label1  "Вверх"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Salmon
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

#property indicator_label2  "Вниз"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDarkTurquoise
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2

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[0]);
      //--- запишем время и значения в файл 
      for(int i=0;i<Buf_1[0];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:

Meine Herren, können Sie mir einen Tipp geben? Ich habe versucht, die Daten des Indikators für die zweite Woche in eine Datei zu schreiben, um sie später zu lesen und einen Indikator auf der Grundlage der Daten zu erstellen. Der Indikator ist ein Trainingsindikator, ich berechne das Volumen für jeden Tick eines bestimmten Balkens. Ist der Tick positiv, wird sein Volumen mit "+" addiert, ist er negativ, mit "-". Ich addiere die erhaltenen Volumina und erhalte ein Delta und betrachte dieses Delta als kumulativ. Dadurch entsteht eine Kurve. Diese Kurve wird jedoch nur in Echtzeit erstellt. Sie kann nicht in die Geschichte eingeordnet werden. Zu diesem Zweck habe ich beschlossen, die Daten in eine Datei zu schreiben. In dieser Phase bin ich stecken geblieben. Ich habe es mit einer Bitterkeit geschafft, dass der Code keine Compilerfehler erzeugt. Das daraus resultierende Produkt funktioniert jedoch nicht. Der Indikator hat vorher funktioniert. Nachdem ich den Code zum Schreiben der Datei angehängt habe, funktioniert der Indikator nicht mehr. Das Programm erstellt eine Datei mit einem unverständlichen Datensatz und bricht an dieser Stelle ab. Ich sitze schon den ganzen Tag hier und kann es nicht herausfinden. Kann mir jemand helfen?


Es wäre ratsam, den Zeiger vor der Aufnahme an das Ende der Datei zu setzen.

FileSeek - Файловые операции - Справочник MQL4
FileSeek - Файловые операции - Справочник MQL4
  • docs.mql4.com
Если выставить позицию за "правую границу" файла (больше, чем размер файла), то последующая запись в файл будет будет произведена не с конца файла, а с выставленной позиции. При этом между предыдущим концом файла и выставленной позицией будут записаны неопределенные значения...
 
Alexey Viktorov:

Es wäre gut, den Zeiger vor dem Schreiben an das Ende der Datei zu setzen.


Wozu ist das gut? Ich habe den Link gelesen, aber ich verstehe ihn nicht.

 
YarTrade:

Wozu ist das gut? Ich habe den Link gelesen, aber ich verstehe ihn nicht.

Und wozu? Wenn Sie eine Datei öffnen, wird der Zeiger an den Anfang der Datei gesetzt und die Informationen werden an den Anfang der Datei geschrieben. Um an die richtige Stelle zu schreiben, müssen Sie den Mauszeiger an die richtige Stelle bewegen.

 
YarTrade:

Meine Herren, können Sie mir einen Tipp geben? Seit einer Woche versuche ich nun schon, Indikatordaten in eine Datei zu schreiben...

Haben Sie es gelesen?
 
Alexey Kozitsyn:
Haben Sie es gelesen?

Ich bin noch dabei, MQL4 zu lernen. Ich habe es nicht gelesen.

Gibt es einen Online-Schulungsdienst, bei dem man MQL4 kostenlos/bezahlt anhand von Beispielen mit einem Ausbilder lernen kann? Ich habe fast ein MQL4-Tutorial gelesen, aber ich kann überhaupt nicht programmieren. Ich bin mit der Programmierung noch nicht vertraut. Ich versuche, in diesem Thread etwas zu lernen, aber ich bin nicht weitergekommen. Können Sie mir einen Rat geben?

 
YarTrade:

Ich bin noch dabei, MQL4 zu lernen. Ich habe es nicht gelesen.

Gibt es einen Online-Schulungsdienst, bei dem man MQL4 kostenlos/bezahlt anhand von Beispielen mit einem Tutor lernen kann? Ich habe fast ein MQL4-Tutorial gelesen, aber ich kann überhaupt nicht programmieren. Ich bin mit der Programmierung noch nicht vertraut. Ich versuche, in diesem Thread etwas zu lernen, aber ich bin nicht weitergekommen. Können Sie mir einige Vorschläge machen?

1. Die Arbeit mit Dateien in mql4 ist die gleiche wie in mql5.

2. Bei allem Respekt vor Sergej Kowaljow, auch er hat meine Fragen seinerzeit beantwortet, aber meiner Meinung nach sind die Lektionen von Kirill leichter zu verstehen. In Yandex geben Sie ein und sofort 2 Links zu seiner Lektion


 

Hallo! Die Anleitung auf der Website hat mir gereicht, nach ein paar Jahren des Herumprobierens habe ich gelernt, meine eigenen Indikatoren zu schreiben. Aber die Fragen bleiben. Jetzt verstehe ich nicht, warum die Indikatoren verwirrt sind. Auf M1 fangen einige von ihnen nach etwa 12 Stunden an, falsch zu zeichnen, signalisieren aber korrekt. Einige zeichnen und signalisieren falsch. Auf der M5 ziehen sie fünfmal so lange. Können Sie mir bitte einen Tipp geben.

 
Alexey Viktorov:

1. Die Handhabung von Dateien in mql4 ist die gleiche wie in mql5.

2. Bei allem Respekt vor Sergej Kowaljow, auch er hat meine Fragen seinerzeit beantwortet, aber meiner Meinung nach ist die Lektion von Kirill leichter zu verstehen. In Yandex, geben Sie auf und sofort 2 Links zu seiner Lektion



Ist es möglich, mit Hilfe der Lektionen von "Kirill" zu lernen, wenn man sich noch nie mit Programmierung beschäftigt hat? Wie lange dauert es aus Ihrer Sicht?