Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 109

 
Taras Slobodyanik:

logisch - es ist ein Coup.

Sie haben die Informationen geschrieben, ohne die Logik zu bewerten. Wenn sie betroffen ist, sollte sich die PositionID auf die gleiche Weise geändert haben.

Das ändert sich auch jetzt nicht. Wenn dies ein Fehler ist, wäre das großartig!


Deshalb eine Frage. Sollte die Transaktion DEAL_ENTRY_INOUT die PositionID in DEAL_ORDER ändern?

Ich denke, das sollte es. Dieses Verhalten wäre sehr praktisch/richtig.
 
fxsaber:

Sie haben die Informationen geschrieben, ohne die Logik zu bewerten. Wenn sie jedoch betroffen ist, sollte sich die PositionID auf die gleiche Weise geändert haben.

Das ändert sich auch jetzt nicht. Wenn dies ein Fehler ist, wäre das großartig!


Deshalb eine Frage. Sollte die Transaktion DEAL_ENTRY_INOUT die PositionID in DEAL_ORDER ändern?

Hier steht nein. https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties#enum_position_property_integer

Obwohl es früher geschrieben wurde, dass ja, und die Positions-ID wurde geändert.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
 
Andrey Barinov:

Hier steht nein. https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties#enum_position_property_integer

Vielleicht gibt es dafür einen guten Grund. Aus meiner Sicht ist das überhaupt nicht in Ordnung.

Obwohl es vorher geschrieben wurde, dass ja, und die Positions-ID geändert wurde.

Ich bitte die Entwickler, die Situation zu klären. Wenn sich die Positions-ID ändert, werden auf der Registerkarte Handelsverlauf in der Positionsansicht nach fünf Umdrehungen fünf Positionen angezeigt.

Jetzt (die PositionID ändert sich nicht während einer Umdrehung) wird immer nur eine Position angezeigt. Dies ist, gelinde gesagt, eine seltsame Lösung.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Neue Version von MetaTrader 5 build 1930: Schwebende Diagrammfenster und .Net-Bibliotheken in MQL5

fxsaber, 2018.11.09 16:19

Im Modus "durch echte Ticks" erzeugt der Tester die Balken selbständig - beim Eintreffen der Ticks. Aus diesem Grund kann der Balkenverlauf eines benutzerdefinierten Symbols im Terminal und im Tester sehr unterschiedlich sein.

 
Es kommt häufig vor, dass nach dem Kompilieren des EA die Einstellungen des Testers zurückgesetzt werden, wenn dieser EA zuvor in ihm ausgewählt wurde. Das ist, gelinde gesagt, ärgerlich. Nach jeder Kompilierung müssen wir den Baum der Expert Advisors aufrufen und unseren EA suchen. Falls es jemand nicht weiß: Es gibt ein Rezept, mit dem sich der Tester nicht zurücksetzen lässt. Führen Sie den Expert Advisor einmal im Debug-Modus in der Historie aus - CTRL+F5. Danach wirkt sich eine Neukompilierung nicht mehr auf die Testereinstellungen aus.
 
fxsaber:
Es kommt häufig vor, dass nach der Erstellung des Expert Advisors die Einstellungen des Testers zurückgesetzt werden, wenn dieser Expert Advisor zuvor darin ausgewählt wurde. Das ist, gelinde gesagt, ärgerlich. Nach jeder Kompilierung müssen wir den Baum der Expert Advisors aufrufen und unseren EA suchen. Falls es jemand nicht weiß: Es gibt ein Rezept, mit dem sich der Tester nicht zurücksetzen lässt. Führen Sie den Expert Advisor einmal im Debug-Modus in der Historie aus - CTRL+F5. Danach wirkt sich eine Neukompilierung nicht mehr auf die Testereinstellungen aus.


Das Gleiche, ich habe es gestern bemerkt!

So wurde es behoben: Nach dem Kompilieren der neuen Version (neuer Dateiname) muss das Terminal neu gestartet werden. - Vielleicht wird der mqlcache nicht aktualisiert

Danach wird der Tester während der Kompilierung nicht auf die vorherige Datei zurückgesetzt.


Dieses Problem ist schon mehrmals aufgetreten und dann wieder verschwunden. Dann tauchte sie wieder auf....

Z.I. hat die Bedeutung Ihrer Worte nicht verstanden, und Sie haben eher geraten als gefragt...

 
Kommentare, die sich nicht auf dieses Thema beziehen, wurden nach "Fragen von Neulingen zu MQL4, Hilfe und Diskussion über Algorithmen und Codes" verschoben.
 

Ist jemand da? Überprüfen Sie das Skript zum Herunterladen der Geschichte...

Bin ich der Einzige, der erfroren ist? Das Skript stammt aus der Hilfe...

//+------------------------------------------------------------------+ 
//|                                              TestLoadHistory.mq5 | 
//|                        Copyright 2009, MetaQuotes Software Corp. | 
//|                                              https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "2009, MetaQuotes Software Corp." 
#property link      "https://www.mql5.com" 
#property version   "1.02" 
#property script_show_inputs 

//--- input parameters 

//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart()
  {



   int      all_symbols=SymbolsTotal(false);   string  sym_name="";
   Print("Load symbols ",all_symbols);

   for(int k=0;k<all_symbols;k++)
      if((sym_name=SymbolName(k,false))!="")
        {
         SymbolSelect(sym_name,true);

         Print(k," Symbol name ",sym_name);

         int res=CheckLoadHistory(sym_name,PERIOD_M1,(TimeCurrent()-60*60*24*5));

         switch(res)
           {
            case -1 : Print("Unknown symbol ",sym_name);             break;
            case -2 : Print("Requested bars more than max bars in chart ",sym_name); break;
            case -3 : Print("Program was stopped ",sym_name);                        break;
            case -4 : Print("Indicator shouldn't load its own data ",sym_name);      break;
            case -5 : Print("Load failed ",sym_name);                                break;
            case  0 : Print("Loaded OK ",sym_name);                                  break;
            case  1 : Print("Loaded previously ",sym_name);                          break;
            case  2 : Print("Loaded previously and built ",sym_name);                break;
            default : Print("Unknown result ",sym_name);
           }

         datetime first_date;
         SeriesInfoInteger(sym_name,PERIOD_M1,SERIES_FIRSTDATE,first_date);
         int bars=Bars(sym_name,PERIOD_M1);
         Print("First date ",first_date," - ",bars," bars");
        }
//--- 

//--- 
  }
//+------------------------------------------------------------------+ 
//|                                                                  | 
//+------------------------------------------------------------------+ 
int CheckLoadHistory(string symbol,ENUM_TIMEFRAMES period,datetime start_date)
  {
   datetime first_date=0;
   datetime times[100];
//--- check symbol & period 
   if(symbol==NULL || symbol=="") symbol=Symbol();
   if(period==PERIOD_CURRENT)     period=Period();
//--- check if symbol is selected in the MarketWatch 
   if(!SymbolInfoInteger(symbol,SYMBOL_SELECT))
     {
      if(GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL) return(-1);

      SymbolSelect(symbol,true);
     }
//--- check if data is present 
   SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date);
   if(first_date>0 && first_date<=start_date) return(1);
//--- don't ask for load of its own data if it is an indicator 
   if(MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR && Period()==period && Symbol()==symbol)
      return(-4);
//--- second attempt 
   if(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_TERMINAL_FIRSTDATE,first_date))
     {
      //--- there is loaded data to build timeseries 
      if(first_date>0)
        {
         //--- force timeseries build 
         CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times);
         //--- check date 
         if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
            if(first_date>0 && first_date<=start_date) return(2);
        }
     }
//--- max bars in chart from terminal options 
   int max_bars=TerminalInfoInteger(TERMINAL_MAXBARS);
//--- load symbol history info 
   datetime first_server_date=0;
   while(!SeriesInfoInteger(symbol,PERIOD_M1,SERIES_SERVER_FIRSTDATE,first_server_date) && !IsStopped())
      Sleep(5);
//--- fix start date for loading 
   if(first_server_date>start_date) start_date=first_server_date;
   if(first_date>0 && first_date<first_server_date)
      Print("Warning: first server date ",first_server_date," for ",symbol,
            " does not match to first series date ",first_date);
//--- load data step by step 
   int fail_cnt=0;
   while(!IsStopped())
     {
      //--- wait for timeseries build 
      while(!SeriesInfoInteger(symbol,period,SERIES_SYNCHRONIZED) && !IsStopped())
         Sleep(5);
      //--- ask for built bars 
      int bars=Bars(symbol,period);
      if(bars>0)
        {
         if(bars>=max_bars) return(-2);
         //--- ask for first date 
         if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
            if(first_date>0 && first_date<=start_date) return(0);
        }
      //--- copying of next part forces data loading 
      int copied=CopyTime(symbol,period,bars,100,times);
      if(copied>0)
        {
         //--- check for data 
         if(times[0]<=start_date)  return(0);
         if(bars+copied>=max_bars) return(-2);
         fail_cnt=0;
        }
      else
        {
         //--- no more than 100 failed attempts 
         fail_cnt++;
         if(fail_cnt>=100) return(-5);
         Sleep(10);
        }
     }
//--- stopped 
   return(-3);
  }
//+------------------------------------------------------------------+ 
//| Возвращает строкое значение периода                              | 
//+------------------------------------------------------------------+ 
string GetPeriodName(ENUM_TIMEFRAMES period)
  {
   if(period==PERIOD_CURRENT) period=Period();
//--- 
   switch(period)
     {
      case PERIOD_M1:  return("M1");
      case PERIOD_M2:  return("M2");
      case PERIOD_M3:  return("M3");
      case PERIOD_M4:  return("M4");
      case PERIOD_M5:  return("M5");
      case PERIOD_M6:  return("M6");
      case PERIOD_M10: return("M10");
      case PERIOD_M12: return("M12");
      case PERIOD_M15: return("M15");
      case PERIOD_M20: return("M20");
      case PERIOD_M30: return("M30");
      case PERIOD_H1:  return("H1");
      case PERIOD_H2:  return("H2");
      case PERIOD_H3:  return("H3");
      case PERIOD_H4:  return("H4");
      case PERIOD_H6:  return("H6");
      case PERIOD_H8:  return("H8");
      case PERIOD_H12: return("H12");
      case PERIOD_D1:  return("Daily");
      case PERIOD_W1:  return("Weekly");
      case PERIOD_MN1: return("Monthly");
     }
//--- 
   return("unknown period");
  }
//+------------------------------------------------------------------+
 

Forum zum Thema Handel, automatische Handelssysteme und Testen von Handelsstrategien

Unklare Situation, wenn schwebende Aufträge ausgelöst werden.

fxsaber, 2018.11.26 13:37

Es gibt auch eine Situation wie diese:

  1. Es wurde ein Marktauftrag zur Eröffnung einer Position platziert und OrdersTotal hat sich um eins erhöht.
  2. Sie wurde ausgeführt und OrdersTotal verringerte sich um eins, aber PositionsTotal erhöhte sich nicht um eins. Mit anderen Worten: Es gibt eine Position, aber das Terminal weiß nichts davon.

Zum Beispiel gibt es keine Positionen oder Aufträge - PositionsTotal = 0, OrdersTotal = 0.

Sie erteilen einen Börsenauftrag. PositionsTotal = 0, OrdersTotal = 1.

Der Marktauftrag wird ausgeführt - OrdersTotal = 0. Aber PositionsTotal = 0!

 
Dauer der Ausführung
PositionSelectByTicket(OrderGetInteger(ORDER_TICKET));

so dass sich PositionsTotal(nicht schwer zu reproduzieren) ändern kann.


Zum Beispiel gibt PositionsTotal kurz vor PositionsSelectBytTicket, das true zurückgibt, null zurück.