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

 

Hallo Kollegen.

Frage: Um in mql4 die Anzahl der Positionen zu berechnen, kann man die Funktion wie folgt schreiben

//+------------------------------------------------------------------+
// Счетчик ордеров
//+------------------------------------------------------------------+
int OrderCount(int type)
{
  int count = 0;
  for (int trade = OrdersTotal() -1; trade >=0; trade--)
  {
    if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
    {
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == type)
      count++;
    }
  }
  return(count);
}

Wie wird dies in mql5 umgesetzt? Wie kann ich die Anzahl der Positionen nach Magie oder nach Art berechnen?

 
Kommentare, die sich nicht auf dieses Thema beziehen, wurden nach "Fragen von MQL4 MT4 MetaTrader 4 Anfängern" verschoben.
 
Nikita Chernyshov:

Hallo Kollegen.

Frage: Um in mql4 die Anzahl der Positionen zu berechnen, kann man die Funktion wie folgt schreiben

Wie wird dies in mql5 umgesetzt? Wie kann man die Anzahl der Positionen durch eine magische Zahl oder durch einen Typ berechnen?

Beispiel inEhlers_CG EA-Code, Funktion CalculateAllPositions.

 
Vladimir Karputov:

Beispiel inEhlers_CG EA-Code, Funktion CalculateAllPositions.

Ich danke Ihnen vielmals. Ich habe versucht, es so zu wiederholen, dass ich es verstehen kann. Aber es gibt 0 zurück und öffnet endlose Aufträge, bitte beraten Sie, wo habe ich es vermasselt? Ich möchte nicht auf meine Handelsidee achten, ich möchte sie nur allgemein lernen.


#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
#include <Trade\AccountInfo.mqh>
#include <Trade\DealInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Expert\Money\MoneyFixedMargin.mqh>

CPositionInfo  m_position;                   // trade position object
CTrade         trade;                      // trading object
CSymbolInfo    symbol_info;                     // symbol info object
CAccountInfo   m_account;                    // account info wrapper
CDealInfo      m_deal;                       // deals object
COrderInfo     m_order;                      // pending orders object
CMoneyFixedMargin *m_money;


input double lot = 0.01;
input int    TakeP = 300;
input int    StopL = 300;
input int    Magic = 123;
input int    Slip  = 50;

input int    MA    = 50;

double ma[];
int    handle;
int    digits;
double point;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   handle = iMA(NULL,0,MA,0,MODE_SMA,PRICE_CLOSE);
   
   trade.SetExpertMagicNumber(Magic);
   trade.SetDeviationInPoints(Slip);
   trade.SetTypeFilling(ORDER_FILLING_FOK);
   trade.SetAsyncMode(false);
   
   digits=(int)SymbolInfoInteger(NULL,SYMBOL_DIGITS);
   point=SymbolInfoDouble(NULL,SYMBOL_POINT);
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   CopyBuffer(handle,0,0,50,ma);
   ArraySetAsSeries(ma,true); 
   
   double Ask=SymbolInfoDouble(NULL,SYMBOL_ASK);
   double Bid=SymbolInfoDouble(NULL,SYMBOL_BID);
   
   if(Ask > ma[1] && CalculateAllPositions(POSITION_TYPE_BUY) == 0)
     {
       double tp = NormalizeDouble(Ask+TakeP*point,digits);
       double sl = NormalizeDouble(Ask-StopL*point,digits);
       
       if(!trade.Buy(lot,NULL,Ask,sl,tp))
          {
      //--- сообщим о неудаче
      Print("Метод Buy() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
          } else
               {
                 Print("Метод Buy() выполнен успешно. Код возврата=",trade.ResultRetcode(),
                 " (",trade.ResultRetcodeDescription(),")");
               }
     }
     
   if(Bid < ma[1] && CalculateAllPositions(POSITION_TYPE_SELL) == 0)
     {
       double tp = NormalizeDouble(Bid-TakeP*point,digits);
       double sl = NormalizeDouble(Bid+StopL*point,digits);
       
       if(!trade.Sell(lot,NULL,Bid,sl,tp))
          {
      //--- сообщим о неудаче
      Print("Метод Sell() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
          } else
               {
                 Print("Метод Sell() выполнен успешно. Код возврата=",trade.ResultRetcode(),
                 " (",trade.ResultRetcodeDescription(),")");
               }
     }     
   Comment(CalculateAllPositions(POSITION_TYPE_BUY));
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Счетчик ордеров                                                  |
//+------------------------------------------------------------------+
int CalculateAllPositions(const ENUM_POSITION_TYPE type)
  {
   int count=0;   
  
   for(int i=PositionsTotal()-1;i>=0;i--)
      {
      if(m_position.SelectByIndex(i)) 
        {
         if(m_position.Symbol()==NULL && m_position.Magic()==Magic && m_position.PositionType()==type)
         count++;
       }
         
     }
    return(count);
  }
 
Nikita Chernyshov:

Ich danke Ihnen vielmals. Ich habe versucht, es in eine Form zu bringen, die für mich mehr Sinn macht. Aber es gibt 0 zurück und öffnet endlose Aufträge, bitte beraten Sie, wo habe ich es vermasselt? Bitte beachten Sie meine Handelsidee nicht, ich versuche nur, mich mit ihr vertraut zu machen.


Das Schlüsselwort Ihres Fehlers ist, dass ich nicht umsonst so viel Verifizierungscode in meinen EAs geschrieben habe. Sie haben fast alle Innereien ausgelassen, insbesondere OnTradeTransaction.

 

Ich konfrontiert ein Problem, der Indikator basierte EA funktioniert korrekt auf dem realen Konto, aber es liegt in der Tester, in Tick Generation Modi sowohl durch OHLC und durch alle Ticks - das Ergebnis ist das gleiche. Das Ergebnis des Fehlers ist der leere Puffer des Indikators beim Null-Bar (nur wenn es einen neuen Bar am oberen TF gibt, der für die Berechnung des Indikators verwendet wird). Ich habe es jedoch geschafft, den Indikator zu berechnen, indem ich Sleep zu meinem Expert Advisor hinzufügte. Aber ich habe herausgefunden, dass dieser Sleep je nach Modus der Tick-Generierung unterschiedlich sein sollte - für die Generierung aus allen Ticks ist Sleep(15000) ausreichend, während für OHLC Sleep(30000) benötigt wird.

Es stellt sich also die Frage, ob die Situation mit Sleep normal ist, denn es stellt sich logischerweise heraus, dass dort unterschiedliche Verzögerungszeiten modelliert werden, abhängig von der Art der Tick-Erzeugung!

Liebe Entwickler, ich bitte Sie, die Situation mit dem Indikator zu erklären, weil ich selbst nicht verstehen kann, was der Grund ist - ein Fehler im Code oder im Tester!

Ich bin bereit, den Indikator und den Expert Advisor in der PM zu geben, aber sagen Sie mir, an wen.

 
Aleksey Vyazmikin:

Ich konfrontiert ein Problem, der Indikator basierte EA funktioniert korrekt auf dem realen Konto, aber es liegt in der Tester, in Tick Generation Modi sowohl durch OHLC und durch alle Ticks - das Ergebnis ist das gleiche. Das Ergebnis des Fehlers ist der leere Puffer des Indikators beim Null-Bar (nur wenn es einen neuen Bar am oberen TF gibt, der für die Berechnung des Indikators verwendet wird). Aber ich habe es geschafft, den Indikator durch Hinzufügen von Sleep zu berechnen, und es wurde herausgefunden, dass dieser Sleep je nach Modus der Tick-Generierung unterschiedlich sein sollte - für die Generierung aus allen Ticks ist Sleep(15000) ausreichend, aber für OHLC wird Sleep(30000) benötigt.

Es stellt sich also die Frage, ob die Situation mit Sleep normal ist, denn es stellt sich logischerweise heraus, dass dort unterschiedliche Verzögerungszeiten modelliert werden, abhängig von der Art der Tick-Erzeugung!

Liebe Entwickler, ich bitte Sie, die Situation mit dem Indikator zu erklären, weil ich selbst nicht verstehen kann, was der Grund ist - ein Fehler im Code oder im Tester!

Ich bin bereit, Ihnen den Indikator und EA in der PM zu geben, aber sagen Sie mir, an wen.

Der Schlafmodus funktioniert bei diesem Indikator nicht. Außerdem wird sie auch im Expert Advisor ignoriert, wenn es sich um den Tester handelt.

 
Ihor Herasko:

Im Indikator funktioniert der Schlaf nicht. Außerdem wird sie auch im Expert Advisor ignoriert, wenn es sich um den Tester handelt.

Ich habe bereits geschrieben, dass Sleep ist in der Expert Advisor, und wenn es ignoriert wird, und Sie sind 100% sicher, dass es, dann ist es eine zusätzliche Bestätigung, dass der Fehler in der Prüfer ist.

Die Verzögerung tritt möglicherweise nicht rechtzeitig ein, kann aber für das Programm emuliert werden.

Hinzugefügt: Sleep funktioniert im Tester, hier ist ein einfacher Code, der dies bestätigt

   Print(iClose(Symbol(),PERIOD_CURRENT,0));
   Sleep(15000);
   Print(iClose(Symbol(),PERIOD_CURRENT,0));

Ergebnis

2019.01.22 08:28:24.661 2019.01.21 23:49:00   66920.0
2019.01.22 08:28:24.661 2019.01.21 23:49:15   66928.0
 
Ihor Herasko:

Im Indikator funktioniert der Schlaf nicht. Außerdem wird sie sogar im EA ignoriert, wenn es um den Tester geht.

Das ist sie nicht.

 
Aleksey Vyazmikin:

Ich habe bereits geschrieben, dass Sleep ist in der EA, und wenn es ignoriert wird, und Sie sind 100% sicher, dass dies, dann ist es eine zusätzliche Bestätigung, dass der Fehler in der Prüfer ist.

Die Verzögerung tritt möglicherweise nicht rechtzeitig ein, kann aber für das Programm emuliert werden.

Hinzugefügt: Sleep funktioniert im Tester, hier ist ein einfacher Code, der dies bestätigt

Ergebnis

Dies war ursprünglich in Ihrem Beitrag der Fall:

Es gelang mir jedoch, den Indikator zum Lesen zu bringen, indem ich Sleep hinzufügte, und hier wurde er offenbart...

Deshalb habe ich auf Sleep in the indicator reagiert.

Und was den Schlaf im EA angeht, so verstehe ich nicht, warum Sie ihn in 4 und 5 unterschiedlich gestalten mussten. In 4 ist er so:

void OnTick()
{
   Print("Before: ", TimeCurrent());
   Sleep(100000);
   Print("After: ", TimeCurrent());
}
2019.01.22 07:38:19.432 2018.11.08 00:02:05  Test AUDUSD,M5: After: 2018.11.08 00:02:05
2019.01.22 07:38:19.432 2018.11.08 00:02:05  Test AUDUSD,M5: Before: 2018.11.08 00:02:05
Zum Inhalt der Frage. Schlaf sollte keine Auswirkungen auf die Neuberechnung der Daten im Indikator haben. Mit der Pufferbefüllung stimmt etwas nicht. Vielleicht gibt es ein reproduzierbares Stück Code?