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

 
Oder geben Sie an, wie Sie diese Löschfunktion in diese Bedingung schreiben können.
 
spoiltboy:
Oder sagen Sie mir, wie ich diese Löschfunktion unter dieser Bedingung schreiben kann.

müssen Sie zunächst das Ticket des zu löschenden Auftrages definieren

Wenn das Ticket null oder undefiniert ist, darf es nicht gelöscht werden.

 
spoiltboy:

Dies gilt für verschiedene Aufträge. Die Funktion des Entfernens des einen durch eine Bedingung, das Entfernen des anderen ohne eine Bedingung.

Die Frage ist, warum in meinem Fall die Löschfunktion ohne Bedingung erfolgreich funktioniert, aber wenn ich sie in eine Bedingung einfüge, erzeugt sie einen Fehler, wenn die Bedingung eintritt.

Die Bedingung muss korrigiert werden, Sie können es nicht ohne die Bedingung tun, die Protokolle werden die gesamte Festplatte einnehmen
 
Renat Akhtyamov:

müssen Sie zunächst das zu löschende ticketD und ticketUP definieren

Wenn das Ticket null oder undefiniert ist, wird es nicht gelöscht.

So definiert, ein TicketD, das andereTicketUP .

Oder verwechsle ich da etwas?

 
spoiltboy:

So definiert, ein TicketD, das andereTicketUP .

Oder bringe ich etwas durcheinander?

Wie kann es definiert werden, wennticketUP bereits gelöscht ist ?

Sie haben es gelöscht, aktualisieren Sie ticketUP auf den Zustand, den Sie benötigen, wobei die Bedingung zum Löschen von ticketUP nicht funktioniert, und diese Bedingung muss ebenfalls in den Code eingefügt werden

 
Renat Akhtyamov:

Wie kann sie definiert werden, wenndas TicketUP bereits gelöscht wurde?

Sie haben es gelöscht, aktualisieren Sie ticketUP auf den Zustand, den Sie benötigen, in dem die Bedingung zum Löschen des Tickets nicht funktioniert, und diese Bedingung muss ebenfalls zum Code hinzugefügt werden.

So werden die Aufträge mitticketD, einem anderenticketUP zuerst erstellt (entsprechend der Abwesenheitsbedingung), und danach werden sie bereits gelöscht.

if(BuyLimitCount()==0&& BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
int ticketUP=OrderSend(Symbol(),OP_BUYLIMIT, lotB, minpr1,3, slB, tpB,"", MagicB,0, Red);
if(ticketUP==-1)Print("ERROR OP_BUY"); elsePrint("OP_BUY OK");}

if(SellLimitCount()==0&& SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
int ticketD=OrderSend(Symbol(),OP_SELLLIMIT, lotS, maxpr1,3, slS, tpS,"", MagicS,0, Blue);
if(ticketD==-1)Print("ERROR OP_SELL"); elsePrint("OP_SELL OK");}

if(x!=maxpr1){x=maxpr1;OrderDelete(ticketD);}

OrderDelete(ticketUP);

Wenn ich verwirrt bin, was dann?

 
spoiltboy:

So werden Aufträge mitticketD, ein anderesticketUP zuerst erstellt (entsprechend der Abwesenheitsbedingung), und dann werden sie gelöscht.

if(BuyLimitCount()==0&& BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointsl*Point,5);
int ticketUP=OrderSend(Symbol(),OP_BUYLIMIT, lotB, minpr1,3, slB, tpB,"", MagicB,0, Red);
if(ticketUP==-1)Print("ERROR OP_BUY"); elsePrint("OP_BUY OK");}

if(SellLimitCount()==0&& SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1+pointsl*Point,5);
int ticketD=OrderSend(Symbol(),OP_SELLLIMIT, lotS, maxpr1,3, slS, tpS,"", MagicS,0, Blue);
if(ticketD==-1)Print("ERROR OP_SELL"); elsePrint("OP_SELL OK");}

if(x!=maxpr1){x=maxpr1;OrderDelete(ticketD);}

OrderDelete(ticketUP);

Wenn ich was verwechsle?

Wieder haben Sie einen Befehl ohne Bedingung:

OrderDelete(ticketUP);

Warum haben Sie den Code nicht geändert?

Nehmen Sie sich eine Auszeit, um zumindest "nachzudenken" und alles zu sortieren + lesen Sie, was Sie geschrieben haben, welche Ratschläge gegeben wurden.

Übrigens, hier gibt es Freelancer , wenn Sie nicht...

 
Renat Akhtyamov:

Sie haben also wieder einen Befehl ohne Bedingung:

OrderDelete(ticketUP);

Warum haben Sie den Code nicht geändert?

Nehmen Sie sich eine Auszeit, um zumindest "nachzudenken" und es herauszufinden + lesen Sie, was Ihnen geschrieben wurde, welche Ratschläge Ihnen gegeben wurden.

Übrigens, wenn es nicht klappt, kann man hier freiberuflich arbeiten ...

Ohne Bedingung - denn so erfolgt die Entfernung, und mit Bedingung - nein. Also schrieb ich, um anzuzeigen, dass ich nicht kann. Sie können es so schreiben:

OrderDelete(ticketD);

OrderDelete(ticketUP);

Dann werden bei jedem Tick die bereits erstellten Aufträge gelöscht (gemäß der Abwesenheitsbedingung). Und wenn wir es mit der Bedingung schreiben:

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}

Wenn dann die Bedingung eintritt, wird ein Löschfehler geschrieben.

Wie schreibe ich die Löschung der angegebenen Aufträge in diese Bedingung?

 
spoiltboy:

Ohne Bedingung, weil die Löschung so funktioniert, mit Bedingung nicht. Ich habe es so geschrieben, um darauf hinzuweisen, was ich nicht tun kann. Wenn Sie es so schreiben:

OrderDelete(ticketD);

OrderDelete(ticketUP);

Dann werden bei jedem Tick die bereits erstellten Aufträge gelöscht (gemäß der Abwesenheitsbedingung). Und wenn wir es mit der Bedingung schreiben:

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}

Wenn dann die Bedingung eintritt, wird ein Löschfehler geschrieben.

Wie sollte die Bedingung für die Löschung der angegebenen Aufträge formuliert werden?


Sie können die Bedingung zum Löschen von Aufträgen nicht entfernen!

ticketUP und ticketD sollten beim Öffnen eines Tickets in die globalen Variablen geschrieben werden

GlobalVariableSet("ticketUP",ticketUP);

GlobalVariableSet("ticketD",ticketD);

und lesen Sie dort nach, bevor Sie ein schwebendes Ticket löschen

ticketUP=GlobalVariableGet("ticketUP")

ticketD=GlobalVariableGet("ticketD")

Übrigens, sehen Sie dort (in global) - was Sie haben, was Ticket geschrieben ist

Ich denke, dass danach alles so funktionieren wird, wie es sollte.

 
Hallo! Wer kann helfen, das Problem zu lösen, ich schreibe eine Viper für ein dynamisches Array, hier ist der Code der Klasse:
class CArray
{  
private:
   template <typename T>
   T _array[];
   int _index;
   int _err;
   int _err_sys;
public:
   CArray(){_index = -1; _err = 0; _err_sys = 0;}
   ~CArray(){}
  // template <typename T>
   T operator[](int i){
      if((_index == -1) || (i < 0) || (i > _index)) {_err_sys = -1;}
      return (_array[i]);
   }
   T at(int i){  
      if((_index == -1) || (i < 0) || (i > _index)) {_err_sys = -1;}
      return (_array[i]);
   }
   void push_back(T value){
      _array[++_index] = value;
   }
};

Teil des Programmcodes:

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

#include "Array.mqh"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
CArray *array;


int OnInit()
  {
  int b = 1;
   array = new CArray();
   array.push_back(b);
   int a = array.at(0);
  
//---
   return(INIT_SUCCEEDED);
  }
...

Nach dem Versuch, den Expert Advisor auf realen Daten auszuführen, wird der folgende Fehler ausgegeben: interner Fehler #-1005

Was mache ich falsch? Vielen Dank im Voraus!