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

 
2047728:
Ciao, ho iniziato a studiare MQL4 usando i video tutorial del 2013. Sto riscrivendo il codice esattamente dal video, aggiungendo alcune piccole modifiche da un altro video, come risultato ho 25 errori. Ho provato a cercare la soluzione a questi errori, ma dal momento che la build del terminale è cambiata e sono avvenuti alcuni cambiamenti nella codifica. Sarò grato se qualcuno può aiutarmi a modificare il codice o almeno darmi qualche consiglio utile, grazie in anticipo.

E questo come vi aiuta? La prossima volta, vai direttamente a Freelance.

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

Ciao, ho iniziato a studiare MQL4 utilizzando i video tutorial 2013, ho riscritto il codice esattamente dal video, aggiungendo alcune piccole modifiche da un altro, come ho bisogno di loro. Ho provato a cercare la soluzione a questi errori, ma dal momento che la build del terminale è cambiata e sono avvenuti alcuni cambiamenti nella codifica. Sarò grato se qualcuno può aiutarmi a modificare il codice o almeno darmi qualche consiglio utile, grazie in anticipo.

Aggiungete i cambiamenti uno per uno e correggete i bug - imparerete passo dopo passo. Vuoi imparare la lingua - inizia con esempi semplici

 

Buon pomeriggio! Per favore aiutami a capire il codice dell'indicatore. C'è un livello zero, basato su di esso, devi riempire il primo livello. Cosa non faccio, cosa non funziona. Ecco il codice indicatore:

 //+---------------------------------------------------------------------------------------------------------+
//|                                                                                        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);     // Причина деинициализации
  }
 

Per favore, aiutatemi.

Non riesco a creare uno script su questo argomento, ecco la pagina https://www.mql5.com/ru/articles/1368

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

Scriviamo uno script per salvare i dati del grafico in un file *.csv (applicazione s_ExportChartToCSV_v1.mq4):

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);
}

Esegui lo script su grafici con timeframes non standard. Come risultato dell'esecuzione dello script, riceviamo dei file *.csv standard con dati temporali non standard nella directory experts/filies.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Если можно сделаете скрипт

grazie in anticipo

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

da quando il tester di strategia ha iniziato a caricare lo swap?

o non l'ho notato?

perché non includerlo nella versione HTML del rapporto?

 
Vladislav Andruschenko:

da quando il tester di strategia ha iniziato a caricare lo swap?

o non l'ho notato?

perché non includerlo nella versione HTML del rapporto?

È sempre stato così.

Ecco perché i risultati dei test con le stesse impostazioni potrebbero essere leggermente diversi a causa dei cambiamenti di swap. Oppure i risultati nell'ottimizzazione e nei test differiscono, se l'ottimizzazione è stata lunga e lo swap è cambiato durante questo tempo.

 
Sergey Basov:

Questo è sempre stato il caso.

Ecco perché i risultati dei test con le stesse impostazioni possono essere leggermente diversi a causa dei cambiamenti di swap. Oppure i risultati sono diversi nell'ottimizzazione e nei test, se l'ottimizzazione è stata lunga e lo swap è cambiato durante questo tempo.


Non l'ho mai notato! Pensavo che non ci fosse lo swap in mt4 nello strategy tester.

 
Ragazzi, per favore consigliatemi, non riesco a trovare i segnali dell'indicatore ADX in MQL5 per la generazione di EA
 

Buona sera a tutti!

Nello Strategy Tester l'ordine viene modificato senza problemi, ma su un conto demo questa modifica non funziona.

Lo stop loss è modificato. Nel tester lo stoploss può essere solo 1 pip di distanza dal prezzo corrente ma nei conti demo anche se impostiamo lo stoploss ad una distanza di spread + 6-8 pip in più.

MODE_STOPLEVEL=0, MODE_FREEZELEVEL=0.

Si prega di consigliare perché e come fare la modifica corretta.

 
Valerius:

Buona sera a tutti!

Nello Strategy Tester l'ordine viene modificato senza problemi, ma su un conto demo questa modifica non funziona.

Lo stop loss è modificato. Nel tester lo stoploss può essere solo 1 pip di distanza dal prezzo corrente ma nei conti demo anche se impostiamo lo stoploss ad una distanza di spread + 6-8 pip in più.

MODE_STOPLEVEL=0, MODE_FREEZELEVEL=0.

Si prega di consigliare perché e come fare la modifica corretta.

0 significa uno stop fluttuante. Nel tester, lo spread è fisso. Se si imposta 1, allora 1 sarà sempre lì. Ma nella vita reale galleggia.
Motivazione: