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

 
Maxim Kuznetsov:

apenas para acrescentar, NÃO É GARANTIDO que o terminal tenha e venha a ter histórico suficiente.

no exemplo acima não há nenhuma referência à história

portanto, é garantido que o resultado da OrderSelect() é verdadeiro

UPD: OrderSelect em 4 funciona muito bem, testado uma vez - para ordens de mercado o tempo de acesso às propriedades do pedido.... é realmente milhões de vezes por segundo, eu não quero olhar para cima, eu acho que estava discutindo com o moderador Artem, mas é como se eles dissessem "todas as pontas dos pés diferem", se você gosta, fique com ele

 

Olá, há uma necessidade de dados sobre o saque de cada transação.

Qualquer pessoa pode encontrar um roteiro para coletar tais estatísticas e produzir na forma de um relatório?

Obrigado

 
законопослушный гражданин:

Olá, há uma necessidade de dados sobre o saque de cada transação.

Qualquer pessoa pode encontrar um roteiro para coletar tais estatísticas e produzir na forma de um relatório?

Obrigado

for(int i=OrdersTotal()-1;i>=0;i--) {

   if (!OrderSelect(i,SELECT_BY_POSITON,MODE_TRADES)) continue;

   double prosad=DBL_MIN;

   if (OrderType()!=OP_BUY && OrderType!=OP_SELL) continue;

   for(int j=iBarShift(OrderSymbol(),OrderOpenTime(),PERIOD_M1); j>=0;j--) {

      double delta=( OrderType()==OP_BUY? OrderOpenPrice()-iLow(OrderSymbol(),PERIOD_M1,j) : iHigh(OrderSymbol(),PERIOD_M1,j)-OrderOpenPrice() );

      delta /= MarketInfo(OrderSymbol(),MODE_POINT);

      if (delta>prosad) prosad=delta;

   }

  PrintFormat("Максимальная просадка по ордеру %d = %d пунктов , %f денег",OrderTicket(),(int)(prosad),prosad*OrderLots()*MarketInfo(OrderSymbol(),MODE_TICKVALUE);

}

está "escrito à mão", não testado, cheio de erros :-) basta ajustá-lo às suas necessidades e usá-lo

 
Maxim Kuznetsov:

for(int i=OrdersTotal()-1;i>=0;i--) {

   if (!OrderSelect(i,SELECT_BY_POSITON,MODE_TRADES)) continue;

   double prosad=DBL_MIN;

   if (OrderType()!=OP_BUY && OrderType!=OP_SELL) continue;

   for(int j=iBarShift(OrderSymbol(),OrderOpenTime(),PERIOD_M1); j>=0;j--) {

      double delta=( OrderType()==OP_BUY? OrderOpenPrice()-iLow(OrderSymbol(),PERIOD_M1,j) : iHigh(OrderSymbol(),PERIOD_M1,j)-OrderOpenPrice() );

      delta /= MarketInfo(OrderSymbol(),MODE_POINT);

      if (delta>prosad) prosad=delta;

   }

  PrintFormat("Максимальная просадка по ордеру %d = %d пунктов , %f денег",OrderTicket(),(int)(prosad),prosad*OrderLots()*MarketInfo(OrderSymbol(),MODE_TICKVALUE);

}

escrito "à mão", não verificado, cheio de erros :-) ajustar-se às suas necessidades e uso

obrigado, vou tentar descobrir!

 
@Igor Makanu, muito obrigado por suas respostas sobre a classificação de pedidos no terminal. Provavelmente vou salvá-los como um conjunto de estruturas e classificá-los eu mesmo. Minhas dúvidas foram principalmente porque temia que tais ações executadas em cada carrapato tivessem um impacto negativo perceptível sobre o desempenho.
 
Janis Ozols:
@Igor Makanu, muito obrigado por suas respostas sobre a classificação de pedidos no terminal. Provavelmente vou salvá-los como um conjunto de estruturas e classificá-los eu mesmo. As dúvidas eram principalmente porque eu temia que tais ações executadas em cada carrapato tivessem um impacto negativo perceptível sobre o desempenho.

Então, por que separar em cada carrapato? Basta apenas quando o número de entradas muda ou a lista muda completamente...

 
Boa tarde Por favor, ajude-me a entender porque o indicador baixado do navegador não é arrastado para a carta. Está no catálogo.
Arquivos anexados:
image002.jpg  38 kb
 
Boa tarde. Se não há carregamento automático da ferramenta indicadora do mercado para oterminal comercial, qual é o problema?
 
Igor Makanu:

no exemplo acima não há nenhuma referência à história

portanto, é garantido que o resultado da OrderSelect() é verdadeiro

UPD: OrderSelect em 4 funciona muito bem, eu estava testando-o uma vez - para ordens de mercado o tempo de acesso às propriedades do pedido.... é realmente milhões de vezes por segundo, não quero procurar, acho que estava discutindo com o moderador Artem, mas como eles dizem "todas as pontas dos pés são diferentes", eu gosto disso - mantenha-o

O Moderador Artem não está discutindo. O Moderador Artem está debatendo :)
 
void OnTick()
  {
    if(isCrossing() == 1)          
      
    ... 

    if(isCrossing() == 2)
      
    ... 
  }

int isCrossing(){  
  double ma = iMA(NULL, g_timeFrame, g_maPeriod, g_maShift, g_maMethod, g_maApplietPrice, 0);
  double low = iLow(Symbol(), g_timeFrame, 0);
  double high = iHigh(Symbol(), g_timeFrame, 0);

  if(g_barTime < iTime(NULL,g_timeFrame,0) && high > ma && Bid <= ma){
    g_barTime = iTime(NULL,g_timeFrame,0);
    return 1;
  } 
  
  if(g_barTime < iTime(NULL,g_timeFrame,0) && low < ma && Bid >= ma){
    g_barTime = iTime(NULL,g_timeFrame,0);
    return 2;
  }
   
  return 0;
}
Por que isCrossing() não retorna 2???? O isCrossing( ) em si tem um segundo se entrada, mas então não há se entrada em OnTick() quando isCrossing() == 2. Que disparate é esse...