Come scoprire se il mercato è chiuso? (mql4) - pagina 2

 
Alexey:

int Weekday = TimeDayOfWeek(TimeLocal());                                                          //Локальное время  |
int Weekdays = TimeDayOfWeek(TimeCurrent());                                                       //Серверное время  |

while(IsExpertEnabled())                                                                 //До тех пор пока запушенно  |

     {
     if(Weekday!=0||Weekday!=6){Exp=true;if(Weekday==1){Info(4,Weekday,0);}}       //Если не Сбб. Воск. то разрешено  |
     if(Weekdays==0||Weekdays==6)                                                  //Если Сбб. Воск. то не разрешено  |
       {
       Exp=false;Info(5,Weekdays,0);
       if(Weekdays==6){Sleep(86400000);}                                                //Если суббота пауза 24 часа  |
       if(Weekdays==0){Sleep(3600000);}                                               //Если воскресение пауза 1 час  |
       }

Questo è più o meno come l'ho risolto, attraverso pause e cicli, ma è un codice vecchio, prima che la versione del terminale fosse aggiornata. Ci sono modi più semplici ora, basta leggere un po' la letteratura.
Grazie naturalmente, ma è come si dice, salire attraverso l'occhio di un posto) posso anche mettere una pausa sull'euro al server 5.0 mi permette di farlo e poi con ogni ciclo di timer provare a cambiare la pausa, se l'errore 132 allora il mercato è chiuso, se normale allora il commercio è lì, ma al momento del trading questo server si allaga, voglio risolvere il problema umanamente, non attraverso "loop", ma è fino a sviluppatori MK.
 

IsTradeAllowed

Restituisce informazioni sulla possibilità di fare trading con Expert Advisors.

boolIsTradeAllowed();

La seconda forma di questa chiamata restituisce informazioni sulla capacità di negoziare per un simbolo specificato in un momento specifico.

boolIsTradeAllowed(
const string symbol// simbolo
datetimetested_time// tempo
);

Parametri

simbolo

[simbolo.

tempo_testato

[Tempo.

Valore restituito

Restituisce true se l'EA è autorizzato a commerciare e il thread è libero, altrimenti restituisce false.

 
if(SymbolInfoInteger(NULL,SYMBOL_TIME)>60) return(0);
 
Kino:
Grazie naturalmente, ma è come si dice per entrare dall'occhio di un posto) posso anche mettere una pausa sull'euro a 5,0 il server lo permetterà, e poi con ogni ciclo di timer provare a cambiare la pausa, se l'errore 132 allora il mercato è chiuso, se normale allora il commercio è, ma al momento del trading questo server è inondato, vorrei risolvere il problema umanamente, non attraverso "loop", ma questo è gli sviluppatori MK.
Richiesta di autorizzazione al commercio necessaria. Non ho questa richiesta nel mio esempio perché c'è una differenza di tre ore tra la chiusura del mercato e 3 ore prima della chiusura del mercato, è per lo più piatta. Per questo l'ho fatto in modo diverso lì, ma anche con delle pause, ma con un intervallo molto più piccolo.
 
offfline:

IsTradeAllowed

Restituisce informazioni sulla possibilità di fare trading con Expert Advisors.

boolIsTradeAllowed();

La seconda forma di questa chiamata restituisce informazioni sulla capacità di negoziare per un simbolo specificato in un momento specifico.

boolIsTradeAllowed(
const string symbol// simbolo
datetimetested_time// tempo
);

Parametri

simbolo

[simbolo.

tempo_testato

[Tempo.

Valore restituito

Restituisce true se l'EA è autorizzato a negoziare e il thread per eseguire le negoziazioni è libero, altrimenti restituisce false.

Alexander, ti sbagli)


//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);
      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
  if (IsTradeAllowed() == True) Print("---- Ура торгуем -----");
   {
      int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"My order",16384,0,clrGreen);
      {
         if (ticket <0) Print("---- Уже не торгуем -----",GetLastError());
      }
   }

  }
//+------------------------------------------------------------------+
 

questo funziona abbastanza bene

//+------------------------------------------------------------------+
//|                                                         тест.mq4 |
//|                                                   Sergey Gritcay |
//|                                               sergey1294@list.ru |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritcay"
#property link      "sergey1294@list.ru"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   if(isNewTime())
     {
      Print("---- Ура торгуем -----");
      int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"My order",16384,0,clrGreen);
        {
         if(ticket<0) Print("---- Уже не торгуем -----",GetLastError());
        }
     }
     else Print("---- функция isNewTime() = false, возможно торговля закрыта ");

  }
//+------------------------------------------------------------------+
bool isNewTime()
  {
//--- в статической переменной будем помнить время 
   static datetime last_time=0;
//--- текущее время
   datetime time=TimeCurrent();

//--- если это первый вызов функции
   if(last_time==0)
     {
      //--- установим время и выйдем 
      last_time=time;
      return(false);
     }

//--- если время отличается
   if(last_time!=time)
     {
      //--- запомним время и вернем true
      last_time=time;
      return(true);
     }
//--- дошли до этого места - значит время сервера не обновилось, вернем false
   return(false);
  }
 
sergey1294:

questo funziona abbastanza bene

Grazie, farò una prova.
 
Kino:
Grazie per il suggerimento, ma quando il mercato è aperto non è corretto cercare di determinare la possibilità di lavorare con gli ordini, ma funzionerà.

Da parte mia, il mio ragionamento è il seguente.

Se è necessario fare trading sul simbolo corrente, un segno indiretto che il mercato è aperto è l'arrivo di nuovi tick. Quindi, l'evento OnTick è sufficiente e il problema è chiuso.

Se abbiamo bisogno di lavorare con simboli diversi da quello corrente, il fatto di aprire operazioni sul simbolo corrente non garantisce che le operazioni vengano eseguite su qualche altro simbolo. Per esempio, l'Expert Advisor è stato eseguito su EURUSD, l'ora è 09:00 UTC, e vogliamo scambiare azioni USA, il cui mercato aprirà solo alle 13:00 UTC. Quindi, OnTick non aiuterà. Dovremo determinare se il mercato si apre con altri simboli attraverso tentativi di inviare ordini al server a certi intervalli. Inviare un ordine una volta al minuto non è assolutamente un bombardamento del server, ma un approccio abbastanza normale. Cosa c'è di sbagliato in questo?

 

no tick no trade come mi è stato detto una volta da servicedesk su questo problema del giorno della settimana,

hanno suggerito una soluzione come.

TimeDayOfWeek(TimeLocal());

anche se non è del tutto corretto, perché il giorno della settimana può non essere lo stesso del giorno terminale.

 
In un progetto recente il compito era quello di rilevare il fatto che il commercio con un simbolo arbitrario era aperto e disponibile.
Una condizione importante era quella di non cercare di aprire gli ordini, anche se ci avevo fatto ricorso molte volte in altri progetti. Ad essere onesti, mi sembra che questo sia il metodo più semplice e affidabile finora.

Finora ho trovato il modo migliore per farlo (ma sto ancora cercando, vedi sotto):
1) Determinare se il trading è permesso "faccia a faccia" - seconda forma della funzione IsTradeAllowed() (è stata descritta sopra). Se no, allora non è permesso :)
2) Confronta il tempo dell'ultima quotazione usando SymbolInfoInteger(<symbol>, SYMBOL_TIME) con il tempo di una delle sessioni di trading(SymbolInfoSessionTrade()), se il tempo della quotazione cade in uno dei range della sessione, allora il trade è permesso.
3) Controllare se il tempo della quotazione non è troppo "datato": se è più di xx minuti fa (confrontare SymbolInfoInteger(<symbol>, SYMBOL_TIME) e TimeCurrent(), allora pensiamo che la quotazione sia datata e, quindi, non possiamo fare trading con essa (se ho ragione, era circa tre minuti)

Lo svantaggio di questo approccio è il seguente: ci possono essere condizioni in cui i trade nel simbolo sono impossibili, mentre i tick passano.
Non sono entrato nel meccanismo; lo sviluppo è stato fatto per un broker e durante i test hanno attivato una tale modalità - i tick vanno, ma il trading è impossibile. Finora non siamo riusciti a superare questa variante.

È giusto dire che non ho incontrato questo nel trading reale. Quindi in condizioni "normali" la soluzione sembra tollerabile. Ma lo sto ancora cercando :)

P.S. I passi 1 e 2 possono essere combinati (per trasferire SymbolInfoInteger(<symbol>, SYMBOL_TIME) nella funzione IsTradeAllowed), ma non ho ancora fatto prove di tale variante e non lo dico.

SymbolInfoSessionTrade - Документация на MQL4
  • docs.mql4.com
SymbolInfoSessionTrade - Документация на MQL4