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

 
giannis1386:

Sono completamente confuso.

double blevel=OrderStopLoss()<Bid-Point*TS; funziona per me. SL insegue il prezzo solo in profitto.

double slevel=OrderStopLoss()>Ask+Point*TS; Non so come aggiungere questo a else

Non è un bool.

Non è un bool, ma si chiama conversione implicita

Cosa stai facendo comunque? Reti a strascico?

 
Artyom Trishkin:

Non è un bool, ma si chiama conversione implicita

Cosa stai facendo comunque? Reti a strascico?

Sì, ho provato a fare un trawl. lo script originale era solo per chiudere quando l'ordine raggiungeva il profitto
 
giannis1386:
Sì, ho provato a fare un trawl. lo script originale era solo per chiudere quando il profitto sull'ordine veniva raggiunto
Non uno script, un EA. State confondendo i tipi di programmi. Lo script viene eseguito una volta dopo essere stato caricato sul grafico e poi cancellato. Se non è in loop. È improbabile che qualcuno faccia uno script in loop per chiudere le posizioni.
 
giannis1386:
Sì, ho provato a fare un trawl. lo scrip originale era solo per chiuderlo quando raggiungeva il profitto su un ordine

Logica:

Se il profitto dell'ordine corrente selezionato nel ciclo è maggiore del valore impostato, se il suo stoploss è inferiore (per Comprare)/superiore (per Vendere) al livello di strascico dello stoploss calcolato, allora sposta lo stop al nuovo valore.

Questo è in poche parole.

 
Artyom Trishkin:
Non è quello che ho suggerito?

Sì, beh... Ho guardato il tuo codice così distrattamente che è meglio dire che non l'ho guardato affatto. Ma questa è la metà del problema, poi ho detto delle sciocchezze che quasi mi vergogno. Per qualche ragione ho improvvisamente avuto questa folle idea che ArrayMaximum() potesse essere applicato a un array di strutture o anche a un campo separato di questo array.

Mi pento, non consiglio a nessun altro di pensarla così, non funziona...:)

 
Alexey Viktorov:

Sì, beh... Ho guardato il tuo codice così distrattamente che è meglio dire che non l'ho guardato affatto. Ma questo è la metà del problema, poi ho detto delle sciocchezze che quasi mi vergogno. Per qualche ragione ho improvvisamente avuto questa pazza idea che ArrayMaximum() potesse essere applicato ad un array di strutture o anche ad un campo separato di questo array.

Mi pento, non consiglio a nessun altro di pensare così, non funziona...:)

Bene... E io? Ho guardato il tuo codice allo stesso modo e ti ho ringraziato - era davvero più corto...

In breve - entrambi valgono una battuta...

 
Artyom Trishkin:
Non uno script, un Expert Advisor. State confondendo i tipi di programmi. Lo script viene eseguito una volta dopo essere stato caricato sul grafico e poi cancellato. Se non è in loop. Quasi nessuno farà uno script in loop per chiudere le posizioni.

secondo l'autore:

Ecco uno script standard MT4 close.mq4 leggermente modificato

Mettete il file nella cartella MetaTrader\experts\Scripts,

 
Artyom Trishkin:

Bene... E io? Appena ho dato un'occhiata al tuo codice, mi sono inchinato in segno di gratitudine - è davvero più corto...

In breve - entrambi valgono una battuta...

No, non sono d'accordo. Questo codice

  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)]);

testato e funziona. Ci sono semplici matrici doppie definite dall'utente, e CopyRates() riempie una matrice di strutture e quindi non si può scegliere il massimo e il minimo usando funzioni di lavoro con matrici.

 
giannis1386:

secondo l'autore:

Ecco uno script standard MT4 close.mq4 leggermente modificato

Mettete il file nella cartella MetaTrader\experts\Scripts,

Quindi il suo script funziona solo una volta - l'ho messo sul grafico, lo script ha funzionato(posizioni chiuse) e si è scaricato.

Non hai bisogno di uno script, ma di un EA.

 
Alexey Viktorov:

No, non sono d'accordo. Questo codice

  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)]);

è testato e funziona. Qui ci sono semplici doppi array personalizzati, e CopyRates() riempie un array di strutture e quindi non è possibile selezionare max e min usando funzioni di array.

Beh, te lo dico - anch'io stavo guardando il tuo codice in modo super attento. Quindi - lo scherzo riguarda me.

SZY... Ma il mio codice restituisce quattro valori: High/Low/Highest/Lowest, il tuo restituisce solo High e Low, e il mio codice controlla il successo della copia dei dati (anche se non tutti), il tuo no...

È così che il mio codice controlla la copia completa dei dati richiesti:

//+------------------------------------------------------------------+
//|                                      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)==rangeBars) {
      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);
}
//+------------------------------------------------------------------+
Motivazione: