Einzelnen Beitrag anzeigen
  #1 (permalink)  
Alt 15.05.20
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
AVT befindet sich auf einem aufstrebenden Ast
Standard Trailing Wert ist nicht korrekt

Situation:
1. ein Indikator
-. hat default Werte, die nie verändert werden (TF=h1)
2. ein EA (TF=h1)
-. liest (eigentlich) die Werte des Indikators aus
-. benutzt diese Werte zum Ein-/Ausstieg und Trailen

Problem:
Der SL wird anhand einer Indikatorline, also auf einen festen Wert gesetzt (im Gegensatz zu Bid/Ask+/-EinWert). Aber obwohl bei der 1. Order der SL-Wert korrekt vom Indikator übernommen wird, erscheint beim Trailing plötzlich ein Fantasie-Wert, bei dem ich nicht erkennen kann, woher der überhaupt kommt.

Frage: Was übersehe ich hier?
Code:
//=============================================================================
void CheckToOpen()
{
   int    tckt;
   // === default values of Indi
   double upLi=iCustom(Symbol(),MAframe,INDI, 0,0); //HT.up,UpLine
   double dnLi=iCustom(Symbol(),MAframe,INDI, 1,0); //HT.dn,DnLine
   double Ssl=iCustom(Symbol(),MAframe,INDI, 2,0);  //chan.hi,UpperBorder
   double Lsl=iCustom(Symbol(),MAframe,INDI, 3,0);  //chan.low,LowerBorder
   double sigL=iCustom(Symbol(),MAframe,INDI, 4,0); //sig.up,= 1
   double sigS=iCustom(Symbol(),MAframe,INDI, 5,0); //sig.dn,=-1
   bool ShortOnly=(dnLi>0);                         //IfStoppedOutLastShort
   bool LongOnly=(upLi>0);                          //IfStoppedOutLastLong
   Print(__FUNCTION__," HT.up=",DoubleToStr(upLi,_Digits)," HT.dn=",DoubleToStr(dnLi,_Digits),
         " chan.hi=",DoubleToStr(Ssl,_Digits)," chan.lo=",DoubleToStr(Lsl,_Digits),
         " sig.up=",DoubleToStr(sigL,_Digits)," sig.dn=",DoubleToStr(sigS,_Digits) );
   // ============================================================= OpenShort
   if( (sigS==-1 || ShortOnly) && NoOfRunnings(Symbol())!=-1 ) //Sig.dn,HT.dn
   {
      tckt=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,NULL,EAMAGIC,0,clrRed);
      Print(__FUNCTION__," tck: ",IntegerToString(tckt)," SL: ",DoubleToStr(Ssl,_Digits));
      if(tckt>0) 
      {  
         if(OrderSelect(tckt,SELECT_BY_TICKET))
         {
            Print(__FUNCTION__," order ",IntegerToString(tckt)," selectable");
            if(!OrderModify(tckt,OrderOpenPrice(),
                            NormalizeDouble(Ssl,_Digits),OrderTakeProfit(),0,clrOrange) )
               Print(__FUNCTION__," open short, SL: ",DoubleToStr(Ssl,_Digits) );
         }
      }
      return;
   }
   // ============================================================= OpenLong
   if( (sigL==1 || LongOnly) && NoOfRunnings(Symbol())!=1 ) //Sig.up,HT.up
   {
      tckt=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,NULL,EAMAGIC,0,clrGreen);
      Print(__FUNCTION__," tck: ",IntegerToString(tckt)," SL: ",DoubleToStr(Lsl,_Digits));
      if(tckt>0)
      {  
         if(OrderSelect(tckt,SELECT_BY_TICKET))
         {
            Print(__FUNCTION__," order ",IntegerToString(tckt)," selectable");
            if(!OrderModify(tckt,OrderOpenPrice(),
                            NormalizeDouble(Lsl,_Digits),OrderTakeProfit(),0,clrOrange) )
               Print(__FUNCTION__," open long, SL: ",DoubleToStr(Lsl,_Digits) );
         }
      }
      return;
   }
}
//=============================================================================
void CheckToTrail()
{
   double Ssl=iCustom(Symbol(),MAframe,INDI, 2,0); //chan.hi
   double Lsl=iCustom(Symbol(),MAframe,INDI, 3,0); //chan.low

   for(int i=0; i<OrdersTotal(); i++)
   {
      if(OrderMagicNumber()!=EAMAGIC || OrderSymbol()!=Symbol()) continue;
   // ============================================================= TrailShort
      if( OrderType()==OP_SELL)
      {
         Print(__FUNCTION__," cur SL=",DoubleToStr(OrderStopLoss(),_Digits),
               " chan.hi=",DoubleToStr(Ssl,_Digits) );
         if(OrderStopLoss()>Ssl ) //SlHigherThanChan.hi
         {
            if(!OrderModify(OrderTicket(),OrderOpenPrice(),
                            NormalizeDouble(Ssl,_Digits),OrderTakeProfit(),0,clrOrange))
            Print(__FUNCTION__," fail modify short, SL ",DoubleToStr(Ssl,_Digits) );
         }
         break;
      }
   // ============================================================= TrailLong
      if(OrderType()==OP_BUY)
      {
         Print(__FUNCTION__," cur SL=",DoubleToStr(OrderStopLoss(),_Digits),
               " chan.low=",DoubleToStr(Lsl,_Digits) );
         if(OrderStopLoss()<Lsl ) //SlLowerThanChan.low
         {
            if(!OrderModify(OrderTicket(),OrderOpenPrice(),
                            NormalizeDouble(Lsl,_Digits),OrderTakeProfit(),0,clrOrange))
            Print(__FUNCTION__," fail modify long, SL ",DoubleToStr(Lsl,_Digits) );
         }
         break;
      }
   }
}
Bild im Anhang zeigt Werte einer Bar nach der Eröffnung: Der erste SL bei der Eröffnung wird korrekt gelesen und gesetzt. Bei der nächsten Bar sollte er eigentlich runtergezogen werden - der Wert ist aber komplette Fantasie wie man sieht, gibt es den Wert nirgendswo.

Habt Ihr Hinweise? Danke. AVT
Angehängte Grafiken
Dateityp: jpg EA-HT.JPG (147,7 KB, 5x aufgerufen)