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 66

 
Roger:

Na verdade, o que você chamou de Trailing não é, é calculado de uma maneira diferente e seu comportamento pode ser ilógico.


Mesmo que nossos conceitos dos termos não coincidam, mas você me entende, não é mesmo?

Resolvido o problema, ele estava aqui:

double getLots(double newSL) {
   int opnTime = 0; // время открытия трейда для цикла пересчета позиций
   double lotSum = 0; 
   for (int i = 0; i <= OrdersTotal()-1; i++) {
      OrderSelect(i, SELECT_BY_POS);     
      if ((OrderOpenTime() > opnTime) && (OrderType() == OP_BUY) || (OrderType() == OP_SELL)) { 
         opnTime = OrderOpenTime(); 
         if (OrderType() == OP_BUY)    { lotSum += OrderLots() * (newSL - OrderOpenPrice()) / Point; }
         if (OrderType() == OP_SELL)   { lotSum -= OrderLots() * (newSL - OrderOpenPrice()) / Point; }
      }
   }   
   return(lotSum);
}

Esta função não levava em conta todas as negociações abertas, então tive que mudar as condições do loop. Agora é o que parece:

double AcountProfitEx(double Price) {
   double   ProfitSum   = 0;
   for (int i = OrdersTotal()-1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS);
      if(OrderType() == OP_BUY)
      ProfitSum -= (OrderOpenPrice() - Price) * OrderLots() / Point;
      if(OrderType() == OP_SELL)
      ProfitSum += (OrderOpenPrice() - Price) * OrderLots() / Point;
   }
   return (ProfitSum);
}

Esta função calcula a soma dos lucros de todas as negociações em aberto no nível de preço especificado para ela. No entanto, há uma opinião citada que não leva em conta a propagação, e eu concordo com ela. O autor deste parecer sugeriu esta solução:

double getLots(double newSL)
{
   double TickValue, delta;
   double lotSum;
   string SymbolName;
   
   SymbolName = Symbol();
   TickValue = MarketInfo( SymbolName, MODE_TICKVALUE) / Point;
   delta = ( newSL - Bid ) * TickValue;

   lotSum = 0.0; 
   for (int i = 0; i <= OrdersTotal()-1; i++)
   {
      OrderSelect(i, SELECT_BY_POS);     
      if ( OrderSymbol() == SymbolName )
      { 
         if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * delta; }
         if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * delta; }
      }
   }   
   return(lotSum);
}

Mas confesso, para ser honesto, não o entendo como ele escreve:

A propagação não é contabilizada. Isto pode ser corrigido pela contagem do resultado do preço atual.
Eu não entendo o algoritmo que ele sugeriu, como a propagação é levada em conta? Alguém pode explicar, por favor?
 
Mepkypuu:

Mas, para ser honesto, eu não o entendo como ele escreve:

Parece que não entendo seu algoritmo; como a propagação é considerada lá? Alguém pode explicar?

OrderProfit() conta para posições curtas no atual Ask, é aqui que o valor do spread atual é levado em conta. Se o spread não mudar, quando o preço mudar da atual Licitação para a novaSL o lucro da posição (qualquer, Comprar ou Vender, com um sinal apropriado) em um lote mudará pelo valor do delta, que está escrito no operador:

delta = ( newSL - Bid ) * TickValue;

Em resumo, OrderProfit() conta tudo, incluindo spreads. Fixamos o resultado por um certo momento ( o preço atual) usando OrderProfit(). A partir daqui, tudo o que temos que fazer é monitorar as mudanças de preços.

 
Mislaid:

OrderProfit() é contado para posições curtas no atual Ask, é aqui que os valores de spread atuais são levados em conta. Se o spread não mudar, quando o preço mudar do atual Bid para o newSL, o lucro de um lote da posição (Comprar ou Vender, com o sinal correspondente) mudará pelo valor do delta, que está escrito na declaração:

delta = ( newSL - Bid ) * TickValue;

Em resumo, OrderProfit() conta tudo, incluindo spreads. Fixamos o resultado por um certo momento (o preço atual) usando OrderProfit(). A partir daqui, tudo o que temos que fazer é monitorar a mudança de preço.

Acho que estou começando a entender, mas talvez seja mais correto:

if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * ((newSL - Bid) / Point * MarketInfo( SymbolName, MODE_TICKVALUE)); }
if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * ((newSL - Ask) / Point * MarketInfo( SymbolName, MODE_TICKVALUE)); }

OrderProfit para posições curtas é calculado a partir do Ask price, não é?

A propósito, MarketInfo( SymbolName, MODE_TICKVALUE) retorna 329,02 para o par de moedas EURUSD, é por isso que esta função não funciona corretamente para mim.

 

Até o momento, decidi ir por um truque, ou seja, MarketInfo(SymbolName, MODE_TICKVALUE) para contar de forma diferente:

double GetTickValue(string CurrentQuote) {
   string AccountCurr = AccountCurrency();
   string BaseCurr = StringSubstr(CurrentQuote,0,3);
   string CurrentCurr = StringSubstr(CurrentQuote,3,3);
   
   if (CurrentCurr == AccountCurr)  
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE));
   if (BaseCurr == AccountCurr)
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) / MarketInfo(CurrentQuote, MODE_BID));
   if ((CurrentCurr != AccountCurr) && (BaseCurr != AccountCurr))  
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) * MarketInfo(StringConcatenate(BaseCurr,AccountCurr), MODE_BID) / MarketInfo(CurrentQuote, MODE_BID));
}
 
Mepkypuu:

Até o momento, decidi ir por um truque, ou seja, MarketInfo(SymbolName, MODE_TICKVALUE) para contar de forma diferente:

A forma como foi escrito é correta. Por quanto a licitação é deslocada, por quanto o Ask é deslocado, com o spread inalterado.
 
Mislaid:
A forma como foi escrito é correta. Tanto quanto o Bid se move, tanto quanto o Ask se move, se o spread se mantém inalterado.

Por experiência pessoal, a propagação é normalmente inalterada e bastante forte). Durante movimentos bruscos, vi o spread aumentar de 8 para 80 pontos em um spread de cinco dígitos.
 
É possível codificar (de forma confiável) uma tampa dupla?
 
001:
Uma tampa dupla pode ser codificada (de forma confiável)?
Isso é possível.
 

Ao testar um Consultor Especialista na revista, um erro aparece

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Erro 4002 (índice de array - fora da faixa)

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Tentativa de abrir uma ordem de compra. Esperando por uma resposta.

Por conseguinte, as ordens não são abertas. Como eliminar o erro? Quais são as razões?

Eu ficaria feliz em ajudar.

 
alexey1979621:

Ao testar um EA, um erro aparece no registro

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Erro 4002 (índice de array - fora da faixa)

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Tentativa de abrir uma ordem de compra. Esperando por uma resposta.

Por conseguinte, as ordens não são abertas. Como eliminar o erro? Quais são as razões?

Eu ficaria feliz em ajudar.

Pouca coisa ficará clara apenas nas mensagens terminais, pouca coisa o ajudará se você não postar o código EA. Em algum lugar de sua matriz você está escrevendo um lote inexistente de dados, como uma das suposições, mas adivinhar não é meu perfil.
Razão: