Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1889

 
Grazie mille! Mi informerò!
 
Posso rendere i livelli di trading nel terminale MT5 non STYLE_DOT ma STYLE_ SOLID, per esempio?
 

Si prega di aiutare con il codice

fatto un indicatore

Nel tester funziona correttamente

Quando lo metto sul grafico non si visualizza correttamente

Non capisco perché

//+------------------------------------------------------------------+
//|                                                        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 #:

Si prega di aiutare con il codice

fatto un indicatore

Nel tester funziona correttamente

Quando lo metto sul grafico non viene visualizzato correttamente

Non riesco a capirne il motivo.

Hai usato il debugger per trovare la causa?

 

Per favore aiutatemi a scrivere il codice

Condizioni per l'indicatore:

Se il massimo (2) è maggiore del massimo precedente (1) e il minimo (2) è maggiore del minimo precedente (1), aspetta la situazione opposta (massimi 3 e 4) e (minimi 3 e 4). Al massimo tra i massimi (2 e 3), impostare il segno del massimo come un punto blu.

Se il massimo (4) è inferiore al massimo precedente (3) e il minimo (4) è inferiore al minimo precedente (3), aspetta la situazione opposta (massimi 5 e 6) e (minimi 5 e 6). Al minimo tra i massimi (4 e 5), il minimo è impostato come punto rosso.

Scusa, l'immagine non va bene.

Il codice stesso:


 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;                                          // прерываем цикл

          }

        }

     } 
 
Cari specialisti! Codice:

int Handle = FileOpen("2022.02.01 12-00",FILE_ANSI|FILE_WRITE|FILE_COMMON,'-'); //aprire per scrivere
FileWrite(Handle, "1", "643", "USDCAD","[11-1.30-0.70]");//scrivere il set di dati
FileSeek(Handle,0,SEEK_SET);//sostituito il puntatore all'inizio del file (penso che questo non sia necessario, ma comunque)
FileClose(Handle);//chiuso il file
Handle = FileOpen("2022.02.01 12-00",FILE_ANSI|FILE_SHARE_READ|FILE_COMMON,'-');//open for reading
Print(FileTell(Handle)," ",FileReadNumber(Handle)," ",FileReadNumber(Handle));
FileClose(Handle); //chiuso il file

La voce di registro deve contenere la posizione corrente del puntatore, uno spazio, il primo valore letto dal file (1), uno spazio, il secondo valore letto dal file (643). Invece, viene registrato quanto segue:

6 643.0 1.0

Cioè, per qualche ragione che non riesco a capire, il puntatore del file non è all'inizio del file, ma a sei byte da esso, al secondo separatore ("-"), mentre la lettura successiva è da destra a sinistra. I tentativi di spostare il puntatore all'inizio del file usando la funzione FileSeek non hanno avuto successo.
Il mio intelletto non è sufficiente per capirne la ragione. Per favore, spiega cos'è questo.
 
Sergey Gubar #:

Per favore aiutatemi a scrivere il codice

Condizioni per l'indicatore:

Se il massimo (2) è maggiore del massimo precedente (1) e il minimo (2) è maggiore del minimo precedente (1), aspetta la situazione opposta (massimi 3 e 4) e (minimi 3 e 4). Al massimo tra i massimi (2 e 3), impostare il segno del massimo come un punto blu.

Se il massimo (4) è inferiore al massimo precedente (3) e il minimo (4) è inferiore al minimo precedente (3), aspetta la situazione opposta (massimi 5 e 6) e (minimi 5 e 6). Al minimo tra i massimi (4 e 5), il minimo è impostato come punto rosso.

Scusa, l'immagine non va bene.

Il codice stesso:


Non guardare avanti

[i+1]
 

Per favore, aiutatemi!

Non ricevo affatto quello che mi aspetto. Necessità di leggere il file di log

#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);
}
//+------------------------------------------------------------------+
 

Buon pomeriggio a tutti. Ho un indicatore che disegna i livelli di Fibonacci. Ho bisogno che l'EA piazzi un altro EA con certe impostazioni su questo grafico quando il prezzo raggiunge il livello 61.8 su questa griglia Fibo e prema il pulsante per aprire un ordine.

Qui sotto c'è uno screenshot dell'indicatore e dell'EA con i suoi pulsanti. Non abbiamo il codice sorgente dell'Expert Advisor con i pulsanti. Un EA per tracciare il livello 61,8 sulla griglia Fibo non funzionerà nel tester; funzionerà sul conto demo e poi, se tutto va bene, questa combinazione potrà essere installata sul conto reale.

indicatore che disegna i livelli di Fibo il consigliere con i pulsanti deve essere premuto sulla sinistra aperta


È davvero possibile farlo? Se è così, come implementarlo a parole, e poi nel codice? Per favore, spiegatelo in dettaglio e chiaramente.

 
DanilaMactep #:

Buon pomeriggio a tutti. Ho un indicatore che disegna i livelli di Fibonacci. Ho bisogno che l'EA piazzi un altro EA con certe impostazioni su questo grafico quando il prezzo raggiunge il livello 61.8 su questa griglia Fibo e prema il pulsante per aprire un ordine.

Qui sotto c'è uno screenshot dell'indicatore e dell'EA con i suoi pulsanti. Non abbiamo il codice sorgente dell'Expert Advisor con i pulsanti. Un EA per tracciare il livello 61,8 sulla griglia Fibo non funzionerà nel tester; funzionerà sul conto demo e poi, se tutto va bene, questa combinazione potrà essere installata sul conto reale.


È davvero possibile farlo? Se è così, come implementare a parole, e poi in codice? Per favore, spiegate come potete più dettagliatamente e chiaramente.

Ha una memoria di 24 ore?

Motivazione: