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

 
spoiltboy:

Bom. Você pode me dizer onde está o erro?

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0; int ticketUP, ticketD;

void OnTick()
  {
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}



slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
  } 

Tudo funciona, coloca um pedido ao preço de maxpr1.

Então eu quero fazer o mesmo, mas a um preço minpr1:

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0; int ticketUP, ticketD;

void OnTick()
  {
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}



slS=NormalizeDouble(minpr1+pointsl*Point,5);
tpS=NormalizeDouble(minpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, minpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
  }

Erro 130 (paradas erradas). O que eu estou fazendo de errado?


Quando você coloca uma ordem pendente, o preço de abertura não pode estar muito próximo do mercado. A distância mínima do preço pendente do preço de mercado atual em pontos também pode ser obtida usando a função MarketInfo() com o parâmetro MODE_STOPLEVEL. Se o preço aberto da ordem pendente estiver incorreto, será gerado um erro 130 (ERR_INVALID_STOPS).

 
Alekseu Fedotov:
Não, não é isso, a lacuna está lá. Também tentei mudar a compra pendente, testei-a no mesmo gráfico e cometi os mesmos erros.
 
spoiltboy:
Não, não é isso, a lacuna está lá. Além disso, tentei mudar minha compra pendente, testei-a no mesmo gráfico, os mesmos erros.

Uma lacuna é uma lacuna, mas você provavelmente não leu tudo o que se segue

....... Seo preço aberto do pedido pendente estiver incorreto, será gerado o erro 130 (ERR_INVALID_STOPS)...........

ou seja, você está tentando definir OP_SELLLIMIT abaixo do preço de mercado.

 
Alekseu Fedotov:

Uma lacuna é uma lacuna, mas você provavelmente não leu tudo o que se segue

....... Seo preço aberto do pedido pendente estiver incorreto, será gerado o erro 130 (ERR_INVALID_STOPS)...........

ou seja, você está tentando definir OP_SELLLIMIT abaixo do preço de mercado.

Obrigado.
 
//------------закрываем ордер по обратному сигналу удаляем или модифицируем отложки------

  for(int i2=total-1; i2>=0; i2--)
     if(OrderSelect(i2, SELECT_BY_POS))
         if(OrderSymbol()==Symbol()      )
         if (OrderMagicNumber()==Magic)
      {
      if (OrderType()==OP_BUY)
      {
     if (sig2==1)  {bool cl = OrderClose(OrderTicket(),OrderLots(),Bid,Slip,0);if (cl==false) {Print("OrderClose завершилась с ошибкой #",GetLastError());}}
    
      }
      if (OrderType()==OP_SELL)
      {
     if (sig2==2)  {bool cl = OrderClose(OrderTicket(),OrderLots(),Ask,Slip,0);if (cl==false) {Print("OrderClose завершилась с ошибкой #",GetLastError());}}
    
      }
    
      if (OrderType()==OP_BUYSTOP)
      {
    
     if (sig2==2&&Delete_Order==true)  {bool del = OrderDelete(OrderTicket());if (del==false) {Print("OrderDelete завершилась с ошибкой #",GetLastError());}}
    
     //if (sig==1&&OrderOpenPrice()!=buystop_open&&Ask<buystop_open-stops) {bool mod = OrderModify(OrderTicket(),buystop_open,buystop_sl,0,0);Print("Мод. цены бай стоп=" ,buystop_open,", СЛ=",buystop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
    
      }
    
      if (OrderType()==OP_SELLSTOP)
      {
  
     if (sig2==1&&Delete_Order==true)  {bool del = OrderDelete(OrderTicket());if (del==false) {Print("OrderDelete завершилась с ошибкой #",GetLastError());}}
  
     //if (sig==1&&OrderOpenPrice()!=sellstop_open&&Bid>sellstop_open+stops) {bool mod = OrderModify(OrderTicket(),sellstop_open,sellstop_sl,0,0);Print("Мод. цены бай стоп=" ,sellstop_open,", СЛ=",sellstop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
      
      }
      
      }

    
  
  }
//+------------------------------------------------------------------+
if (FMA1<GrossMA1 && FMA2>GrossMA2 ) {sig=2;} // parada de venda

if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;} // comprar parada

Não há sinal para fechar um comércio aberto por si só.

 
Movlat Baghiyev:
if (FMA1<GrossMA1 && FMA2>GrossMA2 ) {sig=2;} // parada de venda

if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;} // comprar parada

Não há sinal de saída de um comércio por si só.

Na barra de zero o sinal "cintila", que não é visível no pós-fácio. Se for feita a visualização de todos os carrapatos no testador, as perguntas desaparecerão.
 
Vitalie Postolache:
Na barra zero o sinal "cintila", que não é visível pós-facto. Execute a visualização em todos os carrapatos do testador, as perguntas desaparecerão.
Não é esse o problema. Quando uma ordem é acionada, um comércio se abre e fecha imediatamente quando uma nova vela aparece e não há sinal contrário. É por isso que eu lhe dei um código para fechar negócios.
 
Movlat Baghiyev:
Este não é o problema. Quando uma ordem é acionada, uma troca é aberta e é imediatamente fechada quando uma nova vela aparece e não há sinal inverso. Por isso, dei-lhe um código para fechar trocas.
Você precisa anular a variável"sig" após a configuração, porque o sinal será constante, se você anulá-lo, então a variável terá valor novamente após a próxima travessia e anulá-lo novamente após completar todas as ações. Ou você pode colocar uma bandeira que se houvesse uma passagem para cima, a próxima deveria ser para baixo e se não houver nenhuma passagem para baixo, então todos os sinais são ignorados até que haja uma passagem ao contrário.
 

Olá.

Você pode me dizer o que está errado?

O ícone deve ser definido se a linha indicadora tiver cruzado o nível 20, no período M1, e a linha indicadora estiver acima do nível 50, no período M5.

Por alguma razão a marca é estabelecida mesmo que a linha na M5 esteja abaixo do nível estabelecido de 50.

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
Comment("");
int limit = rates_total;
int count=prev_calculated;

for(int i=limit-count; i>=1;i--)
{
//Getting Stochastic buffer values using the iCustom function
  double Stoch1 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
  double Stoch2 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i+1);
  
   double Stoch50_1 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i);
  double Stoch50_2 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i+1);
  
  if(Stoch1>20 && Stoch2<20&&Stoch50_1>50)
  {
   UP[i]=Low[i]-distance*MyPoint;
  }
  //if(Stoch1<80 && Stoch2>80&&Stoch50_1<50)
  //{
  // DOWN[i]=High[i]+distance*MyPoint;
  //}
}
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
mila.com:

Olá.

Você pode me dizer o que está errado?

O ícone deve ser definido se a linha indicadora tiver cruzado o nível 20, no período M1, e a linha indicadora estiver acima do nível 50, no período M5.

Por alguma razão o sinal é definido mesmo que a linha na M5 esteja abaixo do nível definido de 50.

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
Comment("");
int limit = rates_total;
int count=prev_calculated;

for(int i=limit-count; i>=1;i--)
{
//Getting Stochastic buffer values using the iCustom function
  double Stoch1 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
  double Stoch2 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i+1);
  
   double Stoch50_1 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i);
  double Stoch50_2 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i+1);
  
  if(Stoch1>20 && Stoch2<20&&Stoch50_1>50)
  {
   UP[i]=Low[i]-distance*MyPoint;
  }
  //if(Stoch1<80 && Stoch2>80&&Stoch50_1<50)
  //{
  // DOWN[i]=High[i]+distance*MyPoint;
  //}
}
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Seu ciclo é estranho. Estranho.

//+------------------------------------------------------------------+
   if(rates_total<xxx) return(0);         // xxx здесь - количество баров, при которых невозможно рассчитать индикатор
   int limit=rates_total-prev_calculated;
   if(limit>1) {                          // limit больше 1 в том случае, когда в истории произошли изменения
      limit=rates_total-1;                // не обязательно -1, если в цикле есть i+1, значит limit=rates_total-2, и т.д., и т.п.
      // тут проводим действия когда нужно пересчитать всю историю
      }
//---
   for(int i=limit; i>=0; i--) {
      // основной цикл индикатора
      }
//+------------------------------------------------------------------+

Por que limitar a verificação para mais de 1. Por exemplo, a história é carregada e a diferença será maior que uma. Se tudo estiver normal, então as taxas de diferença_total-prev_calculadas serão 0 ou 1
0 - um novo tique chegou e uma nova barra ainda não começou a ser formada.
1 - um novo tick chegou e uma nova barra começou a se formar

Mostre-nos todo o seu indicador - vamos ver o que está errado.

Razão: