Problemi di controllo degli scambi aperti

 

Ciao, ho aggiunto questo al mio codice per controllare se c'è già un trade aperto. Il problema è che il codice eseguirà un solo trade e basta. Qualcuno può vedere un problema con questo codice. Non sono un super esperto di programmazione


// Controlla se ci sono operazioni aperte

for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
if(OrderSelect(cnt,SELECT_BY_POS))
{

if(OrderSymbol()==Symbol())
{
tradeopen=true;
}
else
{
tradeopen=false;
}

}

}

 
Il tuo codice raccoglierà le compravendite in sospeso e aperte, a parte questo mi sembra ok.
 

Grazie Raptor per la tua risposta rapida


Se non ti dispiace Ill allega l'intero codice, forse c'è qualcosa che ho perso altrove. Ho colpito il muro con questo al momento.

File:
daz.mq4  3 kb
 
dazamate:
Qualcuno può vedere un problema con questo codice.

  1. Nessun numero magico significa che è incompatibile con ogni altro EA e trading manuale e se stesso sulla stessa coppia/diversi timeframe.
  2. Se il primo ordine aperto non è stato quello dell'EA allora il flag è falso, anche se ha dei trade aperti.
    int TotalOrderCount(){
        int count=0;
        for(pos = OrdersTotal()-1; pos >= 0 ; pos--) if (
            OrderSelect(pos, SELECT_BY_POS)                 // Only my orders w/
        &&  OrderMagicNumber()  == magic.number             // my magic number
        &&  OrderSymbol()       == Symbol() ){              // and my pair.
            count++;
        }
        return(count);
    }

 
dazamate:

Grazie Raptor per la tua risposta rapida


Se non ti dispiace Ill allega l'intero codice, forse c'è qualcosa che ho perso altrove. Ho colpito il muro con questo al momento.

Alcuni commenti . . .

Tu dichiari i. . .

int i;

. . . ma non lo imposti da nessuna parte, cos'è i?

Tu imposti . . .

static bool tradeopen = false;

. . . poi lo controlli per vedere se puoi piazzare un trade . . . sarà sempre falso a questo punto. . . poi hai del codice più tardi che potrebbe impostarlo a vero

if(OrderSymbol()==Symbol())
    {
    tradeopen=true;
    }  

barcount è impostato a 0

static int barcount = 0;

quindi questo sarà sempre vero se hai almeno 1 barra sul tuo grafico . ..

if(Bars != barcount)

Hai bisogno di esaminare il tuo codice linea per linea . . . tutto ciò che non capisci cercalo e leggilo . . . è l'unico modo per imparare.

 

Raptor, grazie per averla esaminata. Come ho detto non sono un super esperto. Ho letto il modo in cui altre persone codificano le cose e cerco di implementarlo nel mio. Ho letto molto sulle funzioni. Diventa solo frustrante quando non funziona e non sai come diagnosticare il tuo disastro.

In risposta ai vostri commenti

int i;

Non c'è più, lo stavo usando per qualcos'altro e l'ho lasciato lì per sbaglio.


Spiegherò cosa sta succedendo nella mia testa per quanto riguarda il barcounter. Non sono ancora sicuro del perché questa parte del codice non va bene.

static int barcount = 0;  // <- First time program is run bar counter is set to 0

     if(Bars != barcount) // <-  This will be true so the if statement is allowed to run
    
       {      
         if(iBarHour == iOpenHour)
                {
                //If statement
    
                }
         barcount=Bars ; // <- At the end of the if statement, the bar counter is set to Bars so that this if statement will not be true
                         //    again until another bar opens
       }

Per quanto riguarda il controllo per vedere se ci sono operazioni aperte sulla coppia...

static bool tradeopen = false;                // First time program is run tradeopen is set to false. I use the static in front 
// because if I don't the programming will keep setting this to false because an ea or   // a program is just a giant loop is it not. However I should set this to true because // the ea should assume there is a trade open until it does it checks that would // probably be the more smarter approach.       for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)         {           if(OrderSelect(cnt,SELECT_BY_POS)) // <- So it scans each open and pending trade             {                           if(OrderSymbol()==Symbol()) // <- Checks to see if any of them trades are the same as the pair the ea is using                {                 tradeopen=true; // If so then set tradeopen to true                }                        else                {                 tradeopen=false; // If not set trade open to false                }                          }                         }

Così alla fine dell'ea fa questo controllo per vedere se c'è un trade aperto sulla coppia corrente o no. Imposta tradeopen a true o false. È un problema che questo pezzo di codice sia usato alla fine dell'EA?

Inoltre un altro problema che non riesco a capire...

int iBarHour;
iBarHour = TimeHour(TimeCurrent());
Print(iBarHour);
Perché iBarHour restituisce sempre 1? Voglio che restituisca l'ora corrente :(


WHRoeder


Ha importanza se l'EA usa un numero magico o no. Non può semplicemente controllare tutte le operazioni aperte e in sospeso e se qualcuna di esse è la coppia corrente?


Ancora una volta ragazzi, so di essere un novellino, ma tutti i vostri suggerimenti sono apprezzati, so che probabilmente verrò di nuovo criticato per la mia codifica poco chiara :P


Grazie

 
dazamate:

Vi spiegherò cosa sta succedendo nella mia testa per quanto riguarda il barcounter. Non sono ancora sicuro del perché questa parte del codice non va bene.

Scusate, probabilmente sto mostrando la mia ignoranza sull'uso delle variabili statiche. . . Io uso invece le variabili globali e tutto ciò che voglio impostare all'inizializzazione del codice lo metto nella funzione init. https://docs.mql4.com/basis/functions/special

Se state eseguendo questa parte del codice durante il fine settimana non cambierà, usa l'ora del server e questa si aggiorna ad ogni tick.

int iBarHour;
iBarHour = TimeHour(TimeCurrent());
Print(iBarHour);

Supponendo che questo codice funzioni, allora dDayOpenPrice sarà impostato solo mentre iBarHour = 6, quando iBarHour = 7 dDayOpenPrice non sarà più impostato al valore corretto. Se fai di dDayOpenPrice un globale, il suo valore sarà salvato durante l'esecuzione del codice (renderlo statico funzionerà probabilmente anche questo). Se il codice viene riavviato, non accadrà nulla fino al giorno successivo... non fino alla barra delle 6 del mattino.

WHRoeder

Ha importanza se l'EA usa un numero magico o no. Non può semplicemente controllare tutte le operazioni aperte e in sospeso e se qualcuna di esse è la coppia corrente?

Se hai un solo EA su un solo grafico e non fai trading manuale... allora probabilmente puoi fare a meno di usare un numero magico, ma è buona pratica usarlo, prima fai funzionare il tuo codice e poi implementa un numero magico, ti aiuterà ad imparare.

 

RaptorUK grazie ancora una volta.


Faccio il backtest dell'ea per vedere se il codice funziona e Print() la variabile per vedere cosa succede in esse per aiutare il debug del codice. Il codice ibarhour sembra funzionare correttamente, solo che non è stato mostrato correttamente nel backtest perché l'ho impostato per stampare costantemente il valore di ibarhour che non può visualizzarlo abbastanza velocemente come il codice lo sputa fuori così il backtester si inceppa. C'è forse un modo per mettere un ritardo nel codice di stampa?



Inoltre sì, voglio che memorizzi il valore dell'apertura della barra 06:00 :)


Ho riorganizzato il codice, e sono fiero di me stesso, ho fatto in modo che fosse in grado di controllare se l'ea aveva aperto qualche trade sulla coppia corrente. Ho usato l 'esempiodiWHRoeder e l'ho trasformato in una funzione separata :) e ho ottenuto che la funzione restituisse true o false. Evviva.



Dato che sei ovviamente un'élite nel campo della codifica degli EA. Quante storie di successo hai sentito da persone che creano i propri EA? Ho sentito/visto solo brutte storie.











 
dazamate:

Dato che sei ovviamente un'élite nel campo della codifica degli EA. Quante storie di successo hai sentito da persone che creano i propri EA? Ho sentito/visto solo brutte storie.











LOL . . il tuo commento dovrebbe essere diretto a WHRoeder non a me, lui è un codificatore molto, molto più abile di me, dai un'occhiata ad alcuni dei suoi post recenti al codice che ha condiviso, puoi imparare molto dalla comprensione del suo codice, io so di averlo fatto, grazie WHRoeder :-).

Frequento questo posto perché mi piace cercare di aiutare le persone ad aiutarsi... e nel frattempo imparo qualcosa.

Per avere un EA di successo hai bisogno prima di tutto di un metodo di successo...quanti ce ne sono? Molte cose funzionano per un breve periodo di tempo, alcune cose funzionano per un mese o due, pochissime funzionano costantemente. Anche se qualcuno ha un buon metodo (come potrebbe saperlo senza test adeguati non lo so), generalmente non ha la conoscenza o la capacità di trasformarlo in un EA valido. Chiunque abbia un EA valido difficilmente pubblicizzerà il fatto, lo userà e farà soldi...

Mi fa piacere sentire che stai facendo progressi . . . per quanto riguarda il tuo problema di stampa, potresti usare Comment(iBarHour); invece, viene emesso sullo schermo nell'angolo in alto a sinistra.

 
  1. Prego. "Per imparare qualcosa, pratica. Per padroneggiare, insegna".
  2. Bars è inaffidabile (una volta raggiunto il massimo di barre sul grafico non cambierà e il codice si rompe). Volume[0]==1 è inaffidabile, se si perde un tick il codice si rompe. Usa sempre il tempo.
    int start(){
       static datetime Time0;
       if (Time0 == Time[0]) return; Time0 = Time[0];
       // A new bar has started.

  3. probabilmente mostrando la mia ignoranza sull'uso delle variabili statiche . . . Io uso invece le variabili globali e tutto ciò che voglio impostare all'inizializzazione del codiceSe
    la variabile deve essere inizializzata allora deve essere globale. Se la variabile è condivisa tra due o più funzioni, allora deve essere globale. Altrimenti definiscila locale alla funzione, statica se necessario.
  4. Ha importanza se l'EA usa un numero magico o no.
    Probabilmente avrete tutto funzionante, poi aprirete un altro grafico per testare lì e poi improvvisamente tutto fallisce. Fallo bene dall'inizio. Nel mio codice, controllo sia il numero magico che la coppia, nel caso lo mettessi su un altro grafico, ma non cambio il numero magico.
 

Hai ragione Raptor... Scusa WHRoeder che è stato scortese non ti ringrazio sono bene. Beh, questo è l'inizio di un enorme progetto per me, quindi spero davvero che a voi ragazzi non dispiaccia che io vi infastidisca.


int start(){
   static datetime Time0;
   if (Time0 == Time[0]) return; Time0 = Time[0];
   // A new bar has started.

WHRoeder, Questo codice sembra così semplice ma non riesco a capire nella mia testa come funziona, la dichiarazione if non sarà sempre vera se rende time0 uguale a time[0] ogni volta che time0 è uguale a time[0]? Non dico che non funzioni, ma non capisco come funziona strutturato in questo modo.


Altre 2 domande.

Come potrei fare un contatore dove se un ordine pendente viene piazzato e non viene attivato entro x barre, allora deve essere cancellato? Tutto quello che posso fare è mettere un contatore per contare ogni volta che si forma una nuova barra e se la quantità di barre contate == le barre consentite specificate prima che gli ordini in sospeso vengano cancellati. Il contatore di barre viene azzerato ogni volta che viene aperto un nuovo ordine pendente? Come vi sembra?

Prossima domanda.

Questo non ho idea di come procedere.

Voglio fare una funzione che analizza eurusd, usdchf, gbpusd, usdjpy su 1hr tf. Va indietro all'ultima candela delle 06:00 gmt e registra l'apertura, va indietro di altre 24 barre alla candela precedente delle 06:00 gmt e registra l'intervallo 6gmt -6gmt per ogni coppia. Poi confronta il range 6gmt - 6gmt di tutte le coppie e restituisce quello che è il più alto. E' possibile per un ea fare questo dall'essere collegato ad un grafico a tempo?


Grazie ancora per la vostra conoscenza ragazzi e per i vostri pazienti