Caratteristiche utili da KimIV - pagina 113

 
togomsk:


Ciao!

Per qualche ragione, quando la tua libreria è collegata, l'operatore extern smette di funzionare, cioè le variabili sono definite, tutto si compila normalmente, e in linea di principio, l'EA funziona, ma allo stesso tempo, l'EA non ha alcun parametro all'avvio del tipo, anche se ci sono parecchi parametri. Quale può essere la ragione di questo?


Trova nel codice

#property library

E cancellare.

 

Ho aggiunto una variabile j a questa funzione, per la penultima transazione.

double GetProfitLastClosePos(string sy="", int op=-1, int mn=-1, int j=0) {
datetime o;
doppio p=-1;
int i, k=OrdersHistoryTotal();

if (sy=="0") sy=Symbol();
per (i=0; i<k; i++) {
se(OrderSelect(i-j, SELECT_BY_POS, MODE_HISTORY)) {
se (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
se (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
se (o<OrderCloseTime()) {
o=OrderCloseTime();
p=OrderProfit();
}
}
}
}
}
}
}
ritorno(p);
}
 
abdul1:

Ho aggiunto una variabile j a questa funzione per i penultimi scambi.

Se consideriamo che gli ordini che sono stati chiusi sono considerati in OrdersHistoryTotal() secondo il tempo di chiusura da destra -> sinistra (l'ultimo a destra):

double GetProfitLastClosePos (string sy="", int op=-1, int mn=-1,
                              int j=0)          // Искомый (по номеру) ордер от последнего закрытого 
{
    int k = OrdersHistoryTotal(), li_cnt = 0;
//----
    if (sy == "0" || sy == "") sy = Symbol();
    for (int i = k - 1; i >= 0; i--)
    {
        if (!OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) continue;
        if (OrderSymbol() != sy) continue;
        if (OrderType() > 1) continue;
        if (op >= 0) if (OrderType() != op) continue;
        if (mn >= 0) if (OrderMagicNumber() != mn) continue;
        if (j == li_cnt) return (OrderProfit());
        li_cnt++;
    }
//----
    return (-1.0);
}

La funzione restituisce il profitto j-esimo dell'ultimo ordine chiuso, "filtrato" per simbolo, magik, tipo. E i numeri sono contati a partire da 0.

 
TarasBY:

Se teniamo conto che gli ordini chiusi sono contati in OrdersHistoryTotal() per tempo di chiusura da destra -> sinistra (l'ultimo estremo a destra):

La funzione restituisce il profitto j-esimo dell'ultimo ordine chiuso, "filtrato" per strumento, Magik, tipo. E i numeri sono contati a partire da 0.

Ecco di cosa ho bisogno!
 

Ciao a tutti.

Necessitava di una funzione per chiudere gli ordini di acquisto e di vendita di lotti uguali con i controordini, quando il loro profitto va a +. Ho provato a fare questa funzione, ma esce l'errore 4108 (biglietti sbagliati)

Puoi dirmi qual è il problema?

//+------------------------------------------------------------------+
int fCloseBu(){
        // Закрываем встречные
  double LotB,LotS,PrB=0,PrS=0;
  int TicketB,TicketS,i, k=OrdersTotal();

  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==Symbol() || Symbol()=="")) {
        if (Magic_N<0 || OrderMagicNumber()==Magic_N) {
        //----------
        if(OrderType()==OP_BUY){
          if (PrB<OrderProfit()+OrderSwap()+OrderCommission()) {
            PrB=OrderProfit()+OrderSwap()+OrderCommission();
            LotB=OrderLots();
            TicketB=OrderTicket();
          }
        }
        if(OrderType()==OP_SELL){
          if (PrS<OrderProfit()+OrderSwap()+OrderCommission()) {
            PrS=OrderProfit()+OrderSwap()+OrderCommission();
            LotS=OrderLots();
            TicketS=OrderTicket();
          }
        }
       if (PrB>0 && PrS>0 && LotB==LotS) {
          OrderCloseBy(TicketB,TicketS,CLR_NONE);
          Print("Закрываем пару встречных ордеров c одинаковыми лотами в плюсе");
          }  
        }
      }
    }
  }
//-------------
   return(0);
}
//+------------------------------------------------------------------+
 
Gli ordini dovrebbero essere chiusi quando l'intero ciclo di controlli è fatto, cioè dopo l 'istruzione for, non dentro.
 
Potete consigliarmi dove posso trovare un EA che lavori sull'incrocio di una media mobile con la possibilità di spostare la media mobile nelle impostazioni?
 
Roger:
Gli ordini dovrebbero essere chiusi quando l'intero ciclo di controlli è fatto, cioè dopo l'istruzione for, non dentro.


Grazie! Se qualcun altro ha bisogno di una tale funzione, sarà così:

//+------------------------------------------------------------------+
//|    Закрываем встречные                                           |
//+------------------------------------------------------------------+
int fCloseBu(){
  double LotB,LotS,PrB=0,PrS=0;
  int TicketB,TicketS,i, k=OrdersTotal();

  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==Symbol() || Symbol()=="")) {
        if (Magic_N<0 || OrderMagicNumber()==Magic_N) {
        //----------
        if(OrderType()==OP_BUY){
          if (PrB<OrderProfit()+OrderSwap()+OrderCommission()) {
            PrB=OrderProfit()+OrderSwap()+OrderCommission();
            LotB=OrderLots();
            TicketB=OrderTicket();
          }
        }
        if(OrderType()==OP_SELL){
          if (PrS<OrderProfit()+OrderSwap()+OrderCommission()) {
            PrS=OrderProfit()+OrderSwap()+OrderCommission();
            LotS=OrderLots();
            TicketS=OrderTicket();
             }
           }
         }
       }
     }
   }//for
   if(PrB>0 && PrS>0 && LotB==LotS) {
     OrderCloseBy(TicketB,TicketS,CLR_NONE);
     Print("Закрываем пару встречных ордеров c одинаковыми лотами в плюсе");
  }
//-------------
   return(0);
}
//+------------------------------------------------------------------+
 
Ci sono dei video tutorial su questa lingua?
 
Andrei5:
Ci sono dei video tutorial su questa lingua?
C'è un libro, puoi leggerlo online o scaricarlo sul tuo computer. Guarda sopra -> "Tutorial".