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

 
Vitaly Muzichenko:

Até você se cansar de escrevê-los

a sério?))
 
multiplicator:
a sério?))

Sim. Mas como regra geral não se escreve mais de três, porque tal código é difícil de ler mais tarde, especialmente se já passou muito tempo desde que foi escrito. É melhor dividir estes muitos "se" aninhados em funções separadas. Ou use o operador do interruptor ... caso

 
Artyom Trishkin:
MessageBox()

existe alguma maneira de fazer se eu clicar depois que um novo tick entrar, uma nova janela não aparecerá, mas os valores da primeira janela serão usados?

void OnTick()
  {
 if (Orders()<1 && (1==message || !use_MessageBox)){
   ticket=OrderSend(Symbol(), OP_SELL, lot, Bid, slippage, Ask+stopLoss*Point, Bid-takeProfit*Point, "", magic, 0, Red); message=0; 
 } 
 if (Orders()<1 && (message==0 || message==2) && use_MessageBox){
 if(use_PlaySound) PlaySound ("tick");
 message=-2;
 message =MessageBox("Текст, содержащий сообщение для отображения", "Необязательный текст для отображения в заголовке", IDOK);
   }
if (Orders()<1 && (1==message || !use_MessageBox)){
   ticket=OrderSend(Symbol(), OP_SELL, lot, Bid, slippage, Ask+stopLoss*Point, Bid-takeProfit*Point, "", magic, 0, Red); message=0; 
 }

}
 
void Trailing()
{
   for (int i=OrdersTotal() - 1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
      {
         if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol())
         {
            if (OrderType() == OP_BUY)
            {
               if (Bid - OrderOpenPrice() > TrailingStop*Point)
               {
                  if (OrderStopLoss() < Bid-Point*(TrailingStop+TrailingStep) || OrderStopLoss() == 0)
                  {
                     if (!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue))
                        Print("error order modify");
                  }
               }
            }
         }
      }
   }
   
   if (OrderType() == OP_SELL)
   {
      if (OrderOpenPrice() - Ask > TrailingStop*Point)
      {
         if (OrderStopLoss() > Ask + Point * (TrailingStop+TrailingStep) || OrderStopLoss() == 0 )
         {
            if (!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+Point*TrailingStop,Digits),OrderTakeProfit(),0,Red))
               Print("error order modify");
         }
      }
   }
}
//--------------------------------------------------------

Boa tarde, nos testes de rastreamento funciona como esperado, mas na vida real não, ou apenas de vez em quando, de tempos em tempos, spams com erro OrderModify error 4108, não consigo entender o que está errado, por favor corrija, entendo que a EA não seleciona corretamente as ordens de modificação.

Eu gostaria de descrever minha EA:

Quando dois MAs se cruzam, abrir 2 posições, uma curta e uma longa por magik. O curto fecha em Takei ou na travessia do MA, o longo deve ser arrasto. A seleção de uma posição longa para uma rede de arrasto é feita com um número mágico.

Talvez eu tenha cometido um erro em alguma parte do código na abertura da posição:

//BUY
   if (fast1>slow1&&fast2<slow2)
     {
      if (StopLoss_1>0)   sl=NormalizeDouble(Bid-StopLoss_1*Point,Digits);   else sl=0;
      if (TakeProfit_1>0) tp=NormalizeDouble(Ask+TakeProfit_1*Point,Digits); else tp=0;
      closeshrts();
      OrderSend(Symbol(),OP_BUY,Lts,NormalizeDouble(Ask,Digits),5,sl,tp,NULL,0,0,Blue);
     }
   //BUY_2
   if (fast1>slow1&&fast2<slow2)  
     {
      if (StopLoss_2>0)   sl=NormalizeDouble(Bid-StopLoss_2*Point,Digits);   else sl=0;
      if (TakeProfit_2>0) tp=NormalizeDouble(Ask+TakeProfit_2*Point,Digits); else tp=0; 
      closeshrts();
      OrderSend(Symbol(),OP_BUY,Lts,NormalizeDouble(Ask,Digits),5,sl,tp,NULL,MagicNumber,0,Blue);
     }  
     
   //SELL
   if(fast1<slow1&&fast2>slow2)
     {
      if (TakeProfit_1>0) sl=NormalizeDouble(Ask+StopLoss_1*Point,Digits);   else sl=0;
      if (StopLoss_1>0)   tp=NormalizeDouble(Bid-TakeProfit_1*Point,Digits); else tp=0;
      closelongs();
      OrderSend(Symbol(),OP_SELL,Lts,NormalizeDouble(Bid,Digits),5,sl,tp,NULL,0,0,Red);
     }
   //SELL_2
   if(fast1<slow1&&fast2>slow2)
     {
      if (TakeProfit_2>0) sl=NormalizeDouble(Ask+StopLoss_2*Point,Digits);   else sl=0;
      if (StopLoss_2>0)   tp=NormalizeDouble(Bid-TakeProfit_2*Point,Digits); else tp=0;
      closelongs();
      OrderSend(Symbol(),OP_SELL,Lts,NormalizeDouble(Bid,Digits),5,sl,tp,NULL,MagicNumber,0,Red);
     } 

Não sei, talvez eu devesse abrir os pedidos através de um loop? E como escrever corretamente este código para que as paradas corretas e Take Profits sejam definidas? Como eu o escrevi - funciona apenas para Vender, para Comprar, define Stop a 0.

(Por favor, ajude-me no caminho certo))

 
Olá, um amigo meu me fez uma pergunta sobre o alfabeto MQL4:
Então, o alfabeto cirílico é parte do alfabeto russo?
E o ponto de interrogação ???? está incluído no conjunto de caracteres do alfabeto?????
e a contrabarra \\\\\\\, faz parte do alfabeto ou não?
 
entra.
 
Alexander Zhmurenko:
) entra.

O que eu escrevi foi uma citação de um conhecido. Acabo de copiá-lo e colá-lo. Ele está tentando me ensinar MQL. Estou me arrasando, então, por favor escreva o que entra.

a ) ponto de interrogação ( ?)

b) contrabarra (\ )

 
Zvezdochet:

O que eu escrevi foi uma citação de um conhecido. Acabo de copiá-lo e colá-lo. Ele está tentando me ensinar MQL. Estou me arrasando, então, por favor escreva o que entra.

a ) um ponto de interrogação ( ?)

b ) contrabarra ( \ )

O uso de caracteres cirílicos é uma característica indocumentada

Os caracteres que podem ser usados em um ID são: dígitos 0-9, letras minúsculas e maiúsculas a-z e A-Z, reconhecíveis como caracteres diferentes, sublinhado caractere (_). O primeiro personagem não pode ser um número.

sintaxe.

 
int OnInit()
  {
//---
   color желтый = clrAqua;
//---
   return(INIT_SUCCEEDED);
  }
as variáveis também podem ser
 

Olá, você poderia me dizer por que ZigD[0] não é emitido em algum momento?

   for(ww = 0; ww <= Bars-1; ww++)
  {
      zzz = iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, ww);
      
           if(zzz > 0.0)   
           {
           ZigM[kk]=zzz;
            kk++; 
           ZigD[dd]=ww;
            dd++;  
            }
   }   
Razão: