MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 483

 
2047728 :
안녕하세요, 저는 2013년부터 비디오 자습서를 사용하여 MQL4를 배우기 시작했습니다. 비디오에서 코드를 정확히 다시 작성하고 필요한 다른 비디오에서 약간의 변경 사항을 추가하여 결과적으로 25개의 오류가 발생합니다. 이러한 오류에 대한 해결책을 찾으려고 노력했지만 내가 알기로는 터미널 빌드가 변경되었고 결과적으로 코드 작성에 약간의 변경이 있었습니다. 누군가 코드 편집에 도움을 주거나 최소한 좋은 조언을 해주시면 감사하겠습니다. 미리 감사드립니다.

그리고 이것이 어떻게 도움이 될까요? 다음에는 즉시 프리랜스 에 연락하십시오

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

안녕하세요, 저는 2013년부터 비디오 자습서를 사용하여 MQL4를 배우기 시작했습니다. 비디오에서 코드를 정확히 다시 작성하고 필요한 다른 비디오에서 약간의 변경 사항을 추가하여 결과적으로 25개의 오류가 발생합니다. 이러한 오류에 대한 해결책을 찾으려고 노력했지만 내가 알기로는 터미널 빌드가 변경되었고 결과적으로 코드 작성에 약간의 변경이 있었습니다. 누군가 코드 편집에 도움을 주거나 최소한 좋은 조언을 해주시면 감사하겠습니다. 미리 감사드립니다.

한 번에 하나씩 변경 사항을 추가하고 실수를 수정하십시오. 점차적으로 배우십시오. 언어를 배우고 싶다면 간단한 예부터 시작하세요

 

안녕하세요! 표시기 코드를 이해하도록 도와주세요. 0 레벨이 있으며 이를 기반으로 첫 번째 레벨을 채워야 합니다. 내가 하지 않는 것, 작동하지 않는 것. 다음은 표시기 코드입니다.

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

도와주세요, 제발.

https://www.mql5.com/ru/articles/1368 페이지에서 이 주제에 대한 스크립트를 생성하지 않을 수 있습니다.

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

차트의 데이터를 *.csv 파일(응용 프로그램의 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 );
}

비표준 시간대 차트에서 스크립트를 실행합니다. Experts/files 디렉토리에서 스크립트 작업의 결과로 비표준 시간 프레임 데이터가 포함된 표준 *.csv 파일을 얻습니다.

-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------------------------- 스크립트를 만들 수 있다면

미리 감사합니다

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

스왑은 언제부터 전략 테스터 에서 발생하기 시작했습니까?

아니면 내가 눈치채지 못한 걸까?

보고서의 HTML 버전에 포함하지 않는 이유는 무엇입니까?

 
Vladislav Andruschenko :

스왑은 언제부터 전략 테스터 에서 발생하기 시작했습니까?

아니면 내가 눈치채지 못한 걸까?

보고서의 HTML 버전에 포함하지 않는 이유는 무엇입니까?

항상 그랬습니다.

따라서 스왑 변경으로 인해 동일한 설정의 테스트 결과가 약간씩 다를 수 있습니다. 또는 최적화가 길고 이 시간 동안 스왑이 변경된 경우 최적화 및 테스트 결과가 다릅니다.

 
Sergey Basov :

항상 그랬습니다.

따라서 스왑 변경으로 인해 동일한 설정의 테스트 결과가 약간씩 다를 수 있습니다. 또는 최적화가 길고 이 시간 동안 스왑이 변경된 경우 최적화 및 테스트 결과가 다릅니다.


그것에 주의를 기울이지 않았다! 전략 테스터 에서 MT4에는 스왑이 없다고 생각했습니다.

 
말해줘 Expert Advisor를 생성하기 위해 MQL5에서 ADX 표시기를 사용하여 신호를 찾을 수 없습니다.
 

모두 좋은 저녁!

문제는 테스터에서는 문제 없이 순서가 수정되지만 데모 계정에서는 이 수정이 작동하지 않는다는 것입니다.

손절매가 수정됩니다. 테스트에서 손절매는 현재 가격 에서 최소 1포인트가 될 수 있지만, 데모 계정에서는 스프레드 + 또 다른 6-8포인트의 거리에 스탑을 넣어도 해야 합니다.

MODE_STOPLEVEL=0, MODE_FREEZELEVEL=0. 디씨알파리.

수정을 올바르게 하는 이유와 방법을 알려주세요.

 
Valerius :

모두 좋은 저녁!

문제는 테스터에서는 문제 없이 순서가 수정되지만 데모 계정에서는 이 수정이 작동하지 않는다는 것입니다.

손절매가 수정됩니다. 테스트에서 손절매는 현재 가격 에서 최소 1포인트가 될 수 있지만, 데모 계정에서는 스프레드 + 또 다른 6-8포인트의 거리에 스탑을 넣어도 해야 합니다.

MODE_STOPLEVEL=0, MODE_FREEZELEVEL=0. 디씨알파리.

수정을 올바르게 하는 이유와 방법을 알려주세요.

0은 부동 정지를 의미합니다. 테스터에서는 스프레드가 고정되어 있습니다. 1을 넣으면 항상 1이 됩니다. 그러나 실생활에서 그는 수영합니다.
사유: