Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 938

 
Seric29:

Ich möchte ein eindimensionales Array erstellen, in dem 0 bis 4 Elemente double, 5 bis 9 datetame und 10 bis 14 int speichern. Ist es möglich, es in mql4 zu organisieren? Wenn ja, könnten Sie mir zeigen, wie, ich habe ein Beispiel mit Strukturen in C + + gesehen, aber ich habe den Link zu der Website verloren?

Wenn Sie für jeden Typ spezifische Array-Zellen zugewiesen haben, erstellen Sie eine Struktur anstelle eines Arrays.

 
Koldun Zloy:

Wenn Sie für jeden Typ spezifische Array-Zellen zugewiesen haben, dann erstellen Sie eine Struktur anstelle eines Arrays.

Leider kann er die Aufgabe nicht einmal formalisieren

auf der einen Seite sieht es so aus, als wolle er von der strengen Typisierung in C++ / MQL wegkommen, hier ist ein guter Diskussionsfaden, obwohl ich bezweifle, dass er ihm helfen wirdhttps://www.mql5.com/ru/forum/294094

Im Laufe dieser Diskussion (ich glaube, sie läuft schon seit 3 Monaten?) hat sich herausgestellt, dass@Seric29 von der Beschreibung von Funktionssignaturen wegkommen und eine "Phantom"-Funktion bekommen muss, die eine beliebige Anzahl von Parametern akzeptiert

In der Diskussion stellt sich dann heraus, dass mehrdimensionale dynamische Arrays an all dem beteiligt sein sollten, und diese Arrays sollten der Funktion als Parameter übergeben werden

D.h. das ist eine unformalisierte Aufgabe, deren Lösung immer wieder in "Rufen aus dem Feld" endet, die Entwickler haben die Funktionalität von etwas reduziert und geben mir den Quellcode von Schleifenoperatoren, ich werde sie nacharbeiten, dann wird das letztere:

Seric29:
Wie schreibe ich einen Brief an die mql4-Entwickler, um den Compiler-Code zu sehen, gibt es eine Möglichkeit, mehr Funktionen hinzuzufügen, damit er nicht so statisch ist?

... Das war's dann auch schon... die Formulierung "umwerfend" ist das Mindeste, was man sagen kann ))))

 

Deshalb nenne ich keine Einzelheiten.

Man kommt nicht umhin, die Grundlagen zu lernen.

 
Koldun Zloy:

Man kommt nicht umhin, die Grundlagen zu lernen.

Es ist interessant, dass ein Mann die Grundlagen nicht lernt, sondern versucht zu zeigen, dass er alles schon weiß, und Sie alle Metaquotes sind, die ihn daran hindern, seine Arbeit zu tun)

 
Taras Slobodyanik:

es ist interessant, dass ein Mann die Grundlagen nicht lernt, sondern versucht zu zeigen, dass er schon alles weiß, und ihr alle Meta-Zitate seid, die ihn daran hindern, seine Arbeit zu tun)

Grüße. Ich habe mir das Expert Advisor Video "From MQL4 to MQL5 - How to Rewrite an Expert Advisor for Metatrader 5" angesehen.
Vielen Dank an den Autor. Ich habe beschlossen, es selbst zu versuchen. Ich beschloss, es selbst zu versuchen. Die Idee ist die folgende:
1. Ich setze dtriger = 1 in den Eingaben - Kaufen öffnet.
2. Ich setze dtriger = -1 - Sell opens. 3.
3. ich habe dtriger = 0 in den Multisteckern eingestellt - alle offenen sind geschlossen.
Ich habe in den FAQ gelesen, dass es im MT5 nicht möglich ist, entgegengesetzte Positionen zu halten,
und ich habe sie.
Frage: Wie schreibe ich die Schließung einer offenen Position korrekt vor?
Die Frage ist: Wie kann man die Schließung einer aktiven Position bei der Öffnung eines Pfeils (Rückwärtsgang) korrekt vorschreiben?
Ich danke Ihnen vielmals.

#include <Trade\PositionInfo.mqh>.
#include <Handel.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>

CPositionInfo o_position;
CTrade o_trade;
CSymbolInfo o_symbol;
COrderInfo o_order;

Eingabe int triger = 0;
Eingabe double StartLot = 0,01;
Eingabe double lpos_volume = 1.0;
Eingabe int Step = 10;
input int MagicNumber = 12345; // Magische Zahl
input int Schlupf = 30; // Schlupf

int dtriger;
int dStep;

//+------------------------------------------------------------------+
//| Experten-Initialisierungsfunktion|
//+------------------------------------------------------------------+
int OnInit()
{
dStep = Step ;
dtriger = triger ;

if (!o_symbol.Name(Symbol()))
return(INIT_FAILED);

RefreshRates();

o_trade.SetExpertMagicNumber(MagicNumber) ;

if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK))
{
o_trade.SetTypeFilling(ORDER_FILLING_FOK);
}
else if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC))
{
o_trade.SetTypeFilling(ORDER_FILLING_IOC);
}
sonst
{
o_trade.SetTypeFilling(ORDER_FILLING_RETURN);
}
o_trade.SetDeviationInPoints(Slippage);

if (o_symbol.Digits() == 3 || o_symbol.Digits() == 5 )
{
dStep = 10 ;
}

return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
void OnTick()
{
datetimelpos_time = 0;
double lpos_price_open = 0.0;
ENUM_POSITION_TYPE lpos_type = -1;
intpos_count = 0;
double sum_profit = 0;

for (int i = PositionsTotal() - 1; i>=0; i--)
{
if (o_position.SelectByIndex(i))
{
if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
if (o_position.Time() > lpos_time)
{
lpos_time = o_position.Time(); //OrderOpenTime();
lpos_price_open = o_position.PriceOpen(); //OrderOpenPrice();
lpos_type = o_position.PositionType() ; //OrderTipe();
}

pos_count++;
sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
}
}
}

// Zählen Sie die Anzahl der ausstehenden Aufträge
int stop_count=0;

for (int i=OrdersTotal()-1; i >=0; i--)
{
if (o_order.SelectByIndex(i))
{
if (o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
stop_count++;
}
}

if (!RefreshRates())
zurück;

if(dtriger == 0 )
{
CloseAll();
Rückkehr;
}

// + ----- Erste Bestellung öffnen ++++++++++
if (pos_count == 0 && stop_count == 0 )
{
if ( dtriger == -1 && lpos_type != POSITION_TYPE_SELL)
{
o_trade.Sell(StartLot * lpos_volume , o_symbol.Name()); // S E L L 11111
}

if ( dtriger == 1 && lpos_type != POSITION_TYPE_BUY )
{
o_trade.Buy(StartLot * lpos_volume , o_symbol.Name()); // B U Y 11111
}
}


----- Umgekehrt ++++++++++++++++++++++++++++

wenn (pos_count>0)
{
if(lpos_type == POSITION_TYPE_BUY )
{
wenn ( dtriger == -1 )
{
o_trade.Sell(StartLot * lpos_volume , o_symbol.Name()); // S E L L +++++
}
}

if (lpos_type==POSITION_TYPE_SELL )
{
wenn ( dtriger == 1 )
{
o_trade.Buy(StartLot * lpos_volume , o_symbol.Name()); // B U Y +++++
}
}
}


if(pos_count>0 && stop_count>0)
DeleteStopOrders() ;

}
//-----------------------------------------------------------
bool RefreshRates()
{
if (!o_symbol.RefreshRates())
return(false) ;

if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0)
return(false);

return(true);
}
//--- ---------------------------------------------------------
bool IsFillingTypeAllowed (string symbol, int fill_type)
{
int filling = (int)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);

return((filling && fill_type) == fill_type) ;
}

// --------------------------------------------------
void CloseAll()
{
for (int index = PositionsTotal()-1; index >=0; index--)
{
if (o_position.SelectByIndex(index))
{
if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
o_trade.PositionClose(o_position.Ticket())
}
}
}
}

//-----------------------------------------------------------
// Alle schwebenden Aufträge löschen
//-------------------------------------
void DeleteStopOrders()
{
for (int i = OrdersTotal() - 1; i >= 0; i-- )
{
if (o_order.SelectByIndex(i))
if(o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
o_trade.OrderDelete(o_order.Ticket())
}
}

//+------------------------------------------------------------------+

 
procom:

Grüße....

Bitte geben Sie den Code korrekt ein:


 
Artyom Trishkin:

Bitte geben Sie den Code korrekt ein:


ok
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>

CPositionInfo   o_position;
CTrade        o_trade;
CSymbolInfo        o_symbol;
COrderInfo         o_order;

input int          triger            = 0;
input double    StartLot             = 0.01;
input double    lpos_volume       = 1.0;
input int          Step         = 10;
input int          MagicNumber    = 12345;      //      Magic   nuaber
input int          Slippage          = 30;         //   slippage

int dtriger;
int dStep;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   dStep = Step ;
   dtriger = triger ;

   if (!o_symbol.Name(Symbol()))
     return(INIT_FAILED);
   
   RefreshRates();
   
   o_trade.SetExpertMagicNumber(MagicNumber) ;

   if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK))
   { 
      o_trade.SetTypeFilling(ORDER_FILLING_FOK);
   }
   else if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC))
   { 
      o_trade.SetTypeFilling(ORDER_FILLING_IOC);
   }
   else 
   {
      o_trade.SetTypeFilling(ORDER_FILLING_RETURN);
   }
      o_trade.SetDeviationInPoints(Slippage);
   
   if (o_symbol.Digits() == 3 || o_symbol.Digits() == 5 )
   {
      dStep = 10 ;
   }
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
      datetime              lpos_time          =        0;
      double                lpos_price_open    =        0.0;
      ENUM_POSITION_TYPE   lpos_type           =        -1;
      int                      pos_count               =        0;
      double                sum_profit         = 0;
 
   for (int i = PositionsTotal() - 1; i>=0; i--)
   {
      if (o_position.SelectByIndex(i))
      {
         if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            if (o_position.Time() > lpos_time)
            {  
               lpos_time       = o_position.Time();            //OrderOpenTime();
               lpos_price_open = o_position.PriceOpen();       //OrderOpenPrice();
               lpos_type       = o_position.PositionType() ;   //OrderTipe();
             }  
            
            pos_count++;
            sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
          }     
       }     
    }          

   // Считаем кол-во отложенных ордеров
  int stop_count=0;

   for (int i=OrdersTotal()-1; i >=0; i--) 
   {
      if (o_order.SelectByIndex(i)) 
      {
         if (o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber) 
           stop_count++;
      }
   }

   if (!RefreshRates())
     return ;
     
   if(dtriger == 0 )
   {
      CloseAll();
      return;               
   } 
   
  // + -----    Откраваем Первый ордер   ++++++++++
 if (pos_count == 0  && stop_count == 0    )
   {
      if ( dtriger == -1 &&  lpos_type != POSITION_TYPE_SELL)
      {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());  //   S E L L   11111
      }
      
      if ( dtriger == 1 &&  lpos_type != POSITION_TYPE_BUY )
      {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());   //   B U Y    11111
      }
   }
                          

// +  -----   Переворот    ++++++++++++++++++++++++++++   

if (pos_count>0)
   {
      if(lpos_type == POSITION_TYPE_BUY )
      {
         if ( dtriger == -1 )
         {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   +++++
         }
      }

      if (lpos_type==POSITION_TYPE_SELL )
      {
         if ( dtriger == 1 )
         {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());       //   B U Y    +++++
         }
      }
   }


   if(pos_count>0 && stop_count>0) 
     DeleteStopOrders() ;
  
} 
//-----------------------------------------------------------
bool RefreshRates()
{
   if (!o_symbol.RefreshRates())
     return(false) ;
     
    if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0)
      return(false);
      
    return(true);
}  
//---  --------------------------------------------------------- 
 bool IsFillingTypeAllowed (string symbol, int fill_type)
{ 
   int filling = (int)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE); 
 
   return((filling && fill_type) == fill_type) ;
} 
 
 //  -------------------------------------------------- 
   void CloseAll()
{
   for (int index = PositionsTotal()-1; index >=0; index--)
   {
      if (o_position.SelectByIndex(index))
      {
         if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            o_trade.PositionClose(o_position.Ticket());
         }
      }  
    } 
 } 
  
 //----------------------------------------------------------- 
 // Delete all pending orders
 //-------------------------------------
 void DeleteStopOrders()
 {
    for (int i = OrdersTotal() - 1; i >= 0; i-- ) 
   {
      if (o_order.SelectByIndex(i))
         if(o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
            o_trade.OrderDelete(o_order.Ticket());
   }
 } 
 
//+------------------------------------------------------------------+
Dateien:
Stend_t1.mq5  12 kb
 
Igor Makanu:

fangen Sie an, mindestens ein Buch über C++ zu lesen, Ihre Fragen sind eine Wucht, Sie schreiben Fachbegriffe, auf den ersten Blick scheint es, dass Sie eine spezifische Frage stellen, aber in Wirklichkeit operieren Sie nur mit Begriffen, ohne das Wesentliche zu verstehen .... was wird das Makro zurückgeben? wo wird es zurückgeben? im Körper des Makros eine nachladbare Funktion.... Ich kann nicht einmal ansatzweise erklären, wie Ihre Frage aussieht.

Um zu verstehen, was ein Makro ist, buchstabieren Sie den Begriff richtig, macroSETTING , vielleicht fällt es Ihnen dann leichter zu verstehen, was es ist

In mql4 sind die Funktionen und C++ reduziert, mit anderen Worten, es ist eine zu statische Sprache. Ich kann sagen, dass meine Idee gescheitert ist, ich habe eine einfache Überladung ohne Klassen geschrieben, ich habe Argumente hinzugefügt und ihnen 0 gegeben, ich habe versucht, sie in einem Makro aufzurufen, ich habe eine Fehlermeldung bekommen, dass es 3 Funktionen gibt, also stellt sich heraus, dass ich noch beschreiben muss, welche ich aufrufen soll und wie, und ich sage nicht, mit welchen Stolpersteinen ich später zu tun haben werde. Wahrscheinlich ist es besser, gar nichts zu tun, dann macht man keinen Fehler.

 
Seric29:

mql4 hat gekürzte Funktionen und C++, mit anderen Worten eine zu statische Sprache.

Was genau wurde gestrichen?

Mit anderen Worten, Sie müssen nicht, vor allem nicht einmal Google kennt"zu statische Sprache", C++ ist eine statisch typisierte Sprache und darüber nachzudenken ist sinnlos - es ist einfach so.

Seric29:

Wahrscheinlich ist es besser, gar nichts zu tun, dann macht man keinen Fehler.

Ich werde mich kurz fassen RTFM ( lurkmore )

 

Die Frage ist eine rein ästhetische.

Wie kann ich erreichen, dass hier ein eigenes Bild erscheint? MT4



Grund der Beschwerde: