Sì. Non c'è motivo di tradurre il tempo in stringa, poiché il tempo è un numero di secondi. Questo numero è molto più facile e veloce da lavorare rispetto alle stringhe.
Avete corretto una cosa e rovinato un'altra).
Nella seconda parte invece di:
ritorno:
Avevi questa linea corretta nel tuo precedente tentativo.
Grazie per le risposte! Ho provato entrambe le opzioni.
Non vedo quale sia la fregatura - va ancora dritto dentro quando si chiude su uno stop:
lil_lil:
Dite la vostra condizione ad alta voce e vedrete cosa sta succedendo)
if ( TimeSeconds(TimeCurrent()) - TimeSeconds(OrderCloseTime()) > TimeSeconds(30*60) )
if ( TimeCurrent() -OrderCloseTime() > 30*60 )
Infatti, c'è != condizione ovunque, cioè il contrario > dovrebbe esserci, se ho capito bene quello che vuoi dire. Ma tutte le varianti hanno funzionato - funziona ancora.
Ho bisogno che disegni frattali con un periodo, con un tipo "zigzag", in modo che i frattali inferiori superiori inferiori vadano in sequenza e così via.
Ma come risultato, i frattali ripetuti appaiono comunque sul grafico
La base è presa dall'indicatore frattale standard. Screenshot qui sotto con frattale ripetuto sul periodo 5
//+------------------------------------------------------------------+//| Fractals.mq5 |//| Copyright 2009-2017, MetaQuotes Software Corp. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright"2009-2017, MetaQuotes Software Corp."#property link"http://www.mql5.com"//---- indicator settings#property indicator_chart_window#property indicator_buffers2#property indicator_plots2#property indicator_type1DRAW_ARROW#property indicator_type2DRAW_ARROW#property indicator_color1 Gray
#property indicator_color2 Gray
#property indicator_label1"Fractal Up"#property indicator_label2"Fractal Down"bool high_f, low_f, lastIsUpper = true, lastIsLower = true;
int lastLowerIndex, lastUpperIndex;
//---- input datainputint period = 5;
int per = period;
//---- indicator buffersdouble ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high priceint ExtArrowShift=-10;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+voidOnInit()
{
if(per % 2 == 0) per++; //период фракталов только нечетный//---- indicator buffers mappingSetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- sets first bar from what index will be drawnPlotIndexSetInteger(0,PLOT_ARROW,217);
PlotIndexSetInteger(1,PLOT_ARROW,218);
//---- arrow shifts when drawingPlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ExtArrowShift);
//---- sets drawing line empty value--PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- initialization done
}
intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
int i,limit;
//---if(rates_total < per)
return(0);
//---if(prev_calculated < per + (per - 1) / 2)
{
limit = (per - 1) / 2;
//--- clean up arraysArrayInitialize(ExtUpperBuffer,EMPTY_VALUE);
ArrayInitialize(ExtLowerBuffer,EMPTY_VALUE);
}
else limit = rates_total - per;
for(i = limit; i < rates_total - (per + 1) / 2 && !IsStopped(); i++)
{
high_f = true; low_f = true;//с самого начала считаем что есть фрактал в i свечеfor(int g = 1; g < (per+1)/2; g++){//проверка на наличие фрактала (одновременной справа и слева от свечи с возможным фракталом)//---- Upper Fractalif(high[i-g] >= high[i] || high[i+g] > high[i]){//если одно из условий выполнено (high какой либо свечи справа или слева выше чем исследуемый), то фрактала сверху нет
ExtUpperBuffer[i] = EMPTY_VALUE;
high_f = false;
}
//---- Lower Fractalif(low[i-g] <= low[i] || low[i+g] < low[i]){ //если одно из условий выполнено, то фрактала снизу нет
ExtLowerBuffer[i] = EMPTY_VALUE;
low_f = false;
}
}
//устанавливаем верхнийif(high_f){//если фрактал все таки есть (из цикла-проверки выше)if(lastIsLower){//еси последний фрактал был нижний
ExtUpperBuffer[i] = high[i];//устанавливаем сверху
lastUpperIndex = i;//записываем индекс в буффере установленного
lastIsLower = false;//говорим что последний - не нижний
lastIsUpper = true;//а верхний
}else{
if(lastIsUpper){//если последний верхний (а мы пытаемся установить верхний)if(high[i] > ExtUpperBuffer[lastUpperIndex]){//если устанавливаем выше предыдущего
ExtUpperBuffer[lastUpperIndex] = EMPTY_VALUE;//удаляем предыдущий
ExtUpperBuffer[i] = high[i];//устанавливаем новый
lastUpperIndex = i;//записываем индекс нового
}
}
}
}
//аналогично для фрактала снизуif(low_f){
if(lastIsUpper){
ExtLowerBuffer[i] = low[i];
lastLowerIndex = i;
lastIsLower = true;
lastIsUpper = false;
}else{
if(lastIsLower){
if(low[i] < ExtLowerBuffer[lastLowerIndex]){
ExtLowerBuffer[lastLowerIndex] = EMPTY_VALUE;
ExtLowerBuffer[i] = low[i];
lastLowerIndex = i;
}
}
}
}
}
//--- OnCalculate done. Return new prev_calculated.return(rates_total);
}
//+------------------------------------------------------------------+
kotaries: Potete per favore consigliare come ottenere il volume delle posizioni aperte in MQL4, se SYMBOL_SESSION_INTEREST non è supportato? Grazie!
Esamina tutte le posizioni e calcola il loro volume totale:OrderLots()
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает сумму лотов открытых позиций |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ( "" - любой символ, |//| NULL - текущий символ) |//| op - торговая операция ( -1 - любая позиция) |//| mn - MagicNumber ( -1 - любой магик) |//+----------------------------------------------------------------------------+double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
double l=0;
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
l+=OrderLots();
}
}
}
}
}
}
return(l);
}
Non riesco a capire perché viene restituito un certo valore di prev_calculated?
Come si calcola?
Questo è il valore restituito da OnCalculate() all'ultima iterazione. Questo è esplicitamente dichiarato nella documentazione:
La relazione tra il valore restituito da OnCalculate() e il secondo parametro di input prev_calculated dovrebbe essere notato. Ilparametro prev_calculated, quando la funzione viene chiamata, contiene il valorerestituito da OnCalculate() nella chiamataprecedente. Questo permette algoritmi economici per il calcolo dell'indicatore personalizzato al fine di evitare calcoli ripetuti per quelle barre che non sono cambiate dalla precedente chiamata di questa funzione.
Ciao!
Sì. Non c'è motivo di tradurre il tempo in stringa, poiché il tempo è un numero di secondi. Questo numero è molto più facile e veloce da lavorare rispetto alle stringhe.
Avete corretto una cosa e rovinato un'altra).
Nella seconda parte invece di:
ritorno:
Avevi questa linea corretta nel tuo precedente tentativo.
Grazie per le risposte! Ho provato entrambe le opzioni.
Non vedo quale sia la fregatura - va ancora dritto dentro quando si chiude su uno stop:
Dite la vostra condizione ad alta voce e vedrete cosa sta succedendo)
Infatti, c'è != condizione ovunque, cioè il contrario > dovrebbe esserci, se ho capito bene quello che vuoi dire. Ma tutte le varianti hanno funzionato - funziona ancora.
Aiutare a capire la logica, trovare l'errore
Commentato il codice in dettaglio.
Ho bisogno che disegni frattali con un periodo, con un tipo "zigzag", in modo che i frattali inferiori superiori inferiori vadano in sequenza e così via.
Ma come risultato, i frattali ripetuti appaiono comunque sul grafico
La base è presa dall'indicatore frattale standard. Screenshot qui sotto con frattale ripetuto sul periodo 5
Potete per favore consigliare come ottenere il volume delle posizioni aperte in MQL4, se SYMBOL_SESSION_INTEREST non è supportato? Grazie!
Esamina tutte le posizioni e calcola il loro volume totale:OrderLots()
Non riesco a capire perché viene restituito un certo valore di prev_calculated?
Come si calcola in primo luogo?
Non riesco a capire perché viene restituito un certo valore di prev_calculated?
Come si calcola in primo luogo?
Non riesco a capire perché viene restituito un certo valore di prev_calculated?
Come si calcola?
Questo è il valore restituito da OnCalculate() all'ultima iterazione. Questo è esplicitamente dichiarato nella documentazione:
La relazione tra il valore restituito da OnCalculate() e il secondo parametro di input prev_calculated dovrebbe essere notato. Ilparametro prev_calculated, quando la funzione viene chiamata, contiene il valorerestituito da OnCalculate() nella chiamataprecedente. Questo permette algoritmi economici per il calcolo dell'indicatore personalizzato al fine di evitare calcoli ripetuti per quelle barre che non sono cambiate dalla precedente chiamata di questa funzione.
Il compito è trovare la barra con la chiusura minima
for(int x=0; x<=xBars -1; x++)
{
contro++;
// Print(Close[x],",",counter);
int h = ArrayMinimum(Close[x]);
se(contatore > 20) pausa;
}
Il compilatore giura su Close