Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1026

 
Vladimir Karputov:

Das ändert nichts daran, dass Sie versuchen, einen schwebenden Auftrag mit einem Ticket "0" auf jedem Tick zu löschen.

Und wer sagt, dass Sie einen schwebenden Auftrag mit einem "0"-Tick auf jedem Tick haben? Haben Sie überprüft, wie viele ausstehende Aufträge es gibt? Und woher wissen Sie das ....?

Bei welchem Häkchen steht "0"??? OrderGetTicket(0) bedeutet nicht, dass ein Auftrag mit Ticket 0 ausgewählt wird, sondern gibt einen Ticketauftrag aus der Liste der ausstehenden Aufträge unter Index 0 zurück.

 
ascerdfg:


Wahrscheinlich müssen Sie Ihre Aufgabe noch genauer formulieren.

Zum Beispiel: Wenn es einen schwebenden Auftrag gibt, dessen Magie "1" ist - dann löschen Sie ihn.

In diesem Fall wird die Umsetzung wie folgt aussehen:

#include <Trade\Trade.mqh>

CTrade trader;
int OnInit()
  {

   trader.SetExpertMagicNumber(1);

   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
//---
  
  }
void OnTick()
  {
   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders
      if(OrderGetTicket(i)>0)     // selects the pending order by index for further access to its properties
         if(OrderGetInteger(ORDER_MAGIC)==1)
            trader.OrderDelete(OrderGetTicket(i));
  }

Schleife durch alle ausstehenden Aufträge

Wenn ein schwebender Auftrag erfolgreich ausgewählt wurde (der zurückgegebene Wert ist das Ticket größer als Null)

Wenn der magische Wert des ausgewählten schwebenden Auftrags "1" ist

Löschen

 
Alexey Viktorov:

Mit welchem Ticket "0"? OrderGetTicket(0) bedeutet nicht, dass ein Auftrag mit Ticket 0 ausgewählt wird, sondern gibt ein Ticket eines Auftrags aus der Liste der ausstehenden Aufträge unter Index 0 zurück.

Ja, das ist richtig.

 

Können Sie mir sagen, wie viel Arbeitsspeicher benötigt wird, um das Prüfprogramm für 30 Zeichen von 2004 bis heute laufen zu lassen?

Der Tester sagt, dass es nicht genug ist, aber er sagt nicht, wie viel benötigt wird.

 
Igor Zakharov:

Können Sie mir sagen, wie viel Arbeitsspeicher benötigt wird, um das Prüfprogramm für 30 Zeichen von 2004 bis heute laufen zu lassen?

Der Tester sagt, dass es nicht genug ist, aber er sagt nicht, wie viel.

Zwei Zeichen laufen lassen, fünf Zeichen ...

 
Vladimir Karputov:

Zwei Zeichen laufen lassen, fünf Zeichen ...

Das ist nicht wirklich die Frage - wie viel Speicher muss ich kaufen, um einen solchen Test zu ermöglichen?

Hier ist das Ergebnis für ein Symbol (aus dem Protokoll im Eröffnungskursmodus)

264  Mb memory used including 6 Mb of history data, 64  Mb of tick data

Hier sind 2:

271 Mb memory used including 12 Mb of history data, 64 Mb of tick data

3:

1038  Mb memory used including 12 Mb of history data, 832 Mb of tick data

Und hier ist die 4:

1450 Mb memory used including 18 Mb of history data, 1216  Mb of tick data

Es hat sichexponentiell entwickelt :) Ich kann die Logik nicht nachvollziehen, da die Ticks ungefähr gleich sind:

EURUSD,H1: 21470549 ticks, 94233 bars generated. 63097850 total ticks for all symbols
EURUSD: generate 21470549 ticks in 0:00:05.375, passed to tester 21470549 ticks
USDCAD: generate 20302871 ticks in 0:00:05.062, passed to tester 20302871 ticks
USDJPY: generate 21324430 ticks in 0:00:05.641, passed to tester 21324430 ticks
1450 Mb memory used including 18 Mb of history data, 1216 Mb of tick data

Ich habe viele Berichte über 20 oder mehr Zeichen gesehen, ich glaube nicht, dass jemand Terabytes an RAM verwendet. Vielleicht gibt es ein Geheimnis?

 

Ist es möglich, die Anzahl der grafischen Puffer im Indikator einzustellen?

Und die zweite Frage, gibt es eine Möglichkeit der erzwungenen Reinitialisierung des Indikators durch den Expert Advisor verwendet, um RAM zu sparen?

 
Aleksey Vyazmikin:

Ist es möglich, die Anzahl der grafischen Puffer im Indikator einzustellen?

Und die zweite Frage, gibt es eine Möglichkeit der erzwungenen Reinitialisierung des Indikators durch den Expert Advisor verwendet, um RAM zu sparen?

Es ist möglich, die Anzahl der indicator_plots, die in #property indicator_plots angegeben ist, zu verringern, ich habe es getan. Aber es ist kaum möglich, sie zu erhöhen. Diese Verringerung führt jedoch nicht zu einer Speicherplatzeinsparung. Schließlich gibt es noch Puffer. Sie werden lediglich von INDICATOR_DATA auf INDICATOR_CALCULATIONS übertragen, mehr nicht.

 
Alexey Viktorov:

Das in #property indicator_plots angegebene kann reduziert werden, das habe ich getan. Aber eine Erhöhung ist wohl kaum möglich. Durch diese Reduzierung wird jedoch kein Arbeitsspeicher eingespart. Immerhin bleiben die Puffer erhalten. Sie werden lediglich von INDICATOR_DATA in INDICATOR_CALCULATIONS übertragen, mehr nicht.

Ich danke Ihnen für Ihre Antwort. Eine kosmetische Änderung der Anzahl von Puffern ist leider nicht relevant.

 

Ich möchte MACD-Indikator-Handles von drei Zeitrahmen in der OnInit() Block zu erhalten. Auf dem Chart - es funktioniert, aber in der Tester es nicht funktioniert, und das Terminal hängt fest! So möchte ich die Daten zu erhalten, die nicht vorhanden ist? Können Sie mir bitte sagen, wie ich damit umgehen soll?


//+------------------------------------------------------------------+
//|                                                        Test.mq5  |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

//--- Количество периодов торгуемых символов
#define  NUMBER_OF_PERIODS 3

ENUM_TIMEFRAMES Periods[NUMBER_OF_PERIODS]={PERIOD_M1,PERIOD_M2,PERIOD_M3};
int handles[NUMBER_OF_PERIODS];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ArrayInitialize(handles,INVALID_HANDLE);
      for(int p=0; p<NUMBER_OF_PERIODS; p++)
        {
         if(handles[p]==INVALID_HANDLE)
           {
            handles[p]=iCustom(NULL,Periods[p],"Examples\\MACD");
            Print(handles[p]);
            if(handles[p]==INVALID_HANDLE)  Print("Не удалось получить хэндл индикатора для символа !");
           }
        }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

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