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 740

 
evillive:
Estou falando do campo, não do lote mínimo, mas tudo bem, esqueça.
Oh, sim, claro, se você não está escrevendo por conta própria, você tem que levar isso em consideração.
 
evillive:

Obrigado, já me foi explicado :D

É claro que para mim mesmo escrevo com todos os cheques, como deveria ser, havia apenas um esboço de como o lote a ser equilibrado/10 para trazer a relação, mas a idéia não teve sucesso...

Mas você tem muito texto, poderia ser mais simples:

  lotstep= MarketInfo(Symbol(),MODE_LOTSTEP);
  lotmax=MarketInfo(Symbol(), MODE_MAXLOT);
  lotmin=MarketInfo(Symbol(), MODE_MINLOT);

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);
if(lot < lotmin) lot = lotmin;
if(lot > lotmax) lot = lotmax;

Poderia ser mais simples. Somente, o que acontecerá se o MarketInfo() para os retornos por lotes 0? Quais serão as conseqüências? O Expert Advisor será detido e as posições serão abandonadas?

E se MINLOT for definido por corretor para 0,03 e LOTSTEP para 0,02, ou seja, os dois primeiros valores de lote permitidos são 0,03 e 0,05, e o saldo atual é 41 - qual será o valor do lote calculado em seu código?

Por que, se o lote é inferior ao valor mínimo - por exemplo, com um saldo igual a 1, será igual a 0 depois que a expressão for totalmente calculada - por que neste caso seu código leva o lote igual a MINLOT, que pode ser 0,03, ou seja, 30 vezes mais que o valor "bruto" de "AccountBalance()*0,001", que neste caso é igual a 0,001?

Nem sempre é possível obter um valor de lote válido, porque as condições podem ser tais que NENHUM dos valores de lote válidos corresponda a eles. Todas as situações errôneas devem ser programadas, e deve-se lembrar que isto é pelo menos 90% do trabalho.

O modelo aplicado definido pela MetaQuotes é aquele lote = MINLOT + N * LOTSTEP, onde N = 0, 1, 2... M. E M é tal que MINLOT + M * LOTSTEP <= MAXLOT e MINLOT + (M + 1) * LOTSTEP > MAXLOT. Assim, você também deve calcular dentro do modelo definido, ou seja, lote = MINLOT + N * LOTSTEP. Então todos os tipos de combinações embaraçosas de MINLOT e LOTSTEP se tornam sem importância, porque a fórmula funciona de forma geral. Uma vez que você o tenha escrito corretamente, depurou-o corretamente e se concentrou em algo mais interessante e divertido. E com prazer - porque não é preciso voltar constantemente ao código mal escrito porque novamente este código não funciona, mas apenas falhas...

 
simpleton:

Poderia ser mais simples. Mas o que acontecerá se MarketInfo() devolver 0 por lote? Quais serão as conseqüências? O Expert Advisor será detido e as posições serão abandonadas?

Se o valor do MINLOT é definido por um corretor como 0,03, e LOTSTEP como 0,02, ou seja, os dois primeiros valores de lote são 0,03 e 0,05, e o saldo atual é 41, qual é o valor do lote calculado em seu código?

Por que, se o lote é inferior ao valor mínimo - por exemplo, com um saldo igual a 1, após o cálculo completo será igual a 0? Por que neste caso seu código leva o lote igual a MINLOT, que pode ser, por exemplo, 0,03, que é 30 vezes mais que o valor "bruto" "AccountBalance()*0,001", que neste caso é igual a 0,001?

Nem sempre é possível obter um valor de lote válido, porque as condições podem ser tais que NENHUM dos valores de lote válidos corresponda a eles. Todas as situações errôneas devem ser programadas, e deve-se lembrar que isto é pelo menos 90% do trabalho.

O modelo aplicado definido pela MetaQuotes é aquele lote = MINLOT + N * LOTSTEP, onde N = 0, 1, 2... M. E M é tal que MINLOT + M * LOTSTEP <= MAXLOT e MINLOT + (M + 1) * LOTSTEP > MAXLOT. Assim, você também deve calcular dentro do modelo definido, ou seja, lote = MINLOT + N * LOTSTEP. Então todos os tipos de combinações incômodas de MINLOT e LOTSTEP se tornam sem importância, porque a fórmula funciona de forma geral. Uma vez que você o tenha escrito corretamente, depurou-o corretamente e se concentrou em algo mais interessante e divertido. E com prazer - porque não é preciso voltar constantemente ao código mal escrito porque novamente este código não funciona, mas apenas falhas...

Para tais horrores, há também um cheque de suficiência de fundos para abrir com tal lote. Ninguém em seu perfeito juízo permitiria que um robô depositasse 10 libras sabendo que o min/lot é 0,1 e o passo é 0,1, por exemplo.

E se um tão inteligente fosse encontrado, o robô lhe diria: "Dê-me o dinheiro e adeus nesse meio tempo" :D

E eu nunca vi ou li em lugar algum que o passo de lote é zero, é uma fantasia...

 
evillive:

Para tais horrores, há também um cheque sobre a suficiência de fundos para abrir com tal lote. Ninguém em seu perfeito juízo permitiria que um robô depositasse 10 libras, sabendo que o lote mínimo é 0,1 e o passo é 0,1, por exemplo.

E se for encontrado um tão esperto, o robô lhe dirá: "me dê o dinheiro, mas enquanto isso, diga adeus" :D

Para evitar zeros do MarketInfo no testador, eu faço isso:

  double AFM = AccountFreeMargin(); 
  double StopLevel,FreezeLevel,spr,prot;
  if(IsOptimization() || IsTesting() || IsVisualMode())
  {
    MinLot = 0.1;
    LotStep = 0.01;
    spr = Point*10;
    StopLevel = spr*2;
    FreezeLevel = spr*2;
  }
  else
  {
    MinLot = MarketInfo(Symbol(),MODE_MINLOT);
    LotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
    spr = MarketInfo(Symbol(),MODE_SPREAD)*Point;
    StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
    FreezeLevel = MarketInfo(Symbol(),MODE_FREEZELEVEL)*Point;
  }
  if(MM == 1) 
  lot = MinLot+MathMax(LotStep*MathFloor((AFM-initdepo)*risk/100),0); 
  else if(MM == 0) lot = MinLot;
 
evillive:

Para tais horrores, há também um cheque sobre a suficiência de fundos para abrir com tal lote. Ninguém em seu perfeito juízo permitiria que um robô depositasse 10 libras sabendo que o lote mínimo é 0,1 e o incremento é de 0,1, por exemplo.

E se um tão esperto fosse encontrado, o robô lhe diria: "Dê-me o dinheiro e adeus" :D

E nunca vi ou li em lugar algum que o passo do lote é zero, é uma imaginação...

Por que isso é terrível? Porque não se encaixa no modelo simplificado?

Eu quis dizer que com MINLOT = 0,03 e LOTSTEP = 0,02, os dois primeiros valores de lote permitidos são 0,03 e 0,05:

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);

Dará muito valor de 0,04, o que não é permitido. O robô dirá algo como "o servidor disse que meu tamanho de lote está errado".

E o tamanho do lote zero pode ser obtido quando ocorre um erro ao solicitar seu valor através do MarketInfo(). Como causar um erro artificialmente - citei o código:

Print("MarketInfo(\"Фигня\", MODE_LOTSTEP) = ", MarketInfo("Фигня", MODE_LOTSTEP));

Retorna 0. Que tipo de fantasia é essa?

 
simpleton:

Por que o horror? Porque não se encaixa no modelo simplificado?

Eu quis dizer que com MINLOT = 0,03 e LOTSTEP = 0,02, os dois primeiros valores de lote permitidos são 0,03 e 0,05:

Dará muito valor de 0,04, o que não é permitido. O robô dirá algo como "o servidor disse que meu tamanho de lote está errado".

E o tamanho do lote zero pode ser obtido quando ocorre um erro ao solicitar seu valor através do MarketInfo(). Eu lhe dei o código acima sobre como induzir artificialmente este erro:

Então qual é a fantasia?

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);

Esta fórmula é facilmente corrigida para atender às exigências. Você só precisa considerar o lote mínimo

Vai parecer um pouco diferente

lot=Min_Lot+lotstep*MathRound((AccountBalance()-X)*0.001/lotstep);

Onde X - Equilíbrio para abertura de lote mínimo,

Mas o cheque para o lote mínimo ainda será necessário.

 

Boa tarde!

Ajudar um ignorante ) No testador nenhum pedido abre erro 10013 Pedido errado, veja o código onde se encontra o erro.

Todos os números da revista estão indicados no pedido e o pedido não abre.

2014.10.19 12:14:34.984 2014.02.03 00:06:00 pedido falhado compra 0.10 a 102.31100 sl: 102.27200 tp: 102.33600 [Pedido inválido]

2014.10.19 12:22:17.928 2014.02.03 00:06:00 bilhete =0 retcode =10013

MqlTradeRequest Req;
MqlTradeResult  Res;
   string TradeSmb;
   if(TradeSmb=="") TradeSmb=_Symbol;
   Req.action=TRADE_ACTION_DEAL;
   Req.symbol=TradeSmb;
   Req.volume=0.1;
   Req.type=ORDER_TYPE_BUY;
   Req.type_filling=ORDER_FILLING_IOC;
   Req.price = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   Req.sl= NormalizeDouble(sym_bid - (StopLoss*sym_point),sym_digits);
   Req.tp= NormalizeDouble(sym_ask + (TakeProfit*sym_point),sym_digits);
   Req.deviation=3;
   Req.comment="777";
if(OrderSend(Req,Res))
{
      Print("Sent...");
}
      Print("ticket =",Res.order,"   retcode =",Res.retcode);
      if(Res.order!=0)
     {
      datetime tm=TimeCurrent();
      //--- request all history
      HistorySelect(0,tm);
      string comment;
      bool result=HistoryOrderGetString(Res.order,ORDER_COMMENT,comment);
      if(result)
        {
         Print("ticket:",Res.order,"    Comment:",comment);
        }
O pequeno robô corrigiu sua mensagem
 

Onde você vê isso?!

if(OrderSend(Req,Res))

Veja a documentação! E use o botão SRC para inserir o código!

Se você for muito preguiçoso, veja a 1ª e última vez:

int  OrderSend(
   string   symbol,              // символ
   int      cmd,                 // торговая операция
   double   volume,              // количество лотов
   double   price,               // цена
   int      slippage,            // проскальзывание
   double   stoploss,            // stop loss
   double   takeprofit,          // take profit
   string   comment=NULL,        // комментарий
   int      magic=0,             // идентификатор
   datetime expiration=0,        // срок истечения ордера
   color    arrow_color=clrNONE  // цвет
   );

Nunca é uma coisa ruim de se aprender!

 

Caros senhores!

Favor informar.....

Aqui está uma função

OrderProfit( )

Esta função retorna o valor do lucro líquido para a ordem selecionada.

PERGUNTA

Qual função, similar à função acima mencionada, retorna o valor de perda para a ordem selecionada ao invés do valor de lucro.

Isto é, se um pedido fechado no SL com uma perda de US$ 150, eu preciso da função para devolveruma perda de US$ 150.

Obrigado.

 
solnce600:

Caros senhores!

Favor informar.....

Aqui está uma função

OrderProfit( )

Esta função retorna o valor do lucro líquido para a ordem selecionada.

PERGUNTA

Qual função, como a função acima, retorna um valor de perda para a ordem selecionada, em vez de um lucro.

Isto é, se um pedido fechado no SL com uma perda de US$ 150, eu preciso da função para devolveruma perda de US$ 150.

Obrigado.

É a mesma coisa! Somente a quantidade sairá com um sinal de menos.
Razão: