Come faccio a sapere il tipo di parametro di ingresso?
il compilatore stesso sostituisce i tipi al momento della chiamata della funzione template, se tale chiamata non era ancora nel codice, allora il compilatore creerà un'altra copia della funzione e imposterà i tipi stessi - bene, come se fosse logico - un template
se la domanda è su come definire il tipo in una tale funzione, usate
typename
UPD: aggiunto all'esempio sopra il parametro tipo stampanti:
//--- buffers (массивы под буферы индикатора)//--------------------------------------------------------------------double RSI[]; // буфер под RSI//--------------------------------------------------------------------double MAr1_fast[]; // буфер под быструю МАdouble MAr2_slow[]; // буфер под медленную МАdouble MAr2_slowColor[]; // буфер под цвета медленной МА//--------------------------------------------------------------------double MAr3_slow_glob[]; // буфер под глобальную медленную МАdouble MAr3_slow_globColor[]; // буфер под цвета глобальной медленной МА//--------------------------------------------------------------------
Essenzialmente: l'indicatore disegna 4 linee: le prime due sono solo monocolore, le due successive sono bicolori (cambiano colore sulle pieghe).
Il bicolore è dovuto al modo di disegnare DRAW_COLOR_LINE.
Domanda: la prima linea (buffer 2 e 3 nel codice sopra) è perfettamente disegnata e tutto il codice scritto per essa in OnInit funziona; seconda linea si presenta per qualche motivo, per esempio la linea non funziona:
PlotIndexSetString (4, PLOT_LABEL, "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
Cioè, invece del testo che ho impostato nella finestra dei dati, viene visualizzato solo il nome dell'indicatore al posto del buffer. Anche se la linea stessa è tracciata, ed è, come dovrebbe essere, multicolore. Penso che il trucco sia nel cambio di numerazione? Per esempio, non sono sicuro del perché nella parte superiore del codice, quando dichiaro l'ultima linea con la direttiva #property, l'indice dovrebbe essere 4 e non 5, dato che 4 buffer sono già stati usati prima. C'è qualche relazione tra la numerazione delle linee quando si dichiara con #property e la numerazione del buffer quando si collega con gli array in OnInit?
Per favore consigliatemi cosa c'è di sbagliato nel codice qui sopra. Forse qualcuno può trovare un esempio di indicatore dove almeno due linee sono disegnate usando il metodo di disegno DRAW_COLOR_LINE....
Un'altra domanda correlata: come si legano i buffer delle linee colorate? Voglio dire, come fa il codice compilato a sapere che se metto un valore in un buffer di colore, questo colore dovrebbe essere usato per colorare una linea da qualche altro buffer?
Pomeriggio. Sto affrontando una cosa strana quando scrivo un indicatore in MQL5 (indicatore in una sottofinestra separata, 4 righe).
Le descrizioni iniziali del buffer sono le seguenti:
Il prossimo in OnInit:
Essenzialmente: l'indicatore disegna 4 linee: le prime due sono solo monocolore, le due successive sono bicolori (cambiano colore sulle pieghe).
Il bicolore è dovuto al modo di disegnare DRAW_COLOR_LINE.
Domanda: la prima linea (buffer 2 e 3 nel codice sopra) è perfettamente disegnata e tutto il codice scritto per essa in OnInit funziona; seconda linea si presenta per qualche motivo, per esempio la linea non funziona:
Cioè, invece del testo che ho impostato nella finestra dei dati, viene visualizzato solo il nome dell'indicatore al posto del buffer. Anche se la linea stessa è tracciata, ed è, come dovrebbe essere, multicolore. Penso che il trucco sia nel cambio di numerazione? Per esempio, non sono sicuro del perché nella parte superiore del codice, quando dichiaro l'ultima linea con la direttiva #property, l'indice dovrebbe essere 4 e non 5, dato che 4 buffer sono già stati usati prima. C'è qualche relazione tra la numerazione delle linee quando si dichiara con #property e la numerazione del buffer quando si collega con gli array in OnInit?
Per favore consigliatemi cosa c'è di sbagliato nel codice qui sopra. Forse qualcuno può trovare un esempio di indicatore dove almeno due linee sono disegnate usando il metodo di disegno DRAW_COLOR_LINE....
Un'altra domanda correlata: come si legano i buffer delle linee colorate? Voglio dire, come fa il codice compilato a sapere che se metto un valore in un buffer di colore, questo colore dovrebbe essere usato per colorare una linea da qualche altro buffer?
Le mappature sono numerate diversamente dai buffer.
PlotIndexSetString (3, PLOT_LABEL, "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
Buona giornata. Voglio scrivere un EA basato sulla misurazione dell'angolo di pendenza di una media mobile (o meglio un insieme di esse, cioè l'Alligator), in modo che l'EA dia un allarme su un forte impulso di prezzo, preferibilmente con un piccolo ritardo. Per favore consigliate come misurare l'angolo della MA o "dire all'EA" che l'impulso è avvenuto. Forse ci sono già modi noti per farlo. O per esempio un indicatore libero basato sul calcolo degli impulsi?
Ha scritto una funzione per trovare il numero di barra di un frattale su 3 barre. Sul grafico online sembra trovarlo correttamente. Ma durante il test visivo nel tester si trova. Qualcuno dei professionisti può dare un'occhiata al codice e trovare qualche errore?
Te ne sarei molto grato.
//+----------------------------------------------------------------------------+//| Описание : Возвращает номер бара трёхбарного фарактала по его номеру. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" или NULL - текущий символ) |//| tf - таймфрейм ( 0 - текущий ТФ) |//| nf - номер экстремума ( 0 - последний) |//+----------------------------------------------------------------------------+int BarLocExtr(string sy="0", int tf=0, int ne=0, int mode=MODE_UPPER)
{
if(sy=="" || sy=="0") sy=Symbol();
int nlext=0,k=iBars(sy,tf);
nlext=0;
if(mode==MODE_UPPER)
{
for (int i=2; i<=k; i++)
{
if(High[i]>High[i+1] && High[i]>High[i-1])
{
nlext++;
if(nlext>ne) return(i);
}
}
}
if(mode==MODE_LOWER)
{
for (i=2; i<=k; i++)
{
if(Low[i+1]>Low[i] && Low[i-1]>Low[i])
{
nlext++;
if(nlext>ne)
{
//Print("i=",i," Low[i+1]=",Low[i+1]," Low[i]=",Low[i]," Low[i-1]=",Low[i-1]);return(i);
}
}
}
}
Print("Бар локального экстремума не найден");
return(-1);
}
Скальперские автоматические системы по праву считаются вершиной алгоритмического трейдинга, но при этом они же являются и самыми сложными для написания кода. В этой статье мы покажем, как с помощью встроенных средств отладки и визуального тестирования строить стратегии, основанные на анализе поступающих тиков. Для выработки правил входа и...
Buon pomeriggio. QUALE CODICE DOVREI AGGIUNGERE IN MODO CHE L'INDICATORE SMETTA DI FUNZIONARE NEL TESTER DOPO UN MESE? CIOÈ HO SCRITTO TUTTO OK! MA QUANDO FACCIO UN BACKTEST FUNZIONA DI NUOVO. (mgl4)
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
datetime data=D'2020.09.16 20:07'; // Time Blockif(TimeCurrent()>data)
{
Print("Демонстрационный период закончился, покупайте индикатор :)");
Alert("Демонстрационный период закончился, покупайте индикатор :)");
return(INIT_FAILED);
}
if(IsTesting() && TimeCurrent() >= D'2020.09.16 20:07')// для тестировщиков, ограничение работы по времени
{
Comment("Демонстрационный период закончился, покупайте индикатор :) Демонстрационный период закончился, покупайте индикатор :) Демонстрационный период закончился, покупайте индикатор :)");
return(0);
}
Volevo mettere una condizione nel ciclo di chiusura degli ordini nelgiorno di apertura degli stessi, in modo che quelli aperti il venerdì non venissero chiusi.
while (OrdersTotal()>0)
{
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
{
if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5))
{
if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if(result!=TRUE) { error=GetLastError();
Print("LastError = ",error, " ",Symbol()); }
else error=0;
}
elsePrint("NoMagic ", OrderMagicNumber()); // for Debug
}
elsePrint( "Error when order select ", GetLastError());
}
Buon pomeriggio. QUALE CODICE DOVREI AGGIUNGERE IN MODO CHE L'INDICATORE SMETTA DI FUNZIONARE NEL TESTER DOPO UN MESE? CIOÈ HO SCRITTO TUTTO OK! MA QUANDO FACCIO UN BACKTEST FUNZIONA DI NUOVO. (mgl4)
Dovete scrivere questo codice non in OnInit, ma in OnTick().
Volevo mettere una condizione nel ciclo di chiusura dell'ordine nelgiorno di apertura dell'ordine, in modo che quelli aperti il venerdì non fossero chiusi.
Provate in questo modo:
for(int is=OrdersTotal()-1; is>=0; is--)
{
if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES))
{
if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5))
{
if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if(result!=TRUE) { error=GetLastError();
Print("LastError = ",error, " ",Symbol()); }
else error=0;
}
else Print("NoMagic ", OrderMagicNumber()); // for Debug
}
else Print( "Error when order select ", GetLastError());
}
Come faccio a sapere il tipo di parametro di ingresso?
il compilatore stesso sostituisce i tipi al momento della chiamata della funzione template, se tale chiamata non era ancora nel codice, allora il compilatore creerà un'altra copia della funzione e imposterà i tipi stessi - bene, come se fosse logico - un template
se la domanda è su come definire il tipo in una tale funzione, usate
typenameUPD: aggiunto all'esempio sopra il parametro tipo stampanti:
2020.09.16 18:58:21.679 tst (EURUSD,M5) int myfunc<int,int>(int,int)
2020.09.16 18:58:21.680 tst (EURUSD,M5) val1 = 2, typename = int
2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 3, typename = int
2020.09.16 18:58:21.681 tst (EURUSD,M5) 5
2020.09.16 18:58:21.681 tst (EURUSD,M5) int myfunc<double,double>(double,double)
2020.09.16 18:58:21.681 tst (EURUSD,M5) val1 = 10.0, typename = double
2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 30.0, typename = double
2020.09.16 18:58:21.681 tst (EURUSD,M5) 40
UPD: aggiunto__FUNCSIG__ a questo esempio
Pomeriggio.
Sto affrontando una cosa strana quando scrivo un indicatore in MQL5 (indicatore in una sottofinestra separata, 4 righe).
Le descrizioni iniziali del buffer sono le seguenti:
Il prossimo in OnInit:
Essenzialmente: l'indicatore disegna 4 linee: le prime due sono solo monocolore, le due successive sono bicolori (cambiano colore sulle pieghe).
Il bicolore è dovuto al modo di disegnare DRAW_COLOR_LINE.
Domanda: la prima linea (buffer 2 e 3 nel codice sopra) è perfettamente disegnata e tutto il codice scritto per essa in OnInit funziona;
Cioè, invece del testo che ho impostato nella finestra dei dati, viene visualizzato solo il nome dell'indicatore al posto del buffer. Anche se la linea stessa è tracciata, ed è, come dovrebbe essere, multicolore.seconda linea si presenta per qualche motivo, per esempio la linea non funziona:
Penso che il trucco sia nel cambio di numerazione? Per esempio, non sono sicuro del perché nella parte superiore del codice, quando dichiaro l'ultima linea con la direttiva #property, l'indice dovrebbe essere 4 e non 5, dato che 4 buffer sono già stati usati prima. C'è qualche relazione tra la numerazione delle linee quando si dichiara con #property e la numerazione del buffer quando si collega con gli array in OnInit?
Per favore consigliatemi cosa c'è di sbagliato nel codice qui sopra. Forse qualcuno può trovare un esempio di indicatore dove almeno due linee sono disegnate usando il metodo di disegno DRAW_COLOR_LINE....
Un'altra domanda correlata: come si legano i buffer delle linee colorate? Voglio dire, come fa il codice compilato a sapere che se metto un valore in un buffer di colore, questo colore dovrebbe essere usato per colorare una linea da qualche altro buffer?
Pomeriggio.
Sto affrontando una cosa strana quando scrivo un indicatore in MQL5 (indicatore in una sottofinestra separata, 4 righe).
Le descrizioni iniziali del buffer sono le seguenti:
Il prossimo in OnInit:
Essenzialmente: l'indicatore disegna 4 linee: le prime due sono solo monocolore, le due successive sono bicolori (cambiano colore sulle pieghe).
Il bicolore è dovuto al modo di disegnare DRAW_COLOR_LINE.
Domanda: la prima linea (buffer 2 e 3 nel codice sopra) è perfettamente disegnata e tutto il codice scritto per essa in OnInit funziona;
Cioè, invece del testo che ho impostato nella finestra dei dati, viene visualizzato solo il nome dell'indicatore al posto del buffer. Anche se la linea stessa è tracciata, ed è, come dovrebbe essere, multicolore.seconda linea si presenta per qualche motivo, per esempio la linea non funziona:
Penso che il trucco sia nel cambio di numerazione? Per esempio, non sono sicuro del perché nella parte superiore del codice, quando dichiaro l'ultima linea con la direttiva #property, l'indice dovrebbe essere 4 e non 5, dato che 4 buffer sono già stati usati prima. C'è qualche relazione tra la numerazione delle linee quando si dichiara con #property e la numerazione del buffer quando si collega con gli array in OnInit?
Per favore consigliatemi cosa c'è di sbagliato nel codice qui sopra. Forse qualcuno può trovare un esempio di indicatore dove almeno due linee sono disegnate usando il metodo di disegno DRAW_COLOR_LINE....
Un'altra domanda correlata: come si legano i buffer delle linee colorate? Voglio dire, come fa il codice compilato a sapere che se metto un valore in un buffer di colore, questo colore dovrebbe essere usato per colorare una linea da qualche altro buffer?
Le mappature sono numerate diversamente dai buffer.
Questo dovrebbe funzionare.
Buon pomeriggio a tutti!
Ho creato una funzione per modificare lo stoploss. Ma quando funziona dà EURUSD,H1: OrderModify error 130.
E il prezzo è lontano dal luogo in cui lo stoploss dovrebbe essere impostato.
Ecco la funzione:
void open_bu(string walpa, int op) { bool err; int spred=(int)MarketInfo(walpa,MODE_SPREAD); double point=MarketInfo(walpa,MODE_POINT); int digits=(int)MarketInfo(walpa,MODE_DIGITS); for(int is=OrdersTotal()-1; is>=0; is--) { if(OrderSelect(is, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==walpa) { if(OrderType()==op && NormalizeDouble(OrderStopLoss(),digits) < NormalizeDouble(OrderOpenPrice()+spred*point, digits) ) { err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()+spred*point, digits), OrderProfit(), 0, clrNONE); if(!err) error(GetLastError()); } if(OrderType()==op && (NormalizeDouble(OrderStopLoss(),digits) > NormalizeDouble(OrderOpenPrice()-spred*point, digits) || OrderStopLoss()==0)) { Print(walpa," ",spred," ",point," ",digits," ",NormalizeDouble(OrderOpenPrice()-spred*point, digits)); err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()-spred*point, digits), OrderProfit(), 0, clrNONE); if(!err) error(GetLastError()); } } } return; }Ha scritto una funzione per trovare il numero di barra di un frattale su 3 barre. Sul grafico online sembra trovarlo correttamente. Ma durante il test visivo nel tester si trova. Qualcuno dei professionisti può dare un'occhiata al codice e trovare qualche errore?
Te ne sarei molto grato.
Buon pomeriggio. QUALE CODICE DOVREI AGGIUNGERE IN MODO CHE L'INDICATORE SMETTA DI FUNZIONARE NEL TESTER DOPO UN MESE? CIOÈ HO SCRITTO TUTTO OK! MA QUANDO FACCIO UN BACKTEST FUNZIONA DI NUOVO. (mgl4)
Ciao!
Volevo mettere una condizione nel ciclo di chiusura degli ordini nelgiorno di apertura degli stessi, in modo che quelli aperti il venerdì non venissero chiusi.
Buon pomeriggio. QUALE CODICE DOVREI AGGIUNGERE IN MODO CHE L'INDICATORE SMETTA DI FUNZIONARE NEL TESTER DOPO UN MESE? CIOÈ HO SCRITTO TUTTO OK! MA QUANDO FACCIO UN BACKTEST FUNZIONA DI NUOVO. (mgl4)
Dovete scrivere questo codice non in OnInit, ma in OnTick().
Ciao!
Volevo mettere una condizione nel ciclo di chiusura dell'ordine nelgiorno di apertura dell'ordine, in modo che quelli aperti il venerdì non fossero chiusi.
Provate in questo modo:
for(int is=OrdersTotal()-1; is>=0; is--) { if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES)) { if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) { if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error, " ",Symbol()); } else error=0; } else Print("NoMagic ", OrderMagicNumber()); // for Debug } else Print( "Error when order select ", GetLastError()); }