Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1598

 
Maxim Kuznetsov:

solo per aggiungere, NON è GARANTITO che il terminale abbia e dia una storia sufficiente.

nell'esempio precedente non c'è alcun riferimento alla storia

quindi è garantito che il risultato di OrderSelect() sia vero

UPD: OrderSelect in 4 funziona molto bene, provato una volta - per gli ordini a mercato il tempo di accesso alle proprietà dell'ordine.... è davvero milioni di volte al secondo, non voglio cercarlo, penso che stavo discutendo con il moderatore Artem, ma come si dice "tutte le punte sono diverse", mi piace - tienilo

 

Salve, c'è bisogno di dati sul prelievo di ogni transazione.

Qualcuno può incontrare uno script per raccogliere tali statistiche e produrre un output sotto forma di rapporto?

Grazie

 
законопослушный гражданин:

Salve, c'è bisogno di dati sul prelievo di ogni transazione.

Qualcuno può incontrare uno script per raccogliere tali statistiche e produrre un output sotto forma di rapporto?

grazie

for(int i=OrdersTotal()-1;i>=0;i--) {

   if (!OrderSelect(i,SELECT_BY_POSITON,MODE_TRADES)) continue;

   double prosad=DBL_MIN;

   if (OrderType()!=OP_BUY && OrderType!=OP_SELL) continue;

   for(int j=iBarShift(OrderSymbol(),OrderOpenTime(),PERIOD_M1); j>=0;j--) {

      double delta=( OrderType()==OP_BUY? OrderOpenPrice()-iLow(OrderSymbol(),PERIOD_M1,j) : iHigh(OrderSymbol(),PERIOD_M1,j)-OrderOpenPrice() );

      delta /= MarketInfo(OrderSymbol(),MODE_POINT);

      if (delta>prosad) prosad=delta;

   }

  PrintFormat("Максимальная просадка по ордеру %d = %d пунктов , %f денег",OrderTicket(),(int)(prosad),prosad*OrderLots()*MarketInfo(OrderSymbol(),MODE_TICKVALUE);

}

è "scritto a mano", non testato, pieno di bug :-) basta modificarlo secondo le proprie esigenze e usarlo

 
Maxim Kuznetsov:

for(int i=OrdersTotal()-1;i>=0;i--) {

   if (!OrderSelect(i,SELECT_BY_POSITON,MODE_TRADES)) continue;

   double prosad=DBL_MIN;

   if (OrderType()!=OP_BUY && OrderType!=OP_SELL) continue;

   for(int j=iBarShift(OrderSymbol(),OrderOpenTime(),PERIOD_M1); j>=0;j--) {

      double delta=( OrderType()==OP_BUY? OrderOpenPrice()-iLow(OrderSymbol(),PERIOD_M1,j) : iHigh(OrderSymbol(),PERIOD_M1,j)-OrderOpenPrice() );

      delta /= MarketInfo(OrderSymbol(),MODE_POINT);

      if (delta>prosad) prosad=delta;

   }

  PrintFormat("Максимальная просадка по ордеру %d = %d пунктов , %f денег",OrderTicket(),(int)(prosad),prosad*OrderLots()*MarketInfo(OrderSymbol(),MODE_TICKVALUE);

}

scritto "a mano", non controllato, pieno di errori :-) adattati alle tue esigenze e usa

Grazie, cercherò di capirlo!

 
@Igor Makanu, grazie mille per le tue risposte sull'ordinamento degli ordini nel terminale. Probabilmente li salverò come array di strutture e li ordinerò io stesso. I miei dubbi erano principalmente perché temevo che tali azioni eseguite ad ogni tick avrebbero avuto un notevole impatto negativo sulle prestazioni.
 
Janis Ozols:
@Igor Makanu, grazie mille per le tue risposte sull'ordinamento degli ordini nel terminale. Probabilmente li salverò come array di strutture e li ordinerò io stesso. I dubbi erano principalmente perché temevo che tali azioni eseguite ad ogni tick avrebbero avuto un notevole impatto negativo sulle prestazioni.

Allora perché ordinare ad ogni spunta? Basta solo quando il numero di voci cambia o la lista cambia completamente...

 
Buon pomeriggio Vi prego di aiutarmi a capire perché l'indicatore scaricato dal navigatore non viene trascinato sul grafico. È nel catalogo.
File:
image002.jpg  38 kb
 
Pomeriggio. Se non c'è un caricamento automatico dello strumento indicatore dal mercato nelterminale di trading, qual è il problema?
 
Igor Makanu:

nell'esempio precedente non c'è alcun riferimento alla storia

quindi è garantito che il risultato di OrderSelect() sia vero

UPD: OrderSelect in 4 funziona molto bene, lo stavo testando una volta - per gli ordini a mercato il tempo di accesso alle proprietà dell'ordine.... è davvero milioni di volte al secondo, non voglio cercarlo, penso che stavo discutendo con il moderatore Artem, ma come si dice "tutte le punte sono diverse", mi piace - tienilo

Il moderatore Artem non sta discutendo. Il moderatore Artem sta discutendo :)
 
void OnTick()
  {
    if(isCrossing() == 1)          
      
    ... 

    if(isCrossing() == 2)
      
    ... 
  }

int isCrossing(){  
  double ma = iMA(NULL, g_timeFrame, g_maPeriod, g_maShift, g_maMethod, g_maApplietPrice, 0);
  double low = iLow(Symbol(), g_timeFrame, 0);
  double high = iHigh(Symbol(), g_timeFrame, 0);

  if(g_barTime < iTime(NULL,g_timeFrame,0) && high > ma && Bid <= ma){
    g_barTime = iTime(NULL,g_timeFrame,0);
    return 1;
  } 
  
  if(g_barTime < iTime(NULL,g_timeFrame,0) && low < ma && Bid >= ma){
    g_barTime = iTime(NULL,g_timeFrame,0);
    return 2;
  }
   
  return 0;
}
Perché isCrossing() non restituisce 2? La stessa isCrossing() ha una seconda voce if, ma poi non c'è nessuna voce if in OnTick() quando isCrossing() == 2. Cos'è questa sciocchezza...
Motivazione: