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

 
Anatoliy Ryzhakov:
Salve. Potete dirmi come restituire il valore del tipo del penultimo ordine nella storia.

Devi trovare il tempo dell'ultimo ordine chiuso e poi cercare gli ordini con un tempo massimo di chiusura, ma inferiore all'ultimo tempo memorizzato, questo è quello che ho fatto:

https://www.mql5.com/ru/forum/247136#comment_7555643

nel mio esempio il biglietto è stato cercato, bisognerebbe restituire il tipo di ordine invece del biglietto, o conoscendo il biglietto dell'ordine, si può scoprire il suo tipo...

История ордеров
История ордеров
  • 2018.05.24
  • www.mql5.com
Всем привет! Столкнулся с проблемой... сделал робота, который читает историю и открывает сделку...
 

È possibile applicare un modello a una funzione esportabile da esportare da c++ a mql4?

Ho creato un file di tipo regolare con estensione "srp" e vi ho scritto una funzione primitiva.

#define  MT4_EXPFUNC extern "C++" __declspec(dllexport)
MT4_EXPFUNC  int __stdcall  add(int a=0, int b=0)//stdcall //cdecl
{return (18);}

Poi ho creato un file con estensione "def" e ho specificato il nome della funzione da esportare

LIBRARY "dllmt42"
EXPORTS
add

Poi l'ha eseguito attraverso Build - Build Solution.
Voglio applicare un modello alla mia funzione perché svilupperemo funzioni che lavorano con gli array e non possono fare a meno di un modello.

#define  MT4_EXPFUNC extern "C++" __declspec(dllexport)
template<typename T>MT4_EXPFUNC  int __stdcall  add(T a=0, T b=0){ return (18);}

T è evidenziato ma scrive che c'è un consiglio di aiuto di errore ed è possibile, provato a riorganizzare? Inoltre come tale funzione, se possibile, sarà chiamata dal lato mql4?




 
Roman Shiredchenko:

guardare nel codebase - su MT4 lo erano sicuramente...

Proprio in prima pagina, in questo thread.

 

Buona sera. Nel processo di studio e di apprendimento MT5 cercando di attuare un compito generalmente non difficile, ma poca esperienza e lacune nella conoscenza....... in generale non funziona, si prega di aiuto e assistenza.

Ho un indicatore e un expert advisor, entrambi con codice open source, entrambi dello stesso autore (Artem Trishkin, rispetto ed encomio). Sto cercando di chiedere all'indicatore di ottenere la direzione effettiva al momento della richiesta. L'indicatore mostra questa direzione con frecce in alto o in basso. La direzione ottenuta sarà utilizzata dall'Expert Advisor sia come segnale che come filtro, ma è ancora lontana.

Ho il manico dell'indicatore ma i valori dei dati delle frecce dell'indicatore sono un casino e non riesco a capirli.

Non ho cambiato l'indicatore, ho aggiunto OnInit nel mio Expert Advisor:

   CrossAD = iCustom(asymbol.Name(), _Period, "iCrossAD");
   if (CrossAD == INVALID_HANDLE)
   {
      Print("Не удалось создать описатель индикатора iCrossAD!");
      return(INIT_FAILED);
   }
      else Print("Хендл iCrossAD = ",CrossAD);

Ho aggiunto OnTick:

   int n=0;
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find || ArraySize(Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
      }
      else 
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Buy_index  = n;
         Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find || ArraySize(Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 3-го буфера индикатора iCrossAD, error code %d",GetLastError());
      }
      else 
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Sell_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Sell_index  = n;
         Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);

Naturalmente ho descritto e avviato gli appropriati overpens, gli array, definiti come serie temporali e td......

Usato Commento e Stampa per controllare. Non immediatamente, ma nessun errore, solo un paio di avvertimenti, non capisco. Ma la cosa principale - i parametri sono definiti in modo errato. Nonostante la condizione sottostante, il numero massimo per il doppio per la freccia su e qualche numero negativo per la freccia giù sono emessi.

if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
и
if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
 
Ecco i file
File:
 
Sergey Voytsekhovsky:
Ecco i file

Dovresti iniziare a testare l'ottenimento di dati dall'indicatore con un semplice EA di prova, piuttosto che prenderlo da un articolo con un sacco di caratteristiche inutili per il test.

Basta creare un semplice Expert Advisor in MQL Wizard e usarlo per fare pratica con iCustom()

 
Sergey Voytsekhovsky:

Buona sera. Nel processo di studio e di apprendimento MT5 cercando di attuare un compito generalmente non difficile, ma poca esperienza e lacune nella conoscenza....... in generale non funziona, si prega di aiuto e assistenza.

Ho un indicatore e un expert advisor, entrambi con codice open source, entrambi dello stesso autore (Artem Trishkin, rispetto ed encomio). Sto cercando di chiedere all'indicatore di ottenere la direzione effettiva al momento della richiesta. L'indicatore mostra questa direzione con frecce in alto o in basso. La direzione ottenuta sarà utilizzata dall'Expert Advisor sia come segnale che come filtro, ma è ancora lontana.

Ho il manico dell'indicatore ma i valori dei dati delle frecce dell'indicatore sono un casino e non riesco a capirli.

Non ho cambiato l'indicatore, ho aggiunto OnInit nel mio Expert Advisor:

Ho aggiunto OnTick:

Naturalmente ho descritto e avviato gli overpens appropriati, gli array, definiti come serie temporali e td......

Usato Commento e Stampa per controllare. Non immediatamente, ma nessun errore, solo un paio di avvertimenti, non capisco. Ma la cosa principale - i parametri sono definiti in modo errato. Nonostante la condizione sottostante, viene stampato il numero massimo per il doppio per la freccia su e qualche numero negativo per la freccia giù.

Artyom ha detto correttamente e io noterò solo l'inutilità di un confronto

if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find || ArraySize(Buf_Arrow_Buy) != period_find)

Se CopyBuffer restituisce il numero di elementi copiati nell'array, allora la dimensione dell'array sarà esattamente quella. Di conseguenza, la parte evidenziata della condizione duplica semplicemente la prima.

E pensando ad alta voce: non ho guardato il codice dell'indicatore e dell'EA, quindi potrei sbagliarmi. Sei sicuro che ci deve essere un segnale nell'intervallo period_find?

 
Alexey Viktorov:

Artem ha detto correttamente, e mi limiterò a sottolineare l'inutilità di un confronto

Se CopyBuffer restituisce il numero di elementi copiati nell'array, allora la dimensione dell'array sarà esattamente quella. Corrispondentemente, la parte selezionata della condizione duplica semplicemente la prima.

Sto pensando ad alta voce: non ho controllato il codice dell'indicatore e dell'Expert Advisor, quindi potrei sbagliarmi. Sei sicuro che ci deve essere un segnale nell'intervallo period_find?

Sì - è come un filtro - la frequenza dei segnali dipende da esso.

 
Artyom Trishkin:

Si dovrebbe iniziare con un test per ottenere dati dall'indicatore con un semplice test EA, piuttosto che prenderlo da un articolo con un sacco di funzioni inutili per il test.

La funzione iCustom() sarà più conveniente per voi.

Grazie, buon consiglio, lo farò, almeno sarà più conveniente.

Lo inizierò oggi.
 

Può dirmi cosa c'è di sbagliato nel razionamento del lotto?

double lot_=0.01;
double minlot=0.10;
double LotNormalize(double lot_)
  {
   if(minlot==0.001)
     {
      return(NormalizeDouble(lot_,3));
     }
   if(minlot==0.01)
     {
      return(NormalizeDouble(lot_,2));
     }
   if(minlot==0.10)
     {
      return(NormalizeDouble(lot_,1));
     }

   return(NormalizeDouble(lot_,0));
  }