Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 46

 
Renat Akhtyamov:
int ticket;//тикет ордера
..........
ticket=OrderSend(.....);//приказ и запоминаем тикет ордера
if(ticket>0)//открылась
{
//действия с тикетом
}

Mais preciso seria:

if(ticket!=-1)//открылась
{
//действия с тикетом
}

OrderSend - "Devolve o número do ticket atribuído ao pedido pelo servidor comercial ou -1 em caso de falha ."

Embora mesmo no testador o primeiro número de bilhete seja 1 e não 0.

 
Oksana Berenko:

Mais precisamente, será:

if(ticket!=-1)//открылась
{
//действия с тикетом
}

OrderSend - "Devolve o número do ticket atribuído ao pedido pelo servidor comercial ou -1 em caso de falha ."

Embora mesmo no testador o primeiro número de bilhete seja 1 e não 0.

Tão contente de ver a Oksana desaparecida ))

Sim, os bilhetes começam com 1 no testador e no servidor DC, mas você nunca pegará 1 no DC. Sua versão não está funcionando bem, não é correto comparar a desigualdade com -1. E se a conta real retornar 1234567?

if(ticket>0)//открылась
{
//действия с тикетом
}


// так верно
 

Assim, no testador um bilhete não pode ser menos que um, ainda mais no mundo real

zero é inferior a um, ambas as condições são corretas, apenas uma para comparação, a outra para exclusão.

Embora eu tenha me acostumado a fazer isso:

// Открываем ордер
      int ticketbuy = OrderSend(sy,OP_BUY,ll,MarketInfo(sy,MODE_ASK),Slippage,0,0,Comments,mn,0,BuyColor);
         if(ticketbuy<0)
         Print(sy," OpenPosition. OrderSend Buy fail #",GetLastError());
         else
         Print(sy," OpenPosition. OrderSend Buy successfully");

Mas considerando as minhas, as condições são todas corretas, apenas a lógica é diferente)

 
Boa noite, posso desejar-lhe um Feliz Ano Novo? Poderia me dizer o que há de errado com este pedaço de código?
void CloseOrder(int type)
  {
   bool ret;
   int error=0;
   double price=0.0;
   int total=OrdersTotal();
   if(!disabled(_Symbol))
     {
      Print(rezult);
      return;
     }
   for(int i=total-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderType()>1)continue;
      if(OrderType()!=type)continue;
      int digits=(int)SymbolInfoInteger(OrderSymbol(),SYMBOL_DIGITS);
      if(OrderType()==OP_BUY)price=NormalizeDouble(SymbolInfoDouble(OrderSymbol(),SYMBOL_BID),digits);
      if(OrderType()==OP_SELL)price=NormalizeDouble(SymbolInfoDouble(OrderSymbol(),SYMBOL_ASK),digits);

      if(NormalizeDouble(NormalizePrice(OrderSymbol(),price),digits)!=price)continue;
      ret=OrderClose(OrderTicket(),OrderLots(),price,Slippage,clrLawnGreen);
      if(!ret)
        {
         error=GetLastError();
         rezult=StringConcatenate(OrderSymbol(),": error close order ",OrderTicket()," ",DoubleToString(OrderLots(),2)," ",TypeToStr(OrderType())," №- ",error," ",ErrorDescription(error));
         Print(rezult);
        }
      else
        {
         rezult=StringConcatenate(OrderSymbol(),": close order ",OrderTicket()," ",DoubleToString(OrderLots(),2)," ",TypeToStr(OrderType()));
         Print(rezult);
        }

     }
  }
 
Movlat Baghiyev:
Desejo-lhe um Feliz Ano Novo! Você poderia me dizer o que está errado com este código?

Aconselho a mudar a lógica na raiz

Em outras palavras, preciso acompanhar os pedidos abertos - quantas vendas e quantos depósitos estão abertos.

E, com base nestas considerações, devemos gerenciar as ordens - abri-las e fechá-las

 

Não sei por que a EA abre muitas ordens se a condição não deveria ser para abrir uma posição, mas após abri-la abre novamente.

não consigo entender porque minha EA abre muitos pedidos se eu não quero que ela abra uma posição mas ela abre novamente depois que eu a abro, suspeito que tenho algo errado com o loop, eu não entendo realmente os loops

for(int i=OrdensTotal()-1;i>=0;i--)

if(OrderSelect(i,SELECT_BY_POS))

if(OrderMagicNumber()==magic) // if our Magic

{

if(OrderType()==OP_BUY) sdel_b++; // contar bai

if(OrderType()==OP_SELL) sdel_s+++; // Contar sels

if(OrderType()==OP_BUYSTOP) otl_b++; // Contagem de bystops pendentes

if(OrderType()==OP_SELLSTOP) otl_s++; // Contagem de saldos pendentes

}


// agora ordens abertas

if(Hour()==00 && Minute()==01 && otl_b==0 && otl_s ==0); // Se for a hora e não houver ordens pendentes

{

OrderSend (Symbol(),OP_BUYSTOP,lot,Vhod1,20,SL2,TP,NULL,magic,0,clrNONE); // tomar uma posição

OrderSend (Symbol(),OP_SELLSTOP,lot,Vhod2,20,SL,TP2,NULL,magic,0,clrNONE); //

}

 
wishmast:

Não sei por que a EA abre muitas ordens se a condição não deveria ser para abrir uma posição, mas após abri-la abre novamente.

Não entendo porque minha EA abre muitos pedidos, se não quero que ela abra uma posição, mas ela abre novamente após a abertura. Acho que posso estar errado com o loop, não entendo realmente os loops

for(int i=OrdensTotal()-1;i>=0;i--)

if(OrderSelect(i,SELECT_BY_POS))

if(OrderMagicNumber()==magic) // if our Magic

{

if(OrderType()==OP_BUY) sdel_b++; // contar bai

if(OrderType()==OP_SELL) sdel_s+++; // Contar sels

if(OrderType()==OP_BUYSTOP) otl_b++; // Contagem de bystops pendentes

if(OrderType()==OP_SELLSTOP) otl_s++; // Contagem de saldos pendentes

}


// agora ordens abertas

if(Hour()==00 && Minute()==01 && otl_b==0 && otl_s ==0); // Se for a hora e não houver ordens pendentes

{

OrderSend (Symbol(),OP_BUYSTOP,lot,Vhod1,20,SL2,TP,NULL,magic,0,clrNONE); // tomar uma posição

OrderSend (Symbol(),OP_SELLSTOP,lot,Vhod2,20,SL,TP2,NULL,magic,0,clrNONE); //

}

Tente isto

   sdel_b=0;
   sdel_s=0;
   otl_b=0;
   otl_s=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()==magic) // Если наш Меджик
           {
            if(OrderType()==OP_BUY) sdel_b++; // Считаем баи
            if(OrderType()==OP_SELL) sdel_s++; // Считаем селы
            if(OrderType()==OP_BUYSTOP) otl_b++; // Считаем отложенные байстопы
            if(OrderType()==OP_SELLSTOP) otl_s++; // Считаем отложенные селлстопы
           }
        }
     }

....
 
Sergey Gritsay:

Tente isto

   sdel_b=0;
   sdel_s=0;
   otl_b=0;
   otl_s=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()==magic) // Если наш Меджик
           {
            if(OrderType()==OP_BUY) sdel_b++; // Считаем баи
            if(OrderType()==OP_SELL) sdel_s++; // Считаем селы
            if(OrderType()==OP_BUYSTOP) otl_b++; // Считаем отложенные байстопы
            if(OrderType()==OP_SELLSTOP) otl_s++; // Считаем отложенные селлстопы
           }
        }
     }

....
ainda abre um monte de pedidos
148O número de ordens em aberto e pendentes atingiu o limite estabelecido pelo corretor.
 
wishmast:
Ainda abre um monte de pedidos
148O número de ordens em aberto e pendentes atingiu o limite estabelecido pelo corretor.
Por favor, envie-nos o código completo, é difícil entender onde você está cometendo um erro
 

Saudações. Feliz Ano Novo para todos!

Quando tento otimizar uma EA depois de executada, os resultados e o gráfico de otimização estão em branco e o log é escrito no log:

Foramfeitos 2passesdurante a otimização, 2 resultados foram descartados como insignificantes

desmarcar"algoritmo genético" não ajuda. Entendo que os resultados parecem insignificantes para o testador, mas como podemos ver o que existe? E isto apesar do fato de que o Consultor Especialista não perde dinheiro durante o mesmo período (um ano) durante os testes, mas é +/- 20%.

Razão: