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

 
Vyacheslav Kornev:

Obrigado pela ajuda, mas na negociação real não faz diferença como tomar o preço? Afinal, você tem que colocar tanto o indicador quanto a EA no gráfico?

No comércio real, você poderá obter os dados. Desde que não se apaguem acidentalmente as linhas indicadoras.

 
Artyom Trishkin:

Com um verdadeiro, você poderá receber dados. Se você não remover acidentalmente as linhas indicadoras...


Por isso, tenho mais uma pergunta. Tenho um excelente Expert Advisor. Mas precisa fazer isso: quando cruza uma linha, uma ordem adicional é aberta nessa direção, e depois fecha com lucro... Como fazer para que, depois de fechar com lucro, o pedido adicional não seja aberto novamente? Até que a linha indicadora seja atualizada?

//==================Configuração de um pedido adicional ============
Lotes duplos2;
if((PriceHigh>PriceLow && Ask>PriceHigh && LBUY<LSELLL)|| (PriceLow>PriceHigh && Ask>PriceLow && LBUY<LSELLL) )
 

Boa tarde! Preciso de uma pequena ajuda com o código que:

abre BUY se o arquivo 11112222.txt contiver 1;

abre o SELL se o arquivo 11112222.txt contiver -1;

fecha todos os pedidos se o arquivo 11112222.txt contiver 0;


Dado o arquivo 11112222.txt, pode haver apenas três entradas: 1, -1 ou 0


Eu não entendo o que está errado com este código; por alguma razão, se eu vejo 0 no arquivo 11112222.txt, ele abre ordem de compra, ao invés de código de ordem fechada, eu simplesmente não sei o que está errado.

Ay, há também um problema, quando a EA está em execução, é quase sempre impossível abrir o arquivo 11112222.txt, ele diz que o arquivo está ocupado com outra aplicação, então para corrigir este problema eu coloco FileClose(handle2); // Fechar arquivo de texto; mas não ajuda e eu preciso que a EA verifique o arquivo 11112222.txt para 1, -1 ou 0 depois de aberto e depois feche-o, porque o arquivo é periodicamente usado por outro programa para colocar 1, -1 ou 0.

//=================================BUY=========================================
    int handle2 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle2>0) // если в файле больше 0, то есть 1, то открывать BUY
   {
    
       Print(FileReadString(handle2));
       FileClose(handle2); // закрытие текстового файла

                    //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ      
                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на покупку
                     {
                        OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                        FileClose(handle2); // закрытие текстового файла
                     }
                    else
                      Print("NE USPESHNO!!!");
                      FileClose(handle2); // закрытие текстового файла

   }
//=================================конец кода BUY=========================================
      
      
      
      
      
      
      
      
//=================================SELL=========================================
    int handle3 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle3<0)//если в текстовом файле меньше 0, то есть -1, то открывать SELL
   {
    
       Print(FileReadString(handle3));
       FileClose(handle3); // закрытие текстового файла

                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на продажу
                        {
                           OrderSend(Symbol(), OP_SELL, 0.01, Bid, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                           FileClose(handle3); // закрытие текстового файла
                        }
                       else
                       Print("NE USPESHNO!!!");
                       FileClose(handle3); // закрытие текстового файла

   }
//=================================конец кода SELL=========================================
      
      
      
      
      
//=================================ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ=========================================
    int handle4 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle4=0)//если в текстовом файле равно 0, то закрыть все ордера
   {
      
       Print(FileReadString(handle4));
       FileClose(handle4); // закрытие текстового файла
//-----------------код закрывает все ордера--------------------
   bool   result;
   int    error;

 while (OrdersTotal()>0)
 {
   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {   if(OrderType()==OP_BUY)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
           OrderDelete(OrderTicket());
          
           if(result!=TRUE) { error=GetLastError();
              Print("LastError = ",error, " ",Symbol()); }
           else error=0; }
   else Print( "Error when order select ", GetLastError());
         
         FileClose(handle4); // закрытие текстового файла
  }
//------------конец кода закрывающего ордера------------------
 

         FileClose(handle4); // закрытие текстового файла
      
      
   }
//=================================конец кода ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ=========================================


 
Санек:

Boa tarde! Preciso de uma pequena ajuda com o código que:

abre BUY se o arquivo 11112222.txt contiver 1;

abre o SELL se o arquivo 11112222.txt contiver -1;

fecha todos os pedidos se o arquivo 11112222.txt contiver 0;


O arquivo 11112222.txt é dado e pode ter apenas três entradas: 1, -1 ou 0.


Por alguma razão, quando 0 está no arquivo 11112222.txt, ele abre a ordem de compra, enquanto deve acionar o código de fechamento da ordem; não entendo qual é o erro.

Portanto, há também um problema, quando a EA está em execução, é quase sempre impossível abrir o arquivo 11112222.txt, porque ele diz que o arquivo está ocupado com outra aplicação. Para corrigi-lo, coloquei FileClose(handle2); // Fechar arquivo de texto; mas não funciona e preciso que a EA verifique o arquivo 11112222.txt para 1, -1 ou 0 e o feche, porque a cada segundo outro programa usa este arquivo para colocar 1, -1 ou 0 nele.

Porque o cabo do arquivo não é o conteúdo do arquivo.

É preciso ler primeiro o conteúdo do arquivo e só depois definir a condição. É o contrário, você tem uma condição por manipulação, então leia o arquivo e feche-o.

 
Alexey Viktorov:

Porque a manipulação do arquivo não é o conteúdo do arquivo.

É preciso ler primeiro o conteúdo do arquivo e só depois colocar a condição. No seu caso é o contrário, condicionar por manipulação, depois ler o arquivo e fechá-lo.

1) - Esta parte abre o arquivo 11112222.txt para ler os dados do mesmo:

//=================================BUY=========================================
    int handle2 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения

2) - A seguir vem a condição se o cabo2>0


  if(handle2>0) // если в файле больше 0, то есть 1, то открывать BUY
   {

3) - Esta é a parte que eu não entendo:


       Print(FileReadString(handle2));

4) - Esta parte encerra o arquivo:


       FileClose(handle2); // закрытие текстового файла

5) - Como a condição handle2>0 é cumprida, ou seja, o arquivo 11112222.txt contém 1, ele abre uma ordem de compra:

  //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ      
                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на покупку
                     {
                        OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                        FileClose(handle2); // закрытие текстового файла
                     }
                    else
                      Print("NE USPESHNO!!!");
                      FileClose(handle2); // закрытие текстового файла

   }
//=================================конец кода BUY=========================================

Que partes eu misturei?
 

Saudações ao tentar escrever um roteiro para fechar pedidos.

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{  
   bool reasult;
   for (int i = OrdersTotal()-1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS)>0)
      {
         if (OrderSymbol() != Symbol())
            continue;
         
         switch (OrderType())
         {
            case OP_BUY  :
               reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
               if (!reasult) Print ("Ошибка закрытия ордера на покупку", GetLastError());
               break;
            case OP_SELL :
               reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
               if (!reasult) Print ("Ошибка закрытия ордера на продажу", GetLastError());
               break;
         }   
         
      }
   }
}

Se eu abrir várias ordens de venda e compra alternadamente e tentar fechá-las com esta ordem, apenas algumas são fechadas, as demais recebem erro 129 (Preço incorreto).

Tentei fazer um roteiro que, por exemplo, faz 10 tentativas * sobre o número de pedidos, com pausa em caso de erro.

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{ 
   int c=CountTrades()*10;
   
   for ( int a=1 ; a<=c; a++)
   {
   if (CountTrades()==0) { Print ("Orders are successfully closed! Break."); break;}
    Print("Try ", a, " out of ", c);
      
      bool reasult;
      for (int i = OrdersTotal()-1; i >= 0; i--)
      {
         if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if (OrderSymbol() == Symbol()) 
            
            {      
            
            if (OrderType() == OP_BUY)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
                  if (!reasult) {Print ("ERROR ", GetLastError());} 
                  }
            if (OrderType() == OP_SELL)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
                  if (!reasult) {Print ("ERROR ", GetLastError());}  
                  }              
            }   
            
         }
      }Sleep(1000);
   }   
}
//+------------------------------------------------------------------+
int CountTrades()
{
    int count=0;
    for (int i=OrdersTotal()-1; i>=0; i--)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
           if (OrderSymbol() == Symbol())
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                 count++;
        }
    }
    
    return(count);
}

Normalmente, ela lida com sua tarefa após várias tentativas, nas quais o mesmo 129 erro é cometido. Mas enquanto ele tenta, com muitas tentativas, fechar as encomendas pode ser fechado manualmente, e isto não causa erros, eles fecham.

O que eu estou fazendo de errado?

 
Andrey Sokolov:

Saudações ao tentar escrever um roteiro para fechar pedidos.

Se eu abrir várias ordens de venda e compra alternadamente e tentar fechá-las com esta ordem, apenas algumas são fechadas, as demais recebem erro 129 (Preço incorreto).

Tentei fazer um roteiro que, por exemplo, faz 10 tentativas * sobre o número de pedidos, com pausa em caso de erro.

Normalmente, ela lida com sua tarefa após várias tentativas, nas quais o mesmo 129 erro é cometido. Mas enquanto ele tenta, com muitas tentativas, fechar as encomendas pode ser fechado manualmente, e isto não causa erros, eles fecham.

O que eu estou fazendo de errado?

            RefreshRates(); // Попробуйте добавить
            if (OrderType() == OP_BUY)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
                  if (!reasult) {Print ("ERROR ", GetLastError());} 
                  }
            if (OrderType() == OP_SELL)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
                  if (!reasult) {Print ("ERROR ", GetLastError());}  
                  }  

Em geral, o que você escreve não é permitido para negociar em uma conta real, é apenas para um testador

 
Vitaly Muzichenko:

Em geral, o que você escreve não deve ser autorizado a negociar em uma conta real, é apenas para o testador

            RefreshRates(); // Попробуйте добавить

Ajuda, obrigado.

 
Vitaly Muzichenko:

Em geral, o que você escreve não é permitido para negociar em uma conta real, é apenas para um testador


Você pode explicar por que "não é permitido negociar..."?

 
Andrey Sokolov:

Você pode explicar por que "não é permitido negociar"?

Não há verificação de erros, e se o servidor fechar e gerar um erro crítico, a EA continuará a bater no servidor, e isto cheira a proibição de mais auto-negociações por parte da corretora.