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

 
Herzlichen Dank! Ich werde es mir ansehen!
 
Kann ich die Handelsstufen im MT5-Terminal nicht auf STYLE_DOT, sondern z.B. auf STYLE_ SOLID einstellen?
 

Bitte helfen Sie mit dem Code

eine Anzeige gemacht

Im Testgerät funktioniert es korrekt

Wenn ich sie in die Tabelle einfüge, wird sie nicht korrekt angezeigt.

Ich verstehe nicht, warum

//+------------------------------------------------------------------+
//|                                                        Oscil.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property  indicator_buffers 5
#property indicator_plots   5

#property  indicator_color1  clrNONE
#property  indicator_color2  clrRoyalBlue
#property  indicator_color3  clrPink
#property  indicator_color4  clrAqua
#property  indicator_color5  clrYellow

#property  indicator_width1 1
#property  indicator_width2 5
#property  indicator_width3 5
#property  indicator_width4 5
#property  indicator_width5 5

double MainLine[];
double UpLine[];
double DnLine[];
double muls[];
double x,y,z;
double price;
double mulSum=0;
double Pi   = 3.1415926535;
bool LastUp = false;
bool GoUp   = false;
input bool otl    = false;
/***********Range***************/
int    Length             = 3;
int    MajorRangeStrength = 4;


double MajorRangeBuy[];
double MajorRangeSell[];


double RangePrice  = 0.0,
       SweepB      = 0.0;
int    Switch2     = 0,
         SwitchB     = 0;
double Price2BuyA  = 0.0;
int    Price2BuyB  = 1.0;
double Price2SellA = 0.0;
int    Price2SellB = 0.0;
bool   BuySwitchB  = false,
       SellSwitchB = false;
       
int hendlMA_1;
double MA_1[];

int hendlMA_2;
double MA_2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,MainLine,INDICATOR_DATA);
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0);
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); 
   ArraySetAsSeries(MainLine, true);
   
   SetIndexBuffer(1,UpLine,INDICATOR_DATA);
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0);
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); 
   ArraySetAsSeries(UpLine, true);
   
   SetIndexBuffer(2,DnLine,INDICATOR_DATA);
   PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0);
   PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); 
   ArraySetAsSeries(DnLine, true);
   
   SetIndexBuffer(3,MajorRangeBuy,INDICATOR_DATA);
   PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, 0);
   PlotIndexSetInteger(3,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); 
   ArraySetAsSeries(MajorRangeBuy, true);
   
   SetIndexBuffer(4,MajorRangeSell,INDICATOR_DATA);
   PlotIndexSetDouble(4, PLOT_EMPTY_VALUE, 0);
   PlotIndexSetInteger(4,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); 
   ArraySetAsSeries(MajorRangeSell, true);
   
   hendlMA_1=iMA(Symbol(),0,1,0,MODE_LWMA,PRICE_CLOSE);
   ArraySetAsSeries(MA_1,true);
   
   hendlMA_2=iMA(Symbol(),0,1,0,MODE_SMMA,PRICE_CLOSE);
   ArraySetAsSeries(MA_2,true);
   
   ArrayResize(muls, 99);
   
   mulSum = 0;
   
   for (int i0 = 0; i0 < 98; i0++) {//повторяем в цикле 98 раз
      if (i0 <= 18) y = 1.0 * i0 / 18; //если это первые 18 повторений
      else y = (i0 - 18) * 7.0 / 79.0 + 1.0; //иначе
      
      x = MathCos(Pi * y);
      z = 1.0 / (3.0 * Pi * y + 1.0);
      if (y <= 0.5) z = 1;
      
      muls[i0] = z * x;
      mulSum += muls[i0];
   }
   if(otl)Print(" Распределение создано muls[20]=",muls[20]);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
  if (PeriodSeconds() <60*60 || PeriodSeconds() >10080*60) return(0);
   int depth=0;

   int l_ind_counted_8 = prev_calculated; //Возвращает количество баров, не измененных после последнего вызова индикатора.
   
   int bars=Bars(Symbol(),PERIOD_CURRENT);
   if (l_ind_counted_8 < 0) return (0);
   if (l_ind_counted_8 == 0)
      {
         depth = bars - 98;
         for(int a=0;a<bars;a++)
            {
               MainLine[a] = 0;
               UpLine[a] = 0;
               DnLine[a] = 0;
               MajorRangeBuy[a]=0;
               MajorRangeSell[a]=0;
            }
      }
   if (l_ind_counted_8 > 0)  depth = bars - l_ind_counted_8;
   if(otl)Print(" количество баров, не измененных после последнего вызова индикатора= ",l_ind_counted_8,"  Количество баров на текущем графике Bars=",bars,"  depth= ",depth);
   if (l_ind_counted_8 < 1) {
      for (int i2 = 1; i2 < 100; i2++) {
         MainLine[bars - i2] = 0;
         UpLine[bars - i2] = 0;
         DnLine[bars - i2] = 0;
      }
   }
   
   for (int i1 = depth; i1 >= 0; i1--) 
   {
      price = 0;
          
          CopyBuffer(hendlMA_1,0,0,bars,MA_1);
          
      for (int i2 = 0; i2 <= 98; i2++) 
         {
            if(i2 + i1>=bars)break;
            price += muls[i2] * MA_1[i2 + i1];
         }
          
      if (mulSum > 0.0) MainLine[i1] = price / mulSum;

     GoUp=MainLine[i1 + 1] > MainLine[i1] ;
     
      if (GoUp) 
      {
         if (!LastUp) DnLine[i1+1] = MainLine[i1+1];
         DnLine[i1] = MainLine[i1];
         UpLine[i1] = 0;
      }
         else
      {
         if (LastUp) UpLine[i1+1] = MainLine[i1+1];
         UpLine[i1] = MainLine[i1];
         DnLine[i1] = 0;
      }
      LastUp=GoUp; 

   }//  for (int i1

 //  return (0);

/***************** Range **********************/

  int counted_bars=prev_calculated;
  if(otl)Print(" Range counted_bars = ", counted_bars);
   if(counted_bars<0) return(-1);
   int position=bars-counted_bars;
   if (position<0) position=0;
   if (position==0) position=1;
   int rnglength = 250;
   double range = 0.0, srange = 0.0;
   if(otl) Print(" position=",position);
   
   for (int pos = position; pos >=0; pos--)
   {/***************** MAIN Range **********************/
      srange = 0.0;
      int j = 0;
      for (int i=0;i<rnglength;i++)
      {
         j++;
         int posr = pos + i;
         if (posr >= bars) break; 
         srange = srange + (High(posr) - Low(posr));
      }
      range = srange / j * Length;
      int BarNumber = bars-pos; //??????????
      if (BarNumber < 0)  BarNumber = 0;
          
          CopyBuffer(hendlMA_2,0,0,bars,MA_2);
          //Print(bars," - ",pos);
      if(pos<bars)RangePrice = MA_2[pos];  //Moving Average MODE_SMMA
      else RangePrice = MA_2[pos-1];

      if (BarNumber == 1)
      {
         SweepB  = range *  MajorRangeStrength;
         Price2BuyA = RangePrice;
         Price2SellA = RangePrice;
      }     

      if (BarNumber > 1)
      {

         if (Switch2  >  - 1)//проверка цикла на покупку
         {
            if (RangePrice < Price2BuyA) //если средняя цена ниже
            {
if (BuySwitchB ) MajorRangeBuy [pos +BarNumber - Price2BuyB] = 0;                                                                //OUT
                           Price2BuyA = RangePrice;
               Price2BuyB = BarNumber;
               BuySwitchB = true;
            } 
            else if (RangePrice > Price2BuyA)
            {
                            SwitchB = BarNumber - Price2BuyB;
MajorRangeBuy [pos +SwitchB] = MainLine[pos + SwitchB]*1.0005;                                                                                                                          //OUT
                BuySwitchB = true;

                              if (RangePrice - MA_2[pos + SwitchB] >= SweepB && SwitchB >= 1)
                              {
                     Switch2 =  - 1;
                     Price2SellA = RangePrice;
                     Price2SellB = BarNumber;
                     SellSwitchB = false;
                     BuySwitchB = false;
               }
            }
         }
         if (Switch2  < 1)//проверка цикла на продажу
         {
            if (RangePrice  > Price2SellA )
            {
if (pos +BarNumber - Price2SellB<bars&&SellSwitchB ) MajorRangeSell [pos +BarNumber - Price2SellB] = 0;                                                         //OUT
                           Price2SellA = RangePrice;
               Price2SellB = BarNumber;
               SellSwitchB = true;
                    }
                       else if (RangePrice < Price2SellA)
                    {
               SwitchB = BarNumber - Price2SellB ;

         if(pos+ SwitchB<bars)MajorRangeSell[pos + SwitchB] =MainLine[pos + SwitchB]*1.0005;                                                                                                                             //OUT
                SellSwitchB = true;             
        
                              if (pos + SwitchB<bars&&MA_2[pos + SwitchB] - RangePrice >= SweepB && SwitchB >= 1)
                              {
                                     Switch2 = 1;
                     Price2BuyA = RangePrice;
                     Price2BuyB = BarNumber;
                     SellSwitchB = false;
                     BuySwitchB = false;
                                  }
            }
         }
      }

   //   MajorRangeSell[pos] = 0;
    //  MajorRangeBuy[pos]  = 0;  
    }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//========================================================================================
double High(int index)
{   
   if(index < 0) return(-1);
   double Arr[];
   ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT;
   if(CopyHigh(Symbol(),timeframe, index, 1, Arr)>0) 
        return(Arr[0]);
   else return(-1);
}
//========================================================================================
double Low(int index)
{   
   if(index < 0) return(-1);
   double Arr[];
   ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT;
   if(CopyLow(Symbol(),timeframe, index, 1, Arr)>0) 
        return(Arr[0]);
   else return(-1);
}
 
Mikhail Rudyk #:

Bitte helfen Sie mit dem Code

eine Anzeige gemacht

Im Testgerät funktioniert es korrekt

Wenn ich es in die Tabelle einfüge, wird es nicht korrekt angezeigt.

Ich kann den Grund dafür nicht herausfinden.

Haben Sie den Debugger verwendet, um die Ursache zu finden?

 

Bitte helfen Sie mir, den Code zu schreiben

Bedingungen für den Indikator:

Wenn der Höchststand (2) größer ist als der vorherige Höchststand (1) und der Tiefststand (2) größer ist als der vorherige Tiefststand (1), warten Sie auf die umgekehrte Situation (Höchststand 3 und 4) und (Tiefststand 3 und 4). Am Maximum zwischen den Hochpunkten (2 und 3) setzen Sie die Markierung des Maximums als blauen Punkt.

Wenn der Höchstwert (4) niedriger ist als der vorherige Höchstwert (3) und der Tiefstwert (4) niedriger ist als der vorherige Tiefstwert (3), warten Sie auf die umgekehrte Situation (Höchstwerte 5 und 6) und (Tiefstwerte 5 und 6). Am Tiefpunkt zwischen den Hochpunkten (4 und 5) wird der Tiefpunkt als roter Punkt gesetzt.

Entschuldigung, das Bild passt nicht.

Der Code selbst:


 for(int i=Start;i>0 && !IsStopped();i--)

   {

    int a1=0,b1=0,a2=0,b2=0, Stop1a=0, Stop1b=0;

//-----------------------------------    

    if(high[i-1]<high[i] && low[i-1]<low[i] && Stop1a==0)  // условие для установки максимума и открытый доступ

     {

      Stop1a=1;                                            // закрываем доступ (чтобы небыло ненужных повторений)

      for(i;i>0;i--)                                       // цикл для счетчика

        {

         a1++;                                             // счетчик для функции iHighest

         if(high[i-1]>high[i] && low[i-1]>low[i])          // противоложное условие предыдущему

          {

           Stop1a=0;                                       // открываем доступ

           b1=iHighest(NULL,0,MODE_HIGH,a1,i);             // получаем индекс максимального значения

           Max1[b1]=high[b1];                              // заполняем индикаторный массив для максимумов

           break;                                          // прерываем цикл

          }

        }

     } 



    if(high[i-1]>high[i] && low[i-1]>low[i] && Stop1b==0)  // условие для установки минимума и открытый доступ

     {

      Stop1b=1;                                            // закрываем доступ (чтобы небыло ненужных повторений)

      for(i;i>0;i--)                                       //  цикл для счетчика

        {

         a2++;                                             // счетчик для функции iLowest

         if(high[i-1]<high[i] && low[i-1]<low[i])          // противоложное условие предыдущему

          {

           Stop1b=0;                                       // открываем доступ

           b2=iLowest(NULL,0,MODE_LOW,a2,i);               // получаем индекс минимального значения

           Min1[b2]=low[b2];                               // заполняем индикаторный массив для минимумов

           break;                                          // прерываем цикл

          }

        }

     } 
 
Liebe Fachleute! Code:

int Handle = FileOpen("2022.02.01 12-00",FILE_ANSI|FILE_WRITE|FILE_COMMON,'-'); //zum Schreiben öffnen
FileWrite(Handle, "1", "643", "USDCAD","[11-1.30-0.70]");//Datensatz schreiben
FileSeek(Handle,0,SEEK_SET);//Ersetzte den Zeiger auf den Anfang der Datei (ich denke, das ist unnötig, aber trotzdem)
FileClose(Handle);//Schließen der Datei
Handle = FileOpen("2022.02.01 12-00",FILE_ANSI|FILE_SHARE_READ|FILE_COMMON,'-');//zum Lesen öffnen
Print(FileTell(Handle)," ",FileReadNumber(Handle)," ",FileReadNumber(Handle));
FileClose(Handle); //closed file

Der Protokolleintrag muss die aktuelle Zeigerposition, ein Leerzeichen, den ersten aus der Datei gelesenen Wert (1), ein Leerzeichen, den zweiten aus der Datei gelesenen Wert (643) enthalten. Stattdessen wird das Folgende protokolliert:

6 643.0 1.0

Das heißt, aus irgendeinem Grund, den ich nicht herausfinden kann, befindet sich der Dateizeiger nicht am Anfang der Datei, sondern sechs Bytes davon entfernt, am zweiten Trennzeichen ("-"), während das nächste Lesen von rechts nach links erfolgt. Die Versuche, den Zeiger mit der Funktion FileSeek an den Anfang der Datei zu setzen, waren erfolglos.
Mein Verstand reicht nicht aus, um den Grund dafür zu verstehen. Erklären Sie bitte, was zum Teufel hier los ist.
 
Sergey Gubar #:

Bitte helfen Sie mir, den Code zu schreiben

Bedingungen für den Indikator:

Wenn der Höchststand (2) größer ist als der vorherige Höchststand (1) und der Tiefststand (2) größer ist als der vorherige Tiefststand (1), warten Sie auf die umgekehrte Situation (Höchststand 3 und 4) und (Tiefststand 3 und 4). Am Maximum zwischen den Hochpunkten (2 und 3) setzen Sie die Markierung des Maximums als blauen Punkt.

Wenn der Höchstwert (4) niedriger ist als der vorherige Höchstwert (3) und der Tiefstwert (4) niedriger ist als der vorherige Tiefstwert (3), warten Sie auf die umgekehrte Situation (Höchstwerte 5 und 6) und (Tiefstwerte 5 und 6). Am Tiefpunkt zwischen den Hochpunkten (4 und 5) wird der Tiefpunkt als roter Punkt gesetzt.

Entschuldigung, das Bild passt nicht.

Der Code selbst:


Schauen Sie nicht voraus

[i+1]
 

Bitte helfen Sie mir!

Ich erhalte überhaupt nicht das, was ich erwarte. Sie müssen die Protokolldatei lesen

#define  GENERIC_READ            0x80000000
#define  GENERIC_WRITE           0x40000000

#define  WIN32_FILE_SHARE_READ   1
#define  WIN32_FILE_SHARE_WRITE  2

#define  CREATE_NEW              1
#define  CREATE_ALWAYS           2
#define  OPEN_ALWAYS             4
#define  OPEN_EXISTING           3
#define  TRUNCATE_EXISTING       5

#define  SEEK_FILE_BEGIN         0
#define  SEEK_FILE_CURRENT       1
#define  SEEK_FILE_END           2

#define  INVALID_HANDLE_VALUE    -1
#define  UNICODE
#define  FILE_ATTRIBUTE_NORMAL 0x80

#import "kernel32.dll"
int CreateFileW(string Filename,uint AccessMode,int ShareMode,int PassAsZero,int CreationMode,int FlagsAndAttributes,int AlsoPassAsZero);
int ReadFile(int FileHandle,ushort & Buffer[],int BufferLength,int & BytesRead[],int PassAsZero);
int SetFilePointer(int FileHandle,int Distance,int PassAsZero,int FromPosition);
int GetFileSize(int FileHandle,int PassAsZero);
int CloseHandle(int FileHandle);
#import

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
{
  string sDate = TimeToString(TimeCurrent()-86400, TIME_DATE);
  string FileName = TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL4\\Logs\\"+sDate+".log";
  int FileHandle = CreateFileW(FileName, GENERIC_READ, WIN32_FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
   SetFilePointer(FileHandle, 0, 0, SEEK_FILE_BEGIN);
   int szFileA = GetFileSize(FileHandle, 0);
   ushort ReadBufferA[];
    ArrayResize(ReadBufferA, szFileA);
    int BytesReadA[1] = {0};
    ReadFile(FileHandle, ReadBufferA, szFileA, BytesReadA, 0);

  string Res=ShortArrayToString(ReadBufferA, 0, BytesReadA[0]);

  string msg="FileHandle: "+FileHandle+"    \n"
             "FileSize: "+szFileA+"    \n"
             +"Res: "+Res;
  Print(msg); // 2022.02.03 04:56:43.670	test GBPJPY,M30: FileHandle: -1    FileSize: -1    Res: 

 CloseHandle(FileHandle);
}
//+------------------------------------------------------------------+
 

Guten Tag zusammen. Ich habe einen Indikator, der Fibonacci-Levels zeichnet. Ich brauche den EA, um einen anderen EA mit bestimmten Einstellungen auf diesem Diagramm zu platzieren, wenn der Preis das 61,8-Niveau auf diesem Fibo-Gitter erreicht, und die Schaltfläche zum Öffnen einer Order zu drücken.

Unten sehen Sie einen Screenshot des Indikators und des EA mit seinen Schaltflächen. Der Quellcode des Expert Advisors mit den Schaltflächen liegt uns nicht vor. Ein EA für die Verfolgung des 61,8er Niveaus auf dem Fibo-Gitter wird im Tester nicht funktionieren; er wird auf dem Demokonto funktionieren und dann, wenn alles gut geht, kann diese Kombination auf dem echten Konto installiert werden.

Indikator, der Fibo-Ebenen zeichnet der Berater mit den Tasten muss auf der linken offenen Seite gedrückt werden


Ist das wirklich möglich? Wenn ja, wie kann man sie in Worten und dann in Code umsetzen? Bitte erklären Sie das ausführlich und klar.

 
DanilaMactep #:

Guten Tag zusammen. Ich habe einen Indikator, der Fibonacci-Levels zeichnet. Ich benötige einen EA, der einen anderen EA mit bestimmten Einstellungen auf diesem Diagramm platziert, wenn der Preis das 61,8er-Niveau auf diesem Fibo-Gitter erreicht und die Schaltfläche zum Öffnen einer Order drückt.

Unten sehen Sie einen Screenshot des Indikators und des EA mit seinen Schaltflächen. Der Quellcode des Expert Advisors mit den Schaltflächen liegt uns nicht vor. Ein EA für die Verfolgung des 61,8er Niveaus auf dem Fibo-Gitter wird im Tester nicht funktionieren; er wird auf dem Demokonto funktionieren und dann, wenn alles gut geht, kann diese Kombination auf dem echten Konto installiert werden.


Ist das wirklich möglich? Wenn ja, wie kann man das in Worten und dann in Code umsetzen? Bitte erklären Sie, wie Sie das genauer und klarer können.

Haben Sie ein Gedächtnis für 24 Stunden?

Grund der Beschwerde: