Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 649
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
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.
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 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!
Forum sul trading, sistemi di trading automatico e test di strategie di trading
Testare 'CopyTicks'.
fxsaber, 2016.10.19 07:59
// А так же задает привычные 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)
Inserisci questo all'inizio del codice
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:
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.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!
//| 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?
:
Basta inserire un parametro di input nel tuo EA e, a seconda del valore assegnatogli all'avvio, comprerai solo o venderai solo:
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
...
void OnTick()
{
if(!Long)
trade.Sell(0.01);
if(Long)
trade.Buy(0.01);
}