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 132

 
MarkTrade:


Funciona... Obrigado!

Só queria entender porque minha versão não quer funcionar...

Você não consegue ver a diferença? Você tem uma comparação errada.

se (a && b < c) - você não pode fazer isso.

se (a<c && b<c) - isso funciona

 
artmedia70:

Você não consegue ver a diferença? Você tem a comparação errada.

se (a && b < c) - você não pode fazer isso.

se (a<c && b<c) - você pode.



Não, eu notei a diferença. É que eu acreditava que era possível se (a && b < c)... :-)

Agora eu sei, obrigado!

 
MarkTrade:


Não, eu notei a diferença. É que eu acreditava que era possível se (a && b < c)... :-)

Agora eu vou saber, obrigado!

Talvez você quisesse dizer se(a+b < c) ? Então funciona!
 
skyjet:


Mais uma vez, obrigado! Agora tentamos otimizar o número de barras "verificáveis", mas os resultados na janela simplesmente não estão lá. Tentei começar a contar tanto do início quanto do final, mas em vão.

extern int number=3;
//------------------------------------+
for (int x=number; x>1; x--) // x>1 (а не x>=1)
{
if(Open[x]==Open[x-1]) continue;
if(Open[x]<Open[x-1])
   {
    //--- action 1
   }
else
   {
    //--- action 2
   }
}

O que você quer dizer com "...nenhum resultado na janela"? Talvez você esteja exibindo resultados na janela incorretamente e haja um erro em outro lugar no programa?

 

Caros Colegas! Favor informar se há alguma literatura (livros didáticos) sobre linhas de programação baseadas em análises técnicas, incluindo níveis de Fibo. É desejável com exemplos de código de programa "para manequins".

Ou quem pode sugerir um consultor semelhante com código fonte aberto.

Agradeço antecipadamente.

 
alexey1979621:

Caros camaradas! Favor informar se há alguma literatura (livros didáticos) sobre linhas de programação baseadas em análises técnicas, incluindo níveis de Fibo. De preferência com exemplos de código "para manequins".

Não sei como utilizá-lo.

Sou muito grato.

O que há de errado com este livro didático? O que você precisar, estude, pratique, boa sorte!
 
artmedia70:
Você entende e vê o que está contido em sua matriz imediatamente após ela ser "preenchida" com os dados do pedido? Não. Você não sabe, você só assume. SPRINT o conteúdo de todas as células do array, não com seu pr(), mas com o padrão Print() e tente olhar o log do testador e ver o que você tem no array, em cada célula, logo após o seu preenchimento. Quando você souber com certeza que o conteúdo da matriz corresponde a suas idéias sobre seu conteúdo, então imprima-o com seu pr(). Se não lhe der os mesmos resultados - é seu pr(), se os dados corresponderem, então procure por um erro na próxima etapa.

As matrizes foram impressas, mas, no momento, não se trata delas. Descreverei o que eu penso abaixo.

A propósito. Alternou todas as saídas para uma impressão padrão. A situação é a mesma. Aparece o momento em que 4 posições são fechadas em +. E então logicamente a função isCloseByTakeLastOpenPos() deve funcionar, o que eu chamo assim desde o início:

 for (int ord=OrdersTotal()-1; ord>=0; ord--)
   {
      if (!OrderSelect(ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() == 6) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();
              
      // Блок модификации ордеров       
      if (i_sl != 0 || i_tp != 0)
      {
         if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
         {
            OrdersModifyer(g_ticket);
         }
      }
      // Закрытие всех ордеров, если последний ордер закрыт
      if (isCloseByTakeLastOpenPos(2))        // Наша функция, определяющая.. закрылся ли последний закрытый ордер в + или нет.
      {
         // if (g_type < 2)
          {
              ClosePosBySortLots();
          }
          //else
          if (g_type > 1 && g_type < 6)
          {
              DeletePendingOrders(g_ticket);
          }
      }
   }

o que nos dirá que a última ordem fechada é fechada no take ou no lucro. Aqui está a função:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos(int delta)
{
   datetime lastOrderCloseTime = -1,               // Время закрытия последнего открытого ордера
            lastOOTHist = -1;                     // Время открытия последнего открытого ордера из истории
   int j = -1;
   Print ("isCloseByTakeLastOpenPos: вошли в функцию");
   
   for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() > 1) continue;               // Все удалённые отложки нас не интересуют..
      Print ("isCloseByTakeLastOpenPos: первоначальные условия выполнены!");

      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
      {
         lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
         j = i;
         Print ("j = " + j + "   " + TimeToStr(TimeCurrent()));
      }
   }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
   {
      if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
//      pr ("OTP() = " + OrderTakeProfit() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
  //    pr ("OOP() = " + OrderOpenPrice() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
      if (MathAbs(OrderTakeProfit() - OrderClosePrice()) > delta * pt) return (false);
      else
      {
         lastOOTHist = OrderOpenTime();
         Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
                 "\n", "j = ", j,
                 "\n", "lastOOTHist = ", TimeToStr(lastOOTHist, TIME_SECONDS));
      }
   }
   else
   {
      Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
              "\n", "j = ", j,
              "\n", "не удалось выбрать ордер в истории");
      return(false);
   }
  
   for(int h=OrdersTotal()-1; h>=0; h--)
   {
      if (OrderSelect(h, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderMagicNumber() != i_magic)   continue;
         if (OrderSymbol() != Symbol())       continue;
         if (OrderType() > 1)                 continue;
         if (lastOOTHist < OrderOpenTime()) return(false);  // Выбранная рыночная позиция открыта позже закрытой по тейку
      }
      else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);}
   }
   Print ("isCloseByTakeLastOpenPos: последняя закрытая позиция профитна!");
   
   return (true);
}

A situação é interessante. Tudo funciona. E aqui aparece a situação:

Podemos ver que 4 posições foram fechadas com lucro. Eles foram fechados por Takei. Isto é, as funções que fecharam as ordens não funcionaram de forma alguma. A razão parece ser que a condição de fechamento não funcionou. Isto é:

 if (isCloseByTakeLastOpenPos(2))

Quando olhamos para esta função e imprimimos tudo, fica claro que ela não se tornou verdadeira naquele momento. Como assim? Afinal de contas, as 4 encomendas mais externas fecharam em +. Eu dei o código da função acima. Aqui está o que está no diário de bordo no mesmo momento:

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #104 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #102 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #100 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #98 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:03 2013.08.15 12:30 Tester: order #104, sell 0.93 EURUSD.GI is opened at 1.32831

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: j = 74 2013.08.15 12:30

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: вошли в функцию

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!


Podemos ver que a condição não funcionou. O que está errado aqui?

 
Você pode me dizer se existe um indicador que detecta o spread em todo o gráfico ou se é possível fazer isso? Só encontrei um indicador que registra o spread quando o terminal é ligado, a partir do momento em que é conectado.
 
paladin80:

O que você quer dizer com "...a janela de resultados está simplesmente vazia". Talvez você esteja exibindo os resultados na janela incorretamente e haja um erro em outro lugar no programa?


Mas estou comparando 3,2 e 1 barras, ou seja, o cálculo é dificultado por x >=1?

E isso significa que barras com o mesmo preço simplesmente não são consideradas, não lhes são atribuídos números?

Ao definir os parâmetros de otimização: início 1, passo 1, fim 4; em H1 e H4 a guia de resultados está simplesmente vazia, em D1 a mesma rentabilidade com número diferente de barras analisadas.

if(Open[x]==Open[x-1]) continue;
 

Os profissionais não podem ir a lugar algum sem você.

Ajuda com a função. O que conta o último número de pedidos perdidos na história como um pedido mais.

Ou seja, a história mostra 3 últimos pedidos em menos, depois 1 em mais e 2 em menos.

Esta função deve contar os três últimos (antes da ordem positiva)

Razão: