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

 
Ivan Butko:

Se você sabe que condição adicionar ou como implementar (se for fácil), por favor, compartilhe.

Eu posso, mas não é interessante verificar como funciona, então aqui está um esboço

void OnTick()
{  static int ticket = -1;
   while(!IsStopped() &&ticket<0)
   {  if(TerminalInfoInteger(TERMINAL_CONNECTED) && TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && !IsTradeContextBusy())
      {  
         RefreshRates();
         ticket = OrderSend("EURUSD", OP_SELL, 0.01, Bid, 3, 0, 0, "", 0, 0, clrRed);
         if(ticket > 0) break; 
      }
   Sleep(123); 
   }
}
 
Igor Makanu:

Eu posso, mas não é interessante verificar como funciona, então acabei de esboçá-lo.

Igor, obrigado. E não é preciso verificar, eu mesmo o farei, é claro.

Existe alguma maneira de fazê-lo sem esperar por um tique?

Para que o pedido de abertura ocorresse imediatamente quando o "empurrão" fosse pressionado.

É como um botão padrão de "compra/venda" de abertura rápida de negócios no terminal (na parte superior esquerda do gráfico). Você pressiona e a venda se abre instantaneamente. Tudo o que você precisa é abrir uma cesta de pedidos em vez de uma única negociação, sem esperar pelo tick.

Há duas implementações (a meu ver):
1) ou um botão (semelhante) na tabela que abre a cesta,
2) ou um consultor especializado. O consultor me parece mais conveniente, pois pode repetir o pedido para abrir (se houver problemas) mais rápido do que eu posso.



UPD

Seu código funciona, abre em um novo tick, legal, obrigado)


UPD

Outra coisa que me lembrei: os copiadores têm o parâmetro "ms", no qual você pode definir o tempo de verificação. E se o mestre tiver um acordo aberto, ele pode enviar um pedido de abertura de acordo de 1 ms escravo. Isto é, a abertura imediata é viável

 
Igor Makanu:

Eu posso, mas não é interessante verificar como funciona, então aqui está um esboço

Igor, por favor verifique de perto, esta abertura é instantânea, sem esperar por um novo tick?

int OnInit()

{

//---

bilhete int estático = -1;

while(!IsStopped() &&ticket<0)

{ if(TerminalInfoInteger(TERMINAL_CONNECTED) && TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && !IsTradeContextBusy())

{

RefreshRates();

bilhete = OrderSend("EURUSD", OP_SELL, 0,01, Bid, 3, 0, 0, 0, "", 0, 0, clrRed);

if(bilhete > 0) pausa;

}

Dormir(1);

}

//---

return(INIT_SUCCEED);

}



E parece funcionar como pretendido...
 
Ivan Butko:



Caso contrário, parece funcionar como pretendido.

não é a melhor opção.... então pelo menos escreva assim

#property strict
int ticket = -1;
int OnInit()
{  if(ticket < 0) SendMyOrder();
   return(INIT_SUCCEEDED); 
}
//+------------------------------------------------------------------+
void OnTick()
{
   if(ticket < 0) SendMyOrder();
}
//+------------------------------------------------------------------+
void SendMyOrder()
{  while(!IsStopped() && ticket < 0)
   {  if(TerminalInfoInteger(TERMINAL_CONNECTED) && TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && !IsTradeContextBusy())
      {  RefreshRates();
         ticket = OrderSend("EURUSD", OP_SELL, 0.01, Bid, 3, 0, 0, "", 0, 0, clrRed);
         if(ticket > 0) break; 
      }
      Sleep(123); 
   } 
}
//+------------------------------------------------------------------+

mas a primeira opção deve funcionar claramente se você tiver jogado em um gráfico e pressionado o botão de auto-comércio quando considerar necessário "esperar".

Se você quiser fazer uma troca, então você deve escrevê-la dessa maneira:

void OnTick()
{
   if(ticket < 0) SendMyOrder();
   if(ticket > 0) ExpertRemove();
}
 
Igor Makanu:

não é a melhor opção.... então pelo menos escreva assim

mas a primeira opção deve funcionar claramente se você tiver jogado em um gráfico e pressionado o botão de auto-comércio quando considerar necessário "esperar".

Se você quiser fazer uma troca, então você deve escrevê-la dessa maneira:

muitos agradecimentos
 

Ótimo! Os testes das variantes continuam. A variante de Vladimir e Igor revelou-se bastante rápida. Na prática, verificou-se que as negociações se abriram mais rapidamente ao clicar no botão de compra rápida do que ao usar o Expert Advisor. Ambas as variantes têm vantagens e desvantagens. Outra curiosidade é que se prescrevemos no Expert Advisor quais pares abrir um por um, eles abrem um por um e muito lentamente... e se estabelecemos 7 Expert Advisors para cada gráfico (mais como sem carga), então ao contrário - todos os negócios abrem instantaneamente, NÃO em seqüência, sem atrasos entre os pedidos (mas ainda há um intervalo de meio segundo ou um segundo no início).

Quero tentar o botão no gráfico, encontrei o manual, mas ele descreve apenas as coordenadas e outras coisas. Por favor, informe, onde no script do "botão" devo escrever o código para abrir o negócio? Para clicar sobre ele na tabela e o negócio aberto. Como no botão padrão MT de compra/venda rápida.

Ou como atualizar o Painel de Comércio para abrir uma cesta de pedidos?

 
Por favor, ajude com isto
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2019.10.14
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
Ivan Butko:

Quero experimentar o botão na tabela, encontrei o manual,

Eu não procurei o manual, mas desenhei o botão ))))

#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
input string   sym1 = "EURUSD";
input string   sym2 = "GBPUSD";
input string   sym3 = "USDCAD";
input string   sym4 = "USDJPY";
input string   sym5 = "AUDUSD";
#include <Controls\Button.mqh>
CButton ButtonSend;

string sym[5];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   sym[0] = sym1;
   sym[1] = sym2;
   sym[2] = sym3;
   sym[3] = sym4;
   sym[4] = sym5;
   ButtonSend.Create(0, "ButtonSend" + _Symbol, 0, 10, 50, 100, 90);
   ButtonSend.Color(clrRed);
   ButtonSend.Text("Kill Forex!");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   static int ticket[5] = {-1, -1, -1, -1, -1 };
   if(ticket[0] > 0 && ticket[1] > 0 && ticket[2] > 0 && ticket[3] > 0 && ticket[4] > 0) return;
   if(ButtonSend.Pressed())
     {
      ButtonSend.Pressed(false);
      Print("Start OrderSend()");
      while(!IsStopped())
        {
         if(TerminalInfoInteger(TERMINAL_CONNECTED) && TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && !IsTradeContextBusy())
           {
            RefreshRates();
            for(int i = 0; i < 5; i++)
              {
               if(sym[i] == "") ticket[i] = INT_MAX;
               if(ticket[i] > 0) continue;
               ticket[i] = OrderSend(sym[i], OP_SELL, 0.01, SymbolInfoDouble(sym[i],SYMBOL_BID), 3, 0, 0, "", 0, 0, clrRed);
              }
           }
         if(ticket[0] > 0 && ticket[1] > 0 && ticket[2] > 0 && ticket[3] > 0 && ticket[4] > 0)  break;
         Sleep(123);
        }
     }
  }
//+------------------------------------------------------------------+

Se as configurações para o símbolo serão "", então não abra 0,01 lote neste símbolo, a configuração do lote não fez, pois como o tópico sobre como aprender, não olhar quem vai fazer, tente se fixar se necessário ;)

 
Igor Makanu:

Eu não procurei por um manual, mas desenhei o botão ))))

se o símbolo estiver definido para "", então não abra 0,01 lote para este símbolo, a definição do lote não fez, pois como o tópico sobre como aprender, não olhar quem vai fazer, tente se fixar se necessário ;)

Muito obrigado, Igor! Rápido e direto ao assunto!

tentará

 
Igor Makanu:

Estranho, se em um EA, ele abre negócios um após o outro em cada par de moedas especificado. com um intervalo de tempo. E quando você o coloca em 5 gráficos diferentes com pares de moedas diferentes (símbolo(0)), todas as 5 negociações se abrem simultaneamente e instantaneamente quando você pressiona o auto-negocio.

Você pode sugerir o que pode ser e como consertá-lo? Ter tudo em um EA e em um gráfico (para que o botão no gráfico abra todos os pares tão rápido quanto ao ativar o "autotrade" com vários EAs, como na versão original)