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

 
Vinin:

¿Estás seguro de que tienes todos los aparatos? Faltan en algunos lugares. Por eso su lógica es errónea. Y lo más probable es que el resultado no sea el esperado.
Vitya, ¿has estado fuera? Hace tiempo que no te veo...
 
artmedia70:
Vitya, ¿has estado fuera? Hace tiempo que no te veo...


Hoy he estado en casa (casi).
 
Vinin:

Hoy he estado en casa (casi)
Ya casi estoy en casa para la segunda semana :))
 
Vinin:

¿Estás seguro de que tienes todos los aparatos? Faltan en algunos lugares. Por eso su lógica es errónea. Y lo más probable es que el resultado no sea el esperado.

Si te refieres al código del indicador, todo está bien allí, el indicador funciona, da señales en forma de flechas (para los topes de los indicadores de compra/venta-4 y 5). Pero cuando leo estas flechas del indicador en el Asesor Experto, me sale un sinsentido. No he sacado a relucir el Asesor Experto por completo porque lo principal ahí es entender cómo leer la señal y hacer la operación correspondiente. En general, el problema está en la lectura de la señal.
 
paladin80:

Para pegar el código correctamente aquí, primero haga clic en SRC y luego copie el código allí.

Si te he entendido bien, en un momento determinado hay que abrir un OP_BUYSTOP y un OP_SELLSTOP ? ¿Es aceptable tener otras órdenes pendientes en este momento? Por ejemplo, ¿hay órdenes pendientes, pero antes de abrir una nueva, hay que borrar las antiguas?



if (hour1 == TimeHour(TimeCurrent()) && minute1 == TimeMinute(TimeCurrent()))// если время подошло то
{
min=Low[iLowest(Symbol(),0,MODE_LOW,6,1)]; // вычисляем минимальную цену последних 6 свечей
max=High[iHighest(Symbol(),0,MODE_HIGH,6,1)]; // вычисляем максимальную цену последних 6 свечей
double volum=max-min;// общий объем локалки последних 6 свечей М5

if ((volum<=n)==true)// если объем свечей меньше или равно n пунктов 
{ 
OrderSend ( Symbol (), OP_BUYSTOP, параметры);// открываем отложенный ордер байстоп
OrderSend ( Symbol (), OP_SELLSTOP, параметры);// открываем отложенный ордер селлстоп
}

if (OrderSelect(1,SELECT_BY_POS,MODE_HISTORY)&& OrderTakeProfit()==true) ///если первый открывшийся отложенный ордер закрыт с профитом
{
OrderDelete(1);// удаляем второй открытый отложенный ордер
}

}
bool closeorder;//определим  закрытие ордеров
closeorder=true;

if (closeorder==true)//
{
int hour2 = TimeHour(StrToTime(time2));// вычисляем время закрытия ордеров
int minute2 = TimeMinute(StrToTime(time2));

if (hour2 == TimeHour(TimeCurrent()) && minute2 == TimeMinute(TimeCurrent()))// если время 
{
for(int i=OrdersTotal()-1; i>=0; i--)// определяем количество открытых позиций, и отложенных ордеров и закрываем все возможные позиции, и отложенные ордера
 if (OrderSelect(1,SELECT_BY_POS,MODE_TRADES))break; //определяем место где будем искать ( рабочие позиции)
if (OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);// Закрытие ордера бай если такой есть
if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage);//Закрытие ордера селл если такой есть
{
for(int D=OrdersTotal()-1; D>=0; D--)
if (OrderSelect(D,SELECT_BY_TICKET,MODE_TRADES)==true)
if (OrderType()==OP_BUYSTOP ) OrderDelete(D); //удаляем отложенный байстоп
if (OrderType()==OP_SELLSTOP) OrderDelete(D);// удаляем отложенный селлстоп

Ya he pegado el código genérico para que quede más claro... Al final del día quería cerrar todas las posiciones y órdenes posibles...

y en el momento de abrir dos órdenes pendientes (por la mañana) no hay órdenes abiertas ni posiciones abiertas antes, ya que todas tienen que cerrarse a cierta hora de la tarde. Me pregunto si el cierre completo de mi pedido está al menos correctamente descrito =)))



 
artmedia70:

Sinceramente, no conozco la lógica de su función. No sé si debería eliminar los objetos o construirlos. Dime qué quieres que haga y veremos en qué se equivoca la lógica. Sin embargo, si la función intenta construir un objeto gráfico pero falla, significa que ya existe. ¿Cuál es el siguiente paso lógico en su programa? Puede construir un nuevo objeto con un nombre diferente (por ejemplo, añadir la hora actual al nombre del objeto (TimeToStr(TimeCurrent()))) o, si ya tiene un objeto pero necesita cambiar sus propiedades, no lo construya de nuevo, sino simplemente cambie sus propiedades. Entonces el error no volverá a producirse.

Es muy sencillo. Lo principal es saber lo que quieres... :)



En realidad, la función no es más que un sustituto visual de la impresión, sólo muestra todo en la pantalla. Todavía no está muy bien escrito, pero funciona. :) Llegaré y lo reescribiré. Y entonces puedes pensar en la pregunta que era.

Por cierto, si no construyes nuevos objetos, sino que modificas las propiedades de los existentes, entonces de nuevo... Va a ser un dolor de cabeza. La idea es mostrar los últimos N cardúmenes en la pantalla. Si siempre sobrescribimos el objeto más externo, podríamos terminar con un solo objeto que tenga un error particular. Podría ir más allá y seleccionar en un bucle todos los objetos que necesite y reescribirlos únicamente, pero probablemente no merezca la pena el esfuerzo, ya que esta función es sólo para probar y no me aburre mucho porque ya tengo demasiadas cosas que hacer. Algún día probaré el código de esa función, y lo traeré a mis sentidos, ¡y entonces podré pensar en ello!

 

Ha surgido una pregunta. Estoy escribiendo el siguiente experimento. Tengo un montón de órdenes que, naturalmente, se abren una tras otra en función de determinadas señales. Si la última orden se cierra, todas las demás órdenes de mercado y pendientes deben cerrarse...

Por supuesto, todo se puede escribir a través de arrays, pero yo he utilizado una forma ordinaria. Aquí está:

for (int li_ord=OrdersTotal()-1; li_ord>=0; li_ord--)
   {
      if (!OrderSelect(li_ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();

      // Закрытие всех ордеров, если последний ордер закрыт
      if (GetLastOrderState() != 0)
      {
          if (g_type > 1)
          {
              DeletePendingOrders(g_ticket);
          }
          else
          {
              CloseMarketOrders(g_ticket);
          }
      }
   }

Estado:

 if (GetLastOrderState() != 0)

comprobamos si la última orden abierta está cerrada Entonces empezamos a borrar las órdenes pendientes y a cerrar las órdenes de mercado...


Aquí está la función propiamente dicha, para que no haya duda de que algo falla(Las críticas y comentarios son bienvenidos, e incluso más que bienvenidos :)) ):

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
double GetLastOrderState()
{
   double lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
          lastOrderOpenTime = -1;                     // Время открытия последнего ордера
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
  
      if (lastOrderOpenTime < OrderOpenTime())
      {
          lastOrderOpenTime = OrderOpenTime();
          lastOrderCloseTime = OrderCloseTime();
      }
   }
   
   return (lastOrderCloseTime);
}
 
vovak_85:

Si te refieres al código del indicador - todo está bien allí con los paréntesis, el indicador funciona, da señales en forma de flechas (para la compra/venta - 4 y 5 topes del indicador). Pero cuando leo estas flechas del indicador en el Asesor Experto, me sale un sinsentido. No he sacado a relucir el Asesor Experto por completo porque lo principal ahí es entender cómo leer la señal y hacer la operación correspondiente. En general, el problema está en la lectura de la señal.
Esto es tuyo:
double L_B=iCustom(0,0,"Makedonskii",MM,MP,0,4);

double L_S=iCustom(0,0,"Makedonskii",MM,MP,0,5);

Así es como debería ser:
double L_B=iCustom(NULL,0,"Makedonskii",MM,MP,4,0);

double L_S=iCustom(NULL,0,"Makedonskii",MM,MP,5,0);
Algo así.
 
hoz:

En realidad, la función es sólo un sustituto visual de la impresión, pero muestra todo en la pantalla. No está muy bien escrito, pero funciona... :) Llegaré y lo reescribiré. Y entonces puedes pensar en la pregunta que era.

Por cierto, si no construimos nuevos objetos, sino que cambiamos las propiedades de los existentes, entonces de nuevo... Eso sería un dolor de cabeza. Por idea, necesitamos mostrar las últimas N articulaciones en la pantalla. Si siempre sobrescribimos el último objeto, podríamos terminar con un solo objeto que tenga un error particular. Podría ir más allá y seleccionar en un bucle todos los objetos que necesite y reescribirlos únicamente, pero probablemente no merezca la pena el esfuerzo, ya que esta función es sólo para probar y no me aburre mucho porque ya tengo demasiadas cosas que hacer. Algún día probaré el código de esa función, y lo traeré a mis sentidos, ¡y entonces podré pensar en ello!

Una vez hice una función que muestra mensajes en una ventana indicadora vacía. Puede ajustar los colores de las líneas mostradas. Ya está depurado. Si lo necesitas, puedo compartirlo.
 
r772ra:
Esto es tuyo: debería ser así:
Algo así.

gracias por la corrección, pero el algoritmo no funcionaba correctamente...