[Archiv!] Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Könnte nirgendwo ohne dich hingehen - 2. - Seite 288

 

Guten Tag, wer kann helfen, ein Problem zu lösen, vielleicht mache ich etwas falsch,

Ich habe einen Klimablock, der die Schlussflagge der letzten Position bei Takei zurückgibt und dasselbe für den Stop,

//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по тейку.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}

aber ich verwende es folgendermaßen.

bool Buystop=isCloseLastPosByStop(NULL,OP_BUY,MagBuy);
bool BuyTake=isCloseLastPosByTake(NULL,OP_BUY,MagBuy);
bool Sellstop=isCloseLastPosByStop(NULL,OP_SELL,MagBuy);
bool SellTake=isCloseLastPosByTake(NULL,OP_SELL,MagBuy);

//--------------------------------------------------------------------------------+
if(total==1) 
  {
   if(Buystop==True)
   {   OpenPosition(NULL, OP_SELL, Lot,Bid+Sl3*Point, Bid-Tp3*Point,MagBuy);
   }  
   if(BuyTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    }     
    
   if(Sellstop==True)
   {   OpenPosition(NULL, OP_BUY,  Lot, 0, Ask+Tp*Point,MagBuy);
   }  
   if(SellTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    } }

und zunächst läuft alles wie geplant und bei Los 4 öffnet sich die, die ich brauche und diese

if(Buystop==True)
   {   OpenPosition(NULL, OP_SELL, Lot,Bid+Sl3*Point, Bid-Tp3*Point,MagBuy);
   } 

Ich kann nicht herausfinden, wofür es ist.

zur Verdeutlichung

Zeit Typ Bestellung Band Preis S / L T / P Gewinn Bilanz
1 2011.01.03 00:00 kaufen 1 1.00 1.3346 1.3146 1.3446
2 2011.01.03 00:00 verkaufen 2 1.00 1.3344 0.0000 0.0000
3 2011.01.05 15:18 s/l 1 1.00 1.3146 1.3146 1.3446 -2001.70 47998.30
4 2011.01.05 15:18 verkaufen 3 1.00 1.3146 1.3546 1.2946
5 2011.01.07 14:38 t/p 3 1.00 1.2946 1.3546 1.2946 1983.88 49982.18
6 2011.01.07 14:38 verkaufen 4 1.00 1.2944 1.3344 1.2744
7 2011.01.07 14:38 kaufen 5 1.00 1.2946 1.2746 1.3046

 
FoxUA:

Ich kann nicht herausfinden, wofür es ist


Das ist richtig,

Die erste Prüfung (Summe==1) findet statt, wenn der Auftrag noch 1 ist. Innerhalb des Blocks finden Sie den letzten geschlossenen Verkauf -> offen, den letzten geschlossenen Kauf -> wieder offen. Das sind 3 Bestellungen.

 
Figar0:


Ja, das ist richtig,

Die erste Prüfung (Summe==1) findet statt, wenn der Auftrag noch 1 ist. Innerhalb des Blocks finden Sie den letzten geschlossenen Verkauf -> offen, den letzten geschlossenen Kauf -> wieder offen. Daraus ergeben sich bereits 3 Aufträge.


Ja, aber wie soll man es machen, es waren nur 2 Aufträge, so dass es nicht einen Auftrag unter Nummer 6 eröffnet,

Zeit Typ Bestellung Band Preis S / L T / P Gewinn Bilanz
1 2011.01.03 00:00 kaufen 1 1.00 1.3346 1.3146 1.3446
2 2011.01.03 00:00 verkaufen 2 1.00 1.3344 0.0000 0.0000
3 2011.01.05 15:18 s/l 1 1.00 1.3146 1.3146 1.3446 -2001.70 47998.30
4 2011.01.05 15:18 verkaufen 3 1.00 1.3146 1.3546 1.2946
5 2011.01.07 14:38 t/p 3 1.00 1.2946 1.3546 1.2946 1983.88 49982.18
6 2011.01.07 14:38 verkaufen 4 1.00 1.2944 1.3344 1.2744
7 2011.01.07 14:38 kaufen 5 1.00 1.2946 1.2746 1.3046

 

Am einfachsten ist es, zu prüfen, ob ein offener Auftrag vom Typ Kaufen oder Verkaufen vorhanden ist. Zum Beispiel so (die Variablen BuyOrders, SellOrders, TotalOrders sind globale Variablen im Programm; sie müssen in der Funktion start() als int BuyOrders, SellOrders, TotalOrders deklariert werden;) :

void OrdersRecount()
{
  BuyOrders=0; SellOrders=0; TotalOrders=0;
  if (OrdersTotal()>0)
  {
    for (int j = 0; j < OrdersTotal(); j++) 
    {
      if (OrderSelect(j, SELECT_BY_POS)) 
      {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagBuy)
        {
          if (OrderType() == OP_BUY) BuyOrders++;
          if (OrderType() == OP_SELL) SellOrders++;        
          TotalOrders++;
        }
      }
    } 
  }
}
 
Figar0:

Es gibt viele Möglichkeiten, die einfachste ist, nach einem offenen Kauf- oder Verkaufsauftrag zu suchen. Nehmen Sie das hier:


Ich verstehe nicht, wie man es benutzt, bitte helfen Sie mir.

 
FoxUA:


Ich verstehe nicht, wie man es benutzt, also helft mir, wenn ihr könnt.


Das werde ich tun, aber ich verstehe immer noch nicht die Logik Ihres Codes:

   if(Buystop==True)
   {   OpenPosition(NULL, OP_SELL, Lot,Bid+Sl3*Point, Bid-Tp3*Point,MagBuy);
   }  
   if(BuyTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    }     
    
   if(Sellstop==True)
   {   OpenPosition(NULL, OP_BUY,  Lot, 0, Ask+Tp*Point,MagBuy);
   }  
   if(SellTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    } }
Sind Sie sicher, dass es in drei Kisten gekauft und in einer verkauft werden kann? Es ist nicht symmetrisch...
 
Figar0:


Ich werde dir helfen, aber ich verstehe die Logik deines Codes noch nicht:

Sind Sie sicher, dass es sich in drei Fällen um einen Verkauf und in einem Fall um einen Kauf handelt? Es ist nicht symmetrisch...


Ich möchte, dass er sich öffnet, wenn keine Position auf dem Markt ist, und wenn einer der Werte korrekt ist, dann 1 Auftrag öffnet und wartet, bis die Position geschlossen ist.

bool totalBuy=ExistPositions(NULL,OP_BUY,MagBuy) ;
bool totalSell=ExistPositions(NULL,OP_SELL,MagBuy) ;


if(totalBuy==False||totalSell==False) 
 
FoxUA:

Ich möchte, dass es nur dann geöffnet wird, wenn keine Position auf dem Markt ist, und wenn einer der gewählten Werte korrekt ist, dann wird 1 Auftrag geöffnet und dann gewartet, bis die Position geschlossen ist.

Es stellt sich also heraus, dass Sie vielleicht 2 Kaufaufträge und keinen Verkaufsauftrag haben?
 

Figar0:

Т.е. получается что возможна ситуация когда у вас будет 2 ордера на покупку и не одного на продаж

Nein, im Gegenteil, es sollten nur 2 Positionen sein, einschließlich Verkauf ohne Stopps und Tracking, die Erklärung zeigt, wie es geschieht. alles ist richtig, aber eine zusätzliche Position unter Nummer 6 öffnet
 
FoxUA:
Nein umgekehrt, die Positionen sollten nur 2 sein, einschließlich Verkaufen ohne Stopps und Behalten, die Erklärung zeigt, wie es funktioniert. richtig, aber eine zusätzliche Position öffnet unter Nummer 6


Nun, dann wird alles viel komplizierter. Beschreiben Sie in Worten, wie der Algorithmus funktionieren soll, und ich werde versuchen, Ihnen dabei zu helfen)

- Es sind 2 Positionen gleichzeitig möglich;

- zunächst 2 Positionen eröffnen: kaufen und verkaufen;

- Wenn die Long-Position durch einen Stop-Loss geschlossen wird -> Eröffnung einer Short-Position mit verdreifachtem SL und TP, erhalten wir zwei Verkaufspositionen, eine mit normalem SL und TP und eine mit verdreifachtem TP;

Wie geht es weiter?