Schließung von halben Parzellen. - Seite 16

 
Ok, ich habe einen kleinen Fortschritt gemacht. Ich habe jedoch ein Problem. Wenn ich einen Auftrag zum ersten Mal für ein bestimmtes Paar platziere, wird die Hälfte des Auftrags NICHT geschlossen, es sei denn, ich habe einen Handel zum Vergleich in der Geschichte... In diesem Fall, wenn der erste Handel 1:1 war, wird die Hälfte der Position nicht geschlossen, da es nichts gibt, mit dem man in der Historie vergleichen kann... Ich bin mir auch nicht ganz sicher, was ich falsch mache, aber selbst wenn es einen Handel in der Historie gibt, mit dem man vergleichen kann (OrderOpenTime()), wird die Position immer noch kontinuierlich zum gleichen Preis geschlossen?

int start()
{
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
if(OrderSelect(OrderTicket(),SELECT_BY_TICKET, MODE_TRADES)==True)
{  
   OrderEntryTime            = OrderOpenTime();
   datetime OrderEntryClosed = OrderCloseTime(); 
    CurrentSymbol            = OrderSymbol();
     if(OrderType() <= OP_SELL && CurrentSymbol == Symbol())
         {   
         Print(" The Selected Order ", CurrentSymbol, " matches this pair: ", Symbol());
         Print(" The Open Time of this order was: ", TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));  
         }
         
  if(OpenOrdersThisPair(Symbol())>0 && CurrentSymbol==Symbol())
     {
      // Need a for loop to compare historically closed trades that match with Symbol() and the "datetime OrderEntryTime = OrderOpenTime();" above.
     CheckHistoricalTrades(); 
     }
   }
}
}  
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  

void CheckHistoricalTrades()
{
for(int Pos=OrdersHistoryTotal()-1; Pos >= 0; Pos--) 
    {
     if (OrderSelect(Pos, SELECT_BY_POS, MODE_HISTORY)  
        &&  OrderMagicNumber()  == MagicNumber            
        &&  CurrentSymbol       == Symbol()            
        &&  OrderType()         <= OP_SELL
        &&  OrderEntryTime    >  OrderOpenTime() && OrderType()==OP_BUY)
          {
          Print(" Last Order Open Time: ", TimeToStr(OrderOpenTime(), TIME_MINUTES | TIME_DATE), 
                  " Was not the same as current order: ", TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));
          CloseHalfOrder();
          }
                if(OrderEntryTime > OrderOpenTime() && OrderType()==OP_SELL)
                  {
                  Print("Last Order Open Time: ", TimeToStr(OrderOpenTime(), TIME_MINUTES | TIME_DATE), 
                     " Was not the same as current order: ", TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));
                  CloseHalfOrder1(); // This just closes half of the position at 1:1 - then if OrderStopLoss > OrderOpenPrice() = MoveToBreakEven() void kicks in. 
                  }
                      
     }
}  
Ich weiß, das Problem ist starrte mich direkt in dann Gesicht, aber ich kann es nicht sehen...
 
Dies sind die Drucke aus der Zeitschrift - einige Drucke sind oben nicht abgebildet - aber alle oben genannten sind es.
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: Last Order Open Time: 2010.02.04 09:22 Was not the same as current order: 2010.02.25 01:16 //>>> "Last Order Open time" here doesn't make sense?
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: SELL First Target Closed: 0.03 OP_SELL First Closed - Open Time: 2010.02.05 15:07 //>>> This is the same as "The Last Order Open Time"?
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: close #16 sell 0.03 GBPJPY at 138.270 sl: 138.240 tp: 135.082 at price 136.637  //>>> Therefore, it closed it here.
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: Ask >= FirstTarget_Sell - Current Ask: 136.637 FirstTarget_Sell: 136.676     //>>> The ask is at the OrderClose() price.
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: FirstTarget_Sell: 136.676
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: Order Ticker Number = 10
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: The Lots to close is: 0.030
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1: Last Order Open Time: 2010.02.05 15:07 Was not the same as current order: 2010.02.25 01:16
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1:  The Open Time of this order was: 2010.02.25 01:16
2013.08.09 13:56:20     2010.02.25 09:16  Trend Fishing 3 Exits GBPJPY,H1:  The Selected Order GBPJPY matches this pair: GBPJPY
 
DomGilberto:

Das Problem, das ich jedoch habe, ist, dass ich versuche, denselben "OP_BUY" oder "OP_SELL" teilweise bis zu 4 Mal zu unterschiedlichen Preisen zu schließen... Ich denke, die Frage, die ich stellen sollte, ist, kann ich einen Weg, wo durch ich eine Regel, dass ALLE teilweise schließt (von allen Lots und Preis auf EINEN bestimmten Handel) wird nur teilweise schließen EINMAL auf ihre vordefinierten "OrderClose()" Parameter gesetzt...

Die Art und Weise, wie ich es jetzt mit dem Vergleich der OrderOpenTime() mache, wird im Wesentlichen nur einmal funktionieren und wird jede andere Art von OrderClose()-Funktion davon abhalten, überhaupt zu passieren... Ich möchte einen Weg finden, wo ich eine Regel für 4 OrderClose() Funktionen anwenden kann... (wenn das Sinn macht?)

