Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 132

 
MarkTrade:


Funciona... Gracias.

Ojalá entendiera por qué mi versión no quiere funcionar...

¿No ves la diferencia? Tienes una comparación equivocada.

if (a && b < c) - no puedes hacer eso.

if (a<c && b<c) - que funciona

 
artmedia70:

¿No ves la diferencia? Se equivoca en la comparación.

if (a && b < c) - no puedes hacer eso.

si (a<c && b<c) - puede.



No, he notado la diferencia. Es que creía que era posible si (a && b < c)... :-)

Ahora lo sé, ¡gracias!

 
MarkTrade:


No, he notado la diferencia. Es que creía que era posible si (a && b < c)... :-)

Ahora lo sabré, ¡gracias!

¿Quizás querías decir si(a+b < c) ? ¡Entonces puedes hacerlo así!
 
skyjet:


Gracias de nuevo. Ahora he intentado optimizar el número de barras "comprobables", pero los resultados en la ventana no están ahí. Intenté empezar a contar tanto desde el principio como desde el final, pero fue en vano.

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
   }
}

¿Qué quiere decir con "...sin resultados en la ventana"? ¿Tal vez se están mostrando los resultados en la ventana de forma incorrecta y hay un error en otra parte del programa?

 

Queridos compañeros Por favor, indique si hay alguna literatura (libros de texto) sobre la programación de líneas basadas en el análisis técnico, incluyendo los niveles de Fibo. Es deseable con ejemplos de código de programa "para dummies".

O que pueda sugerir un asesor similar con código abierto.

Se lo agradezco de antemano.

 
alexey1979621:

¡Queridos camaradas! Por favor, indique si hay alguna literatura (libros de texto) sobre la programación de líneas basadas en el análisis técnico, incluyendo los niveles de Fibo. Preferiblemente con ejemplos de código "para tontos".

No sé cómo usarlo.

Estoy muy agradecido.

¿Qué tiene de malo este libro de texto? Lo que necesites, estudia, practica, ¡suerte!
 
artmedia70:
¿Comprende y ve lo que contiene su matriz inmediatamente después de que se "llene" con los datos del pedido? No. No lo sabes, sólo lo supones. Muestre el contenido de todas las celdas del array, no con su pr(), sino con el Print() estándar e intente mirar en el registro del probador y vea lo que tiene en el array, en cada celda, justo después de que se llene. Cuando sepas con seguridad que el contenido del array coincide con tus ideas sobre su contenido, entonces imprímelo con tu pr(). Si no te da los mismos resultados - es tu pr(), si los datos coinciden, entonces busca un error en el siguiente paso.

Las matrices se han impreso, pero, por el momento, no se trata de ellas. A continuación describo lo que pienso.

Por cierto. Cambió todas las salidas a una impresión estándar. La situación es la misma. Aparece el momento en que se cierran 4 posiciones en +. Y entonces lógicamente debería funcionar la función isCloseByTakeLastOpenPos(), que llamo desde el principio así:

 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);
          }
      }
   }

que nos dirá que la última orden cerrada está cerrada en toma o en beneficio. Esta es la función:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
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);
}

La situación es interesante. Todo funciona. Y aquí aparece la situación:

Podemos ver que 4 posiciones se cerraron con toma de beneficios. Fueron cerrados por Takei. Es decir, las funciones que cerraban los pedidos no funcionaban en absoluto. La razón parece ser que la condición de cierre no funcionó. Esto es:

 if (isCloseByTakeLastOpenPos(2))

Cuando miramos esta función e imprimimos todo, queda claro que no se ha hecho realidad por el momento. ¿Cómo es eso? Al fin y al cabo, los 4 pedidos más externos se cerraron en +. He dado el código de la función más arriba. Esto es lo que hay en el registro en el mismo 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 la condición no ha funcionado. ¿Qué ocurre aquí?

 
¿Puedes decirme si hay un indicador que detecte el spread en todo el gráfico o si es posible hacerlo? Sólo he encontrado un indicador que registra el diferencial cuando se enciende el terminal desde el momento en que se conecta.
 
paladin80:

¿Qué quieres decir con que "...la ventana de resultados está vacía"? ¿Tal vez se están mostrando los resultados en la ventana de forma incorrecta y hay un error en otra parte del programa?


Pero estoy comparando 3,2 y 1 barras, es decir, el cálculo se ve obstaculizado por x >=1?

¿Y significa que los bares con el mismo precio simplemente no se tienen en cuenta, no se les asignan números?

Configurando los parámetros de optimización: inicio 1, paso 1, fin 4; en H1 y H4 la pestaña de resultados está simplemente vacía, en D1 la misma rentabilidad con diferente número de barras analizadas.

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

Los profesionales no pueden ir a ninguna parte sin ti.

Ayuda con la función. Que cuenta el último número de órdenes perdedoras en el historial a una orden más.

Es decir, el historial muestra 3 últimos pedidos en negativo, luego 1 en positivo y 2 en negativo.

Esta función debe contar los tres últimos (antes de la orden positiva)

Razón de la queja: