[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 165

 
Dove si nasconde l'errore ')'? - parametri sbagliati contare 4 volte? Forse non è questo il modo di scriverlo?
//-----------------------------------------------------------------------------+ 
//  Удаление объекта OBJ_HLINE горизонтальная линия  /Blue/Red          |  
//-----------------------------------------------------------------------------+   
 void DelHLine(color cl, string nm="", double p1=0, int st=0, int wd=1)  
  { 
     int    obj_total= ObjectsTotal(OBJ_HLINE); 
   
  for(int i=0;i<obj_total;i++) 
   {
     if(ObjectType(OBJ_HLINE)==true) 
     {
        if(ObjectGet(OBJPROP_COLOR)==Red)
         { 
           if(ObjectGet(OBJPROP_PRICE1)>Ask) ObjectDelete(FrDnNam);
         } 
     }
  }
    
    for(i=0;i<obj_total;i++) 
       {
         if(ObjectType(OBJ_HLINE)==true)
         {
          if(ObjectGet(OBJPROP_COLOR)==Blue) 
         { 
          if(ObjectGet(OBJPROP_PRICE1)<Bid) ObjectDelete(FrApNam); 
       }
       
    } 
   }

    return; 
  }
 
Controlla ObjectGet(), ci devono essere due parametri.
 
Roger:

Utilizzare la funzione NormalizeDouble(lot,2)

Grazie. Ho il sospetto che sia quello che stavo cercando.

splxgf:

Grazie per la discussione. Anche le tue informazioni saranno utili.

 
Operr:
Dove si nasconde l'errore ')'? - parametri sbagliati contare 4 volte? Forse non è così che dovrebbe essere scritto?
Le funzioni ObjectType() e ObjectGet() mancano di nomi di oggetti
 
Operr:
Dove si nasconde l'errore ')'? - parametri sbagliati contare 4 volte? Forse non è questo il modo di scriverlo?

//------------------------------------------------------------+ 
//  Удаление объекта OBJ_HLINE горизонтальная линия  /Blue/Red|  
//------------------------------------------------------------+   
void DelHLine(string nm="")  
{int obj_total=ObjectsTotal();
  for(int i=0;i<obj_total;i++) 
  {if(nm==ObjectName(i)&&ObjectType(nm)==OBJ_HLINE)
   {color cl=ObjectGet(nm,OBJPROP_COLOR);double pr=ObjectGet(nm,OBJPROP_PRICE1);
    if((cl==Red&&pr>Ask)||(cl==Blue&&pr<Bid))ObjectDelete(nm);}}}
 
Potreste consigliarmi se è possibile forzare un aggiornamento della build in MT4? Non si aggiorna quando riavvio il terminale.
 

Signori professionisti, ho bisogno di nuovo del vostro aiuto!

Qui sotto c'è un frammento di codice responsabile della chiusura dei trade, ma il fatto è che quando gli ordini pendenti non vengono eseguiti non li cancella, non riesco a capire perché. Ma quando ho bisogno di chiudere un ordine pendente che è già stato eseguito, tutto va correttamente e se l'ordine non è stato eseguito allora si blocca lì finché non viene eseguito...

OrderSelect(0, SELECT_BY_POS, MODE_TRADES);
Magic = OrderMagicNumber();
orderticket = OrderTicket();

if (OrdersTotal() == 1 && Magic == 111 && OrderType( ) == 0)
{
if (H1_BUY_5 == 0 || H1_BUY_1 == 0)
{
OrderClose(orderticket, lots, Bid, 5, Yellow);
if (OrdersTotal() == 1) OrderDelete(orderticket, Brown);
}

}

 

Xaoss1990:

Qui sotto c'è un frammento di codice responsabile della chiusura dei trade, ma il fatto è che quando gli ordini pendenti non vengono eseguiti non li cancella, non riesco a capire perché.


if (OrdersTotal() == 1 && Magic == 111 && OrderType( ) == 0)


questo interferisce
 

Ho messo una funzione nel mio EA per chiudere 1/3 del lotto aperto quando lo stoploss viene attivato a breakeven, ma per qualche motivo non funziona.

Puoi dirmi cosa c'è che non va?

//=======================================================================================     
void BuyCloseOneThird(string sy="", int op=-1, int mn=-1) {
  double pr=0;
  int    i, k=OrdersTotal(), np=-1;

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && OrderType()==OP_BUY) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (Bid>OrderOpenPrice() && Bid==OrderStopLoss()) {
    if (OrderSelect(np, SELECT_BY_POS, MODE_TRADES)) {
      ClosePosBySelect();}
    }
  }
}
}
}
}
//=======================================================================================     
void SellCloseOneThird(string sy="", int op=-1, int mn=-1) {
  double pr=0;
  int    i, k=OrdersTotal(), np=-1;

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && OrderType()==OP_BUY) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (Ask<OrderOpenPrice() && Ask==OrderStopLoss()) {
    if (OrderSelect(np, SELECT_BY_POS, MODE_TRADES)) {
      ClosePosBySelect();}
    }
  }
}
}
}
}

//+------------------------------------------------------------------+
void ClosePosBySelect() {
  bool   fc;
  color  clClose;
  double pa, pb, pp;
  int    err, it;
double ll = MathCeil(OrderLots() / 3.0 * 10.0) / 10.0;

  if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
    for (it=1; it<=5; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      pa=MarketInfo(OrderSymbol(), MODE_ASK);
      pb=MarketInfo(OrderSymbol(), MODE_BID);
      if (OrderType()==OP_BUY) {
        pp=pb; clClose=Red;
      } else {
        pp=pa; clClose=Blue;
      }
      ll=OrderLots();
      fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
      if (fc) {
        PlaySound("wave"); break;
      } else {
        err=GetLastError();
        if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
        Print(OrderTicket(),"  Ask=",pa,"  Bid=",pb,"  pp=",pp);
        Print("sy=",OrderSymbol(),"  ll=",ll,"  sl=",OrderStopLoss(),
              "  tp=",OrderTakeProfit(),"  mn=",OrderMagicNumber());
        Sleep(1000*5);
      }
    }
  } 
}
 
Sancho77:

Ho messo una funzione nel mio EA per chiudere 1/3 del lotto aperto quando lo stoploss viene attivato a breakeven, ma per qualche motivo non funziona.

Puoi dirmi cosa c'è che non va?


Probabilmente perché si calcola prima il lotto e poi

ll=OrderLots();
fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);