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

 
hoz:

Capisco quello che c'è. Ma non è chiaro perché sia implementato in questo modo.

Ogni singola funzione di libreria è parte del tutto, e una singola libreria è parte dell'intero complesso delle mie librerie - senza questa consapevolezza è impossibile capire il codice.

hoz:

Non puoi comunque usare le tue librerie nella loro forma originale, cioè hai tutto legato lì. Ogni funzione sul pacco degli altri...

Ed è qui che ti sbagli. Avete mai pensato alla struttura di un EA "medio"? Ciò che rende un EA individuale sono le condizioni della strategia (cioè le condizioni di entrata/uscita), e tutto il resto è codice standard. Il modo in cui creo gli EA, compresi quelli basati su ordini: prendo un modello (per esempio, SAR, se è necessario un EA di rete) e vi collego una libreria aggiuntiva in cui sono scritte le condizioni di una nuova strategia (la ricreo).

hoz:

Non ho voluto controllare in nessun modo. Ancora di più, non c'è dubbio che tutto è scritto in modo molto competente. Solo che non capisco bene tutto, quindi ho detto che non credo. Guardo, penso... Ma non capisco tutto. Ecco perché ho chiesto.

P.S. Con bs_Symbol continuo a non capire.

Per capire l'implementazione, è necessario capire i dati di origine. Le librerie sono state create con la capacità di lavorare con qualsiasi strumento (forex) e sia in modalità mono che multicurrency, da qui l'introduzione della variabile globale bs_Symbol, che contiene il valore dello strumento corrente.
 
IIya:

Amici, ho bisogno di aiuto per mettere a punto un EA.

C'è del codice che apre un ordine sotto certe condizioni if. L'esecuzione della condizione può avvenire ad ogni tick perché è posta nel corpo di int start().

Abbiamo bisogno di:

1. Dopo l'esecuzione della condizione (e l'apertura di un ordine), pausa per l'apertura di nuovi ordini, pausa per n barre. Per esempio, se l'EA è su timeframe M30 e ho bisogno di mettere in pausa per 3 ore, la pausa dovrebbe essere di 6 barre.

2. Questo programma dovrebbe funzionare nel tester di strategia.

Quale codice è necessario? E quale sarebbe il posto giusto dove metterlo.

La funzione iBarShift() vi aiuterà. Per prima cosa, dovete trovare l'ora dell'ultima apertura dell'ordine e passarla a questa funzione, e poi monitorare il valore restituito da questa funzione confrontandolo con un certo numero (nel vostro caso 6).
 
TarasBY:
La funzione iBarShift() vi aiuterà. Per prima cosa, dovete trovare l'ora dell'ultima apertura dell'ordine e passarla a questa funzione, e poi monitorare il valore restituito da questa funzione confrontandolo con un certo numero (nel vostro caso, 6).

Risolviamo la cosa insieme )

Passiamo il tempo dell'ultima apertura dell'ordine a questa funzione e otteniamo il numero restituito. Questo è approssimativamente:

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
int my_bar = iBarShift(NULL,PERIOD_M30,OrderOpenTime()); 

Ok, abbiamo il numero del bar. Ora come facciamo a mettere in pausa gli ordini aperti per 6 barre?

 
IIya:

Risolviamo la cosa insieme )

Passiamo il tempo dell'ultima apertura dell'ordine alla funzione, e otteniamo che il numero restituito sia approssimativo:

Ok, abbiamo il numero del bar. Ora come facciamo a mettere in pausa gli ordini aperti per 6 barre?

Questo è un approccio analfabeta:

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);

Ma poiché non è direttamente rilevante per questo caso, non ci concentriamo su di esso. Lo schema si presenta così:

    if (my_bar >= 6)
    {
        OrderSend();
    }
 
TarasBY:
Non ci sono errori evidenti nella logica. Stampa il codice passo dopo passo. La procedura di scambio è legata al valore della variabile ticket. Prima di tutto, traccia i suoi cambiamenti. Fate anche attenzione al valore della variabile globale "TRADECONTEXT" - il suo valore deve essere 0.

Grazie! Non ci capisco niente(((, sono come un gattino cieco in questi codici((((...
 
al7bar:

Grazie! Ma non capisco niente(((, sono come un gattino cieco in questi codici((((...
Si scopre che non sei l'autore di questo codice. Allora è più facile contattare l'autore.
 
TarasBY:

Ogni singola funzione di libreria è parte del tutto, e ogni singola libreria è parte dell'intero complesso delle mie librerie - senza questa consapevolezza è impossibile capire il codice.

Sto cercando di capirlo e mi imbatto in ogni sorta di sfumature. È per questo che lo chiedo a te, perché tu lo sai meglio di me. Tu sei l'autore...

TarasBY:

Ed è qui che ti sbagli. Avete mai pensato alla struttura di un Expert Advisor "medio"? Ciò che rende un EA individuale sono le sue condizioni di strategia (cioè le condizioni di entrata/uscita), e tutto il resto è codice standard. Il modo in cui creo Expert Advisors, compresi quelli basati su ordini: prendo un modello (per esempio, SAR, se è necessario un EA di rete) e collego ad esso una libreria aggiuntiva in cui sono scritte le condizioni di una nuova strategia (la ricreo).

Lo capisco. Solo che non voglio copiare l'intera libreria. Lei capisce che è più conveniente creare una fondazione, con la quale sarà conveniente lavorare personalmente.

TarasBY:

Per capire l'implementazione, è necessario capire i dati iniziali. Le librerie sono state create con la possibilità di lavorare con qualsiasi strumento (Forex) e sia in modalità mono che multicurrency, quindi, è stata introdotta la variabile globale bs_Symbol, che contiene il valore del simbolo corrente.

E dove viene impostata esplicitamente questa variabile, se non è un segreto? :) Vedo nella libreriab-PSI@Base.mqh che è solo dichiarato:

 bs_Symbol,                            // текущий инструмент

Ma non c'è niente di più in effetti. In ogni caso, il valore dello strumento corrente è restituito di default attraverso Symbol(). Allora perché abbiamo bisogno di una variabile qui?

 
TarasBY:

Questo è un approccio analfabeta:

Ma, dato che non è direttamente rilevante per questo caso, non ci concentriamo su di esso. E lo schema si presenta così:

Ora il nostro codice funziona. Nella mia versione, funziona così:
int start()
  {
   if (OrdersTotal()<1)                                                //условие
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
      }
   OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
   int my_bar = iBarShift(NULL,PERIOD_M30,OrderOpenTime()); 
   if (my_bar > 6)                                                     //если прошло 6 баров с момента открытия последнего ордера
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);      //открываем новый ордер
      }
   return(0);
  }

:) Ma se viene introdotto nell'Expert Advisor come è ora, tutto inizia a funzionare in modo errato.

Per quanto ho capito, è dovuto a questa voce:

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);

Cosa c'è che non va?

 
Ciao a tutti. si prega di rispondere a tutti coloro che possono creare uno script che aumenta i lotti all'apertura della transazione. dettagli scrivere in un personale. garanzia di retribuzione nella soddisfazione del compito
 
IIya:
Ora il nostro codice funziona. Nella mia versione, funziona così:

:) Solo che se viene implementato nell'EA come è ora, allora tutto inizia a funzionare in modo errato.

Capisco grazie a questa voce:

Cosa c'è che non va?

Io ho solo abbozzato uno schema, mentre il vostro compito era quello di pensare alla logica ulteriore:

int start()
{
   if (OrdersTotal()<1)                                                //условие
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
      }
   else
   {
       OrderSelect (OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
       int my_bar = iBarShift (NULL,PERIOD_M30,OrderOpenTime()); 
       if (my_bar >= 6)                                                     //если прошло 6 баров с момента открытия ордера
       {OrderSend (Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);}      //открываем новый ордер
   }
   return(0);
}
Motivazione: