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

 
2047728 :
Merhaba, 2013 yılından itibaren video eğitimlerini kullanarak MQL4 öğrenmeye başladım, videodaki kodu aynen yeniden yazıyorum, ihtiyacım olan başka bir videodan küçük değişiklikler ekliyorum, sonuç olarak 25 hata alıyorum. Bu hatalara bir çözüm aramaya çalıştım ama anladığım kadarıyla terminal yapısı değişti ve bunun sonucunda kod yazımında bazı değişiklikler oldu. Birisi kodu düzenlemeye yardımcı olursa veya en azından iyi bir tavsiyede bulunursa minnettar olurum, şimdiden teşekkürler.

Ve bu size nasıl yardımcı olacak? Bir dahaki sefere, hemen Freelance ile iletişime geçin

 //+------------------------------------------------------------------+
//|                                                           ea.mq4 |
//|                                                             mql4 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Intruder"
#property link        ""
#property version    "1.00"
#property strict

extern double Lots         = 0.1 ;
extern int     TakeProfit   = 50 ;
extern int     Step         = 50 ;
extern double Multiplier   = 2 ;
extern int     Slippage     = 5 ;
extern int     Magic        = 123 ;

extern int     MA_1_Period  = 21 ;
extern int     MA_1_Shift   = 0 ;

extern int     MA_2_Period  = 3 ;
extern int     MA_2_Shift   = 0 ;


int ticket;
double price,TP,lastlot;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int Init()
  {
   if ( Digits == 3 || Digits == 5 )
     {
      TakeProfit *= 10 ;
      Step       *= 10 ;
      Slippage   *= 10 ;
     }
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert start function                                             |
//+------------------------------------------------------------------+
int start()
  {
   bool check;
   if (CountTrades()== 0 )
     {
       double ima_1 = iMA ( Symbol (), PERIOD_CURRENT , MA_1_Period, MA_1_Shift, MODE_SMA , PRICE_CLOSE , 1 );
       double ima_2 = iMA ( Symbol (), PERIOD_CURRENT , MA_2_Period, MA_2_Shift, MODE_SMA , PRICE_CLOSE , 1 );

       if (ima_1>ima_2)
        {
         ticket= OrderSend ( Symbol (), OP_BUY ,Lots, Ask ,Slippage, 0 , 0 , "" ,Magic, 0 ,Blue);
         if (ticket> 0 )
           {
            TP= NormalizeDouble ( Ask +TakeProfit* Point , Digits );
            check= OrderModify (ticket, OrderOpenPrice (), 0 ,TP, 0 );
           }
        }
       else if (ima_1<ima_2)
        {
         ticket= OrderSend ( Symbol (), OP_SELL ,Lots, Bid ,Slippage, 0 , 0 , "" ,Magic, 0 ,Red);
         if (ticket> 0 )
           {
            TP= NormalizeDouble ( Bid -TakeProfit* Point , Digits );
            check= OrderModify (ticket, OrderOpenPrice (), 0 ,TP, 0 );
           }
        }

     }
   else
     {
       int order_type= FindLastOrderType();
       if (order_type == OP_BUY )
        {
         price=FindLastOrderPrice( OP_BUY );
         if ( Ask <=price-Step* Point )
           {
            lastlot = FindLastLots ( OP_BUY );
            lastlot = NormalizeDouble (lastlot * Multiplier, 2 );
            ticket= OrderSend ( Symbol (), OP_BUY ,lastlot, Ask ,Slippage, 0 , 0 , "" ,Magic, 0 ,Blue);
             if (ticket> 0 )
               ModifiOrders( OP_BUY );
           }
        }
       else if (order_type== OP_SELL )
        {
         price = FindLastOrderPrice( OP_SELL );
         if ( Bid <= price + Step * Point )
           {
            lastlot = FindLastLots ( OP_SELL );
            lastlot = NormalizeDouble (lastlot * Multiplier, 2 );
            ticket= OrderSend ( Symbol (), OP_BUY ,lastlot, Bid ,Slippage, 0 , 0 , "" ,Magic, 0 ,Red);
             if (ticket> 0 )
               ModifiOrders( OP_SELL );
           }
        }
     }

   return ( 0 );
  }
//+------------------------------------------------------------------+
void ModifiOrders( int otype)
  {
   double avgprice= 0 ,
   order_lots= 0 ;
   bool check;
   price= 0 ;
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
        {
         if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==Magic && OrderType ()==otype)
           {
            price+= OrderOpenPrice ()* OrderLots ();
            order_lots+= OrderLots ();
           }
        }
     }
   avgprice= NormalizeDouble (price/order_lots, Digits );

   if (otype == OP_BUY ) TP = NormalizeDouble (avgprice + TakeProfit* Point , Digits );
   if (otype == OP_SELL ) TP = NormalizeDouble (avgprice - TakeProfit* Point , Digits );

   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
        {
         if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==Magic && OrderType ()==otype)
            check= OrderModify ( OrderTicket (), OrderOpenPrice (), 0 ,TP, 0 );
        }
     }
  }
//+------------------------------------------------------------------+
double FindLastLots( int otype)
  {
   double oldlots= 0 ;
   int oldticket= 0 ;

   ticket= 0 ;
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
        {
         if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==Magic && OrderType ()==otype)
           {
            oldticket= OrderTicket ();
             if (oldticket>ticket)
              {
               oldlots= OrderLots ();
               ticket = oldticket;
              }
           }
        }
     }
   return (oldlots);
  }
//+------------------------------------------------------------------+
double FindLastOrderPrice( int otype)
  {
   double oldopenprice=- 1 ;
   int     oldticket= 0 ;

   ticket= 0 ;

   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
        {
         if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==Magic && OrderType ()==otype)
           {
            oldticket= OrderTicket ();
             if (oldticket>ticket)
              {
               oldopenprice= OrderOpenPrice ();
               ticket=oldticket;
              }
           }
        }
     }
   return (oldopenprice);
  }
//+------------------------------------------------------------------+
int FindLastOrderType()
  {
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
        {
         if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==Magic)
             return ( OrderType ());
        }
     }
   return (- 1 );
  }
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count= 0 ;
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
        {
         if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==Magic) count++;
        }
     }
   return (count);
  }
//-------------------------------------------------------------------+
 
2047728 :

Merhaba, 2013 yılından itibaren video eğitimlerini kullanarak MQL4 öğrenmeye başladım, videodaki kodu aynen yeniden yazıyorum, ihtiyacım olan başka bir videodan küçük değişiklikler ekliyorum, sonuç olarak 25 hata alıyorum. Bu hatalara bir çözüm aramaya çalıştım ama anladığım kadarıyla terminal yapısı değişti ve bunun sonucunda kod yazımında bazı değişiklikler oldu. Birisi kodu düzenlemeye yardımcı olursa veya en azından iyi bir tavsiyede bulunursa minnettar olurum, şimdiden teşekkürler.

Değişiklikleri birer birer ekleyin ve hataları düzeltin - yavaş yavaş öğrenin. Bir dil öğrenmek istiyorsanız basit örneklerle başlayın.

 

Tünaydın! Lütfen gösterge kodunu anlamama yardım edin. Sıfır bir seviye var, buna bağlı olarak ilk seviyeyi doldurmanız gerekiyor. Ne yapmıyorum, ne çalışmıyor. İşte gösterge kodu:

 //+---------------------------------------------------------------------------------------------------------+
//|                                                                                        Trend Levels.mq5 |
//|                                                                                                   Serzh |
//+---------------------------------------------------------------------------------------------------------+
#property copyright "Serzh"
#property version    "1.00"

//--------------------------------Входные параметры----------------------------------------------------------

#property indicator_chart_window                  // Индикатор отображается в окне графика
#property indicator_buffers 4                      // К-во индикаторных буферов
#property indicator_plots    2                      // К-во графических серий

//--------------------------------Инициализация графических серий--------------------------------------------

#property indicator_label1    "Максимумы 1-го ровня"          // Название индикаторной серии
#property indicator_type1    DRAW_ARROW                      // Тип линии индикатора
#property indicator_color1    clrDarkGreen                    // Цвет линии индикатора
#property indicator_width1    2                                // Толщина линии индикатора

#property indicator_label2    "Минимумы 1-го ровня"            // Название индикаторной серии
#property indicator_type2    DRAW_ARROW                      // Тип линии индикатора
#property indicator_color2    clrCrimson                      // Цвет линии индикатора
#property indicator_width2    2                                // Толщина линии индикатора

//--------------------------------Инициализация индикаторных массивов----------------------------------------

 double Max_1[],Min_1[];                                             // Индикаторные массивы
 double Max_0[],Min_0[];                                             // Вспомогательные массивы
   
//+---------------------------------------------------------------------------------------------------------+
//|                               Функция обработки события OnInit                                          |
//+---------------------------------------------------------------------------------------------------------+
int OnInit ()

  {
  
   EventSetTimer ( _Period );                                 // Установка Таймера

//-----------------------------------------------------------------------------------------------------------
   
   SetIndexBuffer ( 0 ,Max_1, INDICATOR_DATA );                 // Присвоение индикаторного массива буферу
   SetIndexBuffer ( 1 ,Min_1, INDICATOR_DATA );                 // Присвоение индикаторного массива буферу
   
   PlotIndexSetInteger ( 0 , PLOT_ARROW , 159 );                   // Установка кода символа для PLOT_ARROW
   PlotIndexSetInteger ( 1 , PLOT_ARROW , 159 );                   // Установка кода символа для PLOT_ARROW
   
   PlotIndexSetInteger ( 0 , PLOT_ARROW_SHIFT ,- 10 );             // Установка сдвига символа в пикселях
   PlotIndexSetInteger ( 1 , PLOT_ARROW_SHIFT , 10 );             // Установка сдвига символа в пикселях
    
   PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0 );               // Установка пустого значения
   PlotIndexSetDouble ( 1 , PLOT_EMPTY_VALUE , 0 );               // Установка пустого значения

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

   SetIndexBuffer ( 2 ,Max_0, INDICATOR_CALCULATIONS );                   // Присвоение индикаторного массива буферу
   SetIndexBuffer ( 3 ,Min_0, INDICATOR_CALCULATIONS );                   // Присвоение индикаторного массива буферу
   
   ArraySetAsSeries (Max_0, true );                                     // Установка индексаци массива как в таймсерии
   ArraySetAsSeries (Min_0, true );                                     // Установка индексаци массива как в таймсерии
   
//--------------------------------Инициализация массивов-----------------------------------------------------
   
   return ( INIT_SUCCEEDED );

  }
//+---------------------------------------------------------------------------------------------------------+
//|                               Функция обработки события OnCalculate                                     |
//+---------------------------------------------------------------------------------------------------------+
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[])                       // Спред
  {
//--------------------------------Объявление переменных------------------------------------------------------

 int i0, i_1max, i_1min, i_1maxH= 0 , i_1minH= 0 ;                                 // Индексы
 
 int Max_1Index= 0 , Min_1Index= 0 ;                                               // Индексы максимальных и минимальных баров

 int Step_0, Step_1max, Step_1min;                                             // Шаги циклов
 
 int Start_1max, Start_1min;                                                   // Стартовая позиция
 
 int Stop_1maxA= 0 , Stop_1minA= 0 , Stop_1maxB= 0 , Stop_1minB= 0 ;                   // Ограничитель дальнейших действий
 
 int Shift_max1= 0 , Shift_min1= 0 ;                                               // Шифты
 
 int TotalMax_0= 0 , TotalMin_0= 0 ;                                               // Всего баров в нулевых массивах
 int TotalMax_1= 0 , TotalMin_1= 0 ;                                               // Всего баров в массивах 1-го уровня
 
 int imax_0= 0 , imin_0= 0 , imax_1= 0 , imin_1= 0 ;                                   // Инициализаторы массивов

 
//--------------------------------Расчет 0-го уровня индикатора----------------------------------------------

   if (prev_calculated< 4 ) Step_0= 1 ;                                               // Если расчетов еще небыло Step_0=1
   else Step_0=rates_total- 3 ;                                                   // Если расчеты уже были Step_0=rates_total-3
  
   for (i0=Step_0;i0<rates_total- 2 ;i0++)                                         // Цикл для расчетов
    {
     if (high[i0+ 1 ]<high[i0] && high[i0]>=high[i0- 1 ]) Max_0[i0]=high[i0];       // Присвоение значения массиву Max_0
     else Max_0[i0]= 0 ;                                                         // Присвоение 0 значения массиву
     TotalMax_0= ArrayRange (Max_0,imax_0);                                       // Всего баров в массиве Max_0
         
     if (low[i0+ 1 ]>low[i0] && low[i0]<=low[i0- 1 ])     Min_0[i0]=low[i0];       // Присвоение значения массиву Min_0
     else Min_0[i0]= 0 ;                                                         // Присвоение 0 значения массиву
     TotalMin_0= ArrayRange (Min_0,imin_0);                                       // Всего баров в массиве Min_0
    }

//--------------------------------Расчет максимума 1-го уровня индикатора------------------------------------

   if (TotalMax_1< 2 ) Step_1max= 1 ;                                               // Если расчетов еще небыло Step_1max=1
   else Step_1max=TotalMax_0- 1 ;                                                 // Если расчеты уже были Step_1max=TotalMax_0-1
  
   for (i_1max=Step_1max;i_1max<TotalMax_0- 1 ;i_1max++)                           // Главный цикл для заполнения массива Max_1
      {
       if (Max_0[i_1max]>Min_0[i_1max] && Stop_1maxA< 1 )                         // Нахождение ситуации когда Max_0 больше Min_0
          {
           Start_1max=i_1max;                                                   // Определение стартовой позиции
           Stop_1maxA= 1 ;                                                       // Задается значение пераметру Stop_1maxA
           Stop_1minA= 0 ;                                                       // Задается значение пераметру Stop_1minA
           
           for (i_1maxH=i_1max;Max_0[i_1maxH]>=Min_0[i_1maxH];i_1maxH++)       // Цикл для подсчета к-ва баров
           {Shift_max1++;}                                                     // Подсчет к-ва баров для расчета максимального индекса
           Max_1Index= ArrayMaximum (Max_0,Start_1max,Shift_max1);               // Вычисление максимального индекса
          }
       if (i_1max==Max_1Index) Max_1[i_1max]=Max_0[i_1max];                     // Присвоение значения массиву Max_1
       else Max_1[i_1max]= 0 ;                                                   // Присвоение 0 значения массиву Max_1
       TotalMax_1= ArrayRange (Max_1,imax_1);                                     // Всего баров в массиве Max_1
       
       if (Max_0[i_1max]<Min_0[i_1max] && Stop_1minA< 1 )                         // Нахождение ситуации когда Max_0 меньше Min_0
          {
           Stop_1maxA= 0 ;                                                       // Изменение параметра Stop_1maxA
           Stop_1minA= 1 ;                                                       // Изменение параметра Stop_1minA
          }
      }

//--------------------------------Расчет минимума 1-го уровня индикатора-------------------------------------

   if (TotalMin_1< 2 ) Step_1min= 1 ;                                               // Если расчетов еще небыло Step_1min=1
   else Step_1min=TotalMin_0- 1 ;                                                 // Если расчеты уже были Step_1min=TotalMin_0-1
  
   for (i_1min=Step_1min;i_1min<TotalMin_0- 1 ;i_1min++)                           // Главный цикл для заполнения массива Min_1
      {
       if (Min_0[i_1min]>Max_0[i_1min] && Stop_1minB< 1 )                         // Нахождение ситуации когда Min_0 больше Max_0
          {
           Start_1min=i_1min;                                                   // Определение стартовой позиции
           Stop_1minB= 1 ;                                                       // Задается значение пераметру Stop_1minB
           Stop_1maxB= 0 ;                                                       // Задается значение пераметру Stop_1maxB
           
           for (i_1minH=i_1min;Min_0[i_1minH]>=Max_0[i_1minH];i_1minH++)       // Цикл для подсчета к-ва баров
           {Shift_min1++;}                                                     // Подсчет к-ва баров для расчета минимального индекса
           Min_1Index= ArrayMinimum (Min_0,Start_1min,Shift_min1);               // Вычисление максимального индекса
          }
       if (i_1min==Min_1Index) Min_1[i_1min]=Min_0[i_1min];                     // Присвоение значения массиву Min_1
       else Min_1[i_1min]= 0 ;                                                   // Присвоение 0 значения массиву Min_1
       TotalMin_1= ArrayRange (Min_1,imin_1);                                     // Всего баров в массиве Min_1
       
       if (Min_0[i_1min]<Max_0[i_1min] && Stop_1maxB< 1 )                         // Нахождение ситуации когда Min_0 меньше Max_0
          {
           Stop_1minB= 0 ;                                                       // Изменение параметра Stop_1minB
           Stop_1maxB= 1 ;                                                       // Изменение параметра Stop_1maxB
          }
      }

//--------------------------------------------------------------   
   return (rates_total);
  }
//+---------------------------------------------------------------------------------------------------------+
//|                               Функция обработки события Таймер                                          |
//+---------------------------------------------------------------------------------------------------------+
   void OnTimer (){}
//+---------------------------------------------------------------------------------------------------------+

//+---------------------------------------------------------------------------------------------------------+
//|                               Функция обработки события OnDeinit                                        |
//+---------------------------------------------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   EventKillTimer ();                                                 // Удаление Таймера
   Print ( __FUNCTION__ , "_Код причины деинициализации = " ,reason);     // Причина деинициализации
  }
 

Bana yardım et lütfen.

Bu konuda nasıl bir komut dosyası oluşturamam, işte sayfa https://www.mql5.com/ru/articles/1368

-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------------

Grafikteki verileri bir *.csv dosyasına kaydetmek için bir komut dosyası yazıyoruz (uygulamanın s_ExportChartToCSV_v1.mq4 dosyası):

 int start(){
   int h= FileOpen ( Symbol ()+ Period ()+ ".csv" , FILE_WRITE | FILE_CSV , "," );
       for ( int i= Bars - 1 ;i>= 0 ;i--){
         FileWrite (h, TimeToStr ( Time [i], TIME_DATE ), TimeToStr ( Time [i], TIME_MINUTES ), Open [i], High [i], Low [i], Close [i], Volume [i]);
      }
   FileClose (i);
   return ( 0 );
}

Komut dosyasını standart olmayan zaman dilimlerinin çizelgelerinde yürütürüz. Uzmanlar/dosyalar dizinindeki betiğin çalışmasının bir sonucu olarak, standart olmayan zaman çerçevesi verileriyle standart *.csv dosyaları alırız.

-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------------------------------- Eğer bir komut dosyası yazabilirseniz

şimdiden teşekkürler

Тестирование экспертов на нестандартных таймфреймах
Тестирование экспертов на нестандартных таймфреймах
  • 2009.05.18
  • Dmitry Fedoseev
  • www.mql5.com
Цена на рынке меняется с достаточно большой частотой, чтобы для технического анализа было удобно пользоваться графиком непосредственного изменения цены, так называемого тикового графика. Для упрощения восприятия изменений цены и обеспечения возможности использования в анализе большие интервалы времени используется отображение графиков в виде...
 

Takas ne zamandan beri strateji test cihazında tahakkuk etmeye başladı?

Yoksa fark etmedim mi?

neden raporun HTML sürümüne dahil etmiyorsunuz?

 
Vladislav Andruschenko :

Takas ne zamandan beri strateji test cihazında tahakkuk etmeye başladı?

Yoksa fark etmedim mi?

neden raporun HTML sürümüne dahil etmiyorsunuz?

Her zaman böyle olmuştur.

Bu nedenle, aynı ayarlara sahip test sonuçları, takas değişiklikleri nedeniyle bazen biraz farklılık gösterir. Veya optimizasyon uzunsa ve bu süre zarfında takas değiştiyse optimizasyon ve testlerdeki sonuçlar farklıdır.

 
Sergey Basov :

Her zaman böyle olmuştur.

Bu nedenle, aynı ayarlara sahip test sonuçları, takas değişiklikleri nedeniyle bazen biraz farklılık gösterir. Veya optimizasyon uzunsa ve bu süre zarfında takas değiştiyse optimizasyon ve testlerdeki sonuçlar farklıdır.


hiç dikkat etmedi! Strateji test cihazında MT4'te takas olmadığını düşündüm.

 
Çocuk söyle bana. Uzman Danışman oluşturmak için MQL5'te ADX göstergesini kullanan sinyalleri bulamıyorum
 

Herkese iyi akşamlar!

Soru şu ki, test cihazında sipariş sorunsuz bir şekilde değiştirilir, ancak demo hesabında bu değişiklik çalışmaz.

Stoploss değiştirildi. Testte stoploss cari fiyattan en az 1 puan olabilir ama demo hesapta spread + 6-8 puan daha uzaklıkta stop koysanız bile yapmanız gerekir.

MODE_STOPLEVEL=0, MODE_FREEZELEVEL=0. DC Alpari.

Lütfen bana değişikliği neden ve nasıl doğru bir şekilde yapacağımı söyleyin.

 
Valerius :

Herkese iyi akşamlar!

Soru şu ki, test cihazında sipariş sorunsuz bir şekilde değiştirilir, ancak demo hesabında bu değişiklik çalışmaz.

Stoploss değiştirildi. Testte stoploss cari fiyattan en az 1 puan olabilir ama demo hesapta spread + 6-8 puan daha uzaklıkta stop koysanız bile yapmanız gerekir.

MODE_STOPLEVEL=0, MODE_FREEZELEVEL=0. DC Alpari.

Lütfen bana değişikliği neden ve nasıl doğru bir şekilde yapacağımı söyleyin.

0, yüzer durma anlamına gelir. Test cihazında yayılma sabittir. 1 koyarsanız, her zaman 1 olacaktır. Ama gerçek hayatta yüzüyor.
Neden: