[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 718

 
Roger:
Sie lesen die Datei Zeile für Zeile und weisen Ihren Variablen jedes Mal Werte zu. Wenn die Datei endet, haben die Variablen die letzten Werte.

Wie kann man das umsetzen?

Ich kann nicht herausfinden, was ich verwenden soll

 
zheleznii:

Wie kann man das umsetzen?

Ich weiß nicht, was ich verwenden soll


Darüber wurde bereits viel geschrieben und umgeschrieben, versuchen Sie es unter https://www.mql5.com/ru/forum/118349
 

Nochmals gute Nacht! Ich habe vor kurzem begonnen, einen EA für mehrere Währungen zu schreiben, der Aufträge für ein Währungspaar und Aufträge für ein anderes Währungspaar öffnet.

Ich habe den nächstgelegenen Trailing-Stop aus dem EA herausgerissen und angefangen, damit zu spielen, aber es hat nicht funktioniert. Hier ist der Code:

// ну так сообственно вызываю функцию - TrailingStop();
//вот что в функции
 void TrailingStop()
{ 
   if (TrailingStop<MinStop) return; 
   int ask, bid, open, stop, level; 
   for (int i=0; i<OrdersTotal(); i++) 
      { 
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; 
      if (OrderSymbol()!=Symbol()) continue; 
      if (OrderType()==OP_BUY) 
         { 
         bid=MathRound(Bid/Point); 
         open=MathRound(OrderOpenPrice()/Point); 
         stop=MathRound(OrderStopLoss()/Point); 
         level=bid-TrailingStop; 
         if (level<open || level>bid-MinStop) continue; 
         if (stop>0 && stop>=level) continue; 
         OrderModify(OrderTicket(),OrderOpenPrice(),level*Point,OrderTakeProfit(),0,White); 
         Print("трал сдвинут");
         //ShowError(); 
         } 
      if (OrderType()==OP_SELL) 
         { 
         ask=MathRound(Ask/Point); 
         open=MathRound(OrderOpenPrice()/Point); 
         stop=MathRound(OrderStopLoss()/Point); 
         level=ask+TrailingStop; 
         if (level>open || level<ask+MinStop) continue; 
         if (stop>0 && stop<=level) continue; 
         OrderModify(OrderTicket(),OrderOpenPrice(),level*Point,OrderTakeProfit(),0,White); 
         //ShowError(); 
         Print("трал сдвинут");
         } 
      } 
}

Ich kann mir das nicht erklären. Da es sich bei dem Expert Advisor um einen Multiwährungs-Expert Advisor handelt, eröffnet er Aufträge für Währungen auf unvorhersehbare Weise und eröffnet sie manchmal im selben Moment für mehrere Währungen.

Im nachfolgenden Code berechne ich die offenen Aufträge für(int i=0; i<OrdersTotal(); i++) und weiter geht die Auftragsauswahl OrderSelect usw. Ich verstehe, dass jeder offene Auftrag für ein bestimmtes Währungspaar die Daten Bid, Ask usw. benötigt. Aber hier möchte ich herausfinden, welche Daten heruntergeladen werden sollen und wie ich einen Auftrag für Änderungen auswählen werde? Ich habe nur eine Variante im Kopf, die schlechteste ist, für jede Währung einen Trailing-Stop zu schreiben.

 
Infinity:

Nochmals gute Nacht! Ich habe vor kurzem begonnen, einen EA für mehrere Währungen zu schreiben, der Aufträge für ein Währungspaar und Aufträge für ein anderes Währungspaar öffnet.

Ich habe den nächstgelegenen Trailing-Stop aus dem EA herausgerissen und angefangen, damit zu spielen, aber es hat nicht funktioniert. Hier ist der Code:

Ich kann mir das nicht erklären. Da es sich bei dem Expert Advisor um einen Multiwährungs-Expert Advisor handelt, eröffnet er Aufträge für Währungen auf unvorhersehbare Weise und eröffnet sie manchmal im selben Moment für mehrere Währungen.

Im nachfolgenden Code berechne ich die offenen Aufträge für(int i=0; i<OrdersTotal(); i++) und weiter geht die Auftragsauswahl OrderSelect usw. Ich verstehe, dass jeder offene Auftrag für ein bestimmtes Währungspaar die Daten Bid, Ask usw. benötigt. Aber hier möchte ich herausfinden, welche Daten heruntergeladen werden sollen und wie ich einen Auftrag für Änderungen auswählen werde? Ich habe nur eine Variante im Kopf, die schlechteste ist, für jede Währung einen Trailing-Stop zu schreiben.

Versuchen Sie, ein Werkzeugsymbol in den Schleppnetzcode einzufügen. Dann rufen Sie für jedes Paar das Schleppnetz auf.
void TrailingStop(string sy)

if (sy == "" || sy == "0") sy = Symbol();
Nun, und auf der Grundlage des Sy-Wertes weisen Sie den spezifischen Symboldaten andere Werte zu... Dasselbe fragen Sie zum Beispiel bei Bid...
 

Infinity:

Ich verstehe die Technologie nicht ganz, wie sie funktionieren wird.


 
Roger:

Es wurde bereits viel darüber geschrieben und umgeschrieben - versuchen Sie es unter https://www.mql5.com/ru/forum/118349.

int a1;

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
FileWrite(handle,a1);

FileClose(handle);

In der Datei a1=5;

Ich verstehe die Grundlagen nicht.

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
hier wird a1 der Wert 5 zugewiesen

FileClose(handle);

sehr notwendig

 
Infinity:
Weisen Sie den Variablen im Schleppnetzcode Werte zu, die auf den Daten des an die Funktion übergebenen Paares basieren. Sie müssen den Schleppnetzcode fertigstellen... Zum Beispiel sollte die Variable Bid nicht nur deklariert werden,

aber mit einem zugewiesenen Wert deklariert:

int ask = MarketInfo(sy, MODE_ASK), bid=MarketInfo(sy, MODE_BID), open, stop, level;

Dementsprechend

bid=MathRound(Bid/Point);

sollte schon anders geschrieben werden, zum Beispiel:

bid=MathRound(MarketInfo(sy, MODE_BID)/Point);

Oder erstellen Sie eine weitere Variable, z. B. PriceBid, und schreiben Sie

PriceBid=MathRound(Bid/Point);

und dann PriceBid anstelle von Bid im Code verwenden...

Sehen Sie Ihren gesamten Code durch und verwenden Sie gegebenenfalls Variablen für ein bestimmtes Symbol.
Und dieses Symbol übergeben Sie der Schleppnetzfunktion, wenn Sie sie aufrufen:

 TrailingStop( EURUSD);     // Тралим ЕвроБаксы
 TrailingStop("");         // Тралим символ графика

oder

TrailingStop(NULL);         // Тралим символ графика

Ist es deutlicher?

 
artmedia70:
Weisen Sie den Variablen im Schleppnetzcode Werte zu, die auf den Daten des an die Funktion übergebenen Paares basieren. Sie müssen den Schleppnetzcode fertigstellen... Zum Beispiel sollte die Variable Bid nicht nur deklariert werden,

aber mit einem zugewiesenen Wert deklariert:

Dementsprechend

sollte schon anders geschrieben werden, zum Beispiel:

Oder erstellen Sie eine weitere Variable, z. B. PriceBid, und schreiben Sie

und dann PriceBid anstelle von Bid im Code verwenden...

Gehen Sie Ihren gesamten Code durch und verwenden Sie das Abrufen von Variablenwerten für ein bestimmtes Symbol, wo dies erforderlich ist.
Und dieses Symbol übergeben Sie der Schleppnetzfunktion, wenn Sie sie aufrufen:

oder

Ist es deutlicher?





Das Einzige, was ich nicht verstehe, ist, welches Währungspaar zu welchem Zeitpunkt an mich gesendet werden soll. Ich weiß nicht, woher ich die Information bekomme, dass z.B. 4 Aufträge für diese Paare offen sind und dass diese Paare an mich gesendet werden sollen.

Ich weiß nicht, ob ich es richtig mache oder nicht... jedenfalls ....

в блоке start  определяю открытые ордера и определяю по каким парам они открыты
 for (int i=0; i<OrdersTotal(); i++) 
      { 
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; 
      if (OrderSymbol()=="EURUSD") {sy="EURUSD";MinStop=MarketInfo(sy,MODE_STOPLEVEL); break; }
      if (OrderSymbol()=="GBPUSD") {sy="GBPUSD";MinStop=MarketInfo(sy,MODE_STOPLEVEL); break; }
       
      } 
  TrailingStop(sy);

а в функции делаю следующее

void TrailingStop(string sy)
{ 
   if (TrailingStop<MinStop) return; 
   int ask, bid, open, stop, level,point; 
   for (int i=0; i<OrdersTotal(); i++) 
      { 
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; 
      if (OrderSymbol()==sy)  
      bid=MarketInfo(sy,MODE_BID);
      ask=MarketInfo(sy,MODE_ASK);
      point=MarketInfo(sy,MODE_POINT);
      if (OrderType()==OP_BUY) 
         { 
         bid=MathRound(bid/point); 
         open=MathRound(OrderOpenPrice()/point); 
         stop=MathRound(OrderStopLoss()/point); 
         level=bid-TrailingStop; 
         if (level<open || level>bid-MinStop) continue; 
         if (stop>0 && stop>=level) continue; 
         OrderModify(OrderTicket(),OrderOpenPrice(),level*point,OrderTakeProfit(),0,White); 
         Print("трал сдвинут");
         //ShowError(); 
         } 
      if (OrderType()==OP_SELL) 
         { 
         ask=MathRound(ask/point); 
         open=MathRound(OrderOpenPrice()/point); 
         stop=MathRound(OrderStopLoss()/point); 
         level=ask+TrailingStop; 
         if (level>open || level<ask+MinStop) continue; 
         if (stop>0 && stop<=level) continue; 
         OrderModify(OrderTicket(),OrderOpenPrice(),level*point,OrderTakeProfit(),0,White); 
         //ShowError(); 
         Print("трал сдвинут");
         } 
      } 
}

Aber aus irgendeinem Grund bekam ich einen Fehler EURUSD: Null dividieren - dieser Fehler wahrscheinlich irgendwo in der Variable 0, wahrscheinlich während einer Split-Typ Betrieb bedeutet. Versuche ich überhaupt, es richtig umzusetzen?

 
zheleznii:

int a1;

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
FileWrite(handle,a1);

FileClose(handle);
In der Datei a1=5;

Missverständnis in den Grundlagen. Bitte erläutern Sie - durch Ausfüllen des vorgeschlagenen

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
hier weisen wir a1 den Wert 5 zu

FileClose(handle);

Ich brauche es wirklich.

Also, der Reihe nach.

Wenn nur die neuesten Daten benötigt werden, warum dann die vorherigen speichern? ("vor dem Schreiben" tritt bei Kombination der Modi FILE_READ|FILE_WRITE auf).
Daher ist es logischer, den Modus FILE_CSV|FILE_WRITE zu verwenden, bei dem vorherige Datensätze gelöscht werden, bevor neue Daten geschrieben werden.

Beginnen wir mit dem Schreiben von 4 Variablen in die Datei.

//+------------------------------------------------------------------+
int start(){
   int handle;
   int a1 = 3;
   double punkt = 0.4;
   double nn = 1128;
   double mm = 1000;

   handle=FileOpen("a1.csv",FILE_CSV|FILE_WRITE,';');
   FileWrite(handle,a1,punkt,nn,mm);
   FileClose(handle);           
}
//+------------------------------------------------------------------+

Wichtig ist, dass Sie sich die Reihenfolge merken, in der die Variablen geschrieben werden, denn das ist die Reihenfolge, in der wir sie lesen werden.

Beginnen wir mit dem Einlesen der Daten in die Variablen aus der Datei.

//+------------------------------------------------------------------+
int start(){
   int handle;
   int a;
   double p;
   double n;
   double m;   
   handle=FileOpen("a1.csv",FILE_CSV|FILE_READ, ';');         
   
   a = FileReadNumber(handle);    //считываем первую цифру, соответствующую переменной a1 и далее по порядку...
   p = FileReadNumber(handle);    //punkt
   n = FileReadNumber(handle);    //nn
   m = FileReadNumber(handle);    //mm
   
   FileClose(handle);           
}
//+------------------------------------------------------------------+

Mit der Funktion FileReadNumber() lesen wir die Nummer nach der Nummer in der Reihenfolge, in der sie geschrieben wurden.
Das ist alles, nichts Kompliziertes :)

 
Infinity:


Das Einzige, was ich nicht verstehe, ist, welches Währungspaar zu welchem Zeitpunkt an mich gesendet werden soll. Woher bekomme ich die Information, dass z.B. 4 Aufträge auf diesen Paaren offen sind und dass diese Paare an mich gesendet werden sollen?

Ich weiß nicht, ob ich es richtig mache oder nicht ... jedenfalls ....

Aber ich habe EURUSD: Null-Division-Fehler. Anscheinend, dieser Fehler sagt, ich habe 0 in einer Variable irgendwo, wahrscheinlich, es ist eine Division Betrieb. Versuche ich überhaupt, es richtig umzusetzen?

Überprüfen Sie nach jeder Variablenzuweisung oder vor jeder Division, wo Sie eine Null erhalten, und beginnen Sie dann von dort aus.