Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 579

 
PolarSeaman:
Ich habe noch nicht herausgefunden, wie ich die Sekunden zählen kann, bis der Balken in der aktuellen Periode geschlossen wird. Ich brauche Ihre Hilfe.

Ich habe Ihnen die Funktion genannt.

 
Artyom Trishkin:

Ich habe Ihnen die Funktion genannt.

Ja, aber der Code oben im Kommentar zählt jede Sekunde gleichmäßig herunter und die Funktion ist ruckelig. Auf M1 gibt es von 60 Takten 3 oder 4 Mal keinen Alarm.

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

Ja, aber der Code oben im Kommentar zählt jede Sekunde gleichmäßig herunter und die Funktion ist ruckelig. Auf M1 gibt es von 60 Takten 3 oder 4 Mal keinen Alarm.

Das liegt daran, dass die Funktion TimeCurrent() verwendet - die Ankunftszeit des letzten Zitats. Sie müssen diese Zeit durch eine lokale TimeLocal() mit einem berechneten Offset ersetzen (Sie wurden bereits darüber informiert).

 
Artyom Trishkin:

Sie müssen diese Zeit durch eine lokale TimeLocal() mit berechneter Verschiebung ersetzen (Sie wurden bereits darüber informiert)

Ich weiß nicht, wie man es richtig zu tun, so fand ich einen Code, der Zeit zählt nach unten zu schließen H1 ohne Ticks, und versuchen, es zu verwenden, ersetztTimeCurrent() in Ihrer Funktion, aber es will nicht, mich Sekunden zu schließen zeigen.

#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);
  }
////
 
Bitte teilen Sie mir mit, wie ich die Idee im Code umsetzen kann:
Wenn Haftbefehle offen waren und es jetzt keine mehr gibt = Alarm.

Wahrscheinlich so etwas wie das hier...
double x=0;
If(OrdersTotal >0) {x=1;}
If (OrdersTotal <x) {Alert ;}
x=0;

 
Tigerfreerun:
Können Sie mir bitte sagen, wie ich diese Idee im Code umsetzen kann?
Wenn Optionsscheine geöffnet wurden und nun keine Optionsscheine vorhanden sind = Alarm.

Wahrscheinlich etwas in diesem Stil...
double x=0;
If (OrdersTotal >0) {x=1;}
If (OrdersTotal <x) {Alert ;}
x=0;

If(OrdersTotal ==0) {Alert ;}
 
Alekseu Fedotov:
If (OrdersTotal ==0) {Alert ;}
Dann ist das Signal zyklisch. Und selbst wenn keine Aufträge eröffnet wurden. Die Idee ist, dass 1) die Aufträge offen sind 2) es jetzt keine Aufträge gibt 3) 1 Alert
 

Leute!

Das Diagramm enthält eine Vielzahl von Objekten.

Aber wenn Sie darauf zugreifen.

Comment(ObjectsTotal());

Hier steht, dass es nur drei sind.

Warum werden die Pfeile nicht gezählt?


 
Tigerfreerun:
Bitte sagen Sie mir, wie ich die Idee im Code umsetzen kann:
Wenn Haftbefehle offen waren und es jetzt keine mehr gibt = Alarm.

Wahrscheinlich so etwas wie das hier...
double x=0;
If (OrdersTotal >0) {x=1;}
If (OrdersTotal <x) {Alert ;}
x=0;

Gehen Sie folgendermaßen vor. Der Code ist fast korrekt. Nur ein Wort fehlt dort:

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

Leute!

Das Diagramm enthält eine Vielzahl von Objekten.

Aber wenn Sie darauf zugreifen.

Hier steht, dass es nur drei sind.

Warum werden die Pfeile nicht gezählt?


Vielleicht, weil es sich umSymbole der Schriftart Wingdings handelt