[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 970

 
Vinin:

Grazie.
 
AlexSTAL:
avvertenze

La mia lingua madre è l'ucraino. Ma grazie per l'attenzione.
 

Aiuto! Se ho 2 ciondoli impostati e uno di essi viene chiuso da Take Profit, ho bisogno che il 2° venga cancellato. Come lo scrivo? Dov'è l'errore nel codice?

int pos;
for (pos=0; pos<OrdersTotal(); pos++)
{
if (OrderSelect(pos, SELECT_BY_POS))
{
if (OrderClosePrice() >= OrderTakeProfit())
{
int i;
for (i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS))
{
if (OrderDelete(OrderTicket()))
{
Print("Ордер удален");
       }
      }
     }
    }
break;
   }
  }
 }
return(0);
}
 

Buona sera (ho dimenticato di salutare nei post precedenti). Potete consigliarmi quale funzione usare per fare quanto segue. Nell'Expert Advisor viene aperto un ordine dall'indicatore sulla candela corrente (che sia numero = 9). Se dopo l'ordine di apertura, esso (l'indicatore) ridisegna (e dopo la candela di chiusura 9 non è apparso), allora ho bisogno di DOPO la candela di chiusura 9 ordine chiuso.

 

Ci sono parametri di ingresso:

bool Mart - se vero, significa che c'era un ordine chiuso su stop, quindi fare doppio.

TradeInf - permesso di commercio, se vero, significa che non ci sono ordini scambiati e possiamo commerciare)

C'è il seguente codice:
if (Mart == true && TradeInf==true)
{
Alert("raddoppia il lotto");
LotS=NormalizeDouble(LotS*martin,2);
Alert("dimensione del lotto",LotS);
}
if (Mart == false && TradeInf==true)
{
Alert("Azzera lotto");
LotS=lot;
}

Poi nei comandi OpenOrder, dimensione del lotto = LotS.

Quindi se trova un lotto chiuso per lotto, la dimensione del lotto diventa -9315605757223323600
perché? Qual è la ragione?

 

Salve, sto calcolando un lotto da un valore di equilibrio secondo un principio diverso...

Mi ritrovo con un numero come 0,2345, come faccio a tagliare il doppio senza arrotondare, voglio dire:

a una cifra - 0,2

a due cifre - 0,23

a tre - 0,234 e così via...

 
akacuk21:

Salve, sto calcolando un lotto da un valore di equilibrio secondo un principio diverso...

Mi ritrovo con un numero come 0,2345, come faccio a tagliare il doppio senza arrotondare, voglio dire:

a una cifra - 0,2

a due cifre - 0,23

a tre - 0,234 ecc...


double lot = NormalizeDouble(LOT,2)

lotto - per effettuare ordini

LOT - formula per il calcolo dell'ordine

"2" - arrotondamento a 2 cifre decimali.

 
Grazie per la risposta, ma nel caso di NormalizeDouble, un numero come 0,29 arrotondato a una cifra sarà 0,3 e ho bisogno che sia 0,2
 
È contro le regole dell'arrotondamento, quindi aspettiamo di sentire cosa hanno da dire gli anziani.
 
Sys15975382:
È contro le regole di arrotondamento, aspettiamo quello che hanno da dire i compagni più anziani.

Uh... Signori. Non si possono normalizzare tante cose così... :) Ecco un piccolo aiuto:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления          (   False    - в меньшую,               |
//|                                        True     - в большую сторону)       |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//+----------------------------------------------------------------------------+
double NormalizeLot(double lo, bool ro=False, string sy="") {
  double l, k;
  if (sy=="" || sy=="0") sy=Symbol();
  double ls=MarketInfo(sy, MODE_LOTSTEP);
  double ml=MarketInfo(sy, MODE_MINLOT);
  double mx=MarketInfo(sy, MODE_MAXLOT);

  if (ml==0) ml=0.1;
  if (mx==0) mx=100;

  if (ls>0) k=1/ls; else k=1/ml;
  if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;

  if (l<ml) l=ml;
  if (l>mx) l=mx;

  return(l);
}


Motivazione: