Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 23

 
giannis1386:

Estou completamente confuso.

double blevel=OrderStopLoss()<Bid-Point*TS; funciona para mim. SL vai atrás do preço somente em lucro.

double slevel=OrderStopLoss()>Ask+Point*TS; eu não sei como adicionar este a outro

Não é um bool.

Não é um bool, mas é chamado de conversão implícita

O que você está fazendo afinal? Arrasto?

 
Artyom Trishkin:

Não é um bool, mas é chamado de conversão implícita

O que você está fazendo afinal? Arrasto?

Sim tentou fazer uma rede de arrasto. o roteiro original foi apenas para fechar quando o pedido alcançou lucro
 
giannis1386:
Sim tentou fazer uma rede de arrasto. o roteiro original foi apenas para fechar quando o lucro do pedido foi alcançado
Não é um roteiro, é um EA. Você está confundindo os tipos de programas. O script é executado uma vez após ser carregado na tabela e depois apagado. Se não estiver em loop. É improvável que alguém faça um roteiro em loop para fechar posições.
 
giannis1386:
Sim, eu tentei fazer uma rede de arrasto. o scrip original era apenas para fechá-la quando ela alcançava lucro em um pedido

Lógica:

Se o lucro do pedido atual selecionado no laço for maior que o valor definido, se seu prejuízo for menor (para Comprar)/mais (para Vender) do que o nível de arrasto de prejuízo calculado, então mude a parada para o novo valor.

Isto é em poucas palavras.

 
Artyom Trishkin:
Não foi isso que eu sugeri?

Sim, bem... Eu olhei para seu código de forma tão desatenta, que é melhor dizer que não olhei nada. Mas isso é a metade do problema, então eu disse tal porcaria de que quase me envergonho. Por alguma razão, de repente tive esta idéia maluca de que o ArrayMaximum() poderia ser aplicado a uma série de estruturas ou mesmo a um campo separado desta série.

Arrependo-me, não aconselho mais ninguém a pensar assim, não funciona...:)

 
Alexey Viktorov:

Sim, bem... Eu olhei para seu código de forma tão desatenta, que é melhor dizer que não olhei nada. Mas isso é a metade do problema, então eu disse tal porcaria de que quase me envergonho. Por alguma razão, de repente tive esta idéia maluca de que o ArrayMaximum() poderia ser aplicado a uma série de estruturas ou mesmo a um campo separado desta série.

Arrependo-me, não aconselho mais ninguém a pensar assim, não funciona...:)

Bem... E eu? Olhei seu código da mesma forma e lhe agradeci - foi realmente mais curto...

Em resumo - ambos valem uma piada...

 
Artyom Trishkin:
Não um roteiro, um Expert Advisor. Você está confundindo os tipos de programas. O script é executado uma vez após ser carregado na tabela e depois apagado. Se não estiver em loop. Dificilmente alguém vai fazer um roteiro em loop para fechar posições.

de acordo com o autor:

Aqui está um script MT4 close.mq4 padrão ligeiramente modificado

Colocar o arquivo na pasta MetaTrader (Scripts) dos especialistas em MetaTrader,

 
Artyom Trishkin:

Bem... E eu? quando olhei para o seu código, eu me curvei em agradecimento - é realmente mais curto...

Em resumo - ambos valem uma piada...

Não, eu não concordo. Este código

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

testado e funciona. Existem matrizes duplas simples definidas pelo usuário, e CopyRates() preenche uma variedade de estruturas e, portanto, você não pode escolher o máximo e o mínimo usando funções de trabalho com matrizes.

 
giannis1386:

de acordo com o autor:

Aqui está um script MT4 close.mq4 padrão ligeiramente modificado

Colocar o arquivo na pasta MetaTrader (Scripts),

Assim, seu roteiro funciona apenas uma vez - coloquei-o no gráfico, o roteiro funcionou(posições fechadas) e descarregou.

Você não precisa de um roteiro, você precisa de um EA.

 
Alexey Viktorov:

Não, eu discordo. Este código

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

é testado e funciona. Aqui estão as simples matrizes duplas personalizadas, e CopyRates() preenche uma matriz de estruturas e, portanto, você não pode selecionar máximo e mínimo usando funções de matriz.

Bem, estou lhe dizendo - eu estava observando seu código com super atenção também. Então - a piada é sobre mim.

SZY... Mas meu código retorna quatro valores: alto/baixo/alto/baixo, o seu retorna apenas alto e baixo, e meu código verifica o sucesso da cópia de dados (embora não todos), o seu não...

É assim que meu código verifica a cópia completa dos dados necessários:

//+------------------------------------------------------------------+
//|                                      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);
}
//+------------------------------------------------------------------+
Razão: