Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 649

 
Artyom Trishkin:

Ho visto un pezzo del tuo codice per trovare i vertici a zig zag - penso che sia di Igor Kim. Qui, nel codice di ricerca dell'estremo inserire anche il risparmio del tempo dell'estremo trovato. Lo stai cercando nel loop... Nell'identificarlo, ricordate il momento in cui l'indice del ciclo punta a quando l'estremo è già identificato - prima del ritorno del valore del suo prezzo. Cioè, in aggiunta, passate la variabile datetime per riferimento nella funzione in cui deve essere scritto il tempo in cui si trova l'estremo dello zigzag. Quando la funzione restituisce il valore del prezzo, scriverà inoltre in questa variabile il valore del tempo di apertura della barra in cui si trova l'estremo richiesto dello zigzag.

Mi dispiace, ma sono lontano dal mio computer di lavoro e non posso darvi un esempio di codice.

Ha funzionato tutto, grazie!
 
Ciao, scrivo un po' in MQL4, ma non sono molto bravo in MQL5. Ho bisogno di un piccolo aiutante per calcolare la differenza tra il massimo e il minimo della giornata. La quarta versione ha buone funzioni per questo scopo iHigh e iLow, ma qui sono assenti. Ho provato a usare copyHigh e copyLow, ma continua ad avere molti errori dopo aver sottratto il valore minimo da quello massimo. Potreste dirmi come risolvere questo problema, preferibilmente con uno snippet di codice. Grazie in anticipo!
 
Александр Богданов:
Ciao, scrivo un po' in MQL4, ma non sono molto bravo in MQL5. Ho bisogno di un piccolo aiutante per calcolare la differenza tra il massimo e il minimo della giornata. La quarta versione ha buone funzioni per questo scopo iHigh e iLow, ma qui sono assenti. Ho provato a usare copyHigh e copyLow, ma continua ad avere molti errori dopo aver sottratto il valore minimo da quello massimo. Potreste dirmi come risolvere questo problema, preferibilmente con uno snippet di codice. Grazie in anticipo!
Faresti meglio a mostrarmi il tuo frammento di codice con un sacco di errori e ottenere un mucchio di commenti su ciò che è sbagliato.
 
Александр Богданов:
Ciao, scrivo un po' in MQL4, ma sono uno zero assoluto in MQL5. Avevo bisogno di scrivere un piccolo aiutante per calcolare la differenza tra alto e basso per il giorno. La quarta versione ha buone funzioni per questo scopo iHigh e iLow, ma qui sono assenti. Ho provato a usare copyHigh e copyLow, ma continua ad avere molti errori dopo aver sottratto il valore minimo da quello massimo. Potreste dirmi come risolvere questo problema, preferibilmente con uno snippet di codice. Grazie in anticipo!
Inserirlo all'inizio del codice

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Testare 'CopyTicks'.

fxsaber, 2016.10.19 07:59

// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get( const string Symb, const int TimeFrame, const int iShift )                                  \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator []( const int iPos ) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME NAME;                                                                                           \
                                                                                                              \
  T i##NAME( const string Symb, const int TimeFrame, const int iShift )                                       \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }

DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)
Questo ti permette di usare iHigh e iLow come sei abituato a fare in MT5.
 
fxsaber:
fxsaber:
Inserisci questo all'inizio del codice
Questo vi permetterà di utilizzare i noti iHigh e iLow in MT5.
Grazie mille! Questo renderà molto facile
 
Александр Богданов:
Ciao, scrivo un po' in MQL4, ma non ho familiarità con MQL5. Ho bisogno di un piccolo aiutante per calcolare la differenza tra il massimo e il minimo della giornata. La quarta versione ha buone funzioni per questo scopo iHigh e iLow, ma qui sono assenti. Ho provato a usare copyHigh e copyLow, ma continua ad avere molti errori dopo aver sottratto il valore minimo da quello massimo. Potreste dirmi come risolvere questo problema, preferibilmente con uno snippet di codice. Grazie in anticipo!

Se il compito è solo quello di visualizzare sullo schermo, allora la soluzione migliore è un indicatore. L'indicatore, in OnCalculate() ha tutte le serie temporali necessarie:

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

Per impostazione predefinita, nell'indicatore MQL5, la barra più a destra ha indice rates_total-1. E il vostro compito si riduce a una sottrazione elementare:

   double difference=high[rates_total-1]-low[rates_total-1];


Anche se questo semplice approccio verrà visualizzato correttamente solo se l'indicatore è in esecuzione sul timeframe D1. Se viene eseguito su altri timeframes, allora CopyHigh e CopyLow dovrebbero essere usati - fondamentalmente, niente di complicato.

Ora scriverò un esempio....

//+------------------------------------------------------------------+
//|                                               High minus Low.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//--- input parameter
input ENUM_TIMEFRAMES period=PERIOD_D1;   // для какого периода считать High-Low
//---
double multiplier=0.0;
double High[],Low[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   multiplier=MathPow(10,Digits());
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- разницу цен переводим в пункты
   double difference=(iHigh(Symbol(),period,0)-iLow(Symbol(),period,0))*multiplier;
//--- вывод результата на экран
   Comment("High-Low=",DoubleToString(difference,0));
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Получим Low для заданного номера бара                            |
//+------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+
//| Получим High для заданного номера бара                           |
//+------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+


Ora è possibile eseguire l'indicatore su qualsiasi timeframe del simbolo corrente e selezionare per quale timeframe calcolare la differenza tra High e Low.
File:
 
Александр Богданов:
Ciao, scrivo un po' in MQL4, ma non sono molto bravo in MQL5. Ho bisogno di un piccolo aiutante per calcolare la differenza tra il massimo e il minimo della giornata. La quarta versione ha buone funzioni per questo scopo iHigh e iLow, ma qui sono assenti. Ho provato a usare copyHigh e copyLow, ma continua ad avere molti errori dopo aver sottratto il valore minimo da quello massimo. Potreste dirmi come risolvere questo problema, preferibilmente con uno snippet di codice. Grazie in anticipo!
Se volete ottenere i massimi e i minimi giornalieri (massimi e minimi del giorno corrente), potete usare SymbolInfoDouble() con gli identificatori SYMBOL_BIDHIGH e SYMBOL_BIDLOW (o qualsiasi altro, come preferite).
 
Ciao 2016.10.21_19:58 MSC. Controllo dell'EA nel tester di strategia. L'EA funziona, apre e chiude un trade. Ma il tester della strategia dà errore: posizione iniziale errata 0 per la funzione ArrayMinimum; -1; array fuori range in 'CLose.mqh' (86,59); Il passaggio del test si è fermato a causa di un errore critico nell'EA. C'è uno screenshot dell'Expert Advisor e il codice del file CLose.mqh da attivare. Non vedo alcun errore al di fuori dell'array in questo codice. Ecco perché non capisco quale sia l'errore. Per favore, consigliatemi se potete. Questo è tutto per ora. 20:08 MSC. Errore critico
//+------------------------------------------------------------------+
//|                                                        CLose.mqh |
//|                                              Nickityuk N., 2016. |
//|                             https://www.mql5.com/users/nicityuk/ |
//+------------------------------------------------------------------+
#property copyright "Nickityuk N., 2016."
#property link      "https://www.mql5.com/users/nicityuk/"
#property strict
#include <Expert\OPen.mqh>
//#include <ARrayMinimum.mqh>
double AOmax,AOmax2,AOmin,AOmin2,AOm0,AOn0,z5max0,z5min0,clm,cln,AO[];
int aom,aom2,aon,aon2;
datetime ttm,ttn,hm,hn;
//+------------------------------------------------------------------+
//| Calculate for close order                                        |
//+------------------------------------------------------------------+
void CLose()
  {if(buy==0 && sell==0) {return;}
   else if(OrderType()==OP_BUY) {CloseBuy();}
        else                     CloseSell();}
//+------------------------------------------------------------------+
void St()
  {St0=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_MAIN,0);
   Si0=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_SIGNAL,0);
   St1=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_MAIN,1);
   Si1=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_SIGNAL,1);}
void CloseBuy()
  {St(); if(St0-20>0 && Si0-20>0)
           {if(St1-Si1>0 && St0-Si0<0) {AOm0=iAO(NULL,0,0);
               if(AOm0-AOm1>=0) {AOm1=iAO(NULL,0,0); return;}
               else if(St0-80>0 && St0-100<=0 && Si0-80>0)
                      {if(Si0-100<=0 && St1-Si1>0 && St0-Si0<0)
                         {TwoExtremeAO_Buy(); OneExtremeBuy(); ExpirationBuy();}
                       else return;}            
                    else return;}
            else return;}        
         else return;}
void CloseSell()
  {St(); if(St0-80<0 && Si0-80<0)
           {if(St1-Si1<0 && St0-Si0>0) {AOn0=iAO(NULL,0,0);
               if(AOn0-AOn1<=0) {AOn1=iAO(NULL,0,0); return;}
               else if(St0-20<0 && St0>=0 && Si0-20<0)
                      {if(Si0>=0 && St1-Si1<0 && St0-Si0>0)
                         {TwoExtremeAO_Sell(); OneExtremeSell(); ExpirationSell();}
                       else return;}  
                    else return;}
            else return;}        
         else return;}
//+------------------------------------------------------------------+                      
void CalculateClose()
  {v0=iVolume(NULL,PERIOD_M1,0); //--- go trading only for first tiks of new bar
   v1=iVolume(NULL,PERIOD_M1,1);
   v2=iVolume(NULL,PERIOD_M1,2);
   v3=iVolume(NULL,PERIOD_M1,3);
   v4=iVolume(NULL,PERIOD_M1,4);
   if(v0+v1+v2+v3+v4-10/12>0) return;  
   for(index=0;index<24;index++)
     {AO[index]=iAO(NULL,PERIOD_M5,index);}
   ArrayResize(AO,24,4);
   ArraySetAsSeries(AO,true);}
   //index=0; AO[index]=iAO(NULL,PERIOD_M5,index);}
//+------------------------------------------------------------------+      
void TwoExtremeAO_Buy()
  {CalculateClose();
   if(ArrayMaximum(AO,23,0)==0) return;
   else aom=ArrayMaximum(AO,23,0); AOmax=AO[aom];
   if(ArrayMinimum(AO,aom,0)>0) {aon=ArrayMinimum(AO,aom,0);}
   else return;
   if(ArrayMaximum(AO,aon,0)==0) return;
   else aom2=ArrayMaximum(AO,aon,0); AOmax2=AO[aom2];
     if(AOmax2-AOmax>0) {return;}
     else if(AOmax2-AOmax<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                {Print("OrderClose error.",GetLastError());}
                              else //index=2;
                                   //while(iFractals(NULL,0,MODE_UPPER,index)==0) {index++;}
                                   //Sleep(3000); luf=iFractals(NULL,0,MODE_UPPER,index);
                                   //SL=NormalizeDouble(luf+(Ask-Bid)+(1*_Point),_Digits);
                                   TP=NormalizeDouble(Ask-tp*_Point,_Digits);
                                   tic=OrderSend(Symbol(),OP_SELL,LotsCalculated(),Bid,50,0,TP,"",MAGIC,0,Red);
                                   AOn1=iAO(NULL,0,index); return;}
          else return;}
//+------------------------------------------------------------------+          
void TwoExtremeAO_Sell()
  {CalculateClose();
   if(ArrayMinimum(AO,23,0)==0) return;
   else aon=ArrayMinimum(AO,23,0); Print(aon,""); AOmin=AO[aon];
   if(ArrayMaximum(AO,aon,0)>0) {aom=ArrayMaximum(AO,aon,0);}
   else return;
   if(ArrayMinimum(AO,aom,0)==0) return;
   else aon2=ArrayMinimum(AO,aom,0); AOmin2=AO[aon2]; //Print(aon2,"");
     if(AOmin2-AOmin>0) {return;}
     else if(AOmin2-AOmin<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                {Print("OrderClose error.",GetLastError());}
                              else //index=2;
                                   //while(iFractals(NULL,0,MODE_LOWER,index)==0) {index++;}
                                   //Sleep(3000); ldf=iFractals(NULL,0,MODE_LOWER,index);
                                   //SL=NormalizeDouble(ldf-(1*_Point),_Digits);
                                   TP=NormalizeDouble(Bid+tp*_Point,_Digits);
                                   tic=OrderSend(Symbol(),OP_BUY,LotsCalculated(),Ask,50,0,TP,"",MAGIC,0,Blue);
                                   AOm1=iAO(NULL,0,0); return;}
          else return;}
//+------------------------------------------------------------------+                      
void OneExtremeBuy()
  {index=0;
   while(iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,1,index)==0) {index++;}
   z5max0=iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,1,index); ttm=iTime(NULL,0,index); clm=iClose(NULL,PERIOD_M5,0); //Sleep(3000);
   if((clm-(z5max0-300*Point))<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                       {Print("OrderClose error.",GetLastError());}
                                   else return;}
   else return;}
void OneExtremeSell()
  {index=0;
   while(iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,2,index)==0) {index++;}
   z5min0=iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,2,index); ttn=iTime(NULL,0,index); cln=iClose(NULL,PERIOD_M5,0); //Sleep(3000);
   if((cln-(z5min0+300*Point))>0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                       {Print("OrderClose error.",GetLastError());}
                                   else return;}
   else return;}
//+------------------------------------------------------------------+                                                                      
void ExpirationBuy()
  {hm=TimeHour(ttm); if((hm+3)-TimeCurrent()<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                                   {Print("OrderClose error.",GetLastError());}
                                                 else return;}
                     else return;}
void ExpirationSell()
  {hn=TimeHour(ttn); if((hn+3)-TimeCurrent()<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                                   {Print("OrderClose error.",GetLastError());}
                                                 else return;}
                     else return;}
//+------------------------------------------------------------------+          
 
Николай Никитюк:
Ciao 2016.10.21_19:58 MSC. Controllo del consulente nel tester di strategia. Il consulente lavora, apre e chiude un trade. Ma il tester della strategia dà errore: posizione iniziale errata 0 per la funzione ArrayMinimum; -1; array fuori range in 'CLose.mqh' (86,59); Il passaggio di test si è fermato a causa di un errore critico nell'EA. C'è uno screenshot dell'Expert Advisor e il codice del file CLose.mqh da attivare. Non vedo alcun errore al di fuori dell'array in questo codice. Ecco perché non capisco quale sia l'errore. Per favore, consigliatemi se potete. Questo è tutto per ora. 20:08 MSC.

Questo può essere convertito in int (con aon=NormalizeDouble(aon,0)), perché sembra doppio e non è molto chiaro quale sia il risultato?

:

if(ArrayMinimum(AO,aom,0)>0) {aon=ArrayMinimum(AO,aom,0);}
 
Karputov Vladimir:

Basta inserire un parametro di input nel tuo EA e, a seconda del valore assegnatogli all'avvio, comprerai solo o venderai solo:

input bool Long=true;            // allow only "Long"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
...
void OnTick()
  {
   if(!Long)
      trade.Sell(0.01);
   if(Long)
      trade.Buy(0.01);
  }
E per il trading manuale, cosa suggerisci?