Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 96

 

Übrigens, GetSystemTimePreciseAsFileTime war sehr interessant. Eine solche Funktion fehlt in MQL sehr, oder zumindest gerundet auf Mikro/Millisekunden. Zeit in Sekunden ist zu grob. In MT selbst werden überall Millisekunden verwendet. Jetzt müssen wir dies tun, indem wir die genaue Zeit mit dem gleichen GetMicrosecondCount synthetisieren:

long TimeLocal_mcs() 
{ 
  static long time0_mcs= 0;
  if (time0_mcs==0) { datetime t=TimeLocal();  while(TimeLocal()==t);  time0_mcs= (t+1)*1 e6 - GetMicrosecondCount(); }
  datetime time= TimeLocal();
  long time_mcs= time0_mcs + GetMicrosecondCount();
  long delta= time_mcs - time*(long)1 e6; 
  if (delta<0) { time0_mcs-=delta;  time_mcs-=delta; }  
  return time_mcs;
}
 
Alexey Navoykov:

Übrigens, GetSystemTimePreciseAsFileTime war sehr interessant. Wir brauchen wirklich eine solche Funktion in MQL, oder zumindest auf Mikro/Millisekunden gerundet. Die Zeit in Sekunden ist zu grob. In MT selbst werden überall Millisekunden verwendet. Jetzt müssen wir dies tun, indem wir die genaue Zeit mit der gleichen Funktion GetMicrosecondCount synthetisieren:

Erstellen Sie Ihren eigenen Callback mit Generierung in mcs durch WinApi-Funktionalität

 
Konstantin:

Erstellen Sie Ihren eigenen Callback mit Generierung in mcs über WinApi-Funktionalität

Wofür ist der Rückruf?

 
Alexey Navoykov:

Wofür ist der Rückruf?

Nun, wenn Sie den ganzen Thread wollen, dann ist ein Funktionsring ausreichend, und wenn Sie mit Ereignissen arbeiten wollen, dann ist ein Callback

 
Überprüfen Sie Ihre Arbeit (ich weiß nicht, wie es auf dem Markt aussieht) auf einen Unsichtbarkeitsmechanismus. Man kann ernsthaft "erwischt" werden...
 
Altes Thema, aber sehr einfacher Code, um das Problem zu verstehen

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wie kann man überprüfen, ob ein Auftrag nach dem Aufruf von PositionOpen ausgeführt wird?

fxsaber, 2018.08.09 20:35

Versuchen Sie dieses Skript dortForexTimeFXTM-Demo01 (oderFXOpen-MT5)

#include <Trade/Trade.mqh>

void OnStart()
{
  const int PrevTotal = PositionsTotal();
  
  CTrade Trade;  
  
  while (PositionsTotal() == PrevTotal)
    Trade.Buy(1);    
}

Manchmal werden nicht nur eine, sondern zwei neue Stellen ausgeschrieben.


Das Skript versucht, eine neue Position zu eröffnen, aber manchmal erhalten wir zwei.

 
fxsaber:
Ein altes Thema, aber recht einfacher Code, um das Problem zu verstehen

Das Skript versucht, eine neue Position zu eröffnen, und manchmal erhalten wir zwei.

Es ist so, als ob es bereits eine Lösung in QB gäbe:

//+------------------------------------------------------------------+
//| Возвращает "неопределённое" состояние торгового окружения        |
//+------------------------------------------------------------------+
bool IsUncertainStateEnv(const string symbol_name,const ulong magic_number)
  {
   if(MQLInfoInteger(MQL_TESTER)) return false;
   int total=OrdersTotal();
   for(int i=total-1; i>WRONG_VALUE; i--)
     {
      if(OrderGetTicket(i)==0) continue;
      if(OrderGetInteger(ORDER_TYPE)>ORDER_TYPE_SELL) continue;
      if(OrderGetInteger(ORDER_MAGIC)!=magic_number) continue;
      if(!OrderGetInteger(ORDER_POSITION_ID) && OrderGetString(ORDER_SYMBOL)==symbol_name)
         return true;
     }
   return false;
  }

//+------------------------------------------------------------------+
//| Заполняет массивы тикетов позиций                                |
//+------------------------------------------------------------------+
bool FillingListTickets(const uint number_of_attempts)
  {
//--- Проверка состояния окружения
   int n=0,attempts=int(number_of_attempts<1 ? 1 : number_of_attempts);
   while(IsUncertainStateEnv(symb,InpMagic) && n<attempts && !IsStopped())
     {
      n++;
      Sleep(sleep);
     }
   if(n>=attempts && IsUncertainStateEnv(symb,InpMagic))
     {
      Print(__FUNCTION__,": Uncertain state of the environment. Please try again.");
      return false;
     }
//---

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Проверка нулевых цен
   if(!RefreshRates() || Point()==0) return;
//--- Заполнение списков тикетов позиций
   int positions_total=PositionsTotal();
   if(prev_total!=positions_total)
     {
      if(FillingListTickets(num_attempts))
         prev_total=positions_total;
      else return;
     }

 
fxsaber:
Überprüfen Sie Ihre Arbeit (was ist mit dem Markt - ich weiß es nicht) auf den Unsichtbarkeitsmechanismus. Sie könnten ernsthaft "erwischt" werden...

Ich bin dem Link gefolgt, habe aber den fraglichen Unsichtbarkeitsmechanismus nicht verstanden.

 
Alexey Navoykov:

Ich bin dem Link gefolgt, habe aber den Unsichtbarkeitsmechanismus nicht verstanden.

Der Indikator ist im Chart ausgeblendet. Es löscht Expert Advisors. Das habe ich beim kurzen Blick vom Handy aus verstanden.

 
Alexey Navoykov:

Ich bin dem Link gefolgt, habe aber den Unsichtbarkeitsmechanismus nicht verstanden.

Sie kann nicht entfernt werden.