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

 

Si una de las órdenes pendientes se dispara, entonces coloco otra orden pendiente en la dirección opuesta y doblo el volumen, por ejemplo, si coloco compra, entonces coloco sellstop 25 pips más bajo que la compra, y si coloco venta, entonces coloco buystop 25 pips más alto. Si una de las órdenes pendientes se dispara, colocamos una orden pendiente más en sentido contrario a la orden disparada, al precio de la primera orden abierta, y si ésta también se dispara, volvemos a colocar una orden pendiente en sentido contrario a la disparada dentro de los 25 puntos siguientes, etc. Por lo tanto, todas las órdenes de compra deben estar a un solo precio, y todas las órdenes de venta también deben estar a un solo precio. Si alguien entiende lo que he escrito aquí, por favor ayude con el código))

int A = 0;
if (OrdersTotal()==0)
   {
   A = 0;
   if ( Close[2] < Close[1])
      {
      OrderSend (Symbol(),OP_BUY,1,Ask,3,Ask-50*Point,Ask+25*Point,0,1);                 // первый вариант событий
      OrderSend (Symbol(),OP_SELLSTOP,2,Bid-25*Point,3,Bid+25*Point,Bid-50*Point,0,2);
      A=1;
      }
      
   if ( Close[2] > Close[1])
      {
      OrderSend (Symbol(),OP_SELL,1,Bid,3,Bid+50*Point,Bid-25*Point,0,1);               //второй вариант событий
      OrderSend (Symbol(),OP_BUYSTOP,2,Ask+25*Point,3,Ask-25*Point,Ask+50*Point,0,2);
      A=2;
      }
   }
//------------------------------------------------------------------------------------------------------------------+
OrderSelect(1,SELECT_BY_TICKET,MODE_TRADES);            //цена открытия первого ордера
int price = OrderOpenPrice();
//------------------------------------------------------------------------------------------------------------------+   
int sells = 0;                                                                                                                              
for (int B = 0; B < OrdersTotal(); B++)
   {
   OrderSelect (B,SELECT_BY_POS,MODE_TRADES);       //количество ордеров sell
   if (OrderType() == OP_SELL) sells++;
   }
   
int buys = 0;                                                                                                                        
for (int b = 0; b < OrdersTotal(); b++)
   {
   OrderSelect (b,SELECT_BY_POS,MODE_TRADES);       //количество ордеров buy 
   if (OrderType() == OP_BUY) buys++;
   }
int sellstops = 0;                                                                                                                              
for (int C = 0; C < OrdersTotal(); C++)
   {
   OrderSelect (C,SELECT_BY_POS,MODE_TRADES);       //количество ордеров sellstop
   if (OrderType() == OP_SELL) sellstops++;
   }

int buystops = 0;                                                                                                                        
for (int c = 0; c < OrdersTotal(); c++)
   {
   OrderSelect (c,SELECT_BY_POS,MODE_TRADES);       //количество ордеров buystop 
   if (OrderType() == OP_BUY) buystops++;
   }
//-----------------------------------------------------------------------------------------------------------------+
if (OrdersTotal()==1)
   {                                               //удаление отложенного ордера..
   OrderDelete(2);                                 //..который остался после срабатываения tp и sl
   }  
//-----------------------------------------------------------------------------------------------------------------+
if (OrdersTotal()>1 && A ==1)
   {
   if (sells == buys && buystops == 0)
      {
      OrderSend (Symbol(),OP_BUYSTOP,2,price,3,price-50*Point,price+25*Point,0,2);     //условия для первого варианта
      }
   if (buys > sells && sellstops == 0)
      {
      OrderSend (Symbol(),OP_SELLSTOP,2,price-28*Point,3,price+22*Point,price-53*Point,0,2);
      }
   }
   
if (OrdersTotal()>1 && A ==2)
   {
   if (sells == buys && sellstops == 0)
      {
      OrderSend (Symbol(),OP_SELLSTOP,1,price,3,price+50*Point,price-25*Point,0,2);     //условия для второго варианта
      }
   if (buys < sells && buystops == 0) 
      {
      OrderSend (Symbol(),OP_BUYSTOP,2,price+22*Point,3,price-28*Point,price+47*Point,0,2);
      }
   }
//-----------------------------------------------------------------------------------------------------------------+
   
   return(0);
   }
 
artmedia70:
¿Esto es de un indicador o de un EA? Hay una diferencia. En general, para evitar que se dibuje la flecha, hay que comprobar la barra adyacente anterior en el indicador y si tiene un valor no nulo o no vacío, significa que la flecha en la barra adyacente ya existe y no es necesario introducir el valor en el buffer de la barra actual. Para un EA, si la barra adyacente anterior ya contiene un hecho de cruce en la misma dirección que la actual y la flecha ya marca este hecho, el hecho de cruce en la barra actual puede no ser registrado (si existe) y la flecha tampoco necesita ser mostrada.
No puedo decirle nada más sobre su código. Si hay telépatas por ahí, probablemente podrán entender tu código en mayor medida ;)

Esto es del indicador. Intersección de 2 resbalones, da la dirección. No entiendo muy bien, la dirección se da sólo al cruzar no en cada barra. A partir de aquí, juzgar por la barra anterior es imposible.... Dime, estamos construyendo un conjunto, ¿no es así? ¿Cómo comprobar la celda anterior? Dos buffers uno CrossUp[i]=Low[i] - Range*0.75;, otro digamos Cr[i]=Low[i] + Range*0.75;(simplemente no quiero entrar en carpetas y código de nuevo)
 
zaqwsx123:

Si una de las órdenes pendientes se dispara, entonces coloco otra orden pendiente en la dirección opuesta y doblo el volumen, por ejemplo, si coloco compra, entonces coloco sellstop 25 pips más bajo que la compra, y si coloco venta, entonces coloco buystop 25 pips más alto. Si una de las órdenes pendientes se dispara, colocamos una orden pendiente más en dirección contraria a la orden disparada, al precio de la primera orden abierta, y si también se dispara, volvemos a colocar una orden pendiente en dirección contraria a la disparada dentro de 25 puntos, etc. Por lo tanto, todas las órdenes de compra deben estar a un solo precio, y todas las órdenes de venta también deben estar a un solo precio. Si alguien entiende lo que he escrito aquí, por favor ayúdeme con el código))

Has escrito un montón de tonterías... Al menos esto:

OrderSelect(1,SELECT_BY_TICKET,MODE_TRADES);            //цена открытия первого ордера

¿está seguro de que el orden es el elegido? ¿Está seguro de que este es el precio? ¿Está seguro de que el pedido tiene un ticket == 1? Cuando se selecciona por ticket, el pool es irrelevante, por lo que MODE_TRADES es superfluo allí. Después de la selección exitosa por ticket, también debemos comprobar la hora de cierre de la orden seleccionada. Si es == 0, la orden está en el mercado y ha sido seleccionada de la lista de órdenes de mercado. Si la hora de cierre > 0, la orden ha sido cerrada o es una orden pendiente eliminada y ha sido seleccionada de la lista de órdenes cerradas.

No quiero buscar más en el código. Tal vez, primero debas familiarizarte con lo básico. Lea el tutorial y la documentación - están en un lugar destacado aquí.

 
artmedia70:


No quiero buscar más en el código...


que me llamó la atención)) ¿Por qué 4 pollitos idénticos? y la muestra no es lo que está en el comentario

if (OrderType() == OP_BUY) buystops++   //количество ордеров buystop

Lo mismo ocurre con la autoparada. necesitas OP_BUYSTOP y OP_SELLSTOP

 
ALXIMIKS:


que me llamó la atención)) ¿Por qué 4 pollitos idénticos? y la muestra no es lo que está en el comentario

similar con selestop. necesitas OP_BUYSTOP y OP_SELLSTOP

No llegué a ese punto. Cuando miras el código y ves que no tienes que explicar los errores, sino que simplemente empiezas a enseñar a una persona desde lo más básico, lo que podría leer por sí mismo, entonces... No quiero hacerlo. Puede dar clases pagadas, pero no en las que sólo ayuda a encontrar errores en el código y no el código entre los errores.
 
Zolotai:

Esto es del indicador. Intersección de 2 diapositivas, da la dirección. No lo entiendo bien, sólo da la dirección al cruzar no en cada barra. A partir de aquí, es imposible juzgar a partir de la anterior bar.... Dime, estamos construyendo un conjunto, ¿no es así? ¿Cómo comprobar la celda anterior? Hay dos buffers: uno CrossUp[i]=Low[i] - Range*0.75; y otro, digamos, Cr[i]=Low[i] + Range*0.75;(no quiero volver a buscar en carpetas y código).
No hay datos de origen. Intenta buscar aquí.
 
Hay una orden BUY_STOP que se ha borrado antes de la ejecución:




Comprueba el código:
            for(int cnt_1=OrdersHistoryTotal()-1; cnt_1>=0; cnt_1--) {
               if(OrderSelect(cnt_1, SELECT_BY_POS, MODE_HISTORY)==true ) {
                  if(OrderSymbol()==Symbol()   &&   OrderCloseTime()!=0   &&   OrderMagicNumber()==My_Magic_Number ) {
                     Print("OrderProfit()=",OrderProfit(), "   OrderCloseTime()=",TimeToStr(OrderCloseTime(),TIME_DATE|TIME_SECONDS), "   OrderType()=",OrderType(), "   OrderTicket()=",OrderTicket(), "   OrderClosePrice()=",OrderClosePrice(), "   OrderOpenPrice()=",OrderOpenPrice() );
                  } // if(OrderSymbol()==Symbol()   &&   OrderCloseTime()!=0   &&   OrderMagicNumber()==My_Magic_Number ) {
               }
            } // for(int cnt_1=0; cnt_1<OrdersHistoryTotal(); cnt_1++) {

Cadena con resultado:
OrderProfit()=0   OrderCloseTime()=2001.01.26 06:15:00   OrderType()=4   OrderTicket()=24   OrderClosePrice()=0.9237   OrderOpenPrice()=0.9419

1, OrderType=4 - "4" es OP_SELLLIMIT, ¿verdad?
2. OrderClosePrice()=0.9237 OrderOpenPrice()=0.9419 - ¿De dónde viene el valor de OrderClosePrice() que no es igual a OrderOpenPrice()?

 
chief2000:

Hay una orden BUY_STOP que se ha borrado antes de la ejecución:




Comprueba el código:

Cadena con resultado:

1, OrderType=4 - "4" es OP_SELLLIMIT, ¿verdad?
2. OrderClosePrice()=0.9237 OrderOpenPrice()=0.9419 - ¿de dónde viene el valor de OrderClosePrice() que no es igual a OrderOpenPrice()?

en el probador, en el modo de visualización, sobre todos los ticks, en el modo paso a paso (F12 en la pausa) encontrar el momento de su eliminación y mirar el precio actual, tal vez allí el perro se esconde allí?
 
artmedia70:
y usted en el probador en el modo de visualización, sí en todas las garrapatas, en el modo de paso (F12 en la pausa) encontrar el momento de su eliminación y ver el precio actual, tal vez ahí es donde el perro está enterrado?


¡BINGO! No lo sabía, pero todo es como lo has escrito, es decir, el precio de cierre en este caso es el valor del precio en el momento de la eliminación de la orden. Gracias.
 

A menudo declaraba una variable como esta dentro de las funciones:

int err = GetLastError();

Más adentro, en alguna condición ya lo llamo para ver si hay un error. Bueno, no sólo yo, sino muchos otros lugares del código que he encontrado. Por lo tanto, es una situación típica. Hoy he pensado que no es lógico declarar la misma variable cada vez en cada función en la que quieras controlar los errores. Lo pensé y llegué a la conclusión de que sería más fácil declarar globalmente una vez e inicializarlo en el init. Es así:

// Объявили на глобальном уровне
int err;

// Инициируем данную переменную:
int init()
{
    err = GetLastError();
}

Y además, cuando se necesita llamar a la variable err en funciones de usuario, sabiendo que ya tiene un valor. De hecho, GetLastError() emite el código del último error, por lo que si esta variable err es llamada en cada función al final de todos los cálculos, que es responsable de emitir el código de error, y llama a GetLastError(), entonces todo será correcto, ¿verdad?

Pero si no se llama a esta variable al final de alguna función (siguiendo la cadena de ejecución del código), no se reiniciará, y provocará una ejecución errónea en caso de que haya habido un error en la ejecución anterior, pero no en la actual, pero el código de error se devuelve en último lugar... Y para restablecerlo, hay que llamar a esta función GetLastError(). Es decir, aquí todo depende de si se ha convocado o no. Si no estás seguro de que vaya a estar en todas partes, es más fácil reasegurar y reajustar cada vez, ¿no?

Razón de la queja: