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

 
PolarSeaman:

Você substituiu no código

para

mas não ajudou).

Desculpe-me, foi tudo o que você notou)

 
Alekseu Fedotov:

FileSeek() com a bandeira SEEK_END, lhe ajudará.

<

Obrigado! Vou tentar!

 
YanSay:

Boa noite!

Estou intrigado sobre como adicionar um código universal (para diferentes instrumentos) para calcular o lote para um negócio baseado em % de depósito.

Eu o fiz assim:

O preço ( preço de abertura) e o SL (Stop Loss) são calculados separadamente.

Para pares onde a moeda de cotação está em dólares (por exemplo, EURUSD), para o índice SPX500 e para o ouro - tudo corretamente calculado, mas para pares onde o dólar é o primeiro em uma cotação (por exemplo, USDJPY) não funciona.

Por favor, informe o que eu perdi...

Preste atenção à normalização

A variável _Digitos armazena o número de decimais após o ponto decimal que determina a precisão do preço do símbolo do gráfico atual.

 
Alekseu Fedotov:

Observe a normalização

A variável _Digitos armazena o número de casas decimais após o ponto decimal que determina a precisão do preço do símbolo gráfico atual.

Obrigado! Aqui está como eu o refiz:

input double MaximumRisk=0.02;                  //Риск в сделке от депозита

//1ый вариант
{Lots = NormalizeDouble(((AccountBalance()*MaximumRisk)/((MathAbs(Price-SL))/Point)/((MarketInfo(Symbol(),MODE_LOTSIZE)*(MarketInfo(Symbol(),MODE_ASK)+Point))
-(MarketInfo(Symbol(),MODE_LOTSIZE)*MarketInfo(Symbol(),MODE_ASK)))),
int(MathAbs(log(MarketInfo(Symbol(), MODE_LOTSTEP)))));}

//2ой вариант
{Lots = NormalizeDouble((AccountBalance()*MaximumRisk)/((MathAbs(Price-SL))/Point)/((MarketInfo(Symbol(),MODE_TICKVALUE))),
int(MathAbs(log(MarketInfo(Symbol(), MODE_LOTSTEP)))));}

Na primeira variante: EURUSD e XAUUSD - tudo está correto; USDJPY - ao invés de 2% do depósito, arrisca 0,2% do depósito; no caso do SPX500 e BRN, gera erro OrderSend 131 (erro no cálculo do lote).

Na 2ª variante: EURUSD, XAUUSD e USDJPY - tudo está correto; SPX500 arrisca 20% do depósito ao invés de 2%; para o BRN, gera erro OrderSend 131 (um erro com cálculo de lote).

Há um erro em outro lugar, não consigo entender em que lugar, por favor, avise.

 
YanSay:

Obrigado! Eis como é feito de novo:

A primeira versão: EURUSD e XAUUSD - tudo está correto; USDJPY - arrisca 0,2% do depósito ao invés de 2% do depósito; o caso com SPX500 e BRN mostra até erro de OrderSend 131 (erro no cálculo do lote).

Na 2ª variante: EURUSD, XAUUSD e USDJPY - tudo está correto; SPX500 arrisca 20% do depósito ao invés de 2%; para o BRN, gera erro OrderSend 131 (um erro com cálculo de lote).

Em algum outro lugar há um erro, não consigo entender em que lugar, por favor, avise.

SubstituirPonto, porMarketInfo(Symbol(),MODE_POINT)

 
Vitaly Muzichenko:

SubstituirPonto, porMarketInfo(Symbol(),MODE_POINT)

Qual é o objetivo? Se tudo for calculado pelo símbolo do gráfico. Faz sentido se houver uma multivariável e o Símbolo diferente do gráfico atual for calculado.

 
Vitaly Muzichenko:

SubstituirPonto, porMarketInfo(Symbol(),MODE_POINT)

Infelizmente, isso não ajudou(

As informações do MODE_POINT dizem: "Tamanho do ponto na moeda de cotação. Ele é armazenado na variável predefinida Ponto para o símbolo atual".

Julgando pela descrição, não importa qual variante usar. Mas eu tentei e não ajudou.


 

Você pode me dizer se é possível colocar uma "seleção" de uma ferramenta gráfica no botão do Expert Advisor, de modo que, ao clicar no botão, o ícone da ferramenta apareça sob o cursor e seja possível esticá-lo?

E o canal já deve ter propriedades especificadas

 
Roman Sharanov:

Você pode me dizer se é possível colocar uma "seleção" de uma ferramenta gráfica no botão do Expert Advisor, para que um ícone de ferramenta apareça sob o cursor e possa ser esticado ao clicar no botão?

Além disso, o canal já pode ter propriedades especificadas.

Talvez

 
YanSay:

Infelizmente, isso não ajudou(

E nas informações do MODE_POINT diz "Tamanho do ponto na moeda de cotação". Pois o símbolo atual é armazenado na variável pré-definida Ponto".

Julgando pela descrição, não importa qual variante usar. Mas eu tentei e não ajudou.

Experimente a função:

//===============================================================================================
//------------------------------ Расчет лота по риску на StopLoss -------------------------------+
//===============================================================================================
double sLot(double Percent=1, double Stloss=100, string symb="0") {
 if(symb=="0") symb=Symbol();
 double TickValue   =SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_VALUE),
        TickSize    =SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_SIZE),
        ContractSize=SymbolInfoDouble(symb,SYMBOL_TRADE_CONTRACT_SIZE),
        Min_Lot     =SymbolInfoDouble(symb,SYMBOL_VOLUME_MIN),
        Max_Lot     =SymbolInfoDouble(symb,SYMBOL_VOLUME_MAX),
        Step        =SymbolInfoDouble(symb,SYMBOL_VOLUME_STEP),
        Free        =AccountInfoDouble(ACCOUNT_FREEMARGIN),
        Lots_New    =0.0;
 int CalcMode=(int)SymbolInfoInteger(symb,SYMBOL_TRADE_CALC_MODE);

  if(Percent > 100) Percent = 100;
  if(Stloss <=0) return(0);
  if(Percent == 0) Lots_New = Min_Lot;
   else {
    if(CalcMode==0 || CalcMode==4)
      Lots_New = MathFloor((((Free*Percent/100)/Stloss)/TickValue)/Step)*Step;
    if(CalcMode==1||CalcMode==2||CalcMode==3)
      Lots_New = MathFloor(((((Free*Percent)/100)/Stloss)/((TickSize*TickValue)*ContractSize/TickValue))/Step)*Step;
   }
   if(Lots_New > Max_Lot) Lots_New = Max_Lot;
   if(Lots_New < Min_Lot) return(0);
  return(NormalizeDouble(Lots_New,/*LotDigit()*/ 2));
 }
Razão: