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

[삭제]  
Andrey Sokolov :

알았습니다. 고맙습니다. 다른 사람이 조언할 수 있습니까?

동시에 나도 너와 함께 공부했어

중간 버퍼

 //+------------------------------------------------------------------+
//|                                                  Demo_iBands.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"

//--- входные параметры
input int                   bands_period= 20 ;           // период скользящей средней
input int                   bands_shift= 0 ;             // сдвиг
input double                deviation= 2.0 ;             // кол-во стандартных отклонений
input ENUM_APPLIED_PRICE    applied_price= PRICE_CLOSE ; // тип цены
//--- переменная для хранения хэндла индикатора iBands
int     handle;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- создадим хэндл индикатора
   handle= iBands ( _Symbol , _Period ,bands_period,bands_shift,deviation,applied_price);
//--- если не удалось создать хэндл
   if (handle== INVALID_HANDLE )
     {
       //--- сообщим о неудаче и выведем номер ошибки
       PrintFormat ( "Не удалось создать хэндл индикатора iBands для пары %s/%s, код ошибки %d" ,
                   _Symbol ,
                   EnumToString ( _Period ),
                   GetLastError ());
       //--- работа индикатора завершается досрочно
       return ( INIT_FAILED );
     }
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   if (handle!= INVALID_HANDLE )
       IndicatorRelease (handle);
//--- почистим график при удалении индикатора
   Comment ( "" );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//--- индикаторные буферы
   double          UpperBuffer[];
   double          LowerBuffer[];
   double          MiddleBuffer[];
//--- количество копируемых значений из индикатора iBands
   int values_to_copy= 2 ;
//--- если FillArraysFromBuffer вернула false, значит данные не готовы - завершаем работу
   if (!FillArraysFromBuffers(MiddleBuffer,UpperBuffer,LowerBuffer,bands_shift,handle,values_to_copy))
       return ;
//--- сформируем сообщение
   Print ( "MiddleBuffer =" ,MiddleBuffer[ 0 ], "UpperBuffer =" ,UpperBuffer[ 0 ], "LowerBuffer =" ,LowerBuffer[ 0 ], "values_to_copy =" ,values_to_copy);
  }
//+------------------------------------------------------------------+
//| Заполняем индикаторные буферы из индикатора iBands               |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers( double &base_values[],     // индикаторный буфер средней линии Bollinger Bands
                           double &upper_values[],     // индикаторный буфер верхней границы
                           double &lower_values[],     // индикаторный буфер нижней границы
                           int shift,                 // смещение
                           int ind_handle,             // хэндл индикатора iBands
                           int amount                 // количество копируемых значений
                          )
  {
//--- сбросим код ошибки
   ResetLastError ();
//--- заполняем часть массива MiddleBuffer значениями из индикаторного буфера под индексом 0
   if ( CopyBuffer (ind_handle, 0 ,-shift,amount,base_values)< 0 )
     {
       //--- если копирование не удалось, сообщим код ошибки
       PrintFormat ( "Не удалось скопировать данные из индикатора iBands, код ошибки %d" , GetLastError ());
       //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
       return ( false );
     }
//--- заполняем часть массива UpperBuffer значениями из индикаторного буфера под индексом 1
   if ( CopyBuffer (ind_handle, 1 ,-shift,amount,upper_values)< 0 )
     {
       //--- если копирование не удалось, сообщим код ошибки
       PrintFormat ( "Не удалось скопировать данные из индикатора iBands, код ошибки %d" , GetLastError ());
       //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
       return ( false );
     }
//--- заполняем часть массива LowerBuffer значениями из индикаторного буфера под индексом 2
   if ( CopyBuffer (ind_handle, 2 ,-shift,amount,lower_values)< 0 )
     {
       //--- если копирование не удалось, сообщим код ошибки
       PrintFormat ( "Не удалось скопировать данные из индикатора iBands, код ошибки %d" , GetLastError ());
       //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
       return ( false );
     }
//--- все получилось
   return ( true );
  }
//+------------------------------------------------------------------+
 
바쁘지 않고 볼 줄 아는 녀석들. 어제 칠면조의 고문을 그렸지만, 뭔가 잘 되지 않습니다. 그는 신호가 아닌 거래를 시작하는 것 같습니다. 그리고 반대 신호에 거래를 성사시키는 조건을 추가하려고 했지만 거래가 성사되거나 성사되지 않습니다. 오류를 찾는 데 도움이 됩니다. 조건에 오류가 있는 것은 아닐까요?
 input int Magic = 000 ;
input double Lots = 0.1 ;
input int TakeProfit = 100 ;
input int StopLoss = 50 ;
input int Slippage = 5 ;

double vverh,vnuz,SL,TP;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   /* if (Digits == 3 || Digits == 5)
   {
      TakeProfit *=10;
      StopLoss *=10;
      Slippage *=10;
   }*/
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
           
     
      vverh = iCustom ( NULL , 0 , "777" , 0 , 1 ); // стрелка вверх
      vnuz = iCustom ( NULL , 0 , "777" , 1 , 1 ); // стрелка вниз
      
     //-----------------------------------------------------------
     if (CountSell() == 0 && vnuz > 0 )
      {
      tiket = OrderSend ( Symbol (),OP_SELL,Lots,Bid,Slippage, 0 , 0 , "" ,Magic, 0 , Red);
       if (tiket> 0 )
         {
         SL= NormalizeDouble (Bid+StopLoss* Point , Digits );
         TP= NormalizeDouble (Bid-TakeProfit* Point , Digits );
         if ( OrderSelect (tiket, SELECT_BY_TICKET))
             if (!OrderModify(tiket,OrderOpenPrice(),SL,TP, 0 ))
               Print ( "Ошибка модификации ордера на продажу" );
         } else Print ( "Ошибка открытия ордера на продажу" );
      }
      
       ////////////////////////////////////////////////////////////////
     if (CountBuy() == 0 && vverh > 0 )
      {
      tiket = OrderSend ( Symbol (),OP_BUY,Lots,Ask,Slippage, 0 , 0 , "" ,Magic, 0 ,Blue);
       if (tiket> 0 )
         {
         TP= NormalizeDouble (Ask+TakeProfit* Point , Digits );
         SL= NormalizeDouble (Ask-StopLoss* Point , Digits );
         if ( OrderSelect (tiket, SELECT_BY_TICKET))
           if (!OrderModify(tiket,OrderOpenPrice(),SL,TP, 0 ))
           Print ( "Ошибка модификации ордера на покупку" );
         } else Print ( "Ошибка открытия ордера на покупку" );
      }  
     
      
  }
//+------------------------------------------------------------------+
int CountSell()
{
   int count = 0 ;
   for ( int trade = OrdersTotal ()- 1 ; trade>= 0 ; trade--)
   {
   if ( OrderSelect (trade,SELECT_BY_POS,MODE_TRADES))
      {
       if (OrderSymbol()== Symbol () && OrderMagicNumber()==Magic && OrderType() == OP_SELL)
         count++;
      }
   }
   return (count);
}
//+------------------------------------------------------------------+
int CountBuy()
{
   int count = 0 ;
   for ( int trade = OrdersTotal ()- 1 ; trade>= 0 ; trade--)
   {
   if ( OrderSelect (trade,SELECT_BY_POS,MODE_TRADES))
      {
       if (OrderSymbol()== Symbol () && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
         count++;
      }
   }
   return (count);
}
파일:
 
PapaYozh :

멈출 때 놀라지 마십시오.   또는 때때로 작동합니다 .

무슨 이유로? 그냥 뭐가 잘못됐는지 쓰세요?

 
Andrey Sokolov :

무슨 이유로? 그냥 뭐가 잘못됐는지 쓰세요?

어떤 종류의 습격?

 
PapaYozh :

어떤 종류의 습격?

알았습니다.

다른 사람이 거기에 무엇이 잘못되었는지 말해 줄 수 있습니까? 무언가가 정말 잘못되면 어떤 이유로 작동이 중지됩니까?

 
Andrey Sokolov :

알았습니다.

다른 사람이 거기에 무엇이 잘못되었는지 말해 줄 수 있습니까? 무언가가 정말 잘못되면 어떤 이유로 작동이 중지됩니까?

여기 답이 있습니다

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

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

이고르 마카누 , 2021.07.05 14:16

지표가 아직 계산되지 않았기 때문에

https://www.mql5.com/ru/docs/series/barscalculated


OnInit() 섹션은 터미널 환경을 얻기에 가장 좋은 곳이 아닙니다. 모든 것이 논리적이고 올바르게 작동한다고 생각합니다.

 
Alexey Viktorov :
여기 답이 있습니다

감사해요.

시작시 즉시 기록에 대한 계산이 필요합니다. 그런 필요가 있기 때문에 인터넷으로 하고 있습니다.

계산 전에 인터넷에서 일시 중지를 추가했습니다. 그렇다면 모두 동일한 일부 "함정"이 있습니까?

 
Andrey Sokolov :

시작시 즉시 기록에 대한 계산이 필요합니다. 그런 필요가 있기 때문에 인터넷으로 하고 있습니다.

계산 전에 인터넷에서 일시 중지를 추가했습니다. 그렇다면 모두 동일한 일부 "함정"이 있습니까?

OnTick()에서 첫 번째 실행 플래그를 설정하는 것이 더 쉽고 안정적입니다.

 
jarikn :
바쁘지 않고 볼 줄 아는 녀석들. 어제 칠면조의 고문을 그렸지만 뭔가 잘 되지 않습니다. 그는 신호가 아닌 거래를 시작하는 것 같습니다. 그리고 반대 신호에 거래를 성사시키는 조건을 추가하려고 했지만 거래가 성사되거나 성사되지 않습니다. 오류를 찾는 데 도움이 됩니다. 조건에 오류가 있는 것은 아닐까요?
표시기가 그릴 가능성이 가장 높으며... 또한 로그에서 오류를 찾습니다.
 
Andrey Sokolov :

무슨 이유로? 그냥 뭐가 잘못됐는지 쓰세요?

개발자는 OnInit()이 초기화를 위한 것이지 다른 어떤 것이 아니라고 썼기 때문에

나는 무슨 일이 일어날지 추측하지 않을 것입니다. 가장 먼저 보는 것은 OnInit()에서 표시기 값을 얻기 위해 일시 중지했다는 것입니다. 사용자가 이때 TF를 전환하면 어떻게 될까요?

추신: 전문가를 실행한 다음 터미널을 닫고 이미 어드바이저가 실행 중인 상태에서 터미널을 다시 여는 경우 코드가 어떻게 작동합니까?