Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 85

 
deathmond1990:
Hallo. Die Frage ist: Können wir die Werte der Ticks (die entsprechenden Preise) für eine bestimmte Handelsperiode (d.h. für eine einzelne Kerze) in ein eindimensionales Array laden? Und zwar so, dass das Feld während der Entstehung einer Kerze gebildet wird. Ist das in MQL4 realistisch? Ich würde mich über Ihr Feedback freuen.


Sie ist real. Eine dynamische Anordnung und los.

//-----------------------+
int k=0;       //на глобальном уровне
double тики[];
//----------------
void OnTick()
  {
   ArrayResize(тики,k+1);
   тики[k]=Bid;
   k++;
  }
//+------------------------
 
Alekseu Fedotov:


Realistisch. Eine dynamische Anordnung und los geht's.

Herzlichen Dank =)
 
Seien Sie gegrüßt, meine Herren! Ich möchte nicht, dass dies wie eine Überschwemmung klingt, aber ich kann auf diese Funktion nicht verzichten. Also Leute, kann mir jemand mit dieser Funktion helfen, die alle Aufträge durchgeht und zwei Aufträge gleichzeitig löscht, den mit dem kleinsten Lot und negativem Gewinn, und den mit dem größten Lot und positivem Gewinn.
 
Arseniy Barudkin:
Seien Sie gegrüßt, meine Herren! Ich möchte nicht, dass dies wie eine Überschwemmung klingt, aber ich kann auf diese Funktion nicht verzichten. Also Leute, kann mir jemand mit dieser Funktion helfen, die alle Aufträge durchgeht und zwei Aufträge gleichzeitig löscht, den mit dem kleinsten Lot und negativem Gewinn, und den mit dem größten Lot und positivem Gewinn, auch aus bestehenden Aufträgen.

Versuchen Sie die Suche nachOrderCloseBy
 

Wie kann man erreichen, dass die Daten aller globalen Variablen auch nach dem Schließen des Terminals im normalen und abnormalen Modus gespeichert werden?

Die Frage betrifft Variablen, die am Anfang des Codes wie folgt deklariert werden:

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

extern double  VAR1 = 1;

double VAR2[1000];

Ich möchte nicht, dass die Werte von VAR1 und VAR2 verloren gehen (das Array wird während des Expert Advisor-Betriebs mit Daten gefüllt). Bisher besteht die einzige Idee darin, bei jedem Tick Daten in eine Datei (global.txt) zu schreiben und dann, wenn das Terminal gestartet wird, aus der Datei (global.txt) zu lesen und die Variablen neu zu erstellen und sie dann bei jedem Tick erneut zu schreiben. Welche anderen Möglichkeiten gibt es?

 
smart_man:

Wie kann sichergestellt werden, dass die Daten aller globalen Variablen auch dann erhalten bleiben, wenn das Client-Terminal im normalen oder abnormalen Modus geschlossen wird?

Die Frage betrifft Variablen, die wie folgt deklariert werden:

extern double  VAR1 = 1;

double VAR2[1000];

Ich möchte nicht, dass die Werte von VAR1 und VAR2 verloren gehen (das Array wird während des Expert Advisor-Betriebs mit Daten gefüllt). Bisher besteht die einzige Idee darin, bei jedem Tick Daten in eine Datei (global.txt) zu schreiben und dann, wenn das Terminal gestartet wird, aus der Datei (global.txt) zu lesen und die Variablen neu zu erstellen und sie dann bei jedem Tick erneut zu schreiben. Welche anderen Varianten gibt es?

Option

Globale Variablen des Client-Terminals

//--------

Nicht zu verwechseln mit global deklarierten Variablen

 
fxtz:

Frage Kann ich ein Programm in Metatrader 4 schreiben, um 2 bis 250 Positionen meiner Wahl mit einem festgelegten Stoploss und einem festgelegten Gewinn mit einem Klick zu öffnen? Ich muss sie nicht manuell öffnen


Haben Sie eine Brokerfirma gefunden, bei der Sie so viele Aufträge für ein Instrument eröffnen können? Normalerweise sind 100 Aufträge eine Grenze für alle Instrumente...

Und ja, ich könnte 100 öffnen.

 
Alekseu Fedotov:

Versuchen Sie die Suche nachOrderCloseBy

Ich danke Ihnen! Aber ich muss die Tickets dieser Aufträge aus mindestens 3 Aufträgen auswählen, oft sind es mehr, von 5 bis 10 Aufträgen, muss ich die Lots und Gewinne dieser Aufträge separat berechnen und vergleichen?

 
Arseniy Barudkin: Wir müssen die Auftragskennungen auswählen, warum sollten wir also die Lose und Gewinne dieser Aufträge separat berechnen und vergleichen?

Die Situation ist viel schlimmer, als Sie sich vorstellen. Zu jedem Zeitpunkt ist nur eine Bestellung verfügbar, die mit OrderSelect() ausgewählt wurde. Und wenn die allererste Bestellung ausgewählt wird, womit sollen wir sie vergleichen? Die schlauen Jungs machen das wirklich so

double МинПрофит=1000000, МаксПрофит=-1000000;
int МаксТикет=0, МинТикет=0;
for(int Номер=OrdersTotal-1; Номер>=0; Номер--)
{
   if(!OrderSelect(Номер,SELECT_BY_POS)) continue;
   if(OrderProfit()>МаксПрофит)
   {
      МаксТикет=OrderTicket();
      МаксПрофит=OrderProfit();
   }
   else if(OrderProfit()<МинПрофит)
   {
      МинТикет=OrderTicket();
      МинПрофит=OrderProfit();
   }
 }
Dann schauen Sie sich den Wert der gefundenen Tickets an - plötzlich ist er gleich Null!!!
 
STARIJ:

Die Situation ist viel schlimmer, als Sie sich vorstellen. Zu jedem Zeitpunkt ist nur eine Bestellung verfügbar, die mit OrderSelect() ausgewählt wurde. Und wenn die allererste Bestellung ausgewählt wird, womit sollen wir sie vergleichen? Die schlauen Jungs machen das wirklich so

Dann schauen Sie sich den Wert der gefundenen Tickets an - plötzlich ist er gleich Null!!!

Vielen Dank für die Hilfe! Bisher habe ich es so belassen, jetzt habe ich beschlossen, die Bedingungen, unter denen die Funktion aufgerufen wird, ein wenig zu ändern. Und ganz allgemein haben Sie mir sehr geholfen))
void MarginDefuse(double lot1=0,double lot2=0)
{
 int ticket1=0,ticket2=0,type=-1;
 double profit1=0,profit2=0;
 bool res1=false,res2=false;
 // Выделение
 for(int i=0; i<OrdersTotal(); i++)
 {
  if(!OrderSelect(i,SELECT_BY_POS)) continue; // Что-то помешало - идем к следующему
  if(OrderSymbol() != Symbol()) continue;          // Чужой график
  if(OrderType()<2 && OrderMagicNumber() == Magic)
  {
   if(OrderLots()>=lot1 && OrderProfit()<0)
   {
    ticket1=OrderTicket();
    lot1=OrderLots();
    type=OrderType();
    profit1=OrderProfit();
   }
  }
 }
 for(int i=OrdersTotal()-1; i>=0; i--)
 {
  if(!OrderSelect(i,SELECT_BY_POS)) continue; // Что-то помешало - идем к следующему
  if(OrderSymbol() != Symbol()) continue;          // Чужой график
  if(OrderType() != type && OrderType()<2 && OrderMagicNumber() == Magic)
  {
   if(OrderLots() >= lot2/Multipler && OrderProfit()>0 && OrderLots()>lot1)
   {
    ticket2 = OrderTicket();
    lot2 = OrderLots();
    profit2=OrderProfit();
   }
  }
 }
 if((profit1+profit2)>0 && lot1<lot2)
 {
  while (!RefreshRates());
  if(ticket1)
  {
   if(OrderSelect(ticket1,SELECT_BY_TICKET))
   res1=OrderCloseX(ticket1,lot1);
  }
  if(ticket2)
  {
   if(OrderSelect(ticket2,SELECT_BY_TICKET))
   res2=OrderCloseX(ticket2,lot2);
  }
  if(res1 && res2)
   DeletePos();
 }
}