Discussão do artigo "Limitações e verificações em Expert Advisors" - página 2

 

Obrigado.

 
double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);

'SYMBOL_VOLUME_LIMIT' - identificador não declarado.............

'SymbolInfoDouble' - nenhuma das sobrecargas pode ser aplicada à chamada da função.............

O problema é só comigo?

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 
gumgum:

'SYMBOL_VOLUME_LIMIT' - identificador não declarado.............

'SymbolInfoDouble' - nenhuma das sobrecargas pode ser aplicada à chamada da função.............

É só comigo?

Assim que uma nova compilação for lançada, tudo se normalizará. Estamos aguardando a compilação.
 
Rosh:

Você pode fazer isso?

lot_max=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
 

Mais uma pergunta sobre a função SeriesInfoInteger().

Ao criar o tópico"AccountInfo... Information relevance", aprendi que há funções que usam dados "armazenados em cache no ambiente do software" e há funções que sempre têm "acesso direto aos dados reais".

A qual categoria de funções pertence a função SeriesInfoInteger()?

 

O código a seguir é usado na função CheckVolumeValue :

int ratio=(int)MathRound(volume/volume_step);

if(MathAbs(ratio*volume_step-volume)>0.0000001)

{

description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",

volume_step,ratio*volume_step);

return(false);

}

Mas ele é mais correto:

int ratio = (int)MathRound((volume-min_volume)/volume_step);

if (MathAbs(ratio*volume_step+min_volume-volume)>0.0000001)

{

description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",

  volume_step,ratio*volume_step+min_volume);

return(false);

}

Porque a etapa mínima da alteração de volume deve ser contada a partir do valor mínimo.

 

E talvez o trecho de código

//--- вычислим значение маржи

bool check=OrderCalcMargin(type,Symbol(),lots,last_tick.ask,margin);

deva ser substituído por:

//--- вычислим значение маржи

double price = (type == ORDER_TYPE_BUY || type == ORDER_TYPE_BUY_LIMIT || type == ORDER_TYPE_BUY_STOP || type == ORDER_TYPE_BUY_STOP_LIMIT) ? last_tick.ask : last_tick.bid;

bool check=OrderCalcMargin(type,Symbol(),lots,price,margin);

[Excluído]  
Attached source code files and source code insets in HTML code are now completely translated into Portuguese for your convenience.
MQL5.community - User Memo
MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.
 
Rashid Umarov:

Devido a alterações na MQL5, agora o volume total máximo permitido para um símbolo pode ser obtido da seguinte forma:

Não use a variante antiga! Era assim:

O artigo foi corrigido e o novo código de especialista Check_Order_And_Volume_Limits.mq5 foi anexado a ele.

Prezado administrador

Tentei usar essa função, mas ela retornou 0 em todos os casos.

Minha versão do MT5 é 2280

 
double orders_volume_on_symbol=PendingsVolume(symbol);


dá erro, não existe tal função

E depois que modifico a função para não incluir ordens pendentes, o resultado é 0


double NewOrderAllowedVolume(string symbol)
  {
   double allowed_volume=0;
//--- obter a limitação do volume máximo de um pedido
   double symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- obter a limitação de volume por um símbolo
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);

//--- obter o volume da posição aberta por um símbolo
   double opened_volume=PositionVolume(symbol);
   if(opened_volume>=0)
     {
      //--- se já tivermos usado o volume disponível
      if(max_volume-opened_volume<=0)
         return(0);

      //--- o volume da posição aberta não excede max_volume
      //double orders_volume_on_symbol=PendingsVolume(symbol);
      //allowed_volume=max_volume-opened_volume-orders_volume_on_symbol;
      allowed_volume=max_volume-opened_volume;
      if(allowed_volume>symbol_max_volume) allowed_volume=symbol_max_volume;
     }
   return(allowed_volume);
  }

Isso ocorre porque o max_volume é 0 e o open_volume é 0;

Por que o volume máximo é 0 se não há posições abertas?

Construir 2715

Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
  • www.mql5.com
Predefined Macro Substitutions - Named Constants - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5