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

 
Renat Akhtyamov:

L'unica cosa da considerare qui è che dopo il blocco del ciclo i==x

In questo caso Array[i] dopo for(...){} restituirà un errore di overrun dell'array e questo è tutto

Facendo questo si fornisce terreno fertile per possibili errori, per esempio, se più in basso nel codice si ha una variabile j, e la si chiama accidentalmente i. Oppure potete scrivere [i] al posto dell'indice dell'array [1] e così via.
Ho scritto qui non di un codice particolare, ma di un esempio di ciò che può essere. Può succedere che non ci siano confini di array e che l'errore sia difficile da catturare, e che si spendano molti minuti preziosi (se non ore) per localizzarlo.
 

(Ho bisogno di un suggerimento, perché sto iniziando a diventare laggoso)

C'è una costruzione come questa:

int RangeBar = 10;
 HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
 LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));

Trova l'Alto/Bassodella gamma in N candele.

Domanda: Come trovare lo stessoAlto/Basso, ma non in base alle ombre, ma ai corpi?

 
Vitaly Muzichenko:

(Ho bisogno di un suggerimento, perché sto iniziando a diventare laggoso)

C'è una costruzione come questa:

int RangeBar = 10;
 HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
 LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));

Trova l'Alto/Bassodella gamma in N candele.

Domanda: Come trovare lo stessoAlto/Basso, ma non in base alle ombre, ma ai corpi?

Ho bisogno di trovare fmax(Open[i],Close[i]) per la parte superiore e fmin(Open[i],Close[i]) per la parte inferiore della candela
 
Artyom Trishkin:
Ho bisogno di cercare fmax(Open[i],Close[i]) per la parte superiore e fmin(Open[i],Close[i]) per la parte inferiore

Cioè, fare un ciclo di loop invece di due linee che cercano High/Low?

HighRange =iHigh(simbolo,0,iHighest(simbolo,0,MODE_HIGH,RangeBar,1));

LowRange =iLow(simbolo,0,iLowest(simbolo,0,MODE_LOW,RangeBar,1))

Questo è necessario per l'EA, non per l'indicatore, funziona correttamente nell'EA, ma come trovare l'intervallo dai corpi - non mi viene in mente.

 
Vitaly Muzichenko:

Cioè, fare un ciclo di loop invece di due linee che cercano High/Low?

HighRange =iHigh(simbolo,0,iHighest(simbolo,0,MODE_HIGH,RangeBar,1));

LowRange =iLow(simbolo,0,iLowest(simbolo,0,MODE_LOW,RangeBar,1));

Ne ho bisogno per Expert Advisor, non per l'indicatore, funziona correttamente in Expert Advisor, ma non riesco a capire come trovare la gamma di corpi.

Ho lanciato uno script di prova. Può essere impreciso, non ci ho lavorato. Spero che lo capirete.

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int      Begin=1;       // Бар начала диапазона поиска
input int      RangeBars=20;  // Диапазон поиска
//---
int bars=Bars(Symbol(),PERIOD_CURRENT);
int begin=(Begin<0?0:Begin>bars-3?bars-3:Begin);
int rangeBars=(RangeBars<2?2:
               RangeBars>bars-begin?bars-begin:
               RangeBars); // Диапазон поиска
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates array[];
   double   high=0, low=0;
   int      highest=-1, lowest=-1;
   if(CopyRates(Symbol(),PERIOD_CURRENT,begin,rangeBars,array)>0) {
      ArraySetAsSeries(array,true);
      high=GetHighestValue(begin,array,highest);
      low=GetLowestValue(begin,array,lowest);
      }
   Print("High=",DoubleToString(high,Digits()),", Highest=",highest,", Low=",DoubleToString(low,Digits()),", Lowest=",lowest);
  }
//+------------------------------------------------------------------+
double GetHighestValue(int bar_begin, MqlRates &array[], int &bar_highest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   high=DBL_MIN;
   bar_highest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmax(array[i].open,array[i].close);
      if(value>high) {
         high=value;
         bar_highest=bar_begin+i;
         }
      }
   return(high);
}
//+------------------------------------------------------------------+
double GetLowestValue(int bar_begin, MqlRates &array[], int &bar_lowest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   low=DBL_MAX;
   bar_lowest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmin(array[i].open,array[i].close);
      if(value<low) {
         low=value;
         bar_lowest=bar_begin+i;
         }
      }
   return(low);
}
//+------------------------------------------------------------------+
Se hai qualche domanda, chiedi pure...
 
Artyom Trishkin:

Ho appena buttato fuori uno script di prova. Ci possono essere delle imprecisioni - l'ho scritto sul momento. Spero che tu riesca a capire come funziona.

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
...
//+------------------------------------------------------------------+
Per qualsiasi cosa, basta chiedere...

Grazie, funziona benissimo!

PS. Ho capito che questa cosa funzionerà nella quinta?

 
Vitaly Muzichenko:

Grazie, funziona benissimo!

PS. Immagino che questa cosa funzionerà nella quinta?

Sì, cercando di fare codice multipiattaforma. O con modifiche minime per la quinta.
 
Ho una mano molto cattiva. per favore aiutatemi ad aggiungere lo stop loss per la vendita (slevel).
int start()
{
//+--------------------------------------------------------------------+
//|   -= stop loss в без убыток =-                                      |
//+--------------------------------------------------------------------+
bool   result;
double stop;
int    cmd,error;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderProfit()>pOPCS)
{
cmd=OrderType();
double blevel=OrderStopLoss()<Bid-Point*TS;
double slevel=OrderStopLoss()>Ask+Point*TS;
//---
if(cmd==OP_BUY || cmd==OP_SELL)
{
while(true)
{
if(cmd==OP_BUY && blevel) stop=Bid-Point*TS;
else                      stop=Ask+Point*TS;
result=OrderModify(OrderTicket(),OrderOpenPrice(),stop,0,0,Orange);
if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
else error=0;
if(error==135) RefreshRates();
else break;
}
}
}
}
 
Artyom Trishkin:

Ho allegato uno script di prova. Può essere impreciso, non ho lavorato sulla mia mano. Spero che lo capirete.

Se hai qualche domanda...

Scusa Artem, ma voglio mostrare la soluzione a questo problema in un modo più semplice

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

Spero che tutti possano scriverlo nel loro codice e aggiungere i controlli necessari. La funzionalità è la stessa sia per mql4 che per mql5.

 
Alexey Viktorov:

Scusa, Artem, ma voglio mostrare una soluzione più semplice a questo problema

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

Spero che tutti possano scriverlo nel loro codice e aggiungere i controlli necessari. La funzionalità è la stessa sia per mql4 che per mql5.

О! Grazie. Non l'ho indovinato io stesso al mattino... È vero, gli array dovrebbero essere controllati per il riempimento. Non l'ho visto nel quadruplo, e nel quinto, i dati spesso non vengono compilati la prima volta a causa della mancanza di dati storici.

ZS. Dovresti dormire di più - i tuoi pensieri lavoreranno in quella direzione.