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

 

Ciao, potresti dirmi perché non funziona? Nessun errore, ma gli ordini non si aprono nel tester. Sto cercando di scrivere un EA per il breakout del massimo e del minimo di una candela giornaliera come strumento di allenamento.


extern int      TimeCandle   = 1440;      //таймфрейм свечи, которую пробиваем 
extern int      HourStart=10; // час начала торговли
extern double   Lots=0.1;     // лот торговли   
extern int      StopLoss=100; // стоплосс
extern int      TakeProfit=100; // тайкпрофит
extern int      znak=5;     // количество знаков котировки
extern int      magik=54321;     // магик 

double minprice; // минимальная цена
double maxprice;// максимальная цена


void OnTick()
  {
  double SL, TP;
  int ticket;
 
   minprice = iLow(Symbol(),TimeCandle,1);
   maxprice = iHigh(Symbol(),TimeCandle,1);   
   
   if (TimeHour(TimeCurrent()==HourStart))
   { 
    if (BuyLimitCount()==0 && BuyCount()==0) //если нет ордера то пытаться открыть
    { 
    SL = NormalizeDouble(maxprice - StopLoss*Point,znak);
    TP = NormalizeDouble(maxprice + TakeProfit*Point,znak);
    ticket = OrderSend(Symbol(), OP_BUYLIMIT,Lots,maxprice, 10, SL,TP,"", magik,0,Blue);
    
    if (ticket <0)
    Print ("Не удалось открыть ордер на покупку");
    }
    
    
     if (SellLimitCount()==0 && SellCount()==0) //если нет ордера то пытаться открыть
    { 
    SL = NormalizeDouble(minprice + StopLoss*Point,znak);
    TP = NormalizeDouble(minprice - TakeProfit*Point,znak);
    ticket = OrderSend(Symbol(), OP_SELLLIMIT,Lots,minprice,10, SL,TP,"", magik,0,Red);
        
    if (ticket <0)
    Print ("Не удалось открыть ордер на продажу");
    }
    
    }
    Comment ("Минимальная цена:" + DoubleToStr(minprice,znak) + "\n" + "Максимальная цена:"+ DoubleToStr(maxprice, znak)); 
  }
   
  // проверяем есть ли байлимит ордера с конца
  int BuyLimitCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_BUYLIMIT )                        
        {
        count ++;
        }
    }
    return(count);  
    
  }
   // проверяем есть ли селллимит ордера с конца
  int SellLimitCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_SELLLIMIT )                        
        {
        count ++;
        }
    }
    return(count);      
  }
  
   // проверяем есть ли бай ордера с конца
  int BuyCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_BUY )                        
        {
        count ++;
        }
    }
    return(count);      
  }
  
  // проверяем есть ли селл ордера с конца
  int SellCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true &&         
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_SELL )                        
        {
        count ++;
        }
    }
    return(count);      
  }
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
  • www.metatrader5.com
Для разработки торговых систем в платформу встроен собственный язык программирования MetaQuotes Language 5 (MQL5), среда разработки MetaEditor и инструменты тестирования стратегий. Любую информацию о разработке торговых стратегий на языке MQL5 можно найти на официальном сайте MQL5.community. На этом же сайте в разделе Code Base могут быть...
 
nelenaby:

Ciao, potresti dirmi perché non funziona? Nessun errore, ma gli ordini non si aprono nel tester. Sto cercando di scrivere un EA per il breakout di alto e basso di una candela giornaliera come strumento di allenamento.


Non si apre, cioè non ci prova o ci prova ma non ci riesce? Cosa c'è scritto nel registro?

 
nelenaby:

Ciao, potresti dirmi perché non funziona? Nessun errore, ma gli ordini non si aprono nel tester. Sto cercando di scrivere un EA per il breakout del massimo e del minimo di una candela giornaliera come strumento di allenamento.


Analizza questa tua espressione

if (TimeHour(TimeCurrent()==HourStart))
        {
          ........
        }

Non capisco il significato di questa espressione e forse mi sbaglio, ma dovresti almeno sostituire "(TimeCurrent()==HourStart)" con "(TimeCurrent() - HourStart)".

 

Poi, se ho capito bene, stai cercando di piazzare un ordine BuyLimit se non c'è BuyLimitOrder AND BuyPosition. Notate l'esatto "E". Cioè, la presenza di uno qualsiasi di essi separatamente vi conviene, quindi, ad una posizione desiderata del prezzo corrente otterrete un numero infinito di ByLimits, uno per ogni tick, fino a quando almeno uno di essi scatta e la prima posizione si apre. Inoltre, non vi interessa dove si trova il prezzo ora. Non appena la strana condizione sul tempo è soddisfatta (appena sopra il post), penso che ci sia un errore, ma non importa. Comunque, se non si tiene conto di questo, l'EA inizierà a piazzare ordini sbagliati al primo tick, fino a quando il prezzo non raggiunge il massimo di ieri, perché si sta usando il massimo di ieri come prezzo per piazzare l'ordine. Il Buy Limit è impostato sotto il prezzo corrente, il che significa che il prezzo corrente dovrebbe essere sopra il massimo di ieri, ma fino ad allora l'ordine fallirà.

Quindi, l'unica situazione che ti conviene è quando il prezzo si è mosso sopra il massimo di ieri, non c'è un bye-limit e non ci sono operazioni aperte. Questa è una combinazione rara. Inoltre, non influenzerà il breakout, ma rimbalzerà dopo il breakout (perché c'è un bylimit), e ti darà un sacco di errori, a partire dal primo tick sopra il massimo di ieri (che è un altro errore). La condizione è già soddisfatta, l'Expert Advisor lancia l'ordine, ma c'è anche uno spread, la distanza minima consentita dal mercato, ecc.

 
Sergey Voytsekhovsky:

Ho difficoltà a capire il significato di questa espressione, forse mi sbaglio, ma almeno sostituisci "(TimeCurrent()==HourStart)" con "(TimeCurrent() - HourStart)".

È vero, c'è un errore qui. Avete bisogno di if (TimeHour(TimeCurrent())==HourStart)

Ora l'ordine si apre a volte, ma genera più errori (OrderSend error 130).

L'errore qui non è corretto riguardo agli ordini limite.

 
nelenaby:

È vero, c'è un errore qui. Ha bisogno di if (TimeHour(TimeCurrent())==HourStart)

Ora apre le transazioni a volte, ma lancia più errori (OrderSend error 130).

Non è giusto per gli ordini limite.

Ecco uno script per lavorare con il tempo.

È vecchio ma funziona correttamente.

 

Salve.

Per favore, aiutatemi a capire come lavorare con i file.

Quando il programma è in esecuzione, salvo i dati ricevuti in un file e leggo il CSV.

Il file aumenta, la velocità diminuisce. Ho provato ad aggiornare (sovrascrivere) alcuni elementi delle linee. Impossibile!

Non si può cancellare una linea selezionata! Non posso aggiungere un nuovo elemento a una vecchia linea!

Questo è molto strano! Si può facilmente cancellare un file o un oggetto grafico, ecc. Ma quando si tratta di lavorare con un file creato, è un punto morto assoluto!

Sui forum c'è solo una raccomandazione: "Leggere il file in memoria, cambiare o cancellare la linea e salvare il nuovo file con il vecchio nome".

Questa non mi sembra la soluzione giusta. Devo essermi perso qualcosa. Per favore, aiutatemi a capire.

 
im-zvv:

Non mi sembra la decisione giusta. Probabilmente mi manca qualcosa. Per favore, aiutatemi a capire.

Dovresti essere assunto urgentemente da Microsoft per sistemare finalmente questa"soluzione sbagliata" per la gestione deifile.


La gestione dei file non è come modificare un file in un editor di file, è più come fare una parola con dadi con lettere individuali.
Se devi inserire una nuova lettera, tutti i cubi che la seguono devono essere spostati a destra.
Se vuoi rimuovere una vecchia lettera, tutti i dadi che la seguono devono essere spostati a sinistra.
Quindi, se il file non è grande e il lavoro non richiede l'accesso al file, è effettivamente più facile scrivere i dati in un nuovo file, cancellare il vecchio e rinominare il nuovo file con il nome del vecchio.

Se non mi sbaglio, l'unica cosa che manca in MQL quando si lavora con i file è la possibilità di tagliare la lunghezza del file alla dimensione richiesta.


 
Alekseu Fedotov:

Ecco uno script per lavorare con il tempo.

È vecchio, ma funziona correttamente.

Anch'io usavo la funzione di Kim, poi ho trovato il tempo di scrivere la mia:

//_______________________________________________________________________
class CWorkTime
  {
private:
   int               mday,mstarthour,mstophour,mstartmin,mstopmin;
   datetime          mstarttime,mstoptime;
   bool              UseThisSession;
   void inittime()
     {
      mday=Day();
      MqlDateTime dtstart,dtstop;
      TimeToStruct(TimeCurrent(),dtstart);
      dtstop=dtstart;
      dtstart.hour= mstarthour;
      dtstart.min = mstartmin;
      dtstop.hour = mstophour;
      dtstop.min = mstopmin;
      mstarttime = StructToTime(dtstart);
      mstoptime=StructToTime(dtstop);
     }
public:
   void              CWorkTime(void){};
   void              ~CWorkTime(void){};
   void              CWorkTime(int hstart,int mstart,int hstop,int mstop)
     {
      mstarthour=hstart;
      mstartmin = mstart;
      mstophour=hstop;
      mstopmin=mstop;
      UseThisSession=(mstarthour<0 || mstophour<0 || mstarthour>23 || mstophour>23) ? false : true;
      UseThisSession=(mstartmin<0 || mstopmin<0 || mstartmin>59 || mstopmin>59) ? false : true;
      if(UseThisSession) inittime(); else Print("Время работы советника не используется");
     };

   bool              Disable()
     {
      bool result=false;
      if(UseThisSession)
        {
         if(mday!=Day()) inittime();
         datetime t=TimeCurrent();
         result=t>=mstarttime && t<=mstoptime ? false : true;
        }
      return(result);
     };
  }
*Work;


.....

int OnInit()
{
   Work=new CWorkTime(StartHour,StartMinute,StopHour,StopMinute);
}

.....


void OnTick()
  {

if(Work.Disable())
{
 Comment("Не торговое время!!! Сопровождение открытых ордеров");
 }
else
{......
disabilitare il runtime - si devono inserire dati non validi quando si inizializza il costruttore, ad esempio 25 ore o 70 minuti
 
Sergey Dzyublik:

Avete urgente bisogno di essere assunti da Microsoft in modo che finalmente sistemino questa"soluzione sbagliata" per la gestione dei file.


Lavorare con i file non è come modificare un file in un editor di file, è più come fare una parola con dadi con lettere individuali.
Se devi inserire una nuova lettera, tutti i cubi che la seguono devono essere spostati a destra.
Se vuoi rimuovere una vecchia lettera, tutti i dadi che la seguono devono essere spostati a sinistra.
Quindi, se il file non è grande e il lavoro non richiede l'accesso al file, è effettivamente più facile scrivere i dati in un nuovo file, cancellare il vecchio e rinominare il nuovo file con il nome del vecchio.

Se non mi sbaglio, l'unica cosa che manca in MQL quando si lavora con i file è la possibilità di tagliare la lunghezza del file alla dimensione richiesta.


Grazie. Buon chiarimento. Purtroppo il mio file è molto grande e quindi dovrò lavorare con i "cubi".