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

 
Vyacheslav Kornev:

Vielen Dank für die Hilfe, aber im realen Handel macht es keinen Unterschied, wie man den Preis zu nehmen? Schließlich müssen Sie sowohl den Indikator und die EA auf dem Chart setzen?

Im realen Handel werden Sie die Daten erhalten können. Solange Sie nicht versehentlich die Indikatorzeilen löschen...

 
Artyom Trishkin:

Mit einem echten Gerät können Sie Daten empfangen. Wenn Sie nicht versehentlich die Indikatorlinien entfernen...


Also, ich habe noch eine Frage: Ich habe einen tollen Expert Advisor. Aber er muss dies tun: Wenn er eine Linie überschreitet, wird ein zusätzlicher Auftrag in dieser Richtung eröffnet, und dann wird er mit Gewinn geschlossen... Wie kann man erreichen, dass nach dem Schließen mit Gewinn die zusätzliche Order nicht wieder geöffnet wird, bis die Indikatorlinie aktualisiert wird?

//==================Einstellung eines zusätzlichen Auftrags ============
double Lots2;
if((PriceHigh>PriceLow && Ask>PriceHigh && LBUY<LSELL)|| (PriceLow>PriceHigh && Ask>PriceLow && LBUY<LSELL) )
 

Guten Tag, ich brauche ein wenig Hilfe mit dem Code, der:

öffnet BUY, wenn die Datei 11112222.txt 1 enthält;

öffnet SELL, wenn die Datei 11112222.txt -1 enthält;

Schließt alle Aufträge, wenn die Datei 11112222.txt 0 enthält;


In der Datei 11112222.txt kann es nur drei Einträge geben: 1, -1 oder 0


Ich verstehe nicht, was mit diesem Code falsch ist; aus irgendeinem Grund, wenn ich 0 in der Datei 11112222.txt sehen, öffnet es BUY um, anstatt geschlossen, um Code, ich weiß einfach nicht, was falsch ist.

Ay, es gibt auch ein Problem, wenn EA läuft, ist es fast immer unmöglich, 11112222.txt zu öffnen, es sagt, dass die Datei mit einer anderen Anwendung beschäftigt ist, so dass ich, um dieses Problem zu beheben, überall "FileClose(handle2); // Close text file" einfüge, aber es hilft nicht, und ich brauche den EA, um die Datei 11112222.txt auf 1, -1 oder 0 zu prüfen, nachdem sie geöffnet wurde, und sie dann zu schließen, weil die Datei periodisch von einem anderen Programm verwendet wird, um 1, -1 oder 0 aufzuzeichnen.

//=================================BUY=========================================
    int handle2 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle2>0) // если в файле больше 0, то есть 1, то открывать BUY
   {
    
       Print(FileReadString(handle2));
       FileClose(handle2); // закрытие текстового файла

                    //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ      
                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на покупку
                     {
                        OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                        FileClose(handle2); // закрытие текстового файла
                     }
                    else
                      Print("NE USPESHNO!!!");
                      FileClose(handle2); // закрытие текстового файла

   }
//=================================конец кода BUY=========================================
      
      
      
      
      
      
      
      
//=================================SELL=========================================
    int handle3 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle3<0)//если в текстовом файле меньше 0, то есть -1, то открывать SELL
   {
    
       Print(FileReadString(handle3));
       FileClose(handle3); // закрытие текстового файла

                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на продажу
                        {
                           OrderSend(Symbol(), OP_SELL, 0.01, Bid, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                           FileClose(handle3); // закрытие текстового файла
                        }
                       else
                       Print("NE USPESHNO!!!");
                       FileClose(handle3); // закрытие текстового файла

   }
//=================================конец кода SELL=========================================
      
      
      
      
      
//=================================ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ=========================================
    int handle4 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle4=0)//если в текстовом файле равно 0, то закрыть все ордера
   {
      
       Print(FileReadString(handle4));
       FileClose(handle4); // закрытие текстового файла
//-----------------код закрывает все ордера--------------------
   bool   result;
   int    error;

 while (OrdersTotal()>0)
 {
   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {   if(OrderType()==OP_BUY)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
           OrderDelete(OrderTicket());
          
           if(result!=TRUE) { error=GetLastError();
              Print("LastError = ",error, " ",Symbol()); }
           else error=0; }
   else Print( "Error when order select ", GetLastError());
         
         FileClose(handle4); // закрытие текстового файла
  }
//------------конец кода закрывающего ордера------------------
 

         FileClose(handle4); // закрытие текстового файла
      
      
   }
//=================================конец кода ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ=========================================


 
Санек:

Guten Tag, ich brauche ein wenig Hilfe mit dem Code, der:

öffnet BUY, wenn die Datei 11112222.txt 1 enthält;

öffnet SELL, wenn die Datei 11112222.txt -1 enthält;

Schließt alle Aufträge, wenn die Datei 11112222.txt 0 enthält;


Es gibt die Datei 11112222.txt, die nur drei Einträge haben darf: 1, -1 oder 0.


Aus irgendeinem Grund, wenn 0 in der Datei 11112222.txt steht, wird eine BUY-Order geöffnet, während ein Close-Order-Code ausgelöst werden sollte; ich verstehe nicht, was der Fehler ist.

Also, es gibt auch ein Problem, wenn der EA läuft, ist es fast immer unmöglich, 11112222.txt zu öffnen, weil es sagt, dass die Datei mit einer anderen Anwendung beschäftigt ist. Ich setze FileClose(handle2); // Close text file; aber es funktioniert nicht und ich brauche den EA, um die Datei 11112222.txt für 1, -1 oder 0 zu überprüfen und zu schließen, weil jede Sekunde ein anderes Programm diese Datei verwendet, um 1, -1 oder 0 in sie zu setzen.

Denn der Dateihandle ist nicht der Inhalt der Datei.

Sie müssen zuerst den Inhalt der Datei lesen und erst dann die Bedingung festlegen. Andersherum ist es so, dass Sie eine Bedingung per Handle haben, dann die Datei lesen und sie schließen.

 
Alexey Viktorov:

Denn der Handle der Datei ist nicht der Inhalt der Datei.

Sie müssen zuerst den Inhalt der Datei lesen und erst dann die Bedingung eingeben. In Ihrem Fall ist es umgekehrt, Bedingung durch Handle, dann lesen Datei und schließen Sie es.

1) - Dieser Teil öffnet die Datei 11112222.txt, um Daten aus ihr zu lesen:

//=================================BUY=========================================
    int handle2 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения

2) - Als nächstes kommt die Bedingung if handle2>0


  if(handle2>0) // если в файле больше 0, то есть 1, то открывать BUY
   {

3) - Das ist der Teil, den ich nicht verstehe:


       Print(FileReadString(handle2));

4) - Mit diesem Teil wird die Datei geschlossen:


       FileClose(handle2); // закрытие текстового файла

5) - Da die Bedingung handle2>0 erfüllt ist, d.h. die Datei 11112222.txt enthält 1, wird ein Kaufauftrag eröffnet:

  //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ      
                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на покупку
                     {
                        OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                        FileClose(handle2); // закрытие текстового файла
                     }
                    else
                      Print("NE USPESHNO!!!");
                      FileClose(handle2); // закрытие текстового файла

   }
//=================================конец кода BUY=========================================

Welche Teile habe ich verwechselt?
 

Ich grüße Sie und versuche, ein Skript zum Schließen von Aufträgen zu schreiben.

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{  
   bool reasult;
   for (int i = OrdersTotal()-1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS)>0)
      {
         if (OrderSymbol() != Symbol())
            continue;
         
         switch (OrderType())
         {
            case OP_BUY  :
               reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
               if (!reasult) Print ("Ошибка закрытия ордера на покупку", GetLastError());
               break;
            case OP_SELL :
               reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
               if (!reasult) Print ("Ошибка закрытия ордера на продажу", GetLastError());
               break;
         }   
         
      }
   }
}

Wenn ich mehrere Verkaufs- und Kaufaufträge abwechselnd eröffne und versuche, sie mit diesem Auftrag zu schließen, werden nur einige wenige geschlossen, der Rest erhält den Fehler 129 (Falscher Preis).

Ich habe versucht, ein Skript zu erstellen, das z.B. 10 Versuche * für die Anzahl der Aufträge macht, mit Pause im Falle eines Fehlers.

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{ 
   int c=CountTrades()*10;
   
   for ( int a=1 ; a<=c; a++)
   {
   if (CountTrades()==0) { Print ("Orders are successfully closed! Break."); break;}
    Print("Try ", a, " out of ", c);
      
      bool reasult;
      for (int i = OrdersTotal()-1; i >= 0; i--)
      {
         if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if (OrderSymbol() == Symbol()) 
            
            {      
            
            if (OrderType() == OP_BUY)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
                  if (!reasult) {Print ("ERROR ", GetLastError());} 
                  }
            if (OrderType() == OP_SELL)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
                  if (!reasult) {Print ("ERROR ", GetLastError());}  
                  }              
            }   
            
         }
      }Sleep(1000);
   }   
}
//+------------------------------------------------------------------+
int CountTrades()
{
    int count=0;
    for (int i=OrdersTotal()-1; i>=0; i--)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
           if (OrderSymbol() == Symbol())
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                 count++;
        }
    }
    
    return(count);
}

In der Regel bewältigt er seine Aufgabe erst nach einer ganzen Reihe von Versuchen, bei denen immer derselbe 129-Fehler ausgegeben wird. Aber während es versucht, mit vielen Versuchen, um Aufträge zu schließen, kann manuell geschlossen werden, und dies nicht zu Fehlern führen, schließen sie.

Was mache ich falsch?

 
Andrey Sokolov:

Ich grüße Sie und versuche, ein Skript zum Schließen von Aufträgen zu schreiben.

Wenn ich mehrere Verkaufs- und Kaufaufträge abwechselnd eröffne und versuche, sie mit diesem Auftrag zu schließen, werden nur einige wenige geschlossen, der Rest erhält den Fehler 129 (Falscher Preis).

Ich habe versucht, ein Skript zu erstellen, das z. B. 10 Versuche * je nach Anzahl der Aufträge unternimmt, mit einer Pause im Falle eines Fehlers.

Er bewältigt seine Aufgabe in der Regel erst nach einer ganzen Reihe von Versuchen, bei denen derselbe 129 Fehler ausgegeben wird. Aber während es versucht, mit vielen Versuchen, um Aufträge zu schließen, kann manuell geschlossen werden, und dies nicht zu Fehlern führen, schließen sie.

Was mache ich falsch?

            RefreshRates(); // Попробуйте добавить
            if (OrderType() == OP_BUY)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
                  if (!reasult) {Print ("ERROR ", GetLastError());} 
                  }
            if (OrderType() == OP_SELL)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
                  if (!reasult) {Print ("ERROR ", GetLastError());}  
                  }  

Im Allgemeinen ist das, was Sie schreiben, nicht für den Handel auf einem echten Konto zugelassen, sondern nur für einen Tester.

 
Vitaly Muzichenko:

Im Allgemeinen sollte das, was Sie schreiben, nicht auf einem echten Konto gehandelt werden dürfen, es ist nur für den Tester gedacht.

            RefreshRates(); // Попробуйте добавить

Das hilft, danke.

 
Vitaly Muzichenko:

Im Allgemeinen darf das, was Sie schreiben, nicht auf einem echten Konto gehandelt werden, es ist nur für einen Tester gedacht.


Können Sie näher erläutern, warum es "nicht erlaubt ist, zu handeln..."?

 
Andrey Sokolov:

Können Sie näher erläutern, warum "kein Handel erlaubt" ist?

Es gibt keine Überprüfung auf Fehler, und wenn der Server geschlossen wird und einen kritischen Fehler erzeugt, wird der Expert Advisor weiterhin auf den Server einschlagen, und das riecht nach einem Verbot für weiteres automatisches Handeln.

Grund der Beschwerde: