MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 579

 
PolarSeaman :
Mevcut periyotta bar kapanana kadar saniyeleri nasıl sayacağımı asla anlamadım. Yardım.

Sana bir fonksiyon verdim.

 
Artyom Trishkin :

Sana bir fonksiyon verdim.

Evet, ancak yorumdaki yukarıdaki kod her saniyeyi sorunsuz bir şekilde sayıyor ve işlev sarsıntılı. M1'de 60 çubuktan 3 veya 4 kez uyarı yoktur.

 #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 :

Evet, ancak yorumdaki yukarıdaki kod her saniyeyi sorunsuz bir şekilde sayıyor ve işlev sarsıntılı. M1'de 60 çubuktan 3 veya 4 kez uyarı yoktur.

Çünkü işlev TimeCurrent()'i kullanır - son alıntının varış zamanı. Bu zamanı yerel bir TimeLocal () ile hesaplanmış bir ofsetle değiştirmeniz gerekir (bu konuda size daha önce söylendi)

 
Artyom Trishkin :

Bu zamanı yerel bir TimeLocal () ile hesaplanmış bir ofsetle değiştirmeniz gerekir (bu konuda size daha önce söylendi)

Bunu nasıl doğru yapacağımı bilmiyorum, bu yüzden H1'in keneler olmadan kapanmasına kadar geçen süreyi sayan bir kod buldum ve onu kullanmaya çalışıyorum , işlevinizde TimeCurrent()'i değiştirdim ama istemiyor kapatmadan önce bana saniyeleri göstermek için.

 #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 );
  }
////
 
Lütfen bana fikri kodda nasıl uygulayacağımı söyleyin:
Emirler açıldıysa, ancak şimdi hiçbiri yoksa = uyarı.

Bunun gibi bir şey sanırım..
çift x=0;
Eğer ( Sipariş Toplamı >0) {x=1;}
Eğer (Sipariş Toplamı <x) {Uyarı ;}
x=0;

 
Tigerfreerun :
Lütfen bana fikri kodda nasıl uygulayacağımı söyleyin:
Siparişler açılmışsa, ancak şimdi değiller = uyarı.

Bunun gibi bir şey sanırım..
çift x=0;
Eğer (Sipariş Toplamı >0) {x=1;}
Eğer (Sipariş Toplamı <x) {Uyarı ;}
x=0;

If ( OrdersTotal ==0) {Uyarı ;}
 
Alekseu Fedotov :
Eğer (Sipariş Toplamı ==0) {Uyarı ;}
Ardından sinyal döngüsel olarak gerçekleşir. Ve hiçbir sipariş açılmamış olsa bile. Buradaki fikir 1) siparişleri açmak 2) şimdi gittiler 3)1 Uyarı
 

Çocuklar!

Grafikte çok fazla nesne var.

Ama iletişime geçtiğinde

 Comment ( ObjectsTotal ());

Sadece üç tane olduğunu bildiriyor.

Neden okları saymıyor?


 
Tigerfreerun :
Lütfen bana fikri kodda nasıl uygulayacağımı söyleyin:
Emirler açıldıysa, ancak şimdi hiçbiri yoksa = uyarı.

Bunun gibi bir şey sanırım..
çift x=0;
Eğer (Sipariş Toplamı >0) {x=1;}
Eğer (Sipariş Toplamı <x) {Uyarı ;}
x=0;

Öyleyse yap. Kod neredeyse doğru. Tek kelime eksik:

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

Çocuklar!

Grafikte çok fazla nesne var.

Ama iletişime geçtiğinde

Sadece üç tane olduğunu bildiriyor.

Neden okları saymıyor?


Belki de Wingdings yazı tipi karakterlerinden oldukları içindir.