초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 649

 
Artyom Trishkin :

나는 당신이 가지고 있는 ZigZag 정점 검색 코드의 일부를 보았습니다. Igor Kim이 보낸 것 같습니다. 여기에 극한값 검색 코드를 삽입하고 찾은 극값의 시간을 추가로 절약합니다. 당신은 사이클에서 그것을 찾고 있습니다 ... 당신이 그것을 찾을 때 극값이 이미 발견되었을 때 사이클 인덱스에 표시된 시간을 기억하십시오 - 가격 값을 반환 하기 전에. 즉, 함수를 참조하여 datetime 변수를 추가로 전달하여 지그재그 극값을 찾은 시간을 기록합니다. 함수가 가격 값을 반환할 때 이 변수에 원하는 지그재그 극한값이 있는 막대가 열리는 시간 값을 추가로 입력합니다.

죄송합니다. 작동하는 컴퓨터와 거리가 멀고 예제 코드를 제공할 수 없습니다.

모든 것이 해결되었습니다! 감사합니다!
 
안녕하세요! MQL4에서는 약간 작성하지만 MQL5에서는 완전히 0입니다. 하루에 높고 낮음의 차이를 계산할 작은 조수를 작성할 필요가 있었습니다. 4차 버전에서는 이를 위한 좋은 iHigh 및 iLow 기능이 있지만 여기서는 누락된 것을 발견했습니다. copyHigh와 copyLow를 사용해 보았지만 최대값에서 최소값을 빼면 많은 오류가 발생합니다. 가급적이면 코드를 사용하여 이 문제를 해결하는 방법을 알려주십시오. 미리 감사드립니다!
 
Александр Богданов :
안녕하세요! MQL4에서는 약간 작성하지만 MQL5에서는 완전히 0입니다. 하루에 높고 낮음의 차이를 계산할 작은 조수를 작성할 필요가 있었습니다. 4차 버전에서는 이를 위한 좋은 iHigh 및 iLow 기능이 있지만 여기서는 누락된 것을 발견했습니다. copyHigh와 copyLow를 사용해 보았지만 최대값에서 최소값을 빼면 많은 오류가 발생합니다. 가급적이면 코드를 사용하여 이 문제를 해결하는 방법을 알려주십시오. 미리 감사드립니다!
많은 오류가 있는 코드를 더 잘 보여주고 잘못된 부분이 있는 경우 많은 주석을 얻습니다.
 
Александр Богданов :
안녕하세요! MQL4에서는 약간 작성하지만 MQL5에서는 완전히 0입니다. 하루에 높고 낮음의 차이를 계산할 작은 조수를 작성할 필요가 있었습니다. 4차 버전에서는 이를 위한 좋은 iHigh 및 iLow 기능이 있지만 여기서는 누락된 것을 발견했습니다. copyHigh와 copyLow를 사용해 보았지만 최대값에서 최소값을 빼면 많은 오류가 발생합니다. 가급적이면 코드를 사용하여 이 문제를 해결하는 방법을 알려주십시오. 미리 감사드립니다!
이것을 코드 시작 부분에 붙여넣습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

'CopyTicks' 테스트

fxsaber , 2016.10.19 07:59

// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
   class CLASS ##NAME                                                                                           \
  {                                                                                                           \
   public :                                                                                                     \
     static T Get( const string Symb, const int TimeFrame, const int iShift )                                  \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
       return ((Copy ##FUNC((Symb == NULL ) ? _Symbol : Symb, _Period , iShift, 1 , tValue) > 0 ) ? tValue[ 0 ] : - 1 ); \
    }                                                                                                         \
                                                                                                              \
    T operator []( const int iPos ) const                                                                      \
    {                                                                                                         \
       return (CLASS ##NAME::Get(_Symbol, _Period , iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS ##NAME NAME;                                                                                           \
                                                                                                              \
  T i ##NAME( const string Symb, const int TimeFrame, const int iShift )                                       \
  {                                                                                                           \
     return (CLASS ##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }

DEFINE_TIMESERIE( Volume , TickVolume, long )
DEFINE_TIMESERIE( Time , Time , datetime )
DEFINE_TIMESERIE( Open , Open , double )
DEFINE_TIMESERIE( High , High , double )
DEFINE_TIMESERIE( Low , Low , double )
DEFINE_TIMESERIE( Close , Close , double )
이렇게 하면 MT5에서 일반적인 iHigh 및 iLow를 사용할 수 있습니다.
 
fxsaber :
fxsaber :
이것을 코드 시작 부분에 붙여넣습니다.
이렇게 하면 MT5에서 일반적인 iHigh 및 iLow를 사용할 수 있습니다.
정말 감사합니다! 이것은 작업을 크게 단순화합니다
 
Александр Богданов :
안녕하세요! MQL4에서는 약간 작성하지만 MQL5에서는 완전히 0입니다. 하루에 높고 낮음의 차이를 계산할 작은 조수를 작성할 필요가 있었습니다. 4차 버전에서는 이를 위한 좋은 iHigh 및 iLow 기능이 있지만 여기서는 누락된 것을 발견했습니다. copyHigh와 copyLow를 사용해 보았지만 최대값에서 최소값을 빼면 많은 오류가 발생합니다. 가급적이면 코드를 사용하여 이 문제를 해결하는 방법을 알려주십시오. 미리 감사드립니다!

작업이 화면에만 표시되는 것이라면 가장 좋은 솔루션은 표시기입니다. OnCalculate()의 표시기에는 필요한 모든 시계열이 있습니다.

//+------------------------------------------------------------------+
//| 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[])
  {

기본적으로 MQL5 표시기에서 가장 오른쪽 막대에는 Rates_total-1 인덱스가 있습니다. 그리고 귀하의 작업은 기본 뺄셈으로 축소됩니다.

   double difference=high[rates_total- 1 ]-low[rates_total- 1 ];


사실, 이러한 간단한 접근 방식은 지표가 D1 기간에 시작된 경우에만 올바르게 표시됩니다. 다른 시간대에 실행하는 경우 CopyHigh 및 CopyLow를 사용해야 합니다. 원칙적으로 복잡한 것은 없습니다.

예시를 쓰겠습니다...

//+------------------------------------------------------------------+
//|                                               High minus Low.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
#property indicator_chart_window
#property indicator_plots 0
//--- input parameter
input ENUM_TIMEFRAMES period= PERIOD_D1 ;   // для какого периода считать High-Low
//---
double multiplier= 0.0 ;
double High [], Low [];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   multiplier= MathPow ( 10 , Digits ());
//---
   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[])
  {
//--- разницу цен переводим в пункты
   double difference=( iHigh ( Symbol (),period, 0 )- iLow ( Symbol (),period, 0 ))*multiplier;
//--- вывод результата на экран
   Comment ( "High-Low=" , DoubleToString (difference, 0 ));
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
//| Получим Low для заданного номера бара                            |
//+------------------------------------------------------------------+
double iLow ( string symbol, ENUM_TIMEFRAMES timeframe, int index)
  {
   double low= 0 ;
   ArraySetAsSeries ( Low , true );
   int copied= CopyLow (symbol,timeframe, 0 , Bars (symbol,timeframe), Low );
   if (copied> 0 && index<copied) low= Low [index];
   return (low);
  }
//+------------------------------------------------------------------+
//| Получим High для заданного номера бара                           |
//+------------------------------------------------------------------+
double iHigh ( string symbol, ENUM_TIMEFRAMES timeframe, int index)
  {
   double high= 0 ;
   ArraySetAsSeries ( High , true );
   int copied= CopyHigh (symbol,timeframe, 0 , Bars (symbol,timeframe), High );
   if (copied> 0 && index<copied) high= High [index];
   return (high);
  }
//+------------------------------------------------------------------+


이제 표시기는 현재 기호의 모든 시간 프레임에서 실행될 수 있으며 높음과 낮음 간의 차이를 계산할 시간 프레임을 선택할 수 있습니다.
파일:
 
Александр Богданов :
안녕하세요! MQL4에서는 약간 작성하지만 MQL5에서는 완전히 0입니다. 하루에 높고 낮음의 차이를 계산할 작은 조수를 작성할 필요가 있었습니다. 4차 버전에서는 이를 위한 좋은 iHigh 및 iLow 기능이 있지만 여기서는 누락된 것을 발견했습니다. copyHigh와 copyLow를 사용해 보았지만 최대값에서 최소값을 빼면 많은 오류가 발생합니다. 가급적이면 코드를 사용하여 이 문제를 해결하는 방법을 알려주십시오. 미리 감사드립니다!
매일의 Hi 및 Low(현재 날짜의 최고 및 최저)가 정확히 필요한 경우 식별자 SYMBOL_BIDHIGH 및 SYMBOL_BIDLOW(또는 기타 기호에 따라)와 함께 SymbolInfoDouble()을 사용하여 아주 간단하게 수행됩니다.
 
안녕하세요! 2016.10.21_19:58 모스크바 시간. 나는 전략 테스터에서 어드바이저를 확인한다. EA는 거래를 열고 닫습니다. 그러나 전략 테스터는 다음과 같은 오류를 제공합니다. ArrayMinimum 함수에 대한 잘못된 시작 위치 0; -하나; 'CLose.mqh'의 범위를 벗어난 배열(86,59); EA의 심각한 오류로 인해 테스트 통과가 중지되었습니다. EA가 어떻게 실수를 하는지에 대한 스크린샷과 포함된 파일 CLose.mqh의 코드가 있습니다. 이 코드에서 배열을 벗어날 방법이 없습니다. 그래서 나는 무엇이 잘못되었는지 이해하지 못합니다. 가능하시면 조언 부탁드립니다. 모든 동안. 20:08 모스크바 시간. 치명적 오류
//+------------------------------------------------------------------+
//|                                                        CLose.mqh |
//|                                              Nickityuk N., 2016. |
//|                             https://www.mql5.com/users/nicityuk/ |
//+------------------------------------------------------------------+
#property copyright "Nickityuk N., 2016."
#property link        "https://www.mql5.com/users/nicityuk/"
#property strict
#include <Expert\OPen.mqh>
//#include <ARrayMinimum.mqh>
double AOmax,AOmax2,AOmin,AOmin2,AOm0,AOn0,z5max0,z5min0,clm,cln,AO[];
int aom,aom2,aon,aon2;
datetime ttm,ttn,hm,hn;
//+------------------------------------------------------------------+
//| Calculate for close order                                        |
//+------------------------------------------------------------------+
void CLose()
  { if (buy== 0 && sell== 0 ) { return ;}
   else if ( OrderType ()== OP_BUY ) {CloseBuy();}
         else                      CloseSell();}
//+------------------------------------------------------------------+
void St()
  {St0= iStochastic ( NULL , 0 , 24 , 5 , 3 , MODE_SMA , 0 , MODE_MAIN , 0 );
   Si0= iStochastic ( NULL , 0 , 24 , 5 , 3 , MODE_SMA , 0 , MODE_SIGNAL , 0 );
   St1= iStochastic ( NULL , 0 , 24 , 5 , 3 , MODE_SMA , 0 , MODE_MAIN , 1 );
   Si1= iStochastic ( NULL , 0 , 24 , 5 , 3 , MODE_SMA , 0 , MODE_SIGNAL , 1 );}
void CloseBuy()
  {St(); if (St0- 20 > 0 && Si0- 20 > 0 )
           { if (St1-Si1> 0 && St0-Si0< 0 ) {AOm0= iAO ( NULL , 0 , 0 );
               if (AOm0-AOm1>= 0 ) {AOm1= iAO ( NULL , 0 , 0 ); return ;}
               else if (St0- 80 > 0 && St0- 100 <= 0 && Si0- 80 > 0 )
                      { if (Si0- 100 <= 0 && St1-Si1> 0 && St0-Si0< 0 )
                         {TwoExtremeAO_Buy(); OneExtremeBuy(); ExpirationBuy();}
                       else return ;}            
                     else return ;}
             else return ;}        
         else return ;}
void CloseSell()
  {St(); if (St0- 80 < 0 && Si0- 80 < 0 )
           { if (St1-Si1< 0 && St0-Si0> 0 ) {AOn0= iAO ( NULL , 0 , 0 );
               if (AOn0-AOn1<= 0 ) {AOn1= iAO ( NULL , 0 , 0 ); return ;}
               else if (St0- 20 < 0 && St0>= 0 && Si0- 20 < 0 )
                      { if (Si0>= 0 && St1-Si1< 0 && St0-Si0> 0 )
                         {TwoExtremeAO_Sell(); OneExtremeSell(); ExpirationSell();}
                       else return ;}  
                     else return ;}
             else return ;}        
         else return ;}
//+------------------------------------------------------------------+                      
void CalculateClose()
  {v0= iVolume ( NULL , PERIOD_M1 , 0 ); //--- go trading only for first tiks of new bar
   v1= iVolume ( NULL , PERIOD_M1 , 1 );
   v2= iVolume ( NULL , PERIOD_M1 , 2 );
   v3= iVolume ( NULL , PERIOD_M1 , 3 );
   v4= iVolume ( NULL , PERIOD_M1 , 4 );
   if (v0+v1+v2+v3+v4- 10 / 12 > 0 ) return ;  
   for (index= 0 ;index< 24 ;index++)
     {AO[index]= iAO ( NULL , PERIOD_M5 ,index);}
   ArrayResize (AO, 24 , 4 );
   ArraySetAsSeries (AO, true );}
   //index=0; AO[index]=iAO(NULL,PERIOD_M5,index);}
//+------------------------------------------------------------------+      
void TwoExtremeAO_Buy()
  {CalculateClose();
   if ( ArrayMaximum (AO, 23 , 0 )== 0 ) return ;
   else aom= ArrayMaximum (AO, 23 , 0 ); AOmax=AO[aom];
   if ( ArrayMinimum (AO,aom, 0 )> 0 ) {aon= ArrayMinimum (AO,aom, 0 );}
   else return ;
   if ( ArrayMaximum (AO,aon, 0 )== 0 ) return ;
   else aom2= ArrayMaximum (AO,aon, 0 ); AOmax2=AO[aom2];
     if (AOmax2-AOmax> 0 ) { return ;}
     else if (AOmax2-AOmax< 0 ) { if ( OrderClose ( OrderTicket (), OrderLots (), Bid , 300 ,White)== false )
                                { Print ( "OrderClose error." , GetLastError ());}
                               else //index=2;
                                   //while(iFractals(NULL,0,MODE_UPPER,index)==0) {index++;}
                                   //Sleep(3000); luf=iFractals(NULL,0,MODE_UPPER,index);
                                   //SL=NormalizeDouble(luf+(Ask-Bid)+(1*_Point),_Digits);
                                   TP= NormalizeDouble ( Ask -tp* _Point , _Digits );
                                   tic= OrderSend ( Symbol (), OP_SELL ,LotsCalculated(), Bid , 50 , 0 ,TP, "" ,MAGIC, 0 ,Red);
                                   AOn1= iAO ( NULL , 0 ,index); return ;}
           else return ;}
//+------------------------------------------------------------------+          
void TwoExtremeAO_Sell()
  {CalculateClose();
   if ( ArrayMinimum (AO, 23 , 0 )== 0 ) return ;
   else aon= ArrayMinimum (AO, 23 , 0 ); Print (aon, "" ); AOmin=AO[aon];
   if ( ArrayMaximum (AO,aon, 0 )> 0 ) {aom= ArrayMaximum (AO,aon, 0 );}
   else return ;
   if ( ArrayMinimum (AO,aom, 0 )== 0 ) return ;
   else aon2= ArrayMinimum (AO,aom, 0 ); AOmin2=AO[aon2]; //Print(aon2,"");
     if (AOmin2-AOmin> 0 ) { return ;}
     else if (AOmin2-AOmin< 0 ) { if ( OrderClose ( OrderTicket (), OrderLots (), Bid , 300 ,White)== false )
                                { Print ( "OrderClose error." , GetLastError ());}
                               else //index=2;
                                   //while(iFractals(NULL,0,MODE_LOWER,index)==0) {index++;}
                                   //Sleep(3000); ldf=iFractals(NULL,0,MODE_LOWER,index);
                                   //SL=NormalizeDouble(ldf-(1*_Point),_Digits);
                                   TP= NormalizeDouble ( Bid +tp* _Point , _Digits );
                                   tic= OrderSend ( Symbol (), OP_BUY ,LotsCalculated(), Ask , 50 , 0 ,TP, "" ,MAGIC, 0 ,Blue);
                                   AOm1= iAO ( NULL , 0 , 0 ); return ;}
           else return ;}
//+------------------------------------------------------------------+                      
void OneExtremeBuy()
  {index= 0 ;
   while ( iCustom ( NULL , PERIOD_M5 , "ZigZag" , 12 , 5 , 3 , 1 ,index)== 0 ) {index++;}
   z5max0= iCustom ( NULL , PERIOD_M5 , "ZigZag" , 12 , 5 , 3 , 1 ,index); ttm= iTime ( NULL , 0 ,index); clm= iClose ( NULL , PERIOD_M5 , 0 ); //Sleep(3000);
   if ((clm-(z5max0- 300 * Point ))< 0 ) { if ( OrderClose ( OrderTicket (), OrderLots (), Bid , 300 ,White)== false )
                                       { Print ( "OrderClose error." , GetLastError ());}
                                   else return ;}
   else return ;}
void OneExtremeSell()
  {index= 0 ;
   while ( iCustom ( NULL , PERIOD_M5 , "ZigZag" , 12 , 5 , 3 , 2 ,index)== 0 ) {index++;}
   z5min0= iCustom ( NULL , PERIOD_M5 , "ZigZag" , 12 , 5 , 3 , 2 ,index); ttn= iTime ( NULL , 0 ,index); cln= iClose ( NULL , PERIOD_M5 , 0 ); //Sleep(3000);
   if ((cln-(z5min0+ 300 * Point ))> 0 ) { if ( OrderClose ( OrderTicket (), OrderLots (), Bid , 300 ,White)== false )
                                       { Print ( "OrderClose error." , GetLastError ());}
                                   else return ;}
   else return ;}
//+------------------------------------------------------------------+                                                                      
void ExpirationBuy()
  {hm= TimeHour (ttm); if ((hm+ 3 )- TimeCurrent ()< 0 ) { if ( OrderClose ( OrderTicket (), OrderLots (), Bid , 300 ,White)== false )
                                                   { Print ( "OrderClose error." , GetLastError ());}
                                                 else return ;}
                     else return ;}
void ExpirationSell()
  {hn= TimeHour (ttn); if ((hn+ 3 )- TimeCurrent ()< 0 ) { if ( OrderClose ( OrderTicket (), OrderLots (), Bid , 300 ,White)== false )
                                                   { Print ( "OrderClose error." , GetLastError ());}
                                                 else return ;}
                     else return ;}
//+------------------------------------------------------------------+          
 
Николай Никитюк :
안녕하세요! 2016.10.21_19:58 모스크바 시간. 나는 전략 테스터에서 어드바이저를 확인한다. EA는 거래를 열고 닫습니다. 그러나 전략 테스터는 다음과 같은 오류를 제공합니다. ArrayMinimum 함수에 대한 잘못된 시작 위치 0; -하나; 'CLose.mqh'의 범위를 벗어난 배열(86,59); EA의 심각한 오류로 인해 테스트 통과가 중지되었습니다. EA가 어떻게 실수를 하는지에 대한 스크린샷과 포함된 파일 CLose.mqh의 코드가 있습니다. 이 코드에서 배열을 벗어날 방법이 없습니다. 그래서 나는 무엇이 잘못되었는지 이해하지 못합니다. 가능하시면 조언 부탁드립니다. 모든 동안. 20:08 모스크바 시간.

또는 리메이크를 위해 int(aon=NormalizeDouble(aon,0) 사용)에 있을 수도 있고, 그렇지 않으면 double과 비슷하고 완전히 명확하지 않습니다.

:

if ( ArrayMinimum (AO,aom, 0 )> 0 ) {aon= ArrayMinimum (AO,aom, 0 );}
 
Karputov Vladimir :

Expert Advisor에 입력 매개변수를 입력하기만 하면 시작 시 할당된 값에 따라 구매만 하거나 판매만 하게 됩니다.

input bool Long= true ;             // allow only "Long"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
...
void OnTick ()
  {
   if (!Long)
      trade.Sell( 0.01 );
   if (Long)
      trade.Buy( 0.01 );
  }
수동 거래 를 위해 무엇을 제공할 수 있습니까?
사유: