OrderDelete einem bestimmten Ticket zuweisen?

 

Hallo zusammen,

anhängender Code dient lediglich zu Test- und Lernzwecken und stellt keine Strategie dar.

Folgende Situation:
Ich habe es hinbekommen, dass aufgrund der vorherigen Kerze eine Limit- oder Stopp-Order mit Entry, SL und TP ausgelöst wird -> das klappt fehlerfrei.
Wird der Entry getriggert, wird die eröffnete Position entweder mit SL oder TP geschlossen -> klappt fehlerfrei.
Wird der Entry NICHT getriggert, soll die Order bei erreichen des eigentlichen SL gelöscht werden -> klappt nur teilweise.

Hier das Problem:
Ich habe den Wert, bei dem die Order gelöscht werden soll als "buyOrderDelete" und "sellOrderDelete" deklariert (sl konnte ich hier nicht nehmen, da globale Variable). Ist nur eine Order in die jeweilige Richtung offen, wird diese auch nach erreichen von SL gelöscht. Habe ich aber zwei "offene Orders" in die gleiche Richtung, wird nur eine davon bei erreichen von "OrderDelete" gelöscht. Die andere bleibt im Markt.

Wie kann ich den "OrderDelete-Wert" einem bestimmten Order-Ticket zuweisen?

Habe es zunächst mit "if buyTicket > 0" probiert, doch das hat keine Änderung bewirkt - auch hier wurde nur eine Order gelöscht und die andere ist im Markt geblieben.
Ich vermute, das Problem liegt in der OnTick-Funktion und dort im Bereich //---Close Order ... siehe anhängender Code.

Vorab schon mal vielen Dank für die Antworten. :-)

//+------------------------------------------------------------------+
//|                                            lern- und test-EA.mq5 |
//|                                         Copyright 2024, Anfänger |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Anfänger"
#property version   "1.00"

#include       <Trade/Trade.mqh>

enum ENUM_LOT  {LOT_FIX,LOT_AMOUNT,LOT_PERCENT};
enum ENUM_SL   {SL_FIX,SL_CANDLE};

input group    "SIGNAL"
input string   TimeRangeStart          = "11:02";
input string   TimeRangeEnd            = "11:12";

input group    "RISIKO"
input ENUM_LOT Lotcalculation          = LOT_AMOUNT;
input double   RiskInLots              = 0.2;
input double   RiskInAmount            = 10.00;
input double   RiskInPercent           = 0.25;

input group    "HANDEL"
input ENUM_SL  SlVariable              = SL_CANDLE;
input uint     SlInitial               = 1500;
input uint     TpInitial               = 3000;

input group    "DIVERS"
input uint     SymbolBuffer            = 100;
input ulong    Magic                   = 202403271656;

CTrade         trade;
ulong          buyTicket;
ulong          sellTicket;
double         high1;
double         low1;
double         buyOrderDelete;
double         sellOrderDelete;
bool           noSignal;
bool           longSignal;
bool           shortSignal;
datetime       timeRangeStart;
datetime       timeRangeEnd;
datetime       timeSignal;


int OnInit(){
   static bool isInit = false;
   if(!isInit){
      isInit = true;
      Print(__FUNCTION__," > EA (re)start");
   }
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason){
   
}

void OnTick(){
   //---TimeRange
   if(timeRangeStart != StringToTime(TimeRangeStart)){
      calcTimes();
   }
   
   //---Signal
   if(TimeCurrent() >= timeRangeStart && TimeCurrent() < timeRangeEnd){
      timeSignal = iTime(_Symbol,PERIOD_CURRENT,0);
      static datetime timestapSignal;
      if(timestapSignal != timeSignal){
         timestapSignal = timeSignal;
         calcSignal();
      }
   }
   
   //---Order
   if(longSignal == true){
      executeBuy();
   }
   longSignal = false;
   
   if(shortSignal == true){
      executeSell();
   }
   shortSignal = false;
   
   //---Close Order
   double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   
   if(bid <= buyOrderDelete && OrderSelect(buyTicket)){
      if(trade.OrderDelete(buyTicket)){
         Print("  -x-> Buy-Stop-Order #",buyTicket," cancelled, SL reached");
      }
   }
   if(bid >= sellOrderDelete && OrderSelect(sellTicket)){
      if(trade.OrderDelete(sellTicket)){
         Print("  -x-> Sell-Stop-Order #",sellTicket," cancelled, SL reached");
      }
   }
}

void calcTimes(){
   timeRangeStart = StringToTime(TimeRangeStart);
   timeRangeEnd   = StringToTime(TimeRangeEnd);
}

void calcSignal(){
   //---Candle 1
   double open1         = iOpen(_Symbol,PERIOD_CURRENT,1);
          high1         = iHigh(_Symbol,PERIOD_CURRENT,1);
          low1          = iLow(_Symbol,PERIOD_CURRENT,1);
   double close1        = iClose(_Symbol,PERIOD_CURRENT,1);
   
   //---Candle 2
   double open2         = iOpen(_Symbol,PERIOD_CURRENT,2);
   double high2         = iHigh(_Symbol,PERIOD_CURRENT,2);
   double low2          = iLow(_Symbol,PERIOD_CURRENT,2);
   double close2        = iClose(_Symbol,PERIOD_CURRENT,2);
   
   //---No Signal
   bool higherLowerBar  = (high1 > high2 && low1 < low2);
   bool insideBar       = (high1 <= high2 && low1 >= low2);
   bool doji            = (open1 == close1);
   
   if(higherLowerBar == true){
      noSignal = true;
      Print("  no signal - higherLowerBar ",higherLowerBar);
      return;
   }
   if(doji == true){
      noSignal = true;
      Print("  no signal - doji ",doji);
      return;
   }
   if(insideBar == true){
      noSignal = true;
      Print("  no signal - insideBar ",insideBar);
      return;
   }
   
   //---Long Signal
   bool lowerLow = (low1 < low2 && high1 <= high2);
   
   if(lowerLow == true){
      longSignal = true;
      Print("!!! LONG SIGNAL");
   }else
      {Print("  no long signal");
   }
   
   //---Short Signal
   bool higherHigh    = (high1 > high2 && low1 >= low2);
   
   if(higherHigh == true){
      shortSignal = true;
      Print("!!! SHORT SIGNAL");
   }else
      {Print("  no short signal");
   }
}

void executeBuy(){
   double ask     = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double bid     = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   double spread  = roundUp(ask - bid);
   double entry   = roundUp(high1 + spread + SymbolBuffer * _Point);
   double sl      = 0;
   
   if(SlVariable == SL_FIX){
      sl = entry - SlInitial * _Point;
   }else  sl = roundUp(low1 - SymbolBuffer * _Point);
   
   double tp = roundUp(entry + TpInitial * _Point);
   Print("  Long: entry ",entry," (spread ",spread,"), sl ",sl,", tp ",tp);
   
   double lots    = calclots(entry - sl);
   double price   = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   
   if(price < entry){  
      if(trade.BuyStop(lots,entry,_Symbol,sl,tp,0,0)){
         if(trade.ResultRetcode() == TRADE_RETCODE_DONE){
            buyTicket = trade.ResultOrder();
            Print("  --> Buy-Stop-Order #",buyTicket," was sent");
            buyOrderDelete = sl;
         }
      }
   }
   if(price >= entry){
      if(trade.Buy(lots,_Symbol,entry,sl,tp)){
         if(trade.ResultRetcode() == TRADE_RETCODE_DONE){
            buyTicket = trade.ResultOrder();
            Print("  --> Buy-Market-Order #",buyTicket," was sent");
         }
      }
   }
}

void executeSell(){
   double ask     = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double bid     = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   double spread  = roundUp(ask - bid);
   double entry   = roundDn(low1 - SymbolBuffer * _Point);
   double sl      = 0;
   
   if(SlVariable == SL_FIX){
      sl = entry + SlInitial * _Point;
   }else  sl = roundDn(high1 + spread + SymbolBuffer * _Point);
   
   double tp    = roundDn(entry - TpInitial * _Point);
   Print("  Short: entry ",entry,", sl ",sl," (spread ",spread,"), tp ",tp);
   
   double lots  = calclots(sl - entry);
   double price = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   
   if(price > entry){  
      if(trade.SellStop(lots,entry,_Symbol,sl,tp,0,0)){
         if(trade.ResultRetcode() == TRADE_RETCODE_DONE){
            sellTicket = trade.ResultOrder();
            Print("  --> Sell-Stop-Order #",sellTicket," was sent");
            sellOrderDelete = sl;
         }
      }
   }
   if(price <= entry){
      if(trade.Sell(lots,_Symbol,entry,sl,tp)){
         if(trade.ResultRetcode() == TRADE_RETCODE_DONE){
            sellTicket = trade.ResultOrder();
            Print("  --> Sell-Market-Order #",sellTicket," was sent");
         }
      }
   }
}

double roundUp(double price){
   double ticksize = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE),_Digits);
   price = NormalizeDouble(price,_Digits);
   double rest = price - NormalizeDouble(price/ticksize,0) * ticksize;
   rest = NormalizeDouble(rest,_Digits);
   if(rest != 0){
      for (double i = _Point; i <= ticksize; i += _Point){
         price = NormalizeDouble(price + _Point,_Digits);
         rest = price - NormalizeDouble(price/ticksize,0) * ticksize;
         rest = NormalizeDouble(rest,_Digits);
         if(rest == 0) break;
      }
   }
   return price;
}

double roundDn(double price){
   double ticksize = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE),_Digits);
   price = NormalizeDouble(price,_Digits);
   double rest = price - NormalizeDouble(price/ticksize,0) * ticksize;
   rest = NormalizeDouble(rest,_Digits);
   if(rest != 0){
      for (double i = _Point; i <= ticksize; i += _Point){
         price = NormalizeDouble(price - _Point,_Digits);
         rest = price - NormalizeDouble(price/ticksize,0) * ticksize;
         rest = NormalizeDouble(rest,_Digits);
         if(rest == 0) break;
      }
   }
   return price;
}

double calclots(double slPoints){
   double lots = 0;
   double ticksize = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
   double tickvalue = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE);
   double lotstep = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   double moneyPerLotstep = slPoints / ticksize * tickvalue * lotstep;

   if(Lotcalculation == LOT_FIX){
      lots = RiskInLots;
      Print("  fixed lot size: ",lots," lot");
   }
   if(Lotcalculation == LOT_AMOUNT){
      lots = MathFloor(RiskInAmount / moneyPerLotstep) * lotstep;
      Print("  lot size caculated via amount: ",lots," lot");
   }
   if(Lotcalculation == LOT_PERCENT){
      double riskPerTrade = AccountInfoDouble(ACCOUNT_EQUITY) * RiskInPercent / 100;
      lots = MathFloor(riskPerTrade / moneyPerLotstep) * lotstep;
      Print("  lot size calculated as a percentage: ",lots," lot");
   }
   lots = MathMin(lots,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX));
   lots = MathMax(lots,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN));
   return lots;
}
Dokumentation zu MQL5: Grundlagen der Sprache / Variablen / Globale Variablen
Dokumentation zu MQL5: Grundlagen der Sprache / Variablen / Globale Variablen
  • www.mql5.com
Globale Variablen werden durch Unterbringung ihrer Erklaerungen ausser beschreibung bestimmter Funktion erzeugt. Globale Variablen werden auf...
 

murkelmel:

Habe ich aber zwei "offene Orders" in die gleiche Richtung, wird nur eine davon bei erreichen von "OrderDelete" gelöscht. Die andere bleibt im Markt.

Das heißt, Du hast eine Variable für das Ticket wie "buyTicket" aber vielleicht zwei oder mehr Orders?

Wie soll das gehen? Entweder hat Du eine dynamische Liste (array) mit den Ticketnummern (eine für Kauf, eine für Verkauf), statt einer Variablen, die Du dann durchsuchen musst, oder Du suchst durch alle offenen schwebenden Aufträgen (n=OrdersTotal(); for ...) nach Deinen Orders.

BTW. Du könntest Deinen Aufträgen auch ein Ablaufdatum mitgeben: request.expiration = TimeCurrent() + 5*PeriodSeconds(PERIOD_CURRENT); für 5 Balken zB.
 
Carl Schreiber #:

Das heißt, Du hast eine Variable für das Ticket wie "buyTicket" aber vielleicht zwei oder mehr Orders?

Wie soll das gehen? Entweder hat Du eine dynamische Liste (array) mit den Ticketnummern (eine für Kauf, eine für Verkauf), statt einer Variablen, die Du dann durchsuchen musst, oder Du suchst durch alle offenen schwebenden Aufträgen (n=OrdersTotal(); for ...) nach Deinen Orders.

BTW. Du könntest Deinen Aufträgen auch ein Ablaufdatum mitgeben: request.expiration = TimeCurrent() + 5*PeriodSeconds(PERIOD_CURRENT); für 5 Balken zB.

Hallo Carl,

vielen Dank für deine Antwort!

Ja, ich hatte bis dato die zwei Variablen "buyTicket" und "sellTicket" und solange ich immer nur eine Order in die jeweilige Richtung hatte, war es auch kein Problem.
Doch du hast recht: sobald es mehr als eine Order ist, funktioniert es, wie ich ja nun erfahren musste, nicht mehr korrekt.

Wenn ich nun eine Abfrage installiere - wie weise ich dann den richtigen "buy- oder sellOrderDelete-Wert" dem korrekten Ticket zu? Wenn die Buy-Stopp- oder Sell-Stopp-Order erstellt wird, erhält diese ein Ticket - der Wert "buyOrderDelete" aber nicht. Wie führe ich diese zwei zusammen?

 
murkelmel #:

Hallo Carl,

vielen Dank für deine Antwort!

Ja, ich hatte bis dato die zwei Variablen "buyTicket" und "sellTicket" und solange ich immer nur eine Order in die jeweilige Richtung hatte, war es auch kein Problem.
Doch du hast recht: sobald es mehr als eine Order ist, funktioniert es, wie ich ja nun erfahren musste, nicht mehr korrekt.

Wenn ich nun eine Abfrage installiere - wie weise ich dann den richtigen "buy- oder sellOrderDelete-Wert" dem korrekten Ticket zu? Wenn die Buy-Stopp- oder Sell-Stopp-Order erstellt wird, erhält diese ein Ticket - der Wert "buyOrderDelete" aber nicht. Wie führe ich diese zwei zusammen?

So wie ich Dich verstehe, würde ich, nach dem zB. der Kurs unter Dein sl fällt durch alle 'open orders' gehen und bei allen mit ORDER_TYP%2==0 (=> Kauf) prüfen ob der ORDER_PRICE_OPEN < sl ist, dann löschen.

Dafür google mal nach: "site:mql5.com loop all orders"

PS: Lernen zu suchen ist fast wichtiger als Lernen zu programmieren.
 
Carl Schreiber #:

So wie ich Dich verstehe, würde ich, nach dem zB. der Kurs unter Dein sl fällt durch alle 'open orders' gehen und bei allen mit ORDER_TYP%2==0 (=> Kauf) prüfen ob der ORDER_PRICE_OPEN < sl ist, dann löschen.

Dafür google mal nach: "site:mql5.com loop all orders"

PS: Lernen zu suchen ist fast wichtiger als Lernen zu programmieren.

Vielen Dank für den Lösungsvorschlag.

Ja, die Suche ist so eine Sache ... das muss man glaube ich tatsächlich erst richtig "lernen"...
Werde meine Bestes geben ...

 
murkelmel #:

Vielen Dank für den Lösungsvorschlag.

Ja, die Suche ist so eine Sache ... das muss man glaube ich tatsächlich erst richtig "lernen"...
Werde meine Bestes geben ...

Bedenke, es gibt fast nichts, was nicht schon für MT5/4 programmiert wurde!
Also, warum erst selbst in jeden Fehlertopf treten, wenn es das doch schon gibt?

Muss ja nicht gleich alles sein, aber Teile des Codes, wie die Schleife durch alles Offene ...

 

Leider komme ich nicht weiter - alles was ich finde, betrifft das Löschen sämtlicher Order oder Teillöschungen oder ähnliches.

Mein Problem ist aber, dass ich eine Variable "buyOrderDelete" und "sellOrderDelete" definiert habe und diese wie oben beschrieben absolut perfekt und fehlerfrei ausgeführt wird - so lange es nur EINE Order in die jeweilige Richtung gibt. Wenn ich aber mehrere Orders in die gleich Richtung habe, wird nur die letzte Variable "gelesen" und somit nur die letzte Order gelöscht.

Hier ein Beispiel dazu:



Mit open Kerze 2 wird eine Buy-Limit in den Markt gesetzt, deren Entry High 1 und SL Low1 ist. Der Wert von SL wurde gleichzeitig als Variable "buyOrderDelete" definiert und für den Fall, dass der Kurs diesen Wert vor dem Entry erreicht, soll die Buy-Limit-Order gelöscht werden.

Mit open Kerze 4 wird eine weitere Buy-Limit in den Markt gesetzt, deren Entry High 3 und SL Low 3 ist - also identisches Verfahren wie bei der ersten Buy-Limit-Order. Auch hier ist der Wert von "buyOrderDelete" der SL von dieser Buy-Limit-Order, welches das Low von Kerze 3 ist.

Beide Buy-Limit-Orders werden nicht ausgeführt, da bei beiden der Kurs den jeweiligen Entry nicht erreicht. Im Verlauf der Kerze 4 läuft der Kurs nun unter das Low von Kerze 3 und 1 und erreicht somit beide "buyOrderDelete"-Werte. Nun wird aber nur der letzte Wert berücksichtigt (der von Kerze 3) und somit auch nur die letzte Buy-Limit-Order gelöscht. Die erste Buy-Limit-Order bleibt im Markt.


Kann man die Variable "BuyOrderDelete" einer Order zuweisen, quasi diese verbinden? In meinem oben abgebildeten Code wird die Variable vermutlich überschrieben und deshalb nur ein Mal ausgeführt.

Verwende ich eine Schleife, werden alle Orders gelöscht - das ist nicht gewollt. Es sollen nur die Orders gelöscht werden, deren SL vor dem Erreichen des Entry getriggert werden.

Vermutlich gibt es hierzu einen Ansatz im Netz - ich bin nur zu blöd diesen zu finden ... aber alles was ich mit Variable und Order in die mql-Suche eingebe, läuft auf das generelle Löschen von Orders hinaus. Nicht aber auf das Löschen von einer ganz bestimmten Order ...

Hat jemand einen Lösungsansatz? Ich wäre sehr dankbar dafür.

Frohe Ostern aus Deutschland ... 

 

Du musst überlegen, welchen Wert hast Du (SL = buyOrderDelete), um was damit zu machen. Jetzt hast Du schwebende Aufträge (Stop, Limit, Stop-Limit).

Wenn jetzt der Preis unter buyOrderDelete fällt, also bid < buyOrderDelete, dann mach eine Schleife über alle schwebenden Aufträge (int n=OrdersTotal(); while(n-->0){OrderGetTicket(n)..} ) lösche alle für die gilt OrderGetDouble(ORDER_PRICE_OPEN) > buyOrderDelete;

 
Carl Schreiber #:

Du musst überlegen, welchen Wert hast Du (SL = buyOrderDelete), um was damit zu machen. Jetzt hast Du schwebende Aufträge (Stop, Limit, Stop-Limit).

Wenn jetzt der Preis unter buyOrderDelete fällt, also bid < buyOrderDelete, dann mach eine Schleife über alle schwebenden Aufträge (int n=OrdersTotal(); while(n-->0){OrderGetTicket(n)..} ) lösche alle für die gilt OrderGetDouble(ORDER_PRICE_OPEN) > buyOrderDelete;

Boah, vielen Dank Carl für den Denkanstoß - ich glaube zumindest, dass ich nun die Lösung habe.
Allerdings stimmt die nicht ganz mit deiner Lösung überein.

Dein Hinweis, dass ich überlegen soll, welchen Wert ich nun habe, hat bei mir ein "Klick" ausgelöst. Wenn der Preis unter buyOrderDelete fällt, dann muss ich mit einer Schleife (wie du beschrieben hast), die dazugehörige offene Order mit dem identischen SL-Wert suchen. Alle offenen Orders, deren Entry (Order_Price_Open) > als buyOrderDelete ist, zu löschen wäre falsch - dann würde ich evtl. auch Orders löschen, deren buyOrderDelete-Wert noch gar nicht erreicht wurde.

Oder habe ich erneut einen Denkfehler?

"Du musst überlegen, welchen Wert hast Du (SL = buyOrderDelete), um was damit zu machen" -> mega Hinweis Carl, vielen Dank !!

 

Grins - mein kleines Osterei für Dich ;)

".. zu löschen wäre falsch - dann würde ich evtl. auch Orders löschen, deren buyOrderDelete-Wert noch gar nicht erreicht wurde."  das kann ich nicht beurteilen, es hängt von Deinen Ideen ab!

Ab im Debugger kannst Du das ganz einfach durchspielen, in jeder Variation! Such Dir ein geeignetes Zeitfenster aus und probier, bist Du es hast wie es sein soll.

Code debugging:  https://www.metatrader5.com/de/metaeditor/help/development/debug

Code debugging - Developing programs - MetaEditor Help
  • www.metatrader5.com
MetaEditor has a built-in debugger allowing you to check a program execution step by step (by individual functions). Place breakpoints in the code...
 
Carl Schreiber #:

Grins - mein kleines Osterei für Dich ;)

".. zu löschen wäre falsch - dann würde ich evtl. auch Orders löschen, deren buyOrderDelete-Wert noch gar nicht erreicht wurde."  das kann ich nicht beurteilen, es hängt von Deinen Ideen ab!

Ab im Debugger kannst Du das ganz einfach durchspielen, in jeder Variation! Such Dir ein geeignetes Zeitfenster aus und probier, bist Du es hast wie es sein soll.

Code debugging:  https://www.metatrader5.com/de/metaeditor/help/development/debug

Carl, ich melde Vollzug!

In der OnTick-Funktion steht bei mir nun:

//---Close Order
   double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   
   if(OrderSelect(buyTicket) && bid <= OrderGetDouble(ORDER_SL)){
      closeOrder();
   }
   if(OrderSelect(sellTicket) && bid >= OrderGetDouble(ORDER_SL)){
      closeOrder();
   }

und weiter unten in der closeOrder-Funktion:

void closeOrder(){
   for(int i = OrdersTotal()-1; i >= 0; i--){
      buyTicket = OrderGetTicket(i);
      if(OrderGetString(ORDER_SYMBOL) != _Symbol && OrderGetInteger(ORDER_MAGIC) != Magic) continue;
      if(OrderSelect(buyTicket) && OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY_STOP){
         if(trade.OrderDelete(buyTicket)){
            Print("  -x-> Buy-Stop-Order #",buyTicket," gelöscht da SL erreicht");
         }
      }
   }
   for(int i = OrdersTotal()-1; i >= 0; i--){
      sellTicket = OrderGetTicket(i);
      if(OrderGetString(ORDER_SYMBOL) != _Symbol && OrderGetInteger(ORDER_MAGIC) != Magic) continue;
      if(OrderSelect(sellTicket) && OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_STOP){
         if(trade.OrderDelete(sellTicket)){
            Print("  -x-> Sell-Stop-Order #",sellTicket," gelöscht da SL erreicht");
         }
      }
   }
}

Damit ist mein Problem, dank deiner Hinweise, nun auch gelöst und ich kann mich dem nächsten Problem, bzw. der Fortschreibung des EAs widmen. Nochmals vielen Dank für deine Denkanstöße.

Was den Debugger betrifft, so habe ich diesen tatsächlich noch nie benutzt. Ich teste immer im Strategietester nach jedem Kompilieren bis das gewünschte Ergebnis erzielt ist ... auch wenn es auch manchmal, wie in diesem Fall, mehrere Tage dauert.

Gruß und bis bald :-)

PS: durch die Nutzung von "OrderGetDouble(ORDER_SL)" konnte ich die Variable "buy/sellOrderDelete" streichen - war nicht mehr nötig.

Grund der Beschwerde: