[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 131

 

Eu retrabalhei um código sobre o que perguntei ontem. Agora tudo está como deveria estar. Abaixo estão 3 funções para mostrar o que é usado para obter o sinal original, já que este é apenas o começo do que estou escrevendo.

//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal)
{
   double fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   double slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   
   DeletePendingOrders();
   
   if (signal == SIGNAL_BUY)
       if (!OpenBuy(fastMa, slowMa))
          return(false);
   
   if (signal == SIGNAL_SELL)
       if (!OpenSell(fastMa, slowMa))
          return(false);
       
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
   // Получаем значения машек для дальнейших рассчётов
   double fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   double slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
 //  double filtrMa = iMA(NULL,i_TF,i_filtrMaPeriod,0,MODE_SMA,MODE_CLOSE,0);
   
   if (FindOrders() > 0)                                 // Если есть открытые ордера, то..
       return (SIGNAL_NO);                               //..ничего не делаем
   
   if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_UP)      // Если машки указывают вверх
       if ( (MathAbs(High[0] - fastMa) <= 0.1 * pt ) || ( MathAbs(Low[0] - fastMa) <= 0.1 * pt) )     // Цена вблизи 0.1пп от fastMa
           return(SIGNAL_BUY);      // Функция возвращает сигнал покупки
       
 //  if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_DOWN)
   //    return(SIGNAL_SELL);
   
   return (SIGNAL_NO);
}

Aqui está a função de compra:

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(double fastMa, double slowMa)
{
   int ticket = -1;
   
//   if ( (MathAbs(High[0] - fastMa) <= 0.1 * pt ) || ( MathAbs(Low[0] - fastMa) <= 0.1 * pt) )
   {
       if ((fastMa + i_thresholdFromMa * pt) > Ask)            // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником
      Print("fastMa = ", DoubleToStr(fastMa,Digits));
      Print("i_thresholdFromMa = ", DoubleToStr(i_thresholdFromMa * pt,Digits));
       ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
      Print("OrderOpenPrice() = ", DoubleToStr(OrderOpenPrice(),Digits));
   }
      if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
 
   return (true);
}

Aqui está a linha:

ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);

temos uma abertura de posição a preçoND(fastMa + i_thresholdFromMa * pt), mas não abre de forma alguma. Por quê?

Já faz dois dias que estou lutando, não sei o que fazer. No código, tudo é a mesma coisa. Eu não passei nenhum cheque de verdade, estou escrevendo-os agora para o tester.

Aqui está uma captura de tela, por exemplo,

Uma articulação

No gráfico, você pode ver que o preço não é mais alto que o fastMa (vermelho), e mais baixo em geral. Mas no código, a condição é explicitamente declarada, que a ordem pendente deve ser pelo preço:

ND(fastMa + i_thresholdFromMa * pt)

Qual é a contrapartida, profissionais? Eu não sei mais o que fazer...

 

Olá.Eu escrevi um indicador baseado no indicador, o indicador de Sinal-Sinal original mostra seus valores em todas as barras anteriores quando anexadas ao gráfico (ele é aplicado a todas as barras, a partir da barra [1]), mas o indicador criado a partir dele (ele é aplicado à barra [0]) mostra seus valores somente quando anexado ao gráfico, seus valores estão corretos mas nas barras anteriores "vazias", por favor me diga como corrigi-lo.

Meu código:

#property indicator_separate_window
#property indicator_minimum -7
#property indicator_maximum 7
#property indicator_buffers 2
#property indicator_color1 Yellow
#property indicator_color2 DarkOrange
#property indicator_width1  2
#property indicator_width2  2
#property indicator_level1 0.0
//--- buffers
double UpMapBuffer[];
double DnMapBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,UpMapBuffer);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,DnMapBuffer);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int vb;   // внутренний бар
    int i;

    for(i=1;i<Bars-34-1;i++)                                               
     {
      double AO_Sig_Sig_1 = iCustom(NULL,0,"Signal-Signal",0,i);                           
      double AO_Sig_Sig_2 = iCustom(NULL,0,"Signal-Signal",0,i+1);
      
      if((High[i]<=High[i+1])&&(Low[i]>=Low[i+1])&&(AO_Sig_Sig_1==AO_Sig_Sig_2))  vb++;
            
      if((AO_Sig_Sig_1!=AO_Sig_Sig_2)||(i>3+vb)) break;                                                                
     }
         
    i=i*(AO_Sig_Sig_1); 
            
    if(MathAbs(i)>3+vb) i=0;                  

    if(i>0)            
     {
      UpMapBuffer[0]=i;
     }
    else
     {
      UpMapBuffer[0]=0;
     } 
         
    if(i<0)         
     {
      DnMapBuffer[0]=i;
     }
    else
     {
      DnMapBuffer[0]=0;
     }          
                      
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

Victor, acho que você deveria fazer uma pausa em Asc + distância, e na condição especificar a proporção de Asc e Mashka, então será o que você quer. Experimente!

 
hoz:


Você pode ver na tabela que o preço não está acima do fastMa (a pulseira vermelha), mas abaixo dele por completo. Mas no código, a condição é explicitamente declarada de que a pausa deve ser pelo preço:

Qual é a contrapartida, profissionais? Eu não sei mais o que fazer...

Talvez no momento em que o pedido foi feito, o MA estava mais baixo do que o que está sendo sacado agora. Tente tomar os valores de MAA não da 0ª barra, mas da 1ª barra.
 
borilunad:

Victor, acho que você deveria fazer uma pausa em Asc + distância, e na condição especificar a proporção de Asc e Mashka, então será o que você quer. Experimente!


Boris, foi o que eu fiz:

//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
   // Получаем значения машек для дальнейших рассчётов
   double fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   double slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
 //  double filtrMa = iMA(NULL,i_TF,i_filtrMaPeriod,0,MODE_SMA,MODE_CLOSE,0);
   
   if (FindOrders() > 0)                                 // Если есть открытые ордера, то..
       return (SIGNAL_NO);                               //..ничего не делаем
   
   if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_UP)      // Если машки указывают вверх
      // if ( (MathAbs(High[0] - fastMa) <= 0.1 * pt ) || ( MathAbs(Low[0] - fastMa) <= 0.1 * pt) )     // Цена вблизи 0.1пп от fastMa
       if ( (MathAbs(Ask - fastMa) <= 0.1 * pt ) || ( MathAbs(Ask - fastMa) <= 0.1 * pt) )
           return(SIGNAL_BUY);      // Функция возвращает сигнал покупки
       
 //  if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_DOWN)
   //    return(SIGNAL_SELL);
   
   return (SIGNAL_NO);
}

E aqui está a abertura de posição:

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(double fastMa, double slowMa)
{
   int ticket = -1;
   
       if ((fastMa + i_thresholdFromMa * pt) > Ask)            // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником
      Print("fastMa = ", DoubleToStr(fastMa,Digits));
      Print("i_thresholdFromMa = ", DoubleToStr(i_thresholdFromMa * pt,Digits));
       ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
      Print("OrderOpenPrice() = ", DoubleToStr(OrderOpenPrice(),Digits));
      
      if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
 
   return (true);
}

Tudo parece estar correto. Mas ele ainda está lá.

Sepulca:
Talvez no momento em que o pedido foi feito, a MAHA estava mais baixa do que o que está agora desenhado. Tente pegar os valores de MA da 1ª barra em vez da 0ª.


Experimentei, sem diferença. Voltei a colocá-lo... O que importa para mim é o que está acontecendo neste momento, não o que estava acontecendo antes.

Aqui está uma captura de tela (se o valor recebido da máquina não for 0, mas 1) :

Onde está a lógica?

 

Victor, é por isso que escrevo condições no início, para que eu possa ver tudo, para que seja mais fácil encontrar erros lógicos, especialmente quando ainda não há conhecimento e experiência suficientes, entre os quais me contarei por um longo tempo. Os profissionais manipulam facilmente funções, arquivos e bibliotecas, e provavelmente esqueceram como eles gradualmente dominaram toda essa sabedoria. Mas não podemos aprender a teoria sem a prática, e muito mais depende do caráter de cada pessoa.

 
hoz:


Boris, foi o que eu fiz:

E aqui está a abertura do cargo:

Tudo parece estar certo. Mas ainda está lá.


Experimentei, sem diferença. Eu voltei... O que importa para mim é o que está acontecendo neste momento, não o que aconteceu antes.

Aqui está uma captura de tela (se o valor recebido da máquina não for 0, mas 1) :

Finalmente, diga-me exatamente o que você quer fazer... Por exemplo: o MAA está subindo e está acima do MAA e o preço está acima/abaixo do MAA e, se for verdade, então coloque um pedido pendente a uma distância tão grande. Vou lhe dar um algoritmo rudimentar. Porque é difícil direcioná-lo na direção certa, quando seus fragmentos de código são arrancados do contexto. E o problema é para a quinta série (exagerado).


Quanto ao destacado: trabalho em preços abertos, então você não verá os MACs redesenhados na barra zero

 
artmedia70:

... é difícil apontar na direção certa...

IMHO, não é difícil, mas muito fácil de "dirigir" ou enviar, pois o camarada é muito zeloso em sua luta contra sachês e prateleiras, não se preocupando em estudar o livro didático e a documentação. :-)

 
Roman.:

IMHO, não é difícil, mas muito fácil de "dirigir" ou enviar, pois o camarada é muito zeloso na luta contra sachês e prateleiras, não se preocupando em estudar o livro didático e a documentação. :-)

Cara, não há praticamente nenhuma armadilha ... Não há milagres.
Assim, um homem se cercou com estas pedras e as move, as move.
 
Sepulca:


Muito obrigado. exatamente o que é necessário)