Ich weiß, dass die Leute vorschlagen, 4 Aufträge zu öffnen, aber ohne zu tief zu gehen, ist es weniger effizient für mich, es auf diese Weise zu tun.

Warum nicht einfach ein zweidimensionales Array haben, das die Ticketnummer und die Anzahl der noch verfügbaren Teilabschlüsse speichert.

Gliederung/Pseudocode:

1. statisches zweidimensionales Array definieren: cOrders[][2].

2. für jede neu eingegebene Bestellung: die erste Dimension von cOrders auf size+1 verkleinern, die Ticketnummer der neuen Bestellung in [x][0] und die Anzahl der noch auszuführenden Teilabschlüsse (in diesem Fall 4) in [x][1] eintragen.

3. in einem beliebigen Zeitintervall (z. B. bei jedem start()) das Array in einer Schleife durchlaufen, jede Bestellung anhand der gespeicherten Ticketnummer auswählen und feststellen, ob ein Teilabschluss durchgeführt werden muss.

4. Wenn ein teilweiser Abschluss durchgeführt werden muss (siehe Schritt 3), wird die Bestellung mit OrderClose() teilweise abgeschlossen und cOrders[x][0] aktualisiert, um die neue Ticketnummer wiederzugeben und cOrders[x][1] um 1 zu verringern.

5. Entfernen Sie aus cOrders alle Aufträge, die geschlossen wurden oder deren Anzahl der noch durchzuführenden Teilabschlüsse 0 beträgt.

Das einzige Problem ist, was bei einem Plattform-/Computer-Neustart geschehen soll. Man könnte diese Informationen in einer Datei speichern und die Datei in init() beim Neustart der Plattform lesen.

 
Thirteen:

Warum nicht einfach ein zweidimensionales Array haben, das die Ticketnummer und die Anzahl der noch verfügbaren Teilabschlüsse speichert.

Gliederung/Pseudocode:

1. statisches zweidimensionales Array definieren: cOrders[][2].

2. für jede neu eingegebene Bestellung: die erste Dimension von cOrders auf size+1 verkleinern, die Ticketnummer der neuen Bestellung in [x][0] und die Anzahl der noch auszuführenden Teilabschlüsse (in diesem Fall 4) in [x][1] eintragen.

3. in einem beliebigen Zeitintervall (z. B. bei jedem start()) das Array in einer Schleife durchlaufen, jede Bestellung anhand der gespeicherten Ticketnummer auswählen und feststellen, ob ein Teilabschluss durchgeführt werden muss.

4. Wenn ein teilweiser Abschluss durchgeführt werden muss (siehe Schritt 3), wird die Bestellung mit OrderClose() teilweise abgeschlossen und cOrders[x][0] aktualisiert, um die neue Ticketnummer wiederzugeben und cOrders[x][1] um 1 zu verringern.

5. Entfernen Sie aus cOrders alle Aufträge, die geschlossen wurden oder deren Anzahl der noch durchzuführenden Teilabschlüsse 0 beträgt.

Das einzige Problem ist, was bei einem Plattform-/Computer-Neustart geschehen soll. Sie könnten diese Informationen in einer Datei speichern und die Datei bei einem Neustart der Plattform mit init() lesen.

Ich denke, am einfachsten geht das mit Magic Numbers ... verwenden Sie Teile der Nummer, um verschiedene Parameter zu definieren, z. B.: Anzahl der Teile, Auftragsnummer, Tag, Monat, EA-Nummer ... alle Teile hätten die gleiche Magic Number und könnten in der Historie leicht verfolgt werden. Ich gehe davon aus, dass das geschlossene Teil und das offene Teil links beide dieselbe Magic Number haben.
 
Ja, ich glaube schon. Die magische Zahl ist immer die gleiche "1234"?

Ich habe keine Ahnung, wie ich Teile der magischen Zahl verwenden kann, um verschiedene Parameter zu definieren? Ich denke, dass die Verwendung von OrderOpenTime() kein logischer Weg sein wird... Ich kann nicht glauben, wie lang dieser Thread geworden ist. Lol.

Ich schwöre bei Gott, dass ich einen Thread dazu machen werde, sobald ich (mit viel Hilfe von allen anderen!) das Problem geknackt habe.
 
RaptorUK:
Ich denke, der einfachste Weg, dies zu tun, ist mit Magic Numbers ... verwenden Sie Teile der Nummer, um verschiedene Parameter zu definieren, zum Beispiel: Anzahl der Teile, Auftragsnummer, Tag, Monat, EA-Nummer ... alle Teile hätten die gleiche Magic Number und könnten leicht in der Historie verfolgt werden. Ich gehe davon aus, dass das geschlossene Teil und das offene Teil links beide dieselbe Magic Number haben.

Die Verwendung der Magic Number zur Codierung von Informationen ist durchaus möglich, aber ich sehe einige mögliche Einschränkungen. Erstens ist die Magic Number ein int und daher 10 Stellen lang, wobei die äußerste linke Stelle nur eine 1 oder 2 sein kann (und wenn die äußerste linke Stelle eine 2 ist, muss die zweitlängste Stelle 7 oder weniger sein). Zweitens könnte es mehr Zeit pro start() in Anspruch nehmen, die gesamte Historie zu überprüfen, um alle Teile der einzelnen Aufträge zu finden, nur um festzustellen, ob der aktuelle Auftrag teilweise geschlossen werden muss (oder kann). Ich bin mir nur nicht sicher, ob dieser Mehraufwand trivial ist oder nicht.

 

Moment, kann ich nicht einfach mehrere MagicNumbers haben? Eine für die anfängliche OrderSend() verwenden, eine für die OrderModify(), nachdem die Hälfte der Position beim ersten Ziel von 1:1 geschlossen wurde, die Order ändern, um die MagicNumber zu ändern? Wenn ich also die Hälfte der Position bei 1:1 schließen möchte, wird sie nur bei 1:1 geschlossen, solange die aktuelle offene "OP_BUY" der magischen Zahl entspricht, die ich ihr zuerst gegeben habe? Nachdem er dann teilweise geschlossen hat, kann ich diese magische Zahl ändern?!

Lol? Ist das nicht wirklich einfach?!

UPDATE: Ich muss offensichtlich heute aufhören, mir das anzusehen - man kann eine MagicNumber nicht ändern - ich wünschte, man könnte es, verdammt noch mal... (facepalm) - Könnt ihr euch vorstellen, wie viel einfacher das alles wäre...

 
DomGilberto:
Moment, kann ich nicht einfach mehrere Magicnumbers haben? Eine für die anfängliche OrderSend() verwenden, eine für die OrderModify(), nachdem die Hälfte der Position mit dem ersten Ziel von 1:1 geschlossen wurde, die Order ändern, um die MagicNumber zu ändern? Wenn ich also die Hälfte der Position bei 1:1 schließen möchte, wird sie nur bei 1:1 geschlossen, solange die aktuelle offene "OP_BUY" der magischen Zahl entspricht, die ich ihr zuerst gegeben habe? Nachdem er dann teilweise geschlossen hat, kann ich diese magische Zahl ändern?!

Lol? Ist das nicht wirklich einfach?!

Nein. Erstens können Sie nach dem ersten OrderSend() die Magic Number nicht mit OrderModify() hinzufügen/ändern. Zweitens: Wenn Sie eine Bestellung teilweise mit OrderClose() schließen, erhält die neue Bestellung (so nehme ich an) dieselbe Magic Number wie die alte Bestellung.

 
Thirteen:

Nein. Erstens können Sie nach dem ersten OrderSend() die Magic Number nicht mit OrderModify() hinzufügen/ändern. Zweitens, wenn Sie einen Teilauftrag mit OrderClose() schließen, erhält der neue Auftrag (so nehme ich an) die gleiche Magic Number wie der alte Auftrag.


Ja, ich habe gemerkt, wie zurückgeblieben ich bin. Ein langer Tag!

Ja, nach der ersten teilweisen Schließung wird der verbleibenden Position immer noch dieselbe Magic Number zugewiesen, mit der sie begonnen hat.

Das frustriert mich jetzt wirklich... Wenn ich nur die magische Zahl ändern könnte, wäre es zu einfach!? Es muss eine logische Möglichkeit geben, eine Position EINMAL teilweise zu schließen - und das mehrmals zu einem bestimmten vordefinierten Preis, der in OrderClose() angegeben ist - Es muss ein Update geben, das uns erlaubt, die MagicNumber() zu ändern!
 

Sie denken überhaupt nicht logisch.

1. Wie würde Ihnen die Änderung der magischen Zahl mehr helfen als die Kenntnis der OrderOpenTime() ? Sie ist genau dasselbe wie ein Identifikator für diese Bestellung.

2. Warum konvertieren Sie sie mit timetostr in das Format Tag/Stunde/Minute? OrderOpenTime() ist bereits im Zeitstempelformat und sieht wie folgt aus: 1375356521 Es stellt die sekundengenaue Zeit dar, zu der die Bestellung geöffnet wurde.

Wenn Sie die magische Zahl ändern könnten, würden Sie die magische Zahl der Bestellung vergleichen, um sicherzustellen, dass sie nicht die magische Zahl hat, die bedeutet, dass sie bereits teilweise geschlossen wurde, richtig?

Wenn Sie das könnten, warum können Sie dann nicht die OrderOpenTime der Bestellung mit dem Zeitstempel vergleichen, von dem Sie wissen, dass er bedeutet, dass die Bestellung bereits teilweise geschlossen wurde?

statisch datetime alreadypartclosed;

wenn die Bestellung teilweise geschlossen wurde

alreadypartclosed = OrderOpenTime();

wenn der Auftrag die Kriterien für einen Teilabschluss erfüllt

if(OrderOpenTime() != alreadypartclosed )

Wenn Sie mehrere offene Aufträge gleichzeitig verwalten, verwenden Sie ein Array[], um jeden Zeitstempel der teilweise geschlossenen Aufträge zu speichern.

Grund der Beschwerde: