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

 
Então, serei capaz de ver o código correto?
 
sergeev:
na primeira ordem de não compra, você inundará a conta com ordens de compra.


Obrigado! Encontrei outro erro!

//+------------------------------------------------------------------+
//|                                                      OnlyBuy.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern double lots=0.1;
extern int SlipPage=3;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  if (OrdersTotal()==0)
   OrderSend(Symbol(),OP_BUY,lots,NormalizeDouble(Ask,Digits),SlipPage,0,0,NULL,0,0,Red);
  for (int j = 0; j < OrdersTotal(); j++)
   {
    OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol())
     {
      if (OrderType() != OP_BUY)
       OrderSend(Symbol(),OP_BUY,lots,NormalizeDouble(Ask,Digits),SlipPage,0,0,NULL,0,0,Red);
     }
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
icas:


Obrigado! Encontrei outro erro!


Mm-hmm.

mas o anterior não foi consertado.

Você não pode colocar uma abertura de ordem imediatamente em um loop. Você tem que fazer um loop completo nos pedidos primeiro e descobrir exatamente se há ou não uma Compra.

E só depois disso você coloca uma Buy, depois desse ciclo.

 
sergeev:

Mm-hmm.

mas o anterior não foi consertado.

Você não pode colocar uma abertura de ordem imediatamente em um loop. Primeiro você deve fazer um loop completo nos pedidos e descobrir exatamente se há uma compra ou um não.

E somente depois disso você deve fazer uma compra se ela ainda não estiver lá.



Certo, eu acabei de pegar uma peça do meu programa posti sem refazê-la. Vou fazer isso agora - cinco minutos...
 
Mas este código também não está correto! Ela só abrirá uma ordem de compra se não houver outras ordens para qualquer outro instrumento financeiro, e se houver outras ordens, não abrirá uma ordem de compra.
 
icas:

Certo, eu acabei de pegar uma peça do meu programa posti sem refazê-la. Vou fazer isso agora - cinco minutos...
//+------------------------------------------------------------------+
//|                                                      OnlyBuy.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern double lots=0.1;
extern int SlipPage=3;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  for (int j = 0; j < OrdersTotal(); j++)
   {
    OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol())
     {
      if (OrderType() == OP_BUY) return(0);
     }
   }
  OrderSend(Symbol(),OP_BUY,lots,NormalizeDouble(Ask,Digits),SlipPage,0,0,NULL,0,0,Red);
  Sleep(10000); //Пауза 10 сек. для исполнениея ордера
//----
   return(0);
  }
//+------------------------------------------------------------------+
Agora mesmo, certo?
 
icas:
Isso é agora mesmo?
Sleep(10000); //Пауза 10 сек. для исполнениея ордера

Qual é o objetivo desta pausa?
 
kolyango:

Por que a pausa?

A ordem não é executada imediatamente. Sem uma pausa no próximo tick, a ordem pode não ser aberta ainda, e o programa enviará outro comando para abri-la. No testador MT5, você já pode inserir o atraso de execução.
 
icas:
Está correto agora?

Você já tentou fazer disso uma função separada para pesquisar a presença/ausência de itens?

Por exemplo:

bool ExistPositions(int mn, string sy="", int op=-1) {
   if (sy=="") sy=Symbol();
   for (int i=0; i<OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS)) {
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (OrderType()>1)            continue;
         if (op<0 || OrderType()==op)  
            return(True);
         }
      }
   return(False);
}

Magia - número mágico da EA (definido em configurações, ou gerado pela EA automaticamente). Então, para verificar a ausência da posição Comprar por símbolo atual deve ser escrito:

if (!ExistPositions(Magic, Symbol(), OP_BUY)) {
   // ... Тут код для вызова функции открытия позиций ... 
   }

Nota - não apenas um comando para abrir uma ordem de compra, mas uma função completa com o tratamento de todos os parâmetros de abertura de ordem e erros devolvidos pelo servidor.

No entanto, para um testador, podemos fazer sem verificar os parâmetros inseridos para valores válidos.

 
artmedia70:

Você já tentou fazer disso uma função separada para pesquisar a presença/ausência de itens?

Por exemplo:

Em seguida, para verificar a ausência de posição de compra pelo símbolo atual deve ser escrito:

Nota - não apenas um comando para abrir uma ordem de compra, mas uma função completa com processamento de todos os parâmetros de abertura da ordem e erros devolvidos pelo servidor.

Entretanto, o testador pode fazer sem verificar os parâmetros inseridos para valores válidos.



No primeiro posto que eu dei as funções, kolyango não ficou satisfeito com isso. Além disso, eu não gosto de trabalhar com mágicos.