Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 1104

 
shtr:

Olá a todos!

Você pode me dizer por que os pedidos não estão abrindo?

O init é init, o comércio é init. Existe o OnTick para EAs, não há necessidade de enfiar tudo no init...

E para o inite, existem códigos de saída especiais inventados pelos desenvolvedores, por que você não os usa?

 
evillive:

Initu é para initu, o comércio é para o togo. Há o OnTick para EAs, não há necessidade de enfiar tudo no init...

E para os inite, existem códigos de saída especiais inventados pelos desenvolvedores, por que não os usamos?

Provavelmente porque não conhecemos os códigos de rescisão inite. Os exemplos no tutorial são diferentes do formulário no editor. A função int start(), por exemplo, está faltando lá. Quando colei o exemplo do simples Expert Advisor do tutorial para o inite, de alguma forma ele funcionou. Mas não importa o que eu tenha escrito, não funcionou. Assim, decidi, após duas semanas de experimentos, consultar um especialista. Obrigado pela dica!

Coloquei tudo isso no OnTick, mas nada mudou.

 
shtr:

Não a usamos, deve ser porque não conhecemos os códigos de conclusão de inicialização. Os exemplos no livro didático diferem da forma do editor. A função int start(), por exemplo, está faltando lá. Quando colei o exemplo do simples Expert Advisor do tutorial para o inite, de alguma forma funcionou. Mas não importa o que eu tenha escrito, não funcionou. Assim, decidi, após duas semanas de experimentos, consultar um especialista. Obrigado pela dica!

Tudo isso foi lançado no OnTick, mas nada mudou.

Esqueça o tutorial, ele é escrito usando a velha sintaxe, muita coisa mudou desde então. A ajuda da entrega do terminal é a mais relevante, e a kodobase, se você olhar, também é uma fonte de exemplos na nova versão da MQL.

E sobre não escrever todo o código no inite, era antes, procure no fórum, há centenas de posts em todos os idiomas deste fórum, apenas toda vez que há um novo escritor que não é um leitor ;)

 
evillive:

Esqueça o tutorial, ele é escrito de acordo com a velha sintaxe, muita coisa mudou desde então. A ajuda da entrega do terminal é a mais relevante, e a kodobase, se você olhar, é também uma fonte de exemplos na nova versão da MQL.

E sobre não escrever todo o código no inite, era antes, procure no fórum, há centenas de posts em todos os idiomas deste fórum, apenas toda vez que há um novo escritor, que não é um leitor ;)

Obrigado!

Livros de texto antigos, quando perdem a relevância, precisam ser imediatamente exterminados))

 
shtr:

Obrigado!

Os antigos tutoriais, quando perdem a relevância, devem ser imediatamente fumados))

E não jogue tudo no OnTick, apenas o que é relevante para o comércio, a parte do código que roda apenas na inicialização deve ser deixada no OnInit (claro, que os nomes das funções devem ser escritos em latim, apenas preguiçoso para mudar o layout no fórum a cada vez).

Sobre o código em si, há perguntas sobre o loop, é estranho, acho que não há colchetes suficientes...

Sim, e também para o cálculo dos níveis de lucros e perdas, eles não são prescritos corretamente. O servidor deve enviar o preço, de preferência normalizado, e não o valor em pips.

 
evillive:

E não coloque tudo no OnTick, apenas o que é relevante para o comércio, parte do código que aciona apenas na inicialização deve ser deixado no OnInit (é claro, nomes de funções devem ser escritos em latim, preguiçoso demais para mudar o layout do fórum toda vez).

Sobre o código em si, há perguntas sobre o loop, é estranho, acho que não há colchetes suficientes...

Sim, e também para o cálculo dos níveis de lucros e perdas, eles não são prescritos corretamente. O servidor deve enviar o preço, de preferência normalizado, e não o valor em pips.

Eu peguei, obrigado. Vou verificar os parênteses - o editor não produziu erros.

Por que o exemplo do livro funcionou? Retirei todas as funções e inseri apenas o código de exemplo, começando com int start. Não houve erros e os negócios foram abertos.

 
shtr:

Entendi, obrigado. Vou verificar os parênteses - o editor não deu nenhum erro.

Por que o exemplo do livro funcionou...? Retirei todas as funções e inseri apenas o código de exemplo, começando do início int. Não houve erros e os negócios foram abertos.

Bem, eu não tinha necessidade de trocar o que funcionava ))))

Se sua pergunta é sobre a diferença entre start e ontik de uma nova maneira, você deveria ter transferido tudo de start para ontik. Ou melhor, no seu caso, do OnInit para o OnTick.

O compilador mantém um registro dos erros de sintaxe, ninguém verificará a lógica, a não ser um humano. Em casos especiais, até mesmo o autor do código pode ficar confuso :)

 
evillive:

Bem, o que funcionou não precisava ser comercializado ))))

E Int começar da maneira antiga e OnTick da nova maneira para EAs, então você deveria ter mudado tudo do início para OnTick. Ou melhor, no seu caso, do OnInit para o OnTick.

O compilador mantém um registro dos erros de sintaxe, a lógica não será verificada por ninguém além de um humano. Em casos especiais, até mesmo o autor do código pode ficar confuso :)

//+------------------------------------------------------------------+
//| 3333.mq4 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#direitos autorais "Copyright 2016, MetaQuotes Software Corp."
#link da propriedade "https://www.mql5.com"
#propriedade versão "1.00"
#propriedade rigorosa
externo int MA_1=5;
externo int MA_2=20;
externa MA_3=80;
externo interno TP=100;
externo int SL=50;
Lote duplo externo=0,1;
Symb;
//+------------------------------------------------------------------+
//| Função de iniciação de especialistas |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEED);
}

//+------------------------------------------------------------------+
//| Função de desinicialização especializada |
//+------------------------------------------------------------------+
nulo OnDeinit(const int razão)
{
//---
}
//+------------------------------------------------------------------+
//| Função de carrapato de especialista |
//+------------------------------------------------------------------+
nulo OnTick()
{
duplo MA_1_t;
duplo MA_2_t;
duplo MA_3_t;
int total;
int pos;
Symb=Símbolo();
Total=0;
for( pos=1; pos<=OrdersTotal(); pos++)
pos=OrderSelect(pos-1,MODE_TRADES);
if(pos==0)
MA_1_t=iMA(NULL,0,MA_1,0,MODE_EMA,PRICE_CLOSE,0);
MA_2_t=iMA(NULL,0,MA_2,0,MODE_EMA,PRICE_CLOSE,0);
MA_3_t=iMA(NULL,0,MA_3,0,MODE_EMA,PRICE_CLOSE,0);
if(MA_2_t>MA_3_t&&MA_1_t<MA_2_t&&Open[1]<MA_1_t&&Close[1]>MA_1_t)
{
stoploss duplo=NormalizeDouble(Ask-SL*Point,Digits);
double takeprofit=NormalizeDouble(Ask+TP*Point,Digits);
pos=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,stoploss,takeprofit, "My order",16384,0,clrGreen);
retornar;
}
if(MA_2_t<MA_3_t&&MA_1_t>MA_2_t&&Open[1]>MA_1_t&&Close[1]<MA_1_t)
{
double stoploss=NormalizeDouble(SL*Point-Bid,Digits);
double takeprofit=NormalizeDouble(Bid-TP*Point,Dígitos);
pos=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,stoploss,takeprofit, "Meu pedido",16384,0,clrRed);
retornar;
}
retornar;
}
//---

//+------------------------------------------------------------------+

"Bem, o que funcionou não precisava ser peddled)")) Bem, você mesmo quer rabiscar algo).

O paciente não caiu em si após a manipulação.

 
shtr:

"Bem, você não deveria ter negociado no que funcionou")) Bem, você mesmo quer rabiscar algo).

O paciente não voltou a si após a manipulação.

Bem, a lógica e a matemática é coxa, é claro que não vai funcionar dessa maneira.

Por exemplo, por que precisamos de um ciclo nesta EA? Quero dizer, é claro que precisamos calcular quantos pedidos para o símbolo e mágico dado já foram feitos, certo? Mas o que vemos aqui é que o laço não conta nada e não pode contar porque não tem um "contador" parafusado em ))))

Total=0;                                   

   for( pos=1; pos<=OrdersTotal(); pos++)         
   pos=OrderSelect(pos-1,MODE_TRADES); И что дальше? Переменная pos всегда или 0, или 1, цикл сбивается постоянно на начало, а то и заглючить может и превратиться в бесконечный цикл.

OrderSelect() retorna um valor booleano, verdadeiro ou falso, que não é apropriado para a variável pos. E o laço deve começar melhor a partir da ordem mais antiga, ou seja, em ordem inversa, para evitar saltar ordens.

A variável Total pode ser útil como um contador:

for(pos=OrdersTotal()-1;pos>=0;pos--)
{
  if(OrderSelect(pos,MODE_TRADES)) //Обязательно проверить, выбран ли ордер
  { 
    if(OrderSymbol()==Symbol()) //желательно проверить, тот ли это ордер по символу, ещё можно по магику проверить дополнительно в этой же строке
    {
     Total++; //если это наш ордер, добавляем счётчику единицу
    }
  }
}
if(Total<1)
{
  торгуем
}

Removi coisas desnecessárias, acrescentei saída de erro após o OrderSend, para o testador em contas fora da CEN as ordens já abertas:

#property version   "1.00"
#property strict
extern int MA_1=5;
extern int MA_2=20;
extern int MA_3=80;
extern int TP=100;
extern int SL=50;
extern double Lot=0.1;

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  
   double MA_1_t=0;
   double MA_2_t=0; 
   double MA_3_t=0;
   int Total=0;
   
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
   {
     if(OrderSelect(pos,MODE_TRADES)) //Обязательно проверить, выбран ли ордер
     { 
       if(OrderSymbol()==Symbol()) //желательно проверить, тот ли это ордер по символу, ещё можно по магику проверить дополнительно в этой же строке
       {
        Total++; //если это наш ордер, добавляем счётчику единицу
       }
     }
   }
   if(Total<1)
   {
      MA_1_t=iMA(NULL,0,MA_1,0,MODE_EMA,PRICE_CLOSE,0);
      MA_2_t=iMA(NULL,0,MA_2,0,MODE_EMA,PRICE_CLOSE,0); 
      MA_3_t=iMA(NULL,0,MA_3,0,MODE_EMA,PRICE_CLOSE,0);
  
      if(MA_2_t>MA_3_t&&MA_1_t<MA_2_t&&Open[1]<MA_1_t&&Close[1]>MA_1_t)
      {
         double stoploss=NormalizeDouble(Ask-SL*Point,Digits);
         double takeprofit=NormalizeDouble(Ask+TP*Point,Digits);
         if(OrderSend(Symbol(),OP_BUY,Lot,Ask,6,stoploss,takeprofit,"My order buy",16384,0,clrGreen)<1) 
         Print("OrderSend error #",_LastError," BuySL=",stoploss," BuyTP=",takeprofit);
      }
    
      if(MA_2_t<MA_3_t&&MA_1_t>MA_2_t&&Open[1]>MA_1_t&&Close[1]<MA_1_t)
      {
         double stoploss=NormalizeDouble(Bid+SL*Point,Digits);
         double takeprofit=NormalizeDouble(Bid-TP*Point,Digits);
         if(OrderSend(Symbol(),OP_SELL,Lot,Bid,6,stoploss,takeprofit,"My order sell",16384,0,clrRed)<1)
         Print("OrderSend error #",_LastError," Sell SL=",stoploss," Sell TP=",takeprofit);
      }
   }
}

Ah, sim, também o cálculo do nível SL para vendas estava errado, deveríamos estar mais atentos.

 
evillive:

Bem, a lógica e a matemática é coxa, então é claro que não vai funcionar assim.

Por exemplo, por que haveria um ciclo neste EA? É claro que precisamos calcular quantos pedidos para o símbolo e número mágico dado que temos, certo? Mas o que vemos aqui é que o laço não conta nada e não pode contar porque não tem um "contador" parafusado em ))))

OrderSelect() retorna um valor booleano, verdadeiro ou falso, que não é apropriado para a variável pos. E o laço deve começar melhor a partir da ordem mais antiga, ou seja, em ordem inversa, para evitar saltar ordens.

A variável Total pode ser útil como um contador:

Removi coisas desnecessárias, acrescentei saída de erro após o OrderSend, para o testador em contas fora da CEN as ordens já abertas:

Ah, sim, também o cálculo do nível SL para vendas estava errado, você precisa ser mais cuidadoso.

Uau!!! Obrigado!!! Isso requer alguma reflexão.

Talvez haja um "auto-estudo" sobre as novas regras em algum lugar? O número de página de 4 dígitos é um pouco estressante....