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

 
Artyom Trishkin:
Vor kurzem habe ich hier eine plattformübergreifende Indikatorvorlage veröffentlicht. Sehen Sie sich das an.
IndikatorPuffer()

Sie müssen einen Blog führen und dort Antworten auf dieselben Fragen veröffentlichen.... Ich wünschte, ich hätte so viel Geduld!

Hier isthttps://www.mql5.com/ru/forum/160683/page670#comment_9054670

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
  • 2018.10.18
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
Igor Makanu:

Sie sollten einen Blog führen und dort Antworten auf die gleichen Fragen veröffentlichen.... Ich wünschte, ich hätte so viel Geduld!

Vielleicht sollten Sie das tun. Ich habe keine Zeit dafür. Die Fragen werden immer die gleichen sein +/-

 
Das Problem wird dadurch gelöst, dass die Hilfsvariablen den letzten Pufferauftragsnummern zugewiesen werden, ohne dass jedoch die Anzeigeeinstellungen vorgeschrieben werden. Vorher standen unnötige Puffer in der Mitte der Liste.
 

Hilfe.

Ich möchte schwebende Aufträge für Positionen platzieren, die für den Tag geschlossen wurden.

Die Funktion setzt den Auftrag zum Preis der zuletzt geschlossenen Position.

Was muss ich tun, um schwebende Aufträge auf den Preis aller im Laufe des Tages geschlossenen Positionen zu setzen?

oid PriceTimePos(string sy="",int op=-1,int mn=-1) 
  {
   datetime t;
   bool daa;
   int d,k_=OrdersTotal(),typ_;
   double   r=0;
   int      i,k=OrdersHistoryTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) 
        {
         if(OrderSymbol()==Symbol()) 
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) 
              {
               if(op<0 ||OrderType()==op) 
                 {
                  if(mn<0 || OrderMagicNumber()==mn) 
                    {
                     if(OrderCloseTime()>=TimeCurrent()-1440*60)
                       {
                        t=OrderCloseTime();
                        r=OrderOpenPrice();
                        sl=OrderStopLoss();
                        tp=OrderTakeProfit();
                        lot=OrderLots();
                        typ_=OrderType();
                        //Print("OpenPrice",r);
                       }
                    }
                 }
              }
           }
        }
     }
// ЕСТЬ ОРДЕР ПО ЦЕНЕ ЗАКРЫТОЙ ПОЗИЦИИ?
   daa=false;
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) 
           {
            if(OrderType()>1 && OrderType()<6) 
              {
               d=MarketInfo(OrderSymbol(), MODE_DIGITS);
               r=NormalizeDouble(r, d);
               if(r==NormalizeDouble(OrderOpenPrice(),d)) {daa=true;}
              }
           }
        }
     }
   if(daa==false)//ЕСЛИ НЕТ ОРДЕРА ПО ЦЕНЕ, СТАВЛЮ
     {
      double opprord=0;
      for(i=0; i<k_; i++) 
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
           {
            if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) 
              {
               if(OrderType()>1 && OrderType()<6) 
                 {
                  d=MarketInfo(OrderSymbol(),MODE_DIGITS);
                  opprord=OrderOpenPrice();
                  // r=NormalizeDouble(r, d);
                  if(r!=NormalizeDouble(opprord,d))
                    {
                     if(r>Ask)
                       {
                        if(typ_==OP_BUY)
                          {
                           Print("OP_BUYSTOP",r);
                           SetOrder(Symbol(),OP_BUYSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                          }
                        if(typ_==OP_SELL)
                          {
                           Print("OP_SELLLIMIT",r);
                           SetOrder(Symbol(),OP_SELLLIMIT,lot,r,sl,tp,_MagicNumber,0,"sl");
                          }
                       }

                     //
                     if(Bid>r)
                       {
                        if(typ_==OP_BUY)
                          {
                           Print("OP_BUYLIMIT",r);
                           SetOrder(Symbol(),OP_BUYLIMIT,lot,r,sl,tp,_MagicNumber,0,"bl");
                          }
                        if(typ_==OP_SELL)
                          {
                           Print("OP_SELLSTOP",r);
                           SetOrder(Symbol(),OP_SELLSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                          }
                       }
                    }
                 }
              }
           }
        }
     }
//return(r);
  }
 
PolarSeaman:

Hilfe.

Ich möchte schwebende Aufträge für Positionen platzieren, die für den Tag geschlossen wurden.

Die Funktion setzt den Auftrag zum Preis der zuletzt geschlossenen Position.

Was sollte ich tun, um schwebende Aufträge auf die Preise aller innerhalb eines Tages geschlossenen Positionen zu setzen?

  1. Gehen Sie die Liste der geschlossenen Positionen in der Schleife durch und wählen Sie diejenigen aus, deren Schließungszeit größer als die Uhrzeit des Beginns des gewünschten Tages ist (und kleiner als die Uhrzeit des Beginns des nächsten Tages, wenn dieser z. B. vorgestern war).
  2. Fügen Sie alle Schlusskurse (Eröffnungskurse - ich weiß nicht genau, auf was Sie sie setzen wollen) aller gefundenen Positionen in ein einfaches Array oder ein Array von Strukturen ein.
  3. Gehen Sie das erstellte Array in der Schleife durch und platzieren Sie ausstehende Aufträge zu den Preisen des Arrays (indem Sie prüfen, ob ein Auftrag zu diesem Preis existiert - Sie müssen nicht mehrere Aufträge zum selben Preis platzieren)
  4. Sie können in der Zwischenzeit auch die Preise von bereits erteilten Aufträgen aus dem Array löschen, aber das ist ein bisschen knifflig...
 

Ich begann mit dem Studium von MQL4 durch das Buch von S. Kovalev. Kovalev, es gibt einige Ungereimtheiten im Code, da das Buch für alte Builds von MT4 geschrieben wurde.


Bitte geben Sie an, wie Sie diesen Code verarbeiten können, um Fehler zu vermeiden.

#property strict

int Count=0;
int init()      
{
   Alert ("Сработала ф-ия init() при запуске");   // Сообщение
   return;                                                                     // Выход из init()
   }   
//--------------------------------------------------------------------
int start()                                                                           // Спец. ф-ия start()
   {
   double Price = Bid;                                                      // Локальная перемен.
   Count++;                                                                      // Счётчик тиков
   Alert("Новый тик ",Count," Цена = ",Price);       // Сообщение
   return;                                                                        // Выход из start()
   }
int deinit()                                                                              // Спец. ф-ия deinit()
   {
   Alert ("Сработала ф-ия deinit() при выгрузке");         // Сообщение
   return;                                                                                 // Выход из deinit()
   }

Fehler

return" - die Funktion muss einen Wert zurückgeben

1. Ist es richtig, dies zu tun?

#property strict

int Count=0;
int init()      
{
   Alert ("Сработала ф-ия init() при запуске");   // Сообщение
   return(0);                                                                     // Выход из init()
   }   
//--------------------------------------------------------------------
int start()                                                                           // Спец. ф-ия start()
   {
   double Price = Bid;                                                      // Локальная перемен.
   Count++;                                                                      // Счётчик тиков
   Alert("Новый тик ",Count," Цена = ",Price);       // Сообщение
   return(0);                                                                        // Выход из start()
   }
int deinit()                                                                              // Спец. ф-ия deinit()
   {
   Alert ("Сработала ф-ия deinit() при выгрузке");         // Сообщение
   return(0);                                                                                 // Выход из deinit()
   }


2. Frage: Wie problematisch ist es, mit dem im Tutorial vermittelten Wissen (ich meine den Altersfaktor der Informationen) Code für neue Builds zu schreiben?



Dateien:
 
Sergey Branin:

Ich begann mit dem Studium von MQL4 durch das Buch von S. Kovalev. Kovalev, es gibt einige Ungereimtheiten im Code, da das Buch für alte Builds von MT4 geschrieben wurde.


Bitte geben Sie Hinweise, wie Sie diesen Code verarbeiten können, um Fehler zu vermeiden.

Fehler

return" - die Funktion muss einen Wert zurückgeben

1. Ist es richtig, dies zu tun?


2. Frage: Wie groß ist das Problem, mit dem im Tutorial vermittelten Wissen Code für neue Builds zu schreiben (ich meine den Faktor Informationsalterung)?



Verwenden Sie OnInit(), OnDeinit(), OnTick() und andere aus der Liste:

Документация по MQL5: Обработка событий
Документация по MQL5: Обработка событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Sergey Branin:

Ich begann mit dem Studium von MQL4 durch das Buch von S. Kovalev. Kovalev, es gibt einige Ungereimtheiten im Code, da das Buch für alte Builds von MT4 geschrieben wurde.


Bitte geben Sie an, wie Sie diesen Code verarbeiten können, um Fehler zu vermeiden.

Fehler

return" - die Funktion muss einen Wert zurückgeben

1. Ist es richtig, dies zu tun?


2. Frage, wie viel ein Problem zu schreiben Code für neue Builds mit Wissen aus dem Tutorial (ich meine das Alter Faktor der Informationen)?



  1. Es ist richtig, dass man Werte aus Nicht-Void-Funktionen zurückgeben kann, aber es ist besser, auf neue Builds umzusteigen - da gibt es nichts Kompliziertes.
  2. Schreiben Sie, vergessen Sie nicht, #property strict Direktive am Anfang des Codes einzufügen - wo alle Direktiven geschrieben werden, lesen Sie Fehlercodes - ihre Beschreibungen sind in der Dokumentation, und alles wird gut und nicht kompliziert.
 
Artyom Trishkin:
  1. Gehen Sie die Liste der geschlossenen Positionen durch und wählen Sie diejenigen aus, deren Schlusszeit größer ist als die Startzeit des gewünschten Tages.

Danke, ich finde die offenen Preise der geschlossenen Positionen zum gewünschten Zeitpunkt im ersten Zyklus. Sie erscheinen alle auf dem Drucker, und ich muss sie in Auftrag geben.

Das Feld ist ein bisschen ein Puzzle für mich, bitte beraten Sie mich, wie man die Zyklen einfügen, um zu überprüfen und setzen sie auf den Eröffnungskurs in den ersten Zyklus der Suche nach diesen Preisen.

Wie kann ich also, ausgehend vom Preis des ältesten Produkts, das ich benötige, zum nächsten gefundenen Preis gelangen?
void PriceTimePos(string sy="",int op=-1,int mn=-1)
  {
   datetime t;
   bool daa;
   int d,k_=OrdersTotal(),typ_;
   double   r=0;
   int      i,k=OrdersHistoryTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(OrderCloseTime()>=TimeCurrent()-1440*60)
                       {
                        t=OrderCloseTime();
                        r=OrderOpenPrice();
                        sl=OrderStopLoss();
                        tp=OrderTakeProfit();
                        lot=OrderLots();
                        typ_=OrderType();
                        //Print("OpenPrice",r);

                        // ЕСТЬ ОРДЕР ПО ЦЕНЕ ЗАКРЫТОЙ ПОЗИЦИИ?
                        daa=false;
                        for(i=0; i<k; i++)
                          {
                           if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                             {
                              if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op))
                                {
                                 if(OrderType()>1 && OrderType()<6)
                                   {
                                    d=MarketInfo(OrderSymbol(), MODE_DIGITS);
                                    r=NormalizeDouble(r, d);
                                    if(r==NormalizeDouble(OrderOpenPrice(),d)) daa=true; //else continue;
                                   }
                                }
                             }
                          }
                        if(daa==false)//ЕСЛИ НЕТ ОРДЕРА ПО ЦЕНЕ, СТАВЛЮ
                          {

                           if(r>Ask)
                             {
                              if(typ_==OP_BUY)
                                {
                                 Print("OP_BUYSTOP",r);
                                 SetOrder(Symbol(),OP_BUYSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                                }
                              if(typ_==OP_SELL)
                                {
                                 Print("OP_SELLLIMIT",r);
                                 SetOrder(Symbol(),OP_SELLLIMIT,lot,r,sl,tp,_MagicNumber,0,"sl");
                                }
                             }

                           //
                           if(Bid>r)
                             {
                              if(typ_==OP_BUY)
                                {
                                 Print("OP_BUYLIMIT",r);
                                 SetOrder(Symbol(),OP_BUYLIMIT,lot,r,sl,tp,_MagicNumber,0,"bl");
                                }
                              if(typ_==OP_SELL)
                                {
                                 Print("OP_SELLSTOP",r);
                                 SetOrder(Symbol(),OP_SELLSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                                }
                             }

                          }
                        //return(r);
                       }
                    }
                 }
              }
           }
        }
     }
//
  }
 
PolarSeaman:

Danke, ich finde die Eröffnungskurse der geschlossenen Positionen zum richtigen Zeitpunkt im ersten Zyklus. Sie tauchen alle im Drucker auf und ich muss sie bestellen.

Das Array ist ein Labyrinth für mich, sagen Sie mir, wie ich die Zyklen zu überprüfen und auf den Eröffnungskurs in der ersten Schleife, um diese Preise zu finden.

Es ist schneller zu verstehen und zu begreifen, was Arrays sind, als zu korrigieren, was man getan hat.

Zumal Arrays nicht einfach, sondern sehr einfach sind.

AK-Magazin hält 30 Patronen - es ist eine Reihe von Größe 30. Und die Cartridges sind die im Array gespeicherten Daten.

Zugegebenermaßen ist dies kein gutes Beispiel - man kann die dritte nicht bekommen, wenn man nicht 0, 1 und 2 hat.

Stellen Sie sich eine Tabellenkalkulation vor:

Index 0
Index 1
Index 2
Index 3
Index 4
Index5.Index6.Index 7
Index 8
Index 9
Wert 1
Indexwert 2
Wert 3
Wert 4
Wert 5
Wert 6
Wert 7
Wert 8
Wert 9
Wert 10

Hier ist ein einfaches eindimensionales Array der Größe 10.

Wert 1 wird in Zelle mit Index 0 gespeichert, Wert 2 wird in Zelle mit Index 1 gespeichert, Wert 3 wird in Zelle mit Index 2 gespeichert, ...
...
Wert 8 wird in Indexzelle 7 gespeichert, Wert 9 wird in Indexzelle 8 gespeichert, Wert 10 wird in Indexzelle 9 gespeichert

So einfach ist das. Um den Wert 3 zu erhalten, müssen Sie sich auf das Array beziehen - seine Zelle 2: Wert3=Array[2];

Grund der Beschwerde: