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

 
PolarSeaman :
막대가 현재 기간에 닫힐 때까지 초를 계산하는 방법을 알지 못했습니다. 돕다.

기능을 주셨어요.

 
Artyom Trishkin :

기능을 주셨어요.

예, 하지만 주석에서 위의 코드는 매초 부드럽게 계산되고 기능이 경련합니다. M1에서는 60개 막대 중 3~4번은 경고가 없습니다.

 #property strict
#define MILLISEC_TIMER_INTERVAL         500 
//--- input parameters
input int s_clo= 2 ;
input int Period_= 13 ,
Shift_= 0 ;
input      ENUM_MA_METHOD Method_MA_= MODE_SMA ;
input ENUM_APPLIED_PRICE Apply_to_= PRICE_CLOSE ;
double ma_fast;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

int OnInit ()
{

   if (! EventSetMillisecondTimer (MILLISEC_TIMER_INTERVAL))
   {
       Print ( "Не могу запустить таймер" );
       return INIT_FAILED ;
   }
return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer
   EventKillTimer ();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTimer ()
  {
   RefreshRates ();
//---
ma_fast= 0 ;
   if (SecondsToCandleClose( Symbol (), 0 )>=s_clo) return ;
   
   { ma_fast=ma(Period_,Shift_,Method_MA_,Apply_to_, 0 ); Alert ( "ma_fast" ,ma_fast, "время откр. бара " , Time [ 0 ]);}
   
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
long SecondsToCandleClose( const string symbol_name, const ENUM_TIMEFRAMES timeframe)
  {
   datetime array[];
   return ( CopyTime (symbol_name,timeframe, 0 , 1 ,array)== 1 ? PeriodSeconds (timeframe)+array[ 0 ]- TimeCurrent () : 0 );
  }

//+------------------------------------------------------------------+
double ma( int period, int ma_shift, ENUM_MA_METHOD ma_method, ENUM_APPLIED_PRICE ap_price, int shift)
  {
   return (ND( iMA ( NULL ,( int ) 0 ,period,ma_shift,ma_method,ap_price,shift)));
  }
   //
   double ND( double A)
  {
   return ( NormalizeDouble (A, Digits ));
  }
   //
 
PolarSeaman :

예, 하지만 주석에서 위의 코드는 매초 부드럽게 계산되고 기능이 경련합니다. M1에서는 60개 막대 중 3~4번은 경고가 없습니다.

함수 가 TimeCurrent()를 사용 하기 때문에 - 마지막 견적이 도착한 시간. 이 시간을 계산된 오프셋이 있는 로컬 TimeLocal()로 바꿔야 합니다(이미 이에 대해 들었습니다).

 
Artyom Trishkin :

이 시간을 계산된 오프셋이 있는 로컬 TimeLocal()로 바꿔야 합니다(이미 이에 대해 들었습니다).

이 작업을 올바르게 수행하는 방법을 몰라서 H1이 틱 없이 닫힐 때까지 시간을 계산하는 코드를 찾았고 사용하려고 합니다. 함수에서 TimeCurrent()를 대체했지만 원하지 않습니다. 닫기 몇 초 전을 보여줍니다.

 #property strict
#property indicator_chart_window
//--- input parameters
#define MILLISEC_TIMER_INTERVAL         500 
int             timeOffset;
datetime        ServerLocalOffset;
datetime        prevTime,myTime,localtime;
bool            newBar = false ;
datetime sec;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer (MILLISEC_TIMER_INTERVAL);
   
   datetime srvtime,tmpOffset;
   RefreshRates ();
   srvtime = TimeCurrent ();
   // Modified
   localtime = TimeLocal ()+ TimeGMTOffset ();
   if ( TimeHour (srvtime)> TimeHour (localtime)){
       // Server Time is still ahead of us
       int newOffset = TimeHour (srvtime)- TimeHour (localtime);
      ServerLocalOffset = (newOffset* 60 * 60 );
   } else if ( TimeHour (srvtime)< TimeHour (localtime)){
       // Server Time is Behind us
       int newOffset = TimeHour (localtime)- TimeHour (srvtime);
      ServerLocalOffset = (newOffset* 60 * 60 );
   } else {
       // No modification required
      ServerLocalOffset = srvtime;
   }
   localtime = TimeLocal ()-ServerLocalOffset;
   
   tmpOffset = TimeSeconds (srvtime) - TimeSeconds (localtime);
   if (tmpOffset < 30 && tmpOffset >= 0 ){
      timeOffset = TimeSeconds (srvtime) - TimeSeconds (localtime);
   }
   return ( INIT_SUCCEEDED );
  }
  
void OnDeinit ( const int reason)
  {
   EventKillTimer ();
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---

//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---
   datetime localtime;
   localtime = TimeLocal ()+( TimeGMTOffset ()+( 60 * 60 ));
 sec= Time [ 0 ]+ Period ()* 60 -localtime-timeOffset; //
 
 if (SecondsToCandleClose( Symbol (), 0 )<= 2 ){ Alert ( "время откр. бара " , Time [ 0 ]);}
       Comment ( " Time 1: " , TimeToStr (sec, TIME_SECONDS ), " Time 2: " , TimeToStr (SecondsToCandleClose( Symbol (), 0 ), TIME_SECONDS ));
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
long SecondsToCandleClose( const string symbol_name, const ENUM_TIMEFRAMES timeframe)
  {
   datetime array[];
   return ( CopyTime (symbol_name,timeframe, 0 , 1 ,array)== 1 ? PeriodSeconds (timeframe)+array[ 0 ]-sec : 0 );
  }
////
 
코드에서 아이디어를 구현하는 방법을 알려주십시오.
주문이 열렸지만 지금은 아무 것도 없는 경우 = 경고.

뭐 이런거 같은데..
이중 x=0;
If ( OrdersTotal >0) {x=1;}
If (OrdersTotal <x) {Alert ;}
x=0;

 
Tigerfreerun :
코드에서 아이디어를 구현하는 방법을 알려주십시오.
주문이 열린 주문인 경우 현재는 경고가 아닙니다.

뭐 이런거 같은데..
이중 x=0;
(OrdersTotal >0) {x=1;}인 경우
If (OrdersTotal <x) {Alert ;}
x=0;

If ( OrdersTotal ==0) {Alert ;}
 
Alekseu Fedotov :
If (OrdersTotal ==0) {Alert ;}
그런 다음 신호가 주기적으로 발생합니다. 그리고 주문이 열리지 않은 경우에도 마찬가지입니다. 아이디어는 1) 오픈 주문 2) 이제 사라졌습니다 3)1 경고
 

얘들아!

차트에 많은 개체가 있습니다.

하지만 연락할 때

 Comment ( ObjectsTotal ());

그는 그들 중 세 가지만 있다고 보고합니다.

그는 왜 화살을 세지 않습니까?


 
Tigerfreerun :
코드에서 아이디어를 구현하는 방법을 알려주십시오.
주문이 열렸지만 지금은 아무 것도 없는 경우 = 경고.

뭐 이런거 같은데..
이중 x=0;
(OrdersTotal >0) {x=1;}인 경우
If (OrdersTotal <x) {Alert ;}
x=0;

그렇게 하세요. 코드는 거의 정확합니다. 한 단어만 빠졌습니다.

 static double x= 0 ;
If ( OrdersTotal > 0 ) {x= 1 ;} 
If ( OrdersTotal <x) {Алерт ; x= 0 ;} 
 
Vladimir Tkach :

얘들아!

차트에 많은 개체가 있습니다.

하지만 연락할 때

그는 그들 중 세 가지만 있다고 보고합니다.

그는 왜 화살을 세지 않습니까?


Wingdings 글꼴 문자에서 왔기 때문일 수 있습니다.