MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1889

 
Çok teşekkürler! Çalışacağım!
 
Örneğin MT5 terminalinde STYLE_DOT değil de STYLE_ SOLID ticaret seviyelerini yapmak mümkün mü ???
 

Lütfen kod konusunda yardım edin

yapılmış gösterge

test cihazında iyi çalışıyor

grafiği koy yanlış gösteriyor

nedenini çözemiyorum

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

Lütfen kod konusunda yardım edin

yapılmış gösterge

test cihazında iyi çalışıyor

grafiği koy yanlış gösteriyor

nedenini çözemiyorum

Nedeni bulmak için bir hata ayıklayıcı kullanmayı denediniz mi?

 

Lütfen kod yazmama yardım et

Gösterge koşulları:

Yüksek (2) önceki yüksek (1) değerinden ve düşük (2) bir önceki düşük (1) değerinden büyükse, tam tersi bir durum (yüksek 3 ve 4) ve (düşük 3 ve 4) bekleriz. Maksimum (2 ve 3) arasındaki maksimum işarette, maksimum işareti mavi nokta şeklinde ayarlayın.

Yüksek (4) bir önceki yüksek (3) değerinden ve düşük (4) önceki düşük (3) değerinden düşükse, tam tersi bir durum (yüksek 5 ve 6) ve (düşük 5 ve 6) bekliyoruz. Maksimum (4 ve 5) arasındaki minimum işarette, minimum işareti kırmızı nokta şeklinde belirliyoruz.

üzgünüm resim eklenmemiş

Kodun kendisi:


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

          }

        }

     } 
 
Sevgili uzmanlar! Kodumuz var:

int Handle = FileOpen("2022.02.01 12-00",FILE_ANSI|FILE_WRITE|FILE_COMMON,'-'); //yazmak için açıldı
FileWrite(Handle,"1","643","USDCAD","[11-1.30-0.70]"); //veri kümesini yaz
FileSeek(Kolu,0,SEEK_SET); // işaretçiyi dosyanın başına taşıdı (bence bu gereksiz, ama yine de)
FileClose(Kolu); //dosyayı kapat
Handle = FileOpen("2022.02.01 12-00",FILE_ANSI|FILE_SHARE_READ|FILE_COMMON,'-');//okumak için açıldı
Print(FileTell(Handle)," ",FileReadNumber(Handle)," ",FileReadNumber(Handle));
FileClose(Kolu); //dosyayı kapat

Günlük girişi, geçerli işaretçi konumunu, bir boşluk, dosyadan okunan ilk değeri (1), bir boşluk, dosyadan okunan ikinci değeri (643) içermelidir. Bunun yerine, aşağıdakiler günlüğe kaydedilir:

6 643.0 1.0

Yani, dosya işaretçisi, nedense benim için anlaşılmaz, dosyanın başında değil, ikinci sınırlayıcıda ("-") ondan altı bayt var ve sonraki okuma sağdan sola doğru gerçekleşiyor. FileSeek işlevini kullanarak işaretçiyi dosyanın başına yeniden düzenleme girişimleri başarı getirmedi.
Benim aklım olan bitenin sebebini anlamak için yeterli değil. Lütfen bunun ne tür bir oyun olduğunu açıklayın.
 
Sergey Gubar # :

Lütfen kod yazmama yardım et

Gösterge koşulları:

Yüksek (2) önceki yüksek (1) değerinden ve düşük (2) bir önceki düşük (1) değerinden büyükse, tam tersi bir durum (yüksek 3 ve 4) ve (düşük 3 ve 4) bekleriz. Maksimum (2 ve 3) arasındaki maksimum işarette, maksimum işareti mavi nokta şeklinde ayarlayın.

Yüksek (4) bir önceki yüksek (3) değerinden ve düşük (4) önceki düşük (3) değerinden düşükse, tam tersi bir durum (yüksek 5 ve 6) ve (düşük 5 ve 6) bekliyoruz. Maksimum (4 ve 5) arasındaki minimum işarette, minimum işareti kırmızı nokta şeklinde belirliyoruz.

üzgünüm resim eklenmemiş

Kodun kendisi:


geleceğe bakma

[i + 1 ]
 

Lütfen yardım et!

Beklediğimi anlamıyorum. Günlük dosyasını okumanız gerekiyor

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

Herkese iyi günler. Fibonacci seviyelerini çizen bir gösterge var. Bu Fibo ızgarasında fiyat 61.8 seviyesine ulaştığında, bu grafikte belirli ayarlarla başka bir danışmanı yerleştirmek için danışmana ihtiyacım var ve bir emir açmak için düğmeye basın.

Aşağıda, düğmeleriyle birlikte göstergenin ve danışmanın bir ekranı bulunmaktadır. Butonlu bir Expert Advisor için kaynak kodu bulunmamaktadır.   Fibo şebekesinde 61.8 seviyesinin başarısını izlemek için Uzman Danışman, test cihazında çalışmayacaktır, ancak ilk başta demoda, her şey yolunda giderse, gerçek olana böyle bir grup koyabilirsiniz.

gösterge çizim fibo seviyeleri düğmeli danışman, sol açıkta tıklamanız gerekiyor


Böyle bir şey yapmak gerçekten mümkün mü? Öyleyse, kelimelerde ve sonra kodda nasıl uygulanır? açıklamak     lütfen mümkün olduğunca ayrıntılı ve net olun.

 
DanilaMactep # :

Herkese iyi günler. Fibonacci seviyelerini çizen bir gösterge var. Bu Fibo ızgarasında fiyat 61.8 seviyesine ulaştığında, bu grafikte belirli ayarlarla başka bir danışmanı yerleştirmek için danışmana ihtiyacım var ve bir emir açmak için düğmeye basın.

Aşağıda, düğmeleriyle birlikte göstergenin ve danışmanın bir ekranı bulunmaktadır. Butonlu bir Expert Advisor için kaynak kodu bulunmamaktadır.   Fibo şebekesinde 61.8 seviyesinin başarısını izlemek için Uzman Danışman, test cihazında çalışmayacaktır, ancak ilk başta demoda, her şey yolunda giderse, gerçek olana böyle bir grup koyabilirsiniz.


Bunu yapmak gerçekten mümkün mü? Öyleyse, kelimelerde ve sonra kodda nasıl uygulanır? açıklamak     lütfen mümkün olduğunca ayrıntılı ve net olun.

Bir günlük anınız var mı?