Caratteristiche utili da KimIV - pagina 89

 
È possibile aggiungere nel vostro Expert Advisor e-CloseByPercentProfit.mq4 per impostare TP e SL sulla coppia nel grafico in cui è installato?
 

Buon pomeriggio a tutti.

Domanda sulla funzione


//+------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                        |
//|  Описание : Возвращает количество позиций.      |
//+------------------------------------------------------------------+

int NumberOfPositions(string sy="", int op=-1, int mn=-1){
  int i, k=OrdersTotal(), kp=0;  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++)                                    {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()== sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op)                   {
            if ( mn<0 || OrderMagicNumber()== mn) kp++;
          }}}}}  return( kp);}  
          

Ho una controparte multivaluta. Le coppie sono impostate in parametri esterni. Con il proprio mago (per ogni coppia).

Tra le condizioni di entrata per ogni strumento c'è questa:
if ( NumberOfPositions(Symbol_1, -1,Magic_1)<1){//если нет открытых
//позиций по 1-му инструменту, 
O (per la seconda coppia)
if ( NumberOfPositions(Symbol_2, -1,Magic_2)<1){//если нет открытых
//позиций по 2-му инструменту, проверяем ОСТАЛЬНЫЕ условия

Quello che è successo è che ho caricato entrambi i simboli ieri - EURUSD, e questa mattina ho trovato che solo un trade si è aperto, anche se sembravano esserci segnali in entrambi i casi.

E poi mi è venuto in mente. Che la funzione

NumberOfPositions(string sy="", int op=-1, int mn=-1)
Prima controlla se c'è una posizione aperta per un simbolo. E poi tutto il resto.

In altre parole, se ho una posizione aperta con l'EA per lo strumento EIRUSD, la seconda posizione non si aprirà nemmeno con un altro mago secondo un algoritmo diverso.

Per favore, ditemi se è vero o no?

O mi sbaglio nel mio ragionamento? O la funzione valuta tutti i criteri unoper uno ...


 

Uso spesso questa funzione, restituisce tutto secondo i parametri di input. Gli elementi che la funzione attraversa sono ordinati in modo sequenziale secondo i parametri. Guardate voi stessi.

int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()== sy || sy=="") { //далее внутри символа
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) { //далее внутри типа ордера
            if ( mn<0 || OrderMagicNumber()== mn) kp++; //внутри магика, и только здесь позиция учтена 
          }
        }
      }
    }
  }
  return( kp);
}
 

Quindi significa che il mio EA non sarà in grado di aprire una seconda posizione EURUSD, anche con un altro mago, finché la prima posizione è aperta?

A quanto pare sì. Perché anche nel tester non sembra vedere nessuna posizione sovrapposta.

//--------------------------------------------------------

 
Rita >> :

Quindi, significa che il mio EA non sarà in grado di aprire la seconda posizione EURUSD anche se ha un altro mago, mentre la prima posizione è aperta?

Esattamente il contrario :)) Significa che la funzione conta i vostri simboli e numeri magici separatamente. Cioè, se c'è una posizione aperta su EURUSD c Magic_1, allora NumberOfPositions("EURUSD", -1, Magic_2)==0; a meno che non ci sia un'altra posizione su EURUSD con Magic_2, ovviamente.

In generale, la funzione conta le posizioni aperte secondo (sy && op && mn), cioè le posizioni saranno contate esattamente con questi parametri. Se non c'è corrispondenza di almeno un parametro, l'ordine non sarà preso in considerazione da questa funzione, e non sarà visibile.

Stampate i valori della funzione in Comment e potrete vedere in tempo reale il numero di ordini e se la funzione funziona correttamente. Molto probabilmente la ragione del malfunzionamento dell'algoritmo è nel codice EA.

 
Ok. Ora controllo il codice.
 
hope писал(а) >>

Aggiungere un binding al simbolo nella chiamata di funzione non aiuta. Perché conta il profitto per ogni posizione separatamente (immagine sopra)?

No, preferisco offrirti il mio disegno...

...e un copione...

 
KimIV писал(а) >>

No, preferisco offrirti il mio disegno...

...e un copione...

Ho capito che sono uno stupido... Non si possono ottenere mammelle aggiungendo manzo e latte.

 
KimIV писал(а) >>
Angela, il compilatore non si aspettava di trovare la definizione della mia funzione proprio in questo posto. Questo significa che da qualche parte sopra il codice manca qualcosa. Può essere un punto e virgola o una parentesi graffa di chiusura. Comunque, controlla il codice con attenzione.

Ho capito, ho solo inserito la tua funzione dentro int start(), quando l'ho messa fuori da int start(), tutto si è compilato. Il problema è diverso, nell'indicatore in modalità visualizzazione nel tester questa funzione non ottiene i dati dall'EA all'indicatore.

 
e-News-Lucky$.mq4

Lucky$ & KimIV

http://www.kimiv.ru

Ciao Igor!

Uso il vostro Expert Advisor, è molto buono, ho provato ad allegare l'indicatore attraverso iCustom ieri ma non l'ha visto, come prescrivere attraverso iCustom? Mi chiedo quali funzioni build-in come iHigh, iLow lo vedono senza problemi, ma si rifiuta di piazzare ordini pendenti tramite indicatore.

L'ho messo così per iHigh e iLow della barra del giorno. Questa funzione funziona come previsto, piazza ordini pendenti, ma non vuole piazzare ordini pendenti con l'indicatore(((.... Vorrei mostrare il frammento di codice su come piazzare ordini pendenti dall'indicatore in questo EA? L' indicatore può essere tutto tranne una chiamata alla funzione iCustom.

Se avete un po' di tempo, grazie.

//глобальные переменные

double Hi_Bar;
double Lou_Bar;

//+------------------------------------------------------------------+
//| Установка ордеров                                                |
//+------------------------------------------------------------------+
void SetOrders() {
  Hi_Bar  = iHigh(Symbol(), PERIOD_D1, 0);
  Lou_Bar =  iLow(Symbol(), PERIOD_D1, 0);
  double ldStop=0, ldTake=0;
  int    spr=MarketInfo(Symbol(), MODE_SPREAD);
  double pAsk= Hi_Bar+( DistanceSet+ spr)*Point;
  double pBid= Lou_Bar- DistanceSet*Point;


Motivazione: