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

 
In mt5, wenn Sie auf echte Ticks testen, zählt die Kommission dort, oder nur der Spread?
 

Der Multiwährungsexperte in der Schleife fragt die Daten nach Symbolen ab. Es gibt ein solches Fragment:

      int gtc1 = GetTickCount();
      res_copy_buf = CopyBuffer(handle, 0, 0, bars_calc, Buf_01); 
      int gtc2 = GetTickCount();

Alle Symbole gehen normal durch. Während des ersten Durchlaufs beträgt die Zeit etwa 120 ms, da die Indikatorpuffer gefüllt werden. Ab dem zweiten Durchlauf ist die Berechnungszeit für den aktuellen Balken kleiner als 1 ms.

Eine Besonderheit ist, dass ein bekannter Broker das Symbol EURRUR hat, für das es keine Daten gibt ("Warten auf Aktualisierung"). Daher bleibt die Berechnung 51 Sekunden lang in dieser Zeile stecken. Fehler 4806. 51 Sekunden sind nicht einmal für ein (erstes) Mal akzeptabel, geschweige denn für einen ganzen Zyklus.

Frage. Wie kann ich schnell herausfinden, dass es für ein bestimmtes Zeichen keine Daten gibt? Ich würde sie dann auswendig lernen und bei den folgenden Durchläufen einfach über sie hinweggehen und weitermachen, ohne das Tempo zu verlieren.

 

Kolleginnen und Kollegen, bitte beraten Sie mich, wie man ein Array vom Typ double in string konvertiert. Ich muss sie in eine Datei schreiben. Hier ist ein allgemeiner Ausbildungscode.

void OnStart()
{

double ar[];               // Массив
ArrayResize(ar,2);         // Подготовка массива
int i, Size=ArraySize(ar); // стартовое количество элементов

ar[0]=1;                   // Установка значений 2-х элементов массива
ar[1]=2; 

ArrayResize(ar,3); // Увеличение размера массива
ar[2]=3;           // Установка значения новому элементу массива
ArrayResize(ar,4); // Увеличение размера массива
ar[3]=4;           // Установка значения новому элементу массива
ArrayResize(ar,5); // Увеличение размера массива
ar[4]=5;           // Установка значения новому элементу массива
ArrayResize(ar,6); // Увеличение размера массива
ar[5]=6;           // Установка значения новому элементу массив
ArrayResize(ar,7); // Увеличение размера массива
ar[6]=7;           // Установка значения новому элементу массив
Size=ArraySize(ar);// новое количество элементов
ArraySetAsSeries(ar,true); // Смена направления индексации


//--- запись в файл


SaveArrayToFile ("s_ar", ar);
return;
}


bool SaveArrayToFile(string FileName, string  &Array[])
  {
//--- Открытие файла
   int h=FileOpen(FileName,FILE_WRITE|FILE_ANSI|FILE_TXT);
   if(h==-1){Alert(" ошибка открытия файла в ф-ии "); return(false);} // Ошибка открытия файла
   
//--- Запись в файл
   FileWriteInteger(h,ArraySize(Array),INT_VALUE); // Запись размера массива
   FileWriteArray(h,Array); // Запись массива
//--- Закрытие файла
   FileClose(h);
   return(true); // Сохранение выполнено
 

Informationen aus dem Artikel

Speichern und Laden von Arrays aus einer Datei

Beim Speichern und Laden eines Arrays aus einer Datei sollte die Differenz zwischen der ersten Dimension der Array-Größe und der Gesamtzahl seiner Elemente berücksichtigt werden. Wenn Sie ein Array speichern, sollten Sie zuerst die Größe des Arrays (die Gesamtzahl der Elemente, die durch ArraySize() bestimmt wird) in die Datei schreiben, dann das gesamte Array:

bool SaveArrayToFile(string FileName,string &Array[])
  {
//--- Открытие файла
   int h=FileOpen(FileName,FILE_TXT|FILE_WRITE);
   if(h==-1) return(false); // Ошибка открытия файла
//--- Запись в файл
   FileWriteInteger(h,ArraySize(Array),INT_VALUE); // Запись размера массива
   FileWriteArray(h,Array); // Запись массива
//--- Закрытие файла
   FileClose(h);
   return(true); // Сохранение выполнено
  }
 

Hallo, ich stehe vor folgendem Problem.

Ich habe zwei EAs für dasselbe Instrument mit jeweils unterschiedlichen Magics. Ich stelle meine Magie über CTrade ein und eröffne eine Position ebenfalls über CTrade. Wenn ich eine offene Position des ersten EA habe, ist seine Magie dem zweiten EA zugewiesen (ich habe es nach dem Öffnen einer Position überprüft, siehe unten), so dass die Prüfung auf offene Positionen meine Magie nicht sieht und ich viele Positionen in eine Richtung öffne. Das Konto ist ein Demokonto, dies kann im Tester nicht erkannt werden. Wenn der Wert der Magie in der Klasse gespeichert wird, sollte er vielleicht auf Null gesetzt werden, aber ich weiß nicht, wie.

int OnInit()
  {    
  // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
   return(INIT_SUCCEEDED);
}
открываю позицию соответственно тоже через CTrade:
 if(SellCount()>0 || BuyCount()>0)
           {
            Print("Уже есть позиция на продажу !!!");
            return; // не добавлять к открытой позиции на покупку
           }
         SL=NormalizeDouble(latest_price.bid + STP*_Point,_Digits);
         TP=NormalizeDouble(latest_price.bid - TKP*_Point,_Digits);
         
         m_trade.Sell(lots1,_Symbol,0,SL,TP,"LaquerreOSC_MA_2.5.6.7 + 2");
         m_position.Select(_Symbol);
           {
            ulong myMagic=m_position.Magic();
            Print(" Открыта поза Селл с магиком № ",myMagic,", И спредом ",SymbolInfoInteger(_Symbol,SYMBOL_SPREAD));
           }
//+------------------------------------------------------------------+
int SellCount()//проверка рыночных ордеров на продажу
  {
   int count=0;
   for(int i=PositionsTotal()-1; i>=0;i--)
     {
      if(PositionSelect(_Symbol)==true)
        {
         if(PositionGetInteger(POSITION_MAGIC)==Magic && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
            count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+

 
Pavel Nikiforov:

Hallo, ich stehe vor folgendem Problem.

Ich habe zwei EAs für dasselbe Instrument mit jeweils unterschiedlichen Magics. Ich stelle meine Magie über CTrade ein und eröffne eine Position ebenfalls über CTrade. Wenn ich eine offene Position des ersten EA habe, ist seine Magie dem zweiten EA zugewiesen (ich habe es nach dem Öffnen einer Position überprüft, siehe unten), so dass die Prüfung auf offene Positionen meine Magie nicht sieht und ich viele Positionen in eine Richtung öffne. Das Konto ist ein Demokonto, dies kann im Tester nicht erkannt werden. Wenn der Wert der Magie in der Klasse gespeichert ist, muss er vielleicht auf Null gesetzt werden, aber ich weiß nicht, wie.

Bittefügen Sie den Code korrektein, nicht als Textblatt.


Was den Code betrifft: Setzen Sie die Eingabeparameter für jeden EA mit seiner eigenen Magie. Nehmen wir an, Sie setzen den ersten auf 10001 und den zweiten auf 10002.

 
Vladimir Karputov:

Bittefügen Sie den Code korrektein, nicht als Textblatt.


Wie für den Code: Setzen Sie die Eingabeparameter für jeden EA mit seiner eigenen Magie. Angenommen, Sie setzen die erste auf 10001 und die zweite auf 10002.

Vielen Dank für diese kurze Antwort. Aber genau das ist der Punkt, die Magie ist anders. Ich habe also festgestellt, dass der zweite Roboter die Positionen mit dem ersten Magier öffnet. Ich weiß nicht, wie das geschieht und wo er die magische Zahl des ersten EA speichert, aber ich würde es gerne herausfinden.

 
Pavel Nikiforov:

Vielen Dank für die schnelle Antwort. Aber das ist die Sache, die Magier sind anders. So habe ich herausgefunden, dass der zweite Roboter Positionen mit der magischen Zahl des ersten eröffnet. Ich weiß nicht, wie es passiert und wo er die erste Zauberernummer speichert, aber ich würde es gerne herausfinden.

In diesem Fall ist es besser, die Magie

  // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
vor jeder Öffnung von Position/Order statt in OnInit.
 
Alexey Viktorov:

In diesem Fall ist es besser, eine Magie anzugeben

vor jedem Öffnen der Position, nicht in OnInit.

In diesem Fall ist es nicht "besser", sondern genau das, was Sie brauchen - es ist eine Wrapper-Klasse für Standard-Handelsfunktionen. Er speichert keine Mehrfachmagie. Deshalb sollte jedes Mal eine Magie gesetzt werden, bevor und wenn man eine Position mit einer neuen Magie eröffnen will.

Im Allgemeinen ist die Reihenfolge wie folgt:

  • Positionen sollten mit Magie 1 eröffnet werden - wir setzen Magie 1 und nachfolgende Positionen werden Magie 1 haben,
  • ist es notwendig, Positionen mit einem Magier 2 zu eröffnen - wir richten Magier 2 ein und alle folgenden Positionen werden einen Magier 2 haben,
  • es ist notwendig, Positionen mit magischer 3 zu eröffnen - wir werden magische 3 einrichten und jede nächste Position wird magische 3 haben,

usw...

 
Alexey Viktorov:

In diesem Fall ist es besser, eine Magie zu setzen

Vor jeder Eröffnung einer Position/eines Auftrags und nicht bei OnInit.

Ursprünglich war es so, es hilft nicht. Aber in den Beispielen ist es normalerweise in OnInit und hat sich daher verschoben. Lange Zeit habe ich damit herumgespielt, Eulen im Test scheinen reibungslos zu laufen, dann öffne ich plötzlich den Server und es gibt 20 Positionen in eine Richtung. Kann die Tatsache, dass die Überprüfung für offene Stellen ist nicht durch Klassen?

 
Pavel Nikiforov:

Vielen Dank für die schnelle Antwort. Aber das ist die Sache, die Magier sind anders. So habe ich herausgefunden, dass der zweite Roboter Positionen mit der magischen Zahl des ersten eröffnet. Ich weiß nicht, wie das passiert und wo er die magische Zahl von EA zuerst speichert, aber ich will es herausfinden.

Da es keineGetExpertMagicNumber-Methode in der CTrade-Klasse gibt, drucken Sie bitte diesen Code nach der Handelsoperation aus:

Print("Expert name: ",__FILE__,", magic: ",IntegerToString(m_trade.RequestMagic());

Auf diese Weise können Sie überprüfen, ob beide EAs unterschiedliche Magie haben.

Grund der Beschwerde